diff --git a/contrib/flex/COPYING b/contrib/flex/COPYING new file mode 100644 index 000000000000..684b011026dd --- /dev/null +++ b/contrib/flex/COPYING @@ -0,0 +1,42 @@ +Flex carries the copyright used for BSD software, slightly modified +because it originated at the Lawrence Berkeley (not Livermore!) Laboratory, +which operates under a contract with the Department of Energy: + +Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007 The Flex Project. + +Copyright (c) 1990, 1997 The Regents of the University of California. +All rights reserved. + +This code is derived from software contributed to Berkeley by +Vern Paxson. + +The United States Government has rights in this work pursuant +to contract no. DE-AC03-76SF00098 between the United States +Department of Energy and the University of California. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +Neither the name of the University nor the names of its contributors +may be used to endorse or promote products derived from this software +without specific prior written permission. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. + +This basically says "do whatever you please with this software except +remove this notice or take advantage of the University's (or the flex +authors') name". + +Note that the "flex.skl" scanner skeleton carries no copyright notice. +You are free to do whatever you please with scanners generated using flex; +for them, you are not even bound by the above copyright. diff --git a/contrib/flex/ChangeLog b/contrib/flex/ChangeLog new file mode 100644 index 000000000000..4d0c7595a7f7 --- /dev/null +++ b/contrib/flex/ChangeLog @@ -0,0 +1,7883 @@ +2012-08-03 Will Estes + + * NEWS: update NEWS to reflect changes in 2.5.37 + +2012-08-03 Will Estes + + * configure.in: update flex version to 2.5.37 + +2012-08-03 Will Estes + + * po/de.po: new de translation from the translation project + +2012-08-02 Will Estes + + * po/vi.po: new vi translation from the translation project + +2012-08-02 Will Estes + + * po/pl.po: new pl translation from the translation project + +2012-08-02 Will Estes + + * po/fi.po: new fi translation from the translation project + +2012-08-02 Will Estes + + * 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 + + * 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 + + * 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 + + * examples/.cvsignore, examples/fastwc/.cvsignore, + examples/manual/.cvsignore, lib/.cvsignore, tools/.cvsignore: remove + unneeded .cvsignore files + +2012-07-22 Will Estes + + * .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 + + * .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 + + * NEWS: update NEWS file to note release date of 2.5.36 + +2012-06-23 Will Estes + + * doc/flex.texi: fix call to version in manual + +2012-06-22 Will Estes + + * doc/flex.texi: add missing argument to call to yylex in manual + +2012-04-27 Will Estes + + * flex.skl: lintish cleanup in flex.skl; resolves #2040664 + +2012-04-27 Will Estes + + * doc/flex.texi: add a 7 to the c99 octal pattern; resolves #3518269 + +2012-03-31 Will Estes + + * doc/flex.texi: copyedit; resolves #3513670 + +2012-03-23 Will Estes + + * buf.c: escape backslashes in #line filenames in %top section; + resolves #3212400; patch submitted by scfc_de + +2012-03-21 Will Estes + + * 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 + + * Makefile.am: install flex++ as a link; resolves bug #2939681 + +2012-03-21 Will Estes + + * 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 + + * flex.skl: add missing prototypes for yyset_column() and + yyget_column(); resolves #3029024; patch submitted by scfc_de + +2012-03-02 Will Estes + + * flex.skl, tests/test-reject/scanner.l, + tests/test-table-opts/scanner.l: wrap yy_fatal_error calls + appropriately + +2012-03-02 Will Estes + + * regex.c: fix overlapping data buffer issue; patch from Tim + Landsheet scfc_de + +2012-03-02 Will Estes + + * scan.l: better bracket handling in the scanner + +2012-03-02 Will Estes + + * flexdef.h, main.c, misc.c: Remove unneeded tracking of line/column + output; patch from Tim Landsheet scfc_de + +2012-03-02 Will Estes + + * 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 + + * doc/flex.texi: fix order of td_lolen and td_hilen in + documentation; resolves #2913693; patch submitted by Andreas + Gruenbacher + +2012-03-02 Will Estes + + * doc/flex.texi: correct document of YY_FLUSH_BUFFER; resolves + #1723028 + +2012-02-17 Will Estes + + * dfa.c, flexdef.h, misc.c, parse.y: speed up things for complex + inputs; resolves #2891390 + +2012-02-17 Will Estes + + * doc/flex.texi: fix ipv6 pattern in manual; update manual copyright + to 2012 + +2012-02-17 Will Estes + + * flex.skl: fremove isatty() declaration; resolves #1984987 + +2012-02-17 Will Estes + + * doc/flex.texi: Add link for RFC 2396 + +2012-02-17 Will Estes + + * flex.skl: resolve #1990170 + +2012-02-17 Will Estes + + * flex.skl: fix documentation to reflect arguments actually used; + bug #2783023 + +2012-02-05 Will Estes + + * main.c: fix yywrap behavior for reentrant scanners + +2012-02-04 Will Estes + + * NEWS: Mmention tr translation + +2012-02-04 Will Estes + + * tables.c: prevent unused stuff from being compiled so as to reduce + warnings + +2012-02-03 Will Estes + + * 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 + + * misc.c: more careful/paranoia + +2012-02-03 Will Estes + + * scanopt.c: more careful memory allocation in option processing + +2012-02-03 Will Estes + + * Makefile.am, configure.in: remove m4/ directory and generally + clean up automake/autoconf inputs + +2012-02-03 Will Estes + + * lib/.cvsignore: cvsignore files that need that + +2012-02-03 Will Estes + + * 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 + + * main.c: correct macro definition of yywrap + +2012-02-03 Will Estes + + * scan.l: Greater specificity in error messages + +2012-02-03 Will Estes + + * parse.y: improve rule handling at EOF + +2012-02-03 Will Estes + + * flex.skl: include cstdio for definition of EOF in all cases + +2012-02-03 Will Estes + + * flex.skl: suppress warning on unused yyguts_t + +2010-08-13 Will Estes + + * NEWS, po/LINGUAS, po/fi.po: new fi translation from the + translation project + +2009-03-31 Will Estes + + * 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 + +2008-12-28 Will Estes + + * configure.in: remove line break that broke configure + +2008-12-28 Will Estes + + * 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 + + * configure.in, flexdef.h: check for regex.h; resolves bug #2337486 + +2008-07-23 Will Estes + + * NEWS, po/ga.po: new ga translation from the translation project + +2008-06-10 Will Estes + + * NEWS, po/ca.po: new ca translation + +2008-05-31 Will Estes + + * Makefile.am: move ABOUT-NLS back to EXTRA_DIST + +2008-05-31 Will Estes + + * Makefile.am: create new dist_doc_DATA; move some EXTRA_DIST files + to new dist_doc_DATA target + +2008-05-31 Will Estes + + * .cvsignore: ignore more automake generated config.status* files + +2008-05-31 Will Estes + + * NEWS: flex distribution now built with automake and autoconf + versions ... + +2008-05-31 Will Estes + + * README.cvs: document GNU auto* version changes for building flex + from cvs + +2008-05-31 Will Estes + + * .cvsignore, doc/Makefile.am: ignore automake-supplied ylwrap + +2008-05-15 Will Estes + + * NEWS, flex.skl: clean up types; resolves 1961902 + +2008-05-15 Will Estes + + * NEWS: update NEWS re manual + +2008-05-15 Will Estes + + * doc/flex.texi: correct eroneous references to 'nowrap' to refer to + 'noyywrap'; resolves bug #1739912 + +2008-05-14 Will Estes + + * filter.c: call clearerr on stdin before dup2'ing it; resolves bug + #1902612 + +2008-05-14 Will Estes + + * NEWS: generic updates to NEWS + +2008-05-14 Will Estes + + * 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 + + * 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 + + * doc/flex.texi: fix typo in example (from Paolo J. Matos + +2008-04-10 Will Estes + + * flexint.h: move endif to better account for what C99 defines for + integer types (fix from debian project) + +2008-04-10 Will Estes + + * gen.c: fix another int type to be size_t + +2008-03-30 Will Estes + + * NEWS, po/fr.po: new fr translation + +2008-03-30 Will Estes + + * NEWS, configure.in: start version 2.5.36 + +2008-02-26 Will Estes + + * NEWS: add date of release + +2008-02-15 Will Estes + + * NEWS, parse.y: fix bug that prevented comments from working + properly + +2008-02-12 Will Estes + + * po/de.po: new de translation + +2008-02-10 Will Estes + + * NEWS, po/vi.po: new vi translation + +2008-02-10 Will Estes + + * NEWS, po/nl.po: new nl translation + +2008-02-09 Will Estes + + * NEWS, po/pl.po: new pl translation + +2008-02-09 Will Estes + + * NEWS, po/de.po, po/pt_BR.po: new de, pt_br translations + +2008-02-09 Will Estes + + * NEWS, flex.skl: generate headers for all functions (resolves bug + #1628314) + +2008-02-09 Will Estes + + * NEWS, flex.skl: change yy_size_t to be size_t (resolves bug + #1849812) + +2008-02-09 Will Estes + + * configure.in: start work on version 2.5.35 + +2007-12-12 Will Estes + + * NEWS, configure.in: revert NEWS and configure.in to version 2.5.34 + +2007-09-12 Will Estes + + * NEWS, configure.in: update version number to 2.5.35 + +2007-09-10 Aaron Stone + + * tests/test-alloc-extra/scanner.l: Use %option extra-type. + +2007-09-10 Aaron Stone + + * 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 + + * po/nl.po: new nl translations from the translation project + +2007-06-28 Will Estes + + * NEWS: change release date + +2007-06-28 Will Estes + + * flex.skl: adjustment for prefix classes; patch submitted by Petr + Machata + +2007-06-28 Will Estes + + * NEWS: NEWS item for yy_init_extra + +2007-06-12 Aaron Stone + + * doc/flex.texi: Docs and example for yylex_init_extra. + +2007-06-01 Will Estes + + * tests/test-alloc-extra/.cvsignore: ignore OUTPUT file in + test-alloc-extra + +2007-06-01 Will Estes + + * tests/descriptions: add description of concatenated options test + +2007-05-31 Will Estes + + * tests/test-alloc-extra/.cvsignore: add missing .cvsignore to + test-alloc-extra + +2007-05-31 Aaron Stone + + * configure.in, flex.skl, gen.c, main.c: Changes to resolve SF bugs + 1568325 and 1563589. + +2007-05-31 Aaron Stone + + * 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 + + * configure.in, tests/test-pthread/scanner.l: fixes to test-pthread + +2007-05-12 Will Estes + + * NEWS: NEWS item for concatenated options + +2007-05-12 Will Estes + + * 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 + + * scanopt.c: parse multiple short concatenated options; patch + submitted by Petr Machata + + * autogen.sh: remove --force option from autogen.sh; much faster + without it + +2007-05-11 Will Estes + + * NEWS, configure.in: version 2.5.34 + +2007-05-08 Aaron Stone + + * NEWS, flex.skl: Better checking after yyalloc/yyrealloc (resolves + bug #1595967) + +2007-05-01 Will Estes + + * doc/flex.texi: change title of manual to 'Lexical Analysis with + Flex' + +2007-04-25 Will Estes + + * flex.skl: c++ memory leak plug + +2007-04-23 Will Estes + + * flex.skl: roll back c++ memory patch as it causes the test suite + no end of grief + +2007-04-23 Will Estes + + * flex.skl: fix function definitions for non-ANSI environments (from + Manoj Srivastava from Debian patchset) + +2007-04-23 Will Estes + + * flex.skl: fix c++ memory leak (from Manoj Srivastava from Debian + patchset) + +2007-04-23 Will Estes + + * flex.skl: fix parameter name in comment (patch from Manoj + Srivastava from the debian patchset + +2007-04-23 Will Estes + + * flex.skl: add a size_t cast (patch from Manoj Srivastava from the + debian patchset + +2007-04-16 Will Estes + + * tests/test-extended/Makefile.am, tests/test-quotes/Makefile.am: + cleanups to handle VPATH builds better; passifies make distcheck + +2007-04-16 Will Estes + + * doc/flex.texi: drop using the \ in \ escaping as it throws pdf + generation for a loop + +2007-04-14 Will Estes + + * .cvsignore: add compile and *.tar.bz2 to .cvsignore + +2007-04-14 Will Estes + + * main.c: add call to setlocale for ctype as per debian patchset + +2007-04-14 Will Estes + + * Makefile.am, NEWS: provide for a PIC version of libfl.a for shared + libraries using flex scanners + +2007-04-13 Will Estes + + * FlexLexer.h: annotate endifs since they're a bit far from their + opening #if statements + +2007-04-13 Will Estes + + * flexdef.h, parse.y: refactor and slightly redo alloca testing, + resolves bug #1675899 + +2007-04-13 Will Estes + + * : 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 + + * flex.skl: fix skeleton for reentrant scanners + +2007-04-13 Will Estes + + * Makefile.am: remove homegrown tags target; automake does that for + us + +2007-04-12 Will Estes + + * flex.skl: fix skeleton for reentrant scanners, resolves bug + #1694318 + +2007-04-12 Will Estes + + * FlexLexer.h: declare some const where missing in c++ header file + +2007-04-10 Will Estes + + * doc/flex.texi: corrections to the manual as per suggestions from + flex-help@ + +2007-04-03 Will Estes + + * doc/flex.texi: include author names in online versions of the + manual + +2007-04-03 Will Estes + + * COPYING: update copyright notice + +2007-04-03 Will Estes + + * AUTHORS: rearrange and update AUTHORS + +2007-03-29 Will Estes + + * NEWS: note sf feature request 1658379 in NEWS + +2007-03-29 Will Estes + + * tools/cvsauthors: add sodabrew to cvsauthors file + +2007-03-29 Aaron Stone + + * flex.skl: SourceForge feature request #1658379: Expose YY_BUF_SIZE + in the header file. + +2007-03-07 Will Estes + + * NEWS, filter.c, flex.skl: apply patches submitted by sodabrew + +2007-03-07 Will Estes + + * README.cvs: more changes describing building flex from cvs + +2007-03-07 Will Estes + + * Makefile.am, README.cvs, README.cvs-snapshot: rename + README.cvs-snapshot to README.cvs + +2007-03-07 Will Estes + + * README.cvs-snapshot: update to explain where flex cvs lives + +2007-03-07 Will Estes + + * README, doc/flex.texi: correct how to submit bugs + +2007-02-16 Will Estes + + * NEWS: clarify NEWS item re man page and pdf manual + +2007-02-14 Will Estes + + * po/Makevars: update bug address to point to flex-devel instead of + lex-help + +2007-02-13 Will Estes + + * 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 + + * configure.in: remove option check-news from call to + AM_INIT_AUTOMAKE as gnits implies check-news + +2007-02-13 Will Estes + + * Makefile.am, configure.in: move automake options from Makefile.am + to configure.in + +2007-02-13 Will Estes + + * autogen.sh: restore --install option to autogen.sh since --force + does not imply --install + +2007-02-13 Will Estes + + * tools/cvsauthors: add john43 to cvsauthors file + +2007-02-13 Will Estes + + * autogen.sh: call autoreconf with --force instead of --install + +2007-02-13 Will Estes + + * doc/.cvsignore: remove texinfo.tex from cvs tree + +2007-02-13 Will Estes + + * NEWS: updates to NEWS file to reflect recent changes + +2007-02-13 Will Estes + + * doc/Makefile.am: add flex.pdf to EXTRA_DIST + +2007-02-13 Will Estes + + * configure.in: remove flex.spec + +2007-02-13 Will Estes + + * Makefile.am: remove maintainercleanfiles + +2007-02-01 Will Estes + + * doc/Makefile.am: more changes to build system to distribute man + page + +2007-02-01 Will Estes + + * doc/Makefile.am: add flex man page to distribution + +2007-02-01 Will Estes + + * .cvsignore, flex.spec.in: remove flex spec file + +2006-11-17 Will Estes + + * 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 + + * tests/create-test: change create-test script to edit files in + place + +2006-11-09 Will Estes + + * 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 + + * doc/flex.texi: fix typos in manual; resolves bug #1592857 + +2006-11-09 Will Estes + + * 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 + + * tests/Makefile.am: test names weren't displaying in test + success/failure messages (from #1591672 + +2006-10-30 Will Estes + + * doc/.cvsignore: add flex.html to .cvsignore in doc directory + +2006-10-22 Will Estes + + * NEWS: update NEWS file for the work that millaway did + +2006-10-22 Will Estes + + * 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 + + * 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 + + * 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 + + * 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 + + * doc/flex.texi: add noyywrap option to example; use whitespace to + clarify example + +2006-08-02 Will Estes + + * NEWS, po/ca.po, po/vi.po: new translations + +2006-04-11 John Millaway + + * tables.c: Casted away signedness to appease -Werror freaks. + +2006-03-28 John Millaway + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * Makefile.am, configure.in, flexdef.h, scanflags.c: Added configure + check for assert.h. Added scanner flags stack. + +2006-03-25 John Millaway + + * 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 + + * doc/flex.texi, parse.y: Changed explicit 'A'-'Z' to isupper(), + where correct to do so. Documentation. + +2006-03-24 John Millaway + + * doc/flex.texi: Documentation. + +2006-03-24 John Millaway + + * doc/flex.texi: Added appendix of patterns to manual. + +2006-03-23 John Millaway + + * doc/flex.texi: . + +2006-03-22 John Millaway + + * doc/flex.texi: Documentation. + +2006-03-22 John Millaway + + * doc/flex.texi: Documented set difference operator {-}. + +2006-03-22 John Millaway + + * 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 + + * 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 + + * 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 + + * Makefile.am: Removed includedir from AM_CPPFLAGS #1439351. + +2006-03-21 John Millaway + + * 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 + + * flexdef.h, misc.c, scan.l: Fixed escape in actions. + +2006-03-21 John Millaway + + * 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 + + * tests/test-table-opts/Makefile.am, + tests/test-table-opts/scanner.l: Removed m4 from test-table-opts + +2006-03-21 John Millaway + + * tests/test-reject/Makefile.am, tests/test-reject/scanner.l: + Removed m4 from test-reject + +2006-03-21 John Millaway + + * filter.c, flexdef.h, main.c, scan.l: Moved set_input_file to + different file. + +2006-03-21 John Millaway + + * 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 + + * filter.c: Documented filter chain. Removed fdopen. Added no-op + fseek. + +2006-03-13 John Millaway + + * gen.c: Fixed another -Wall report. + +2006-03-10 Will Estes + + * NEWS, po/vi.po: new vi translation + +2006-03-09 Will Estes + + * NEWS, po/ga.po, po/nl.po: new nl, ga translations + +2006-02-21 Will Estes + + * m4/Makefile.am: add po.m4 to extra_dist in m4/ so it gets picked + up by distributions + +2006-02-21 Will Estes + + * 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 + + * configure.in: remove website directory from configure.in + +2006-02-20 Will Estes + + * NEWS, configure.in: version 2.5.33 marks in NEWS and configure.in + +2006-02-20 Will Estes + + * configure.in: change email address in configure.in to point to + flex-help@sourceforge.net + +2006-02-20 John Millaway + + * doc/flex.texi: Documentation. + +2006-02-20 John Millaway + + * BUGS: Appended to BUGS file. + +2006-02-18 Will Estes + + * Makefile.am: remove website directory (since it now has its own + module in the flex project + +2006-02-16 John Millaway + + * doc/flex.texi, flex.skl: Fixed buffer overflow in reject state + buffer. Corrected documentation on the state buffer. + +2006-02-16 John Millaway + + * flex.skl: Reverted num_read from size_t back to int. + +2006-02-15 John Millaway + + * Makefile.am, configure.in: Removed reference to RoadMap in + Makefile.am. Added website directory. + +2006-02-15 Will Estes + + * README, RoadMap: remove RoadMap and reference to it in README + +2006-02-15 John Millaway + + * BUGS, README, doc/flex.texi, doc/flex.xml: Eliminated references + to lex.sf.net. + +2006-02-15 John Millaway + + * BUGS, flex.skl: Transfered bugs list from lex.sf.net to BUGS file. + +2006-02-15 John Millaway + + * 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 + + * 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 + + * flex.spec.in: Patched rpm spec file. + +2006-02-14 John Millaway + + * configure.in, flexint.h: Added C99 macro for inttypes, just to be + conformant. + +2006-02-14 John Millaway + + * flexdef.h, nfa.c, parse.y: Changed symbol INFINITE to fix conflict + with C math symbol. + +2006-02-14 John Millaway + + * scan.l: Omitting parens for named rules in trailing context. + +2006-02-14 John Millaway + + * 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 + + * flex.skl: Removed unused local vars. + +2006-02-14 John Millaway + + * flex.skl: Removed certain offending #undefs. + +2006-02-14 John Millaway + + * flexint.h: Removed logical and from preprocessor statement. + +2006-02-14 Will Estes + + * po/nl.po, po/nl.po.1: remove eroneously named nl.po.1; update + nl.po + +2006-02-14 John Millaway + + * dfa.c: . + +2006-02-14 John Millaway + + * flex.skl: Included for serialized tables. + +2006-02-14 John Millaway + + * configure.in: Minor patch to call to head in configure script. + +2006-02-14 John Millaway + + * doc/flex.texi: Documentation patch. + +2006-02-14 John Millaway + + * filter.c, gen.c, libyywrap.c, main.c: Patch for full file system + failure. + +2006-02-13 John Millaway + + * doc/flex.texi: Documentation. + +2006-02-13 John Millaway + + * main.c: Fixed double-fclose when input file is empty. + +2006-02-10 Will Estes + + * 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 + + * buf.c, main.c: Improvement request 1069716 log vs. log10 + +2005-12-22 John Millaway + + * flex.skl: Fixed bug 1257093 yy_init_globals in header file + +2005-04-14 Will Estes + + * po/nl.po: new nl translation + +2005-04-07 Will Estes + + * NEWS, po/LINGUAS, po/nl.po, po/vi.po: new nl and vi translations + +2004-07-20 Will Estes + + * filter.c: correct improper stdin assignment + +2004-05-22 Will Estes + + * NEWS, po/tr.po: new tr translation + +2004-05-12 Will Estes + + * .cvsignore, .indent.pro: .cvsignore and .indent.pro got missed in + the import to sourceforge; replace them + +2004-05-11 Will Estes + + * po/fr.po: new fr translation + +2004-05-03 Will Estes + + * po/LINGUAS: polish is pl, not po + +2004-03-22 Will Estes + + * po/sv.po: yet another sweedish update + +2004-03-19 Will Estes + + * NEWS, po/sv.po: new sv translation + +2003-12-11 John Millaway + + * 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 + + * doc/flex.texi: added 3 faqs + +2003-11-24 Will Estes + + * po/ro.po: new ro translation + +2003-11-07 Will Estes + + * NEWS, po/fr.po: new french translation + +2003-11-07 Will Estes + + * NEWS, po/ca.po: new catalan translation from the translation + project + +2003-11-07 Will Estes + + * NEWS, po/LINGUAS, po/ga.po, po/pl.po: new polish translation; + updated irish translation from translation project + +2003-10-10 Will Estes + + * NEWS, po/LINGUAS, po/ga.po: new Irish translation + +2003-08-25 Will Estes + + * NEWS, po/LINGUAS, po/ro.po: add romanian translation + +2003-07-16 Will Estes + + * flex.skl: flex_*int* type fixes + +2003-07-16 Will Estes + + * tools/cvsauthors: change wlestes email address + +2003-07-16 Will Estes + + * flex.skl: undef yytext_ptr has some bad side effects + +2003-07-07 John Millaway + + * doc/flex.texi: Documented m4 incompatibility with lex. + +2003-05-21 Will Estes + + * NEWS: upgrade to gettext 0.12 + +2003-05-20 Will Estes + + * flex.skl, gen.c: patches from manoj via sourceforge + +2003-05-20 Will Estes + + * 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 + + * doc/.cvsignore: cvs should ignore flex.pdf and flex.ps + +2003-04-25 John Millaway + + * TODO: Added yylineno bugs to TODO list. + +2003-04-03 John Millaway + + * doc/flex.xml: Docbook. + +2003-04-03 John Millaway + + * doc/flex.xml: xml now validates. + +2003-04-02 John Millaway + + * doc/flex.xml: Began conversion to DocBook. + +2003-04-01 Will Estes + + * NEWS, configure.in: version 2.5.31 + +2003-04-01 Will Estes + + * NEWS: remove --enable-maintainer-mode configure option + +2003-04-01 Will Estes + + * configure.in: remove AM_MAINTAINER_MODE + +2003-04-01 John Millaway + + * flex.skl, flexdef.h, main.c, misc.c, scan.l: Renamed some internal + variables. + +2003-03-31 Will Estes + + * NEWS: yylineno is now per-buffer in reentrant scanners + +2003-03-31 John Millaway + + * TODO: Added TODO item. + +2003-03-30 John Millaway + + * 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 + + * flex.skl: Minor documentation. + +2003-03-28 Will Estes + + * NEWS: added %top directive + +2003-03-27 John Millaway + + * 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 + + * TODO, doc/flex.texi: Documented the m4 dependency. + +2003-03-26 Will Estes + + * configure.in, flexdef.h: check for sys/wait.h since we use wait(2) + +2003-03-26 Will Estes + + * flexdef.h: reorder include directives so as to catch system + integer types before flex defined values for same + +2003-03-26 Will Estes + + * TODO: assign tasks due before major release can happen; remove + --enable-maintainer-mode entry + +2003-03-26 Will Estes + + * Makefile.am: only rebuild the ChangeLog if we're inside a cvs + working directory + +2003-03-26 Will Estes + + * configure.in, tools/.cvsignore, tools/Makefile.am: add tools/ + subdirectory to distribution + +2003-03-26 Will Estes + + * 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 + + * doc/Makefile.am: clean up flex.texi processing leftovers with + cleanfiles + +2003-03-26 Will Estes + + * tests/test-linedir-r/Makefile.am: an awk script wasn't included in + the distribution + +2003-03-26 John Millaway + + * 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 + + * TODO: Removed items from TODO list. + +2003-03-26 John Millaway + + * 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 + + * 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 + + * TODO, doc/Makefile.am: remove maintainer-mode conditional around + rebuilding of manpage + +2003-03-25 Will Estes + + * README: mention doc/ for user documentation + +2003-03-25 Will Estes + + * TODO: rework distribution items + +2003-03-25 Will Estes + + * NEWS: mention m4 processing + +2003-03-25 Will Estes + + * tests/README: update instructions for running test suite + +2003-03-25 Will Estes + + * 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 + + * 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 + + * scan.l: Escaped m4 macros in scan.l which would cause + bootstrapping issues. + +2003-03-21 John Millaway + + * doc/flex.texi, flex.skl, main.c: Cleaning up the skel. + +2003-03-20 Will Estes + + * TODO: we want to move the contents of to.do/Wishlist to top level + TODO + +2003-03-20 John Millaway + + * to.do/Wish-List: Assessment of every item in Wish-List. + +2003-03-19 John Millaway + + * main.c: Fixed allocation of slightly more memory than needed. + +2003-03-19 John Millaway + + * 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 + + * TODO: cosmetic changes to TODO list + +2003-03-19 John Millaway + + * flex.skl: Cleaned up warnings so multiple headers could coincide. + +2003-03-19 John Millaway + + * TODO, flex.skl, main.c: Moved prefixes to m4. + +2003-03-19 John Millaway + + * 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 + + * filter.c, flexdef.h, main.c, regex.c: Fixed #line directives. + +2003-03-17 John Millaway + + * 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 + + * TODO: Added some TODOs. + +2003-03-14 John Millaway + + * 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 + + * 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 + + * buf.c, filter.c, flexdef.h, main.c, misc.c: Added internal filter + ability. Deleted various unused variables. + +2003-03-14 John Millaway + + * 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 + + * flex.skl, tests/test-table-opts/scanner.l: Moved test-tables to + m4. + +2003-03-14 John Millaway + + * flex.skl, main.c, options.c: Moved bison bridge code to m4. + +2003-03-13 John Millaway + + * flex.skl, gen.c, main.c, scan.l: Moved YY_USE_LINENO to m4. + +2003-03-13 John Millaway + + * buf.c, flexdef.h, scan.l: Added function buf_m4_undefine. + +2003-03-13 John Millaway + + * flex.skl, main.c, scan.l: Replaced YY_ALWAYS_INTERACTIVE with m4. + Replaced YY_NEVER_INTERACTIVE with m4. + +2003-03-13 John Millaway + + * flex.skl, main.c: Moved YY_TEXT_IS_ARRAY to m4. + +2003-03-12 John Millaway + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * doc/.cvsignore, texinfo.tex: move texinfo.tex to doc/ + +2003-03-05 Will Estes + + * TODO: update TODO + +2003-03-05 Will Estes + + * NEWS, configure.in: version 2.5.29 + +2003-03-04 John Millaway + + * FlexLexer.h, flex.skl: Added growable buffer stack to C++ scanner + as well. yyensure_buffer_stack is now static. + +2003-03-02 John Millaway + + * flex.skl, misc.c: Removed awkward %push %pop syntax from skeleton. + +2003-03-02 John Millaway + + * flex.skl: Renamed YY_CURRENT_BUFFER_FAST to + YY_CURRENT_BUFFER_LVALUE to better reflect its purpose. + +2003-02-28 John Millaway + + * NEWS: made entry on input buffer stacks. + +2003-02-28 Will Estes + + * Makefile.am, doc/Makefile.am: build on . in top level first; this + will simplify calling help2man + +2003-02-28 John Millaway + + * 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 + + * main.c: Removed some symbols from the undef list. They are needed + for multiple headers to coexist. + +2003-02-27 Will Estes + + * 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 + + * NEWS: namespace cleanups + +2003-02-26 John Millaway + + * main.c: Added a few macros to the undef list. + +2003-02-26 John Millaway + + * main.c: Put the undef macros in an array. + +2003-02-12 Will Estes + + * NEWS, configure.in: version 2.5.28 + +2003-02-10 Will Estes + + * README, TODO, configure.in, flex.texi: update documentation to + reflect the sourceforge move + +2003-02-06 Will Estes + + * TODO: update according to current thinking + +2003-02-06 Will Estes + + * TODO: mcvs reviewed + +2003-02-06 Will Estes + + * TODO: sourceforge migration tasks + +2003-02-04 Will Estes + + * 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 + + * scan.l: Flex now warns if always-interactive is specified with + fast or full. + +2003-01-31 Will Estes + + * Makefile.am: switch to using cvs2cl.pl to generate the ChangeLog + +2003-01-31 Will Estes + + * tools/cvs2cl.pl, tools/cvsauthors: we're going to be switching how + we handle our ChangeLog + +2003-01-29 John Millaway + + * gen.c, misc.c: Fixed trailing slash bug in YY_INPUT macro def. + +2003-01-29 Will Estes + + * README.cvs-snapshot: upgrade texinfo to 4.3d + +2003-01-29 Will Estes + + * flex.texi: the @copying construct works now; thanks to the texinfo + maintainers for finding the problem + +2003-01-21 Will Estes + + * NEWS, configure.in: version 2.5.27 + +2003-01-21 Will Estes + + * NEWS: flex now works with recent bison versions + +2003-01-18 John Millaway + + * flex.skl: Check for YYLTYPE_IS_DECLARED. This fixes bison-bridge + with latest bison. + +2003-01-15 Will Estes + + * NEWS, po/pt_BR.po: new pt_br translation + +2003-01-14 Will Estes + + * NEWS, configure.in: version 2.5.26 + +2003-01-14 Will Estes + + * NEWS: Fixed table deserialization bug on big-endian archs. Patch + sent from Bryce Nichols + +2003-01-12 John Millaway + + * tables_shared.h: Fixed table deserialization bug on big-endian + archs. Patch sent from Bryce Nichols . + +2003-01-10 Will Estes + + * README.cvs-snapshot: add version numbers for some tools and + explain about version.texi and --enable-maintainer-mode + +2003-01-10 Will Estes + + * NEWS: catch news up + +2003-01-09 John Millaway + + * 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 + + * flex.skl: Changed type of yyleng from size_t to int. This fixes + bug in PostgreSQL compilation. + +2003-01-09 Will Estes + + * NEWS: catch news up + +2003-01-09 Will Estes + + * flex.skl: more c++ fixes + +2003-01-09 Will Estes + + * Makefile.am, configure.in, flex.spec.in: add a spec file + +2003-01-09 Will Estes + + * flex.skl: type cast to pacify c++ compilers; patch from Bruce + Lilly + +2003-01-08 Will Estes + + * NEWS: new es translation + +2003-01-08 Will Estes + + * po/es.po: new spanish translation + +2002-12-19 John Millaway + + * gen.c: Fixed bug where YY_G(0) sometimes occurs (created by my + previous commit.) + +2002-12-17 John Millaway + + * gen.c: Fixed bug submitted by Bojan Smojver + where the use of yylineno, reentrant, and yymore together caused a + compile-time error. + +2002-12-17 Will Estes + + * NEWS: update NEWS + +2002-12-17 John Millaway + + * flex.texi: Documented new behavior with character ranges. + +2002-12-16 John Millaway + + * parse.y: Fixed bug submitted by Bruce Lilly + 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 + + * ccl.c, flexdef.h: Added utility functions to deal with character + case. + +2002-12-09 Will Estes + + * flexint.h: we don't really need int64 anyway + +2002-12-09 Will Estes + + * flex.skl: apparently some lints are happier with fllthrough + without a space + +2002-12-02 Will Estes + + * NEWS, configure.in: version 2.5.25 + +2002-12-02 Will Estes + + * Makefile.am: enclose flex.1 target in MAINTERNER_MODE + +2002-12-02 Will Estes + + * po/pt_BR.po: new pt_br translation + +2002-12-01 John Millaway + + * flex.texi: Indexed some more faqs. + +2002-11-29 John Millaway + + * flex.skl: Fixed bug in SECOND yyless definition where argument was + not enclosed in parentheses. + +2002-11-29 John Millaway + + * flex.skl: Fixed bug in yyless definition where argument was not + enclosed in parentheses. + +2002-11-27 Will Estes + + * NEWS: flex uses flex_int*_t types + +2002-11-27 Will Estes + + * flexint.h: integer types for non-C99 systems flexint.h + +2002-11-27 John Millaway + + * 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 + + * 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 + + * config.rpath: remove config.rpath + +2002-11-27 Will Estes + + * README-alpha: just list location of betas + +2002-11-26 Will Estes + + * flexint.h: __STDC_VERSION__ needs an L suffix + +2002-11-26 Will Estes + + * NEWS, po/LINGUAS, po/pt_BR.po: new pt_br translation from the + translation project + +2002-11-25 Will Estes + + * flexint.h: include inttypes.h for folks who really are C99 + +2002-11-25 Will Estes + + * TODO: fix a typo + +2002-11-25 Will Estes + + * NEWS, configure.in: version 2.5.24 + +2002-11-23 Will Estes + + * configure.in: try to make sure we have GNU m4 + +2002-11-23 Will Estes + + * tests/test-c++-multiple-scanners/Makefile.am: include + tests/test-c++-multipl-scanners/test.input + +2002-11-23 Will Estes + + * NEWS: more portability fixes + +2002-11-23 Will Estes + + * configure.in, flexdef.h: apparently on some BSD systems, we need + sys/params.h; reported by millaway + +2002-11-22 Will Estes + + * NEWS: update NEWS + +2002-11-22 John Millaway + + * 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 + + * flex.texi: renamed some faqs. + +2002-11-22 Will Estes + + * AUTHORS: update wording about authorship + +2002-11-17 John Millaway + + * parse.y: Removed space before line num in error messages to look + more like gcc's errors. + +2002-11-06 Will Estes + + * NEWS, po/tr.po: new turkish translation from the translation + project + +2002-10-28 Will Estes + + * gen.c: applied c++ from lilypond folks for std:: reasons + +2002-10-25 Will Estes + + * flex.texi: proofreading + +2002-10-24 Will Estes + + * flex.texi: proofreading + +2002-10-22 Will Estes + + * 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 + + * TODO: c++ rants + +2002-10-22 Will Estes + + * flex.texi: more proofreading + +2002-10-22 Will Estes + + * Makefile.am: include intent.pro; indent target is MAINTAINER_MODE + conditional + +2002-10-22 Will Estes + + * 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 + + * tables.c: Added a missing function prototype. + +2002-10-21 Will Estes + + * NEWS, configure.in: version 2.5.23 + +2002-10-21 Will Estes + + * NEWS: update NEWS on recent changes + +2002-10-21 Will Estes + + * flexint.h: use sys/types.h and not inttypes.h + +2002-10-21 Will Estes + + * configure.in: check for limits.h + +2002-10-21 Will Estes + + * TODO: update TODO on recent suggestions + +2002-10-21 Will Estes + + * flex.texi: titlepage and contents + +2002-10-21 Will Estes + + * Makefile.am: typo + +2002-10-21 Will Estes + + * 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 + + * flex.texi: typo. + +2002-10-18 Will Estes + + * flex.texi: report the current version info that flex provides; + reformat a list of non-posix features + +2002-10-18 Will Estes + + * NEWS: report the current version info that flex provides + +2002-10-18 Will Estes + + * flex.skl: FLEX_BETA defined if flex is beta + +2002-10-16 Will Estes + + * flexint.h: if we're doing c++, then we can't use long long + +2002-10-14 Will Estes + + * TODO: update TODO on several things + +2002-10-11 Will Estes + + * flex.texi: more proofreading + +2002-10-11 Will Estes + + * 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 + + * Makefile.am, configure.in: remove intl from dist + +2002-10-11 Will Estes + + * configure.in: we use maintainer mode now + +2002-10-11 Will Estes + + * NEWS: include create-test + +2002-10-11 Will Estes + + * 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 + + * tests/Makefile.am: use dist_noinst_scripts as per email from Akim + Demaille + +2002-10-10 John Millaway + + * flex.texi: Documentation. + +2002-10-10 Will Estes + + * NEWS, configure.in: version 2.5.22; portability fixes and attn to + the test suite + +2002-10-10 Will Estes + + * flexint.h: ok, this seems to work + +2002-10-10 Will Estes + + * 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 + + * tests/TEMPLATE/Makefile.am: sometimes we put header files in the + builddir and so we should account for that + +2002-10-10 Will Estes + + * tests/TEMPLATE/Makefile.am: replace the last instance + +2002-10-10 Will Estes + + * flex.skl: include unistd.h and not cunistd as cunistd only seems + to be present on very recent systems + +2002-10-10 Will Estes + + * 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 + + * configure.in, flex.skl, flexdef.h: current swipe at header magic; + int types be damned + +2002-10-08 Will Estes + + * NEWS: change version constant info to reflect change to flex.skl + +2002-10-08 Will Estes + + * Makefile.am: remove README-alpha option; add definitions for + FLEX_{MAJOR,MINOR,SUBMINOR}_VERSION + +2002-10-07 Will Estes + + * flex.skl, flexdef.h: ok, here goes; try to handle integral + typedefs in one swell foop + +2002-10-07 Will Estes + + * configure.in: we check for {u,}int*_t types; maybe this will + simplify things + +2002-10-07 Will Estes + + * configure.in: we create the tests/TEMPLATE/Makefile so that we can + build the dist archives + +2002-10-07 Will Estes + + * NEWS: more test suite cleanups + +2002-10-07 Will Estes + + * tests/test-c++-multiple-scanners/Makefile.am: we don't use header + files... + +2002-10-07 Will Estes + + * flexdef.h: remove include of malloc.h + +2002-10-04 Will Estes + + * flex.texi: more editing; remove examples index; merge examples + into concept index + +2002-10-04 Will Estes + + * 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 + + * flex.texi: yesterday's proofreading + +2002-10-02 Will Estes + + * flex.texi: proofread some more + +2002-10-02 Will Estes + + * flex.texi: proofread edit begins + +2002-10-01 Will Estes + + * 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 + + * 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 + + * 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 + + * 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 + + * Makefile.am: INCLUDES is obsolete; use AM_CPPFLAGS instead + +2002-09-27 Will Estes + + * configure.in: apparently, AM_CONFIG_HEADER is obsolete + +2002-09-27 Will Estes + + * TODO: integrate test suite into automake + +2002-09-27 Will Estes + + * configure.in: since we dont run the template test, we dont need to + generate its Makefile either + +2002-09-27 Will Estes + + * autogen.sh: use autoreconf instead of calling individual utilities + separately + +2002-09-27 Will Estes + + * configure.in: check for c++ compiler + +2002-09-27 Will Estes + + * configure.in: re-organize according to suggested layout in + autoconf manual + +2002-09-26 Will Estes + + * Makefile.am, NEWS, configure.in: update automake to 1.7 and + autoconf to 2.54 + +2002-09-26 Will Estes + + * Makefile.am: use AM_YFLAGS since YFLAGS is a user variable + +2002-09-25 Will Estes + + * 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 + + * Makefile.am, flex.skl, flex.texi: include a single, automatically + generated version number in flex scanners + +2002-09-23 Will Estes + + * tests/create-test: complain audibly when argument not supplied; + echo on stderr when writing error messages + +2002-09-23 Will Estes + + * 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 + + * tests/TEMPLATE/Makefile.am: not all compilers support '-I dir' so + we write '-Idir' instead + +2002-09-23 Will Estes + + * TODO: reorganize faq entries; proofread the manual + +2002-09-23 Will Estes + + * flex.texi: move c++ experimental warning to top of cxx node + +2002-09-20 Will Estes + + * 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 + + * NEWS: new smarter skeleton/scanner generation + +2002-09-20 John Millaway + + * flex.skl, misc.c: bison-bridge skel handled via %if/%endif pairs. + +2002-09-19 John Millaway + + * flex.skl, misc.c: reentrant skel handled via %if/%endif pairs. + +2002-09-19 John Millaway + + * 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 + + * flex.skl, main.c, misc.c, tables.h: Added %push and %pop + operations to skel processing. + +2002-09-17 Will Estes + + * NEWS, configure.in: flex 2.5.21 + +2002-09-17 John Millaway + + * tests/test-reject/Makefile.am: minor fixup for dist. + +2002-09-16 Will Estes + + * NEWS, configure.in: version 2.5.20 + +2002-09-16 Will Estes + + * flex.texi: correct typo + +2002-09-16 Will Estes + + * NEWS: note the new tables functionality + +2002-09-16 John Millaway + + * tests/test-multiple-scanners-r/.cvsignore, + tests/test-multiple-scanners-r/Makefile.am: Fixed `clean' target and + .cvsignore. + +2002-09-16 John Millaway + + * 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 + + * tests/test-reject/scanner.l: replace yytables_load with + yytables_fload as per millaway's other changes + +2002-09-15 John Millaway + + * TODO, flex.texi: Created user API for tables deserialization. + Documented API and --tables-* options in manual. + +2002-09-15 John Millaway + + * flex.skl, tests/test-table-opts/scanner.l: Tables deserialization + uses yyalloc/yyfree. Changed yytables_load to yytables_fload. + +2002-09-15 John Millaway + + * tests/test-bison-nr/.cvsignore: minor upkeep. + +2002-09-15 John Millaway + + * flex.texi: Categorized and indexed scanner options in manual. + +2002-09-15 John Millaway + + * flex.skl: Initialization of reject vars and %array vars in + reentrant scanner. + +2002-09-13 John Millaway + + * 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 + + * NEWS: millaway has been very busy + +2002-09-13 John Millaway + + * 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 + + * tests/test-bison-nr/.cvsignore: forgot to add .cvsignore on last + commit. + +2002-09-13 John Millaway + + * 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 + + * 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 + + * flex.texi: documentation of tabels api in manual + +2002-09-12 John Millaway + + * TODO, tables.c: Renamed *_fwrite to *_write to reflect writer + abstraction. + +2002-09-11 John Millaway + + * devel/tables.pl: Added perl script to read/dump serialized tables + in devel/ + +2002-09-11 Will Estes + + * 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 + + * NEWS, po/de.po: new de translation from the translation project + +2002-09-11 John Millaway + + * flex.skl: yytbl_load now checks tables set by name. Localized var + scaope in yytbl_load. + +2002-09-10 Will Estes + + * tests/Makefile.am: make clean before make test + +2002-09-09 John Millaway + + * TODO, flex.skl: Fixed deserialization of --fast tables. + +2002-09-09 Will Estes + + * TODO: fix typo; remove the yylineo entry + +2002-09-09 John Millaway + + * 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 + + * NEWS: flex has better internal diagnostics + +2002-09-09 Will Estes + + * configure.in, flexdef.h: test for presence of __func__ and + compensate if absent + +2002-09-09 Will Estes + + * Makefile.am: include the intl/ subdirectory when searching for + include files + +2002-09-09 Will Estes + + * NEWS, po/ru.po, po/sv.po: new sv, ru translations from the + translation project + +2002-09-07 John Millaway + + * flex.skl, misc.c: Changed cryptic skeleton markers to readable + form. + +2002-09-07 John Millaway + + * 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 + + * NEWS, po/ca.po: new ca translation + +2002-09-06 Will Estes + + * NEWS: new fr translation + +2002-09-06 Will Estes + + * po/fr.po: new french translation from the translation project + +2002-09-05 Will Estes + + * NEWS: c99 function defs by default + +2002-09-05 John Millaway + + * 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 + + * flex.skl, flex.texi: Flex generates C99 defs now. Documented the + above change in manual. + +2002-09-05 John Millaway + + * tests/test-table-opts/.cvsignore, + tests/test-table-opts/Makefile.am: Added serialization test to + table-opts test. + +2002-09-05 Will Estes + + * configure.in: oops, i made a typo + +2002-09-05 Will Estes + + * NEWS, configure.in: version 2.5.19 + +2002-09-05 Will Estes + + * scan.l: use FLEX_EXIT(), not exit() + +2002-09-05 John Millaway + + * 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 + + * scan.l: s/exit(1)/exit(EXIT_FAILURE) + +2002-09-05 John Millaway + + * dfa.c, gen.c: Tables are now generated with %option + tables-file=FILE. + +2002-09-05 Will Estes + + * NEWS: catch up on a few things + +2002-09-05 Will Estes + + * scan.l: prevent segfault on input lines which are longer than the + allocated space (problem report from Manoj Srivastava + ) + +2002-09-05 John Millaway + + * flex.texi, main.c, options.c, options.h: Changed option 'header' + to 'header-file'. 'header' still works, though. + +2002-09-05 John Millaway + + * 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 + + * flexdef.h, gen.c, tables.c, tables_shared.h: Lots of work on + tables serialization code. + +2002-09-04 Will Estes + + * README.cvs-snapshot: mention GNU indent + +2002-09-04 Will Estes + + * NEWS: remove the word after from the version line + +2002-09-03 Will Estes + + * NEWS, configure.in: version 2.5.18 + +2002-09-03 Will Estes + + * NEWS: catch up on the NEWS + +2002-09-03 Will Estes + + * 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 + + * 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 + + * configure.in: fixed bug whereby bison was reported missing even + when it was found + +2002-09-02 John Millaway + + * tables.c: In-code documentation. + +2002-09-02 John Millaway + + * flexdef.h: Forgot to indent before previous commit. + +2002-09-02 John Millaway + + * flexdef.h: Added known integer limits if undefined. + +2002-08-29 Will Estes + + * configure.in: version 2.5.17 + +2002-08-29 Will Estes + + * NEWS: more portability fixes; new version number + +2002-08-29 Will Estes + + * 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 + + * dfa.c: eat a blank line + +2002-08-29 Will Estes + + * NEWS: new config.{sub,guess} files; mention that we use indent on + flex + +2002-08-28 Will Estes + + * configure.in: warn if no indent found; version 2.5.16 + +2002-08-28 Will Estes + + * NEWS: catch up on recent changes; version 2.5.16 + +2002-08-27 Will Estes + + * 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 + + * Makefile.am: touch up the indent targeet; it's ready for + production use now + +2002-08-27 Will Estes + + * configure.in: test for GNU indent; reorder the tests somewhat + +2002-08-23 Will Estes + + * configure.in: automake is smarter about autoconf's versioning + scheme + +2002-08-23 Will Estes + + * NEWS: catch NEWS up on what we've been doing + +2002-08-22 Will Estes + + * flexdef.h: do some more conditional including for folks without + standard systems + +2002-08-22 Will Estes + + * tests/test-c++-basic/Makefile.am: use CXX to link the test scanner + here + +2002-08-22 John Millaway + + * flex.texi: Documentation. + +2002-08-22 John Millaway + + * Makefile.am: Created 'indent' target and added .indent.pro. + +2002-08-22 John Millaway + + * 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 + + * tests/test-bison-yylloc/Makefile.am, + tests/test-bison-yylval/Makefile.am: fixed missing 'clean' file. + +2002-08-22 John Millaway + + * 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 + + * README: official releases are being hosted by Vern + +2002-08-21 Will Estes + + * 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 + + * 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 + + * gen.c, nfa.c: More tabels work. + +2002-08-21 John Millaway + + * flexdef.h, gen.c, tables.c, tables_shared.h: More work on tables. + +2002-08-20 John Millaway + + * dfa.c: Cleaned up macros that took no ';'. + +2002-08-20 John Millaway + + * scanopt.c: Fixed oddball '=-'. + +2002-08-20 John Millaway + + * 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 + + * tables.c: More work on tables code. + +2002-08-20 Will Estes + + * Makefile.am, NEWS, configure.in: we're using m4 so have configure + test for it + +2002-08-20 John Millaway + + * Makefile.am, tables.c: Added tables.c and rebuilt dependencies. + +2002-08-20 John Millaway + + * TODO, flex.texi: Dicussed prototypes and header in manual. + +2002-08-19 John Millaway + + * Makefile.am, configure.in, flex.skl, flexdef.h, tables_shared.h: + More work on tables serialization. + +2002-08-19 John Millaway + + * Makefile.am, mkskel.sh: Skeleton is now passed through m4 (before + dist is built). + +2002-08-19 Will Estes + + * po/LINGUAS, po/zh_CN.po: add zh_cn translation from the + translation project + +2002-08-19 Will Estes + + * NEWS: millaway's done a lot of things which need to be mentioned + in NEWS + +2002-08-18 John Millaway + + * main.c: Removed #undef of start conditions. + +2002-08-17 John Millaway + + * TODO: todo list + +2002-08-17 John Millaway + + * 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 + + * flex.skl, flex.texi: Working on tables API. + +2002-08-16 John Millaway + + * 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 + + * flex.skl, flex.texi, misc.c: Prelimary work on tables API. + +2002-08-16 John Millaway + + * 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 + + * 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 + + * Makefile.am: Updated dependencies list. + +2002-08-15 John Millaway + + * main.c: Fixed seg fault bug in ecs. + +2002-08-15 Will Estes + + * 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 + + * configure.in: version 2.5.14 + +2002-08-15 Will Estes + + * NEWS: c-as-c++ tests reworked + +2002-08-15 John Millaway + + * 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 + + * main.c: conditionally include ; include config.h as well + +2002-08-15 Will Estes + + * configure.in, flex.skl: only include if we have it + +2002-08-15 Will Estes + + * NEWS: portability fixes; added missing punctuation; de translation + now included + +2002-08-15 Will Estes + + * po/LINGUAS: we also translate to german + +2002-08-15 Will Estes + + * Makefile.am: require automake at least 1.6 + +2002-08-15 Will Estes + + * NEWS, configure.in: version 2.5.13 + +2002-08-14 Will Estes + + * flex.texi: reverted away from the @copying as it breaks the info + reader + +2002-08-14 John Millaway + + * flex.texi, flexdef.h, main.c, misc.c: Start condition prefixes + attempts to adjust to user preferences. + +2002-08-13 John Millaway + + * main.c: Include start condition symbols in header. + +2002-08-13 John Millaway + + * flexdef.h, main.c: Omit user code and tables from generated header + file. + +2002-08-13 Will Estes + + * 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 + + * NEWS: printf fix and yylex_init reports errors + +2002-08-12 John Millaway + + * flex.texi: Updated manual for %option header. + +2002-08-12 John Millaway + + * flex.skl, flex.texi, gen.c: Fixed type mismatch in printf. + yylex_init now reports errors. + +2002-08-10 John Millaway + + * dfa.c, main.c: Added alignment flag for future use. + +2002-08-10 John Millaway + + * tests/test-table-opts/.cvsignore, + tests/test-table-opts/Makefile.am: Added options to test-table-opts + +2002-08-10 John Millaway + + * 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 + + * flex.texi: more faq editing; corrected mistyped nodenames + +2002-08-09 Will Estes + + * flex.skl: fix typo which propogates out to generated scanners + +2002-08-09 Will Estes + + * flex.texi: edited a few more faqs + +2002-08-09 Will Estes + + * Makefile.am, faq.texi: remove faq.texi as it's included in + flex.texi + +2002-08-08 Will Estes + + * flex.texi: a few more faq edits; remove faq-89 + +2002-08-08 Will Estes + + * flex.texi: cite, not site + +2002-08-08 Will Estes + + * flex.texi: and get the faq included + +2002-08-08 Will Estes + + * flex.texi: fix some grammer/typography in the top node and add a + detailed menu + +2002-08-08 Will Estes + + * TODO: we've updated gettext + +2002-08-08 Will Estes + + * po/.cvsignore: we need to ignore a few more gettext files + +2002-08-08 Will Estes + + * NEWS, configure.in: version 2.5.12 + +2002-08-08 Will Estes + + * NEWS: mention gettext; document the non-need for bison/flex in the + build process + +2002-08-08 Will Estes + + * Makefile.am, configure.in: include intl in the distribution and in + the build process + +2002-08-08 Will Estes + + * Makefile.am: builddir in help2man call needed @-signs around it + +2002-08-08 Will Estes + + * po/.cvsignore: we can ignore Makefile.in.in + +2002-08-08 Will Estes + + * m4/.cvsignore, m4/Makefile.am: oops, too hasty on deleting this + directory, sigh + +2002-08-08 Will Estes + + * 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 + + * 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 + + * TODO: we need to index the faq entries + +2002-08-07 Will Estes + + * faq.texi: proofed "Why do flex scanners call fileno if it is not + ANSI compatible?" + +2002-08-07 Will Estes + + * faq.texi: proofed "How do I expand \ escape sequences in C-style + quoted strings?" + +2002-08-07 Will Estes + + * README: changes to README to align with GNU coding standards + +2002-08-06 Will Estes + + * Makefile.am: help2man should look in builddir for the flex binary + +2002-08-02 John Millaway + + * flex.skl: Fixed yyunput prototype. + +2002-08-01 Will Estes + + * NEWS: new fr translation from the translation project + +2002-08-01 Will Estes + + * po/fr.po: new fr.po translation from the translation project + +2002-08-01 Will Estes + + * NEWS: yylineno performance hit is fixed + +2002-07-31 John Millaway + + * TODO, flex.texi: Updated docs on yylineno. + +2002-07-31 Will Estes + + * TODO: discuss yylineno performance + +2002-07-31 Will Estes + + * NEWS: forgot to say what the date was that we made the release + +2002-07-31 Will Estes + + * NEWS, configure.in: version 2.5.11 + +2002-07-31 Will Estes + + * faq.texi: fixed a menu entry and related problems + +2002-07-31 Will Estes + + * configure.in: someday, maybe we can use autopoint + +2002-07-31 Will Estes + + * Makefile.am: we need to include texinfo.tex now + +2002-07-31 Will Estes + + * texinfo.tex: add texinfo.tex + +2002-07-30 Will Estes + + * 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 + + * TODO: faqs need work + +2002-07-30 Will Estes + + * NEWS, TODO: prototypes get airtime these days + +2002-07-28 John Millaway + + * flex.skl: Added some comments. + +2002-07-28 John Millaway + + * flex.skl: Fixed bug where yyless did not consider yylineno. + +2002-07-28 John Millaway + + * scan.l: Fixed bug I created in previous commit. + +2002-07-28 John Millaway + + * scan.l: Don't wrap ()s around {NAMEDEFS} at the end of a rule. + +2002-07-27 John Millaway + + * 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 + + * 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 + + * 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 + + * NEWS: dist-bzip2 and rename yy_globals and yy_globals_t + +2002-07-24 Will Estes + + * configure.in: version 2.5.10 + +2002-07-24 Will Estes + + * Makefile.am: add dist-bzip2 to automake_options so we'll start + getting tar.bz2 archives + +2002-07-23 John Millaway + + * 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 + + * Makefile.am: typo in tags target + +2002-07-22 John Millaway + + * Makefile.am: Removed erroneous $(srcdir) from help2man target. + +2002-07-22 Will Estes + + * NEWS, configure.in: it's version 2.5.9 now + +2002-07-22 Will Estes + + * po/.cvsignore: updated gettext to 0.11.3 + +2002-07-22 Will Estes + + * 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 + + * autogen.sh, configure.in: rollback on configure.in and autogen.sh + because autpoint is broken + +2002-07-22 Will Estes + + * po/ru.po: new russian translation from translation project + +2002-07-19 Will Estes + + * 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 + + * configure.in: we're preparing for autopoint + +2002-07-17 John Millaway + + * flex.texi: Updated manual. + +2002-07-17 Will Estes + + * NEWS: update the NEWS file for lots of things millaway has done + +2002-07-17 John Millaway + + * 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 + + * faq.texi, flex.texi: Worked on mem mgmt sect of manual. + +2002-07-15 Will Estes + + * scan.l: allow blank lines and continuations in more places + +2002-07-12 Will Estes + + * TODO: millaway finished the faqs directory + +2002-07-12 Will Estes + + * TODO: removed items as per email from millaway + +2002-07-12 John Millaway + + * 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 + + * main.c, scan.l: Fixed POSIXLY_CORRECT detection in scanner. + +2002-07-11 John Millaway + + * faq.texi: More work on faq. + +2002-07-11 John Millaway + + * faq.texi: Moved all faqs into manual -- but did not evaluate them + yet. Removed the old faq files. + +2002-07-10 John Millaway + + * main.c: Removed duplicate definition of FLEX_DEBUG. gcc doesn't + care, but other compilers might. + +2002-07-10 John Millaway + + * flex.texi: Wrote some more about memory mgmt in the manual. + +2002-07-10 John Millaway + + * flex.texi: flex.texi now works with install-info. + +2002-07-10 Will Estes + + * TODO: added items as per email from millaway + +2002-07-10 Will Estes + + * NEWS: after we release a version, we have to keep the version + number in NEWS current + +2002-07-10 John Millaway + + * 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 + + * flex.skl: Memory functions are no longer static. + +2002-07-09 John Millaway + + * tests/test-mem-nr/test.input: Added a missing input file for + test-mem-nr/ + +2002-07-09 John Millaway + + * 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 + + * flex.texi: Added sections in manual for memory management. + +2002-07-09 Will Estes + + * NEWS: noted more user visible changes + +2002-07-09 John Millaway + + * 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 + + * NEWS: new POSIXLY_CORRECT and new ru translation + +2002-07-09 Will Estes + + * po/ru.po: new ru translation from the translation project + +2002-07-09 John Millaway + + * flex.texi: Made note of set/get debug in docs. + +2002-07-09 John Millaway + + * 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 . + +2002-07-09 John Millaway + + * main.c: Check POSIXLY_CORRECT env variable. + +2002-07-09 John Millaway + + * flex.skl: Added prototypes for the get/set debug functions. + +2002-07-09 John Millaway + + * 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 + + * tests/create-test: create-test script now modifies .cvsignore + +2002-07-09 John Millaway + + * tests/create-test: Improved the error checking. + +2002-07-03 Will Estes + + * main.c: fix bug whereby prefix didn't get passed to everybody; + patch by rse@engelschall.com + +2002-07-03 Will Estes + + * faq.texi: ~ is an active character, so we'll just use the word + 'about' + +2002-07-02 John Millaway + + * Makefile.am: Fixed typo. + +2002-07-02 John Millaway + + * faq.texi: Added a faq. + +2002-06-28 John Millaway + + * Makefile.am: Added 'tags' target -- something I should have done + long ago. + +2002-06-28 Will Estes + + * TODO: add two new items regarding coding; remove tests/ copyright + notice item as it's done + +2002-06-26 Will Estes + + * NEWS: note the copyright messages in tests/ + +2002-06-25 John Millaway + + * 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 + + * 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 + + * TODO: add bootstrapper to the todo list + +2002-06-19 Will Estes + + * configure.in: new version number + +2002-06-19 Will Estes + + * TODO: update TODO list + +2002-06-19 Will Estes + + * 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 + + * README-alpha: made code quality warning more explicit; gave url + for cvs and beta flex + +2002-05-23 John Millaway + + * gen.c: Fixed bug where omission of user section 3 caused unmatched + #ifdef's in generated code. + +2002-05-20 Will Estes + + * configure.in: configure.in requires at least autoconf 2.50 + +2002-05-13 John Millaway + + * Makefile.am: Updated my email address. + +2002-05-10 John Millaway + + * flexdef.h, misc.c: chomp'd lines when reading external skel file. + +2002-05-07 Will Estes + + * po/sv.po: new sweedish translation from the translation project + +2002-04-29 Will Estes + + * po/ca.po: new catalan translation from the translation project + +2002-04-29 Will Estes + + * po/es.po: new spanish translation from the translation project + +2002-04-25 Will Estes + + * 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 + + * flex.texi: note that the lex matching of abc{1,3} is the posix + behavior + +2002-04-23 Will Estes + + * configure.in: new version 2.5.7; use autoconf versioning info + +2002-04-23 Will Estes + + * NEWS: note changes in 2.5.7 + +2002-04-23 Will Estes + + * main.c: conditional compile gettext initialization + +2002-04-22 Will Estes + + * po/de.po: new german translation from the translation project + +2002-04-19 John Millaway + + * tests/test-include-by-reentrant/Makefile.am: Fixed command line + for test-include-by-reentrant/Makefile.am + +2002-04-19 John Millaway + + * 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 + + * flexdef.h, misc.c, parse.y, sym.c: Applied 'const' to a few more + char*, where appropriate. + +2002-04-19 John Millaway + + * 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 + + * flexdef.h, gen.c, misc.c: Changed 'char[]' to 'const char*' + wherever in conflicted with gettext. + +2002-04-19 Will Estes + + * po/fr.po, po/sv.po: new files from translation after 2.5.6 beta + release + +2002-04-18 John Millaway + + * tests/test-lineno-r/Makefile.am: Fixed minor typo/cut and paste + error. + +2002-04-18 John Millaway + + * configure.in: Added yylineno test. + +2002-04-18 John Millaway + + * tests/Makefile.am: Added yylineno tests. + +2002-04-18 John Millaway + + * 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 + + * scanopt.c: Applied gettext macros to error messages from scanopt. + +2002-04-15 John Millaway + + * 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 + + * 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 + + * TODO: a lot more work has happened to flex; note this by removing + a number of TODO entries + +2002-04-15 Will Estes + + * TODO: make sure all gettext modules use gettext translation + facilities + +2002-04-14 John Millaway + + * faq.texi: Converted faqs 34-41 to texinfo. + +2002-04-14 John Millaway + + * 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 + + * flexdef.h: defined FLEX_EXIT macro to call longjmp on errors. + +2002-04-13 John Millaway + + * 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 + + * scanopt.c: Fixed minor typo in error message + +2002-04-12 Will Estes + + * 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 + + * tests/test-yyextra/.cvsignore: ignore Makefile.in + +2002-04-12 Will Estes + + * tests/test-string-r/.cvsignore: it's Makefile.in, not makefile.in + +2002-04-12 Will Estes + + * tests/test-yyextra/Makefile.am, tests/test-yyextra/Makefile.in: + put test-yyextra under automake + +2002-04-12 Will Estes + + * tests/test-string-r/Makefile.am, tests/test-string-r/Makefile.in: + put test-string-r under automake + +2002-04-12 Will Estes + + * tests/test-string-nr/.cvsignore, tests/test-string-r/.cvsignore: + we can ignore Makefile.in + +2002-04-12 Will Estes + + * tests/test-string-nr/Makefile.am, + tests/test-string-nr/Makefile.in: put test-string-nr under automake + +2002-04-12 Will Estes + + * tests/test-pthread/.cvsignore: ignore Makefile.in + +2002-04-12 Will Estes + + * tests/test-pthread/Makefile.am, tests/test-pthread/Makefile.in: + put test-pthread under automake + +2002-04-12 Will Estes + + * tests/test-prefix-r/Makefile.am, tests/test-prefix-r/Makefile.in: + put test-prefix-r under automake + +2002-04-12 Will Estes + + * tests/test-prefix-nr/.cvsignore, tests/test-prefix-r/.cvsignore: + we can ignore Makefile.in + +2002-04-12 Will Estes + + * tests/test-prefix-nr/Makefile.am, + tests/test-prefix-nr/Makefile.in: put test-prefix-nr under automake + +2002-04-12 Will Estes + + * 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 + + * tests/test-multiple-scanners-nr/.cvsignore, + tests/test-multiple-scanners-r/.cvsignore: we can ignore Makefile.in + now + +2002-04-12 Will Estes + + * 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 + + * 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 + + * TODO: work done on the test suite; remove relevant entries from + TODO + +2002-04-10 Will Estes + + * 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 + + * tests/test-include-by-buffer/.cvsignore: we have a Makefile.in + which we need to ignore + +2002-04-09 Will Estes + + * 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 + + * tests/TEMPLATE/Makefile.am: and we want LFLAGS in the rule to make + scanner.c as well + +2002-04-09 Will Estes + + * 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 + + * tests/test-header-nr/.cvsignore: we now generate a Makefile.in + from automake; cvs should ignore it + +2002-04-09 Will Estes + + * tests/test-header-nr/Makefile.am: add dependencies for main.o and + scaner.h + +2002-04-09 Will Estes + + * tests/TEMPLATE/Makefile.am: We may want to have LFLAGS readily + available + +2002-04-09 Will Estes + + * tests/test-header-nr/Makefile.am, + tests/test-header-nr/Makefile.in: put test-header-nr under automake + +2002-04-09 Will Estes + + * tests/TEMPLATE/Makefile.am: oops, we need to clean objects too + +2002-04-09 Will Estes + + * 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 + + * 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 + + * 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 + + * tests/test-bison-yylval/Makefile.am, + tests/test-bison-yylval/Makefile.in: adding automake support + +2002-04-08 Will Estes + + * 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 + + * tests/configure.in: test suite changes + +2002-04-08 Will Estes + + * 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 + + * flex.texi: Corrected error in manual regarding return type for + yy_scan_{string,buffer,bytes}. + +2002-04-05 Will Estes + + * po/de.po: new german translations from the translation project + +2002-04-03 Will Estes + + * po/es.po: new spanish translations + +2002-04-01 Will Estes + + * 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 + + * main.c: fix typo in comment + +2002-03-31 John Millaway + + * main.c: Documented the header file kludge, (in anticipation of + buffering Section 1.) + +2002-03-31 John Millaway + + * flex.texi: Created appendix "Makefiles and Flex" in the manual. + +2002-03-30 John Millaway + + * flex.texi: updating manual. + +2002-03-29 Will Estes + + * po/POTFILES.in: we want parse.y, not parse.c + +2002-03-29 John Millaway + + * flex.texi: Indexing the manual (75% done). + +2002-03-29 Will Estes + + * Makefile.am: unlisted intermediate flex/yacc-created files + +2002-03-29 Will Estes + + * TODO: millaway has done more work + +2002-03-29 Will Estes + + * 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 + + * Makefile.am: fine tune flex.1 some more + +2002-03-29 Will Estes + + * Makefile.am, configure.in: generalize the manpage a bit and tell + autofoo about help2man + +2002-03-29 Will Estes + + * po/da.po: new danish from translation project robot + +2002-03-28 John Millaway + + * flex.texi: Indexing the manual -- it's only half done. + +2002-03-28 John Millaway + + * flex.texi: flex manual now uses automake's versioning info. + +2002-03-28 John Millaway + + * README.cvs-snapshot: Mentioned requirements for gettext and + help2man. + +2002-03-28 John Millaway + + * 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 + + * TODO: millaway has done a lot on the TODO list; remove those items + that he has take care of + +2002-03-27 Will Estes + + * README.cvs-snapshot: edited millaway's initial draft + +2002-03-27 John Millaway + + * README.cvs-snapshot: Created file. + +2002-03-27 John Millaway + + * flex.texi: Fixed case of node names in flex.texi. + +2002-03-24 Will Estes + + * TODO: lex- and yacc- generated files + +2002-03-24 Will Estes + + * po/fr.po: new french + +2002-03-18 Will Estes + + * NEWS: ending periods in news items removed; mention nounistd + options + +2002-03-18 Will Estes + + * po/sv.po: updated sweedish translations + +2002-03-18 Will Estes + + * po/de.po: german translation + +2002-03-18 John Millaway + + * 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 + + * po/tr.po: new turkish translation + +2002-03-15 Will Estes + + * NEWS: mention included translations + +2002-03-15 Will Estes + + * TODO: we've done the gettext thing, but sometime we should get + 0.11.1 + +2002-03-15 Will Estes + + * po/ca.po: new catalan translation + +2002-03-14 John Millaway + + * flex.texi: Added section on format of comments. + +2002-03-14 John Millaway + + * flex.texi: Split format chapter into sections. + +2002-03-14 John Millaway + + * flex.texi: Removed explicit pointers in node definitions. + +2002-03-14 Will Estes + + * configure.in: unistd.h can be problematic + +2002-03-14 Will Estes + + * tests/README: editing changes to README + +2002-03-13 Will Estes + + * po/POTFILES.in: scan.l, not scan.c because gettext gets confused + +2002-03-13 Will Estes + + * scan.l: gettext cruft + +2002-03-13 Will Estes + + * tests/descriptions: separate out test descriptions + +2002-03-13 Will Estes + + * po/LINGUAS: french and korean dont crash now + +2002-03-12 Will Estes + + * po/fr.po, po/ko.po: remove duplicate messages as per advice from + Jordi Mallach + +2002-03-12 Will Estes + + * gettext.h: yes, more gettext cruft + +2002-03-12 Will Estes + + * 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 + + * NEWS: gettext and autofoo are now involved + +2002-03-12 Will Estes + + * Makefile.am, autogen.sh, configure.in, flexdef.h, main.c: mostly, + changes for gettext + +2002-03-12 Will Estes + + * 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 + + * TODO: note about cvs documentation + +2002-03-12 Will Estes + + * po/LINGUAS: we now have turkish + +2002-03-12 Will Estes + + * po/tr.po: updated translations, i think + +2002-03-12 Will Estes + + * 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 + + * README-alpha: README-alpha for those bad-hair days + +2002-03-12 Will Estes + + * m4/.cvsignore, m4/Makefile.am: ok,now we kinda have a m4/ subdir + for gettext + +2002-03-12 Will Estes + + * 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 + + * po/ca.po: removing po files, maybe + +2002-03-12 Will Estes + + * tests/.cvsignore: ignore autom4te.cache + +2002-03-11 Will Estes + + * 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 + + * 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 + + * README: eliminate to.do and faqs from the README file + +2002-03-06 Will Estes + + * TODO: more notes on tests/ + +2002-03-06 Will Estes + + * 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 + + * configure.in: we want to generate Makefiles in some more + subdirectories; automake will like this + +2002-03-06 Will Estes + + * TODO: notes on subdirectories + +2002-03-05 Will Estes + + * examples/.cvsignore, examples/Makefile.am: now examples/ fits into + automake + +2002-03-05 Will Estes + + * examples/fastwc/.cvsignore, examples/fastwc/Makefile.am: + examples/fastwc now fits into automake + +2002-03-05 Will Estes + + * 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 + + * examples/manual/Makefile: renamed Makefile to Makefile.examples + for automake's sake + +2002-03-04 Will Estes + + * Makefile.am: add parse.c and scan.c to built_sources + +2002-02-24 John Millaway + + * 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 + + * tests/Makefile.in: Converted test script to portable /bin/sh. + +2002-02-22 John Millaway + + * tests/test-bison-yylloc/Makefile.in: Added some spaces in shell + scripts for portability. + +2002-02-22 John Millaway + + * tests/create-test.pl: Fixed #! line for portability. + +2002-02-22 John Millaway + + * tests/test-bison-yylloc/Makefile.in: Fixed return status code on + bison-lloc test. + +2002-02-21 John Millaway + + * tests/create-test.pl: Added script to auto-create tests. Probably + overkill. + +2002-02-21 John Millaway + + * 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 + + * 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 + + * flex.skl: Added missing #endif. + +2002-02-07 Will Estes + + * 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 + + * gen.c: fix interrupted reads and freads; from the debian package + maintainer + +2002-02-06 Will Estes + + * flex.texi, flexdef.h, main.c, nfa.c: support large flex tables; + from debian package maintainer + +2002-01-29 Will Estes + + * tests/configure.in: add more output files to account for new tests + +2002-01-03 Will Estes + + * 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 + + * 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 + + * flex.skl, main.c: millaway: Fixed yytext_ptr when using %array in + reentrant scanner + +2001-11-20 Will Estes + + * buf.c: oops, forgot this one line + +2001-11-14 Will Estes + + * 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 + + * 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 + + * 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 + + * NEWS: now NEWS has forgotten about the _r variables + +2001-10-26 Will Estes + + * 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 + + * main.c, options.c, options.h: more from millaway + +2001-10-22 Will Estes + + * main.c, options.c, options.h: the last checkin was broken; + millaway fixed it + +2001-10-22 Will Estes + + * 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 + + * flex.skl: flex.skl should come up in C mode + +2001-10-21 Will Estes + + * flex.skl: apparently, isatty and c++ need help getting along (from + octave) + +2001-10-19 Will Estes + + * NEWS: document new options and new option handling + +2001-10-19 Will Estes + + * TODO: tell emacs that TODO is a text/outline mode file + +2001-10-19 Will Estes + + * TODO: we have new long options; we need to document that + +2001-10-19 Will Estes + + * NEWS: tell emacs that NEWS is text/outline mode + +2001-10-19 Will Estes + + * flex.skl: oops, lost a line somewhere in the merge process on + millaway's work + +2001-10-17 Will Estes + + * 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 + + * main.c: Fixed typo in options display + +2001-09-20 Will Estes + + * main.c: reentrant and non-reentrant scanners share the same yywrap + MACRO. millaway + +2001-09-20 Will Estes + + * TODO: clarify item on comments in lexical files + +2001-09-20 Will Estes + + * NEWS, scan.l: now flex recognizes \r as an eol character + +2001-09-20 Will Estes + + * Makefile.am: specify cvsroot so automake distcheck works + +2001-09-19 Will Estes + + * flex.texi: tex has lost its mind; we remove parentheses to + compensate + +2001-09-19 Will Estes + + * NEWS: now that c++ is better supported, let's mention it as a news + item + +2001-09-19 Will Estes + + * 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 + + * 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 + + * main.c: remove argv_fixup; fix typo in error message; changes from + millaway's branch + +2001-08-24 Will Estes + + * NEWS: mention no more c++ comments in c scanners + +2001-08-21 John Millaway + + * flex.skl: Changed // comments to /* */ comments in skeleton. + +2001-08-19 John Millaway + + * flex.texi: Changed @var to @code everywhere. + +2001-08-16 Will Estes + + * to.do/flex.rmail: more mail + +2001-08-16 Will Estes + + * TODO: the manual now has its own section; we're not adding + comments either + +2001-08-04 John Millaway + + * 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 + + * TODO: note jason's thoughts on having a manpage + +2001-08-03 Will Estes + + * TODO: note millaway's assignment and tests to be under flex + license + +2001-08-01 John Millaway + + * 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 + + * autogen.sh: fake automake into believing that ChangeLog already + exists + +2001-08-01 Will Estes + + * Makefile.am: millaway needs to be covered in the ChangeLog + +2001-08-01 Will Estes + + * version.h: automake is supplying version info now so we just pick + it up + +2001-08-01 Will Estes + + * flex.texi: forgot braces on @copyright + +2001-08-01 John Millaway + + * flex.skl: Added missing argument to yy_flex_free. + +2001-08-01 Will Estes + + * AUTHORS: john millaway wrote the reentrant C support + +2001-08-01 Will Estes + + * flex.texi: add license node to the manual + +2001-08-01 Will Estes + + * TODO: c++ ideas + +2001-07-31 Will Estes + + * parse.y: error messages will now show up the way that emacs likes + them + +2001-07-31 Will Estes + + * Makefile.am: oops, left in an extra backslash + +2001-07-31 Will Estes + + * TODO: flex.texi is here; clarify tests/ rewrite issue + +2001-07-31 Will Estes + + * NEWS: hey, we have texinfo, not man + +2001-07-31 Will Estes + + * flex.1: no more manpage + +2001-07-31 Will Estes + + * Makefile.am: remove flex.1 and rewrite the dist-hook so that we + pick up a couple more directories + +2001-07-31 Will Estes + + * flex.texi: the namual now compiles; hurray + +2001-07-31 Will Estes + + * Makefile.am: first attempt at including the tests/ directory via + automake, dist-hook target added + +2001-07-31 Will Estes + + * tests/.cvsignore: ignore config.cache in tests/ directory + +2001-07-31 Will Estes + + * Makefile.am: automake groks the ChangeLog now so we don't have to + remind the maintainer to remake it + +2001-07-30 Will Estes + + * flex.texi: more corrections to the manual; the end is in site + +2001-07-30 Will Estes + + * TODO: auto-generated backup? + +2001-07-27 Will Estes + + * flex.texi: today's tinkering on the manual + +2001-07-27 Will Estes + + * Makefile.am: if we want flex.1 we have to say so in EXTRA_DIST + +2001-07-27 Will Estes + + * TODO: note future issues with flex.texi + +2001-07-27 Will Estes + + * Makefile.am: include flex.1 as it's the only working documentation + for now + +2001-07-27 Will Estes + + * Makefile.am: rearrange to work with automake on building the + ChangeLog + +2001-07-27 Will Estes + + * scan.l: automake is unhappy if we specify the outfile + +2001-07-26 Will Estes + + * flex.texi: more conversions/corrections + +2001-07-26 Will Estes + + * README: we removed misc/ so we don't mention it any more + +2001-07-25 Will Estes + + * flex.texi: begin the manual conversion to texinfo; yes, it's + broken right now + +2001-07-25 Will Estes + + * AUTHORS, THANKS: copy in manual author and thanks info + +2001-07-25 Will Estes + + * Makefile.am: how to fake the ChangeLog into showing up in the + distribution + +2001-07-25 Will Estes + + * Makefile.am: add YFLAGS so parse.h gets made + +2001-07-24 Will Estes + + * 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 + + * TODO: reflect recent doings + +2001-07-24 Will Estes + + * Makefile.in: what with automake, we don't need Makefile.in any + more + +2001-07-24 Will Estes + + * configure.in: more rearranging for automake + +2001-07-24 Will Estes + + * to.do/flex.rmail: more mail came in + +2001-07-24 Will Estes + + * autogen.sh: adjust to automake's idea of the world + +2001-07-24 Will Estes + + * 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 + + * NEWS: rearrange for better order; add automake support as a news + item + +2001-07-24 Will Estes + + * Makefile.am: copyright notice on Makefile.am; document some -D + switches (are they still usable?) + +2001-07-24 Will Estes + + * TODO: add lex-replacement issue + +2001-07-24 Will Estes + + * Makefile.am: add EXTRA_DIST + +2001-07-23 Will Estes + + * autogen.sh: we need to do the same thing in each directory + +2001-07-23 Will Estes + + * configure.in: introduce automake into the macro calls + +2001-07-23 Will Estes + + * Makefile.am: add AUTOMAKE_OPTIONS, info_TEXINFOS, include_HEADERS, + noinst_HEADERS; it's libfl.a, not libflex.a + +2001-07-23 Will Estes + + * Makefile.am: bin_PROGRAMS and lib_LIBRARIES + +2001-07-23 Will Estes + + * to.do/streams.mail: streams.mail has moved here + +2001-07-23 Will Estes + + * TODO: add xref for teximanual + +2001-07-19 Will Estes + + * flex.1: include typo/punctuation fixes from a patch submitted by + noon@cote-dazur.com (Fabrice Bauzac) + +2001-07-17 Will Estes + + * TODO: we want gettext + +2001-06-24 Will Estes + + * flex.skl: include c++ STD fixes from quanstro@quanstro.net + +2001-06-24 Will Estes + + * flex.skl, gen.c: change some int types to size_t as per FreeBSD + 28364 from avn@any.ru + +2001-06-24 Will Estes + + * TODO: remove parse.[ch] from make clean target; repackage + distribution (not rework) + +2001-06-19 Will Estes + + * TODO: add memory api and reworking of flex.skl reworking + +2001-06-18 Will Estes + + * flex.skl: remove extraneous notice from flex.skl + +2001-06-18 Will Estes + + * flex.skl: patch memory leak as per millaway + +2001-06-17 Will Estes + + * to.do/flex.rmail: add vern's ok for copyright/license changes and + john's answer on line offsets + +2001-06-17 Will Estes + + * TODO: remove creation of .cvsignore files (it's done); add other + notes about the test suite + +2001-06-17 Will Estes + + * 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 + + * tests/README: reformat, say to add a description to this file and + mention what to do re .cvsignore + +2001-06-17 Will Estes + + * tests/TEMPLATE/cvsignore: create template for .cvsignore + +2001-06-17 Will Estes + + * TODO: reorganize for logical reasons; test suite now seems to run + out of the box + +2001-06-17 Will Estes + + * tests/.cvsignore: we dont want the Makefile either + +2001-06-17 Will Estes + + * tests/test-prefix-nr/test.input, tests/test-prefix-r/test.input: + test.input was supposed to be here + +2001-06-17 Will Estes + + * tests/.cvsignore: add autoconf legacy files to be ignored + +2001-06-17 Will Estes + + * autogen.sh: clarify usage instructions; prepare tests/ as well + +2001-06-17 Will Estes + + * tests/.cvsignore: . cvsignore for tests/ subdirectory + +2001-06-17 Will Estes + + * FlexLexer.h: tell emacs that FlexLexer.h is c++ + +2001-06-17 Will Estes + + * scan.l: tell emacs scan.l is in C mode + +2001-06-17 Will Estes + + * flex.skl: added punctuation + +2001-06-17 Will Estes + + * 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 + + * to.do/flex.rmail: add bill fenlason's emails + +2001-06-15 Will Estes + + * COPYING: make changes as per Theo De Raadt; remove tabs + +2001-06-08 Will Estes + + * flex.skl: save errno as per Theo de Raadt + +2001-06-07 Will Estes + + * flex.1: correct hyphenation as per openbsd tree + +2001-06-05 Will Estes + + * Makefile.in, configure.in: change references to TESTS/ to tests/ + to account for the directory name changes + +2001-05-27 Will Estes + + * flex.skl, gen.c: commit john millaway's YY_G wrapper corrections + +2001-05-21 Will Estes + + * tests/Makefile.in: remove || exit calls + +2001-05-21 Will Estes + + * gen.c: complete john millaway's reentrant patch + +2001-05-21 Will Estes + + * to.do/flex.rmail: more flex messages in the queue + +2001-05-18 Will Estes + + * flex.skl, flexdef.h, gen.c, main.c, nfa.c, scan.l: john millaway's + reentrancy patch + +2001-05-18 Will Estes + + * tests/Makefile.in: remove || exit from testing loop + +2001-05-18 Will Estes + + * Makefile.in: tell make about the tests directory and its + associated targets + +2001-05-18 Will Estes + + * TODO: rethink the todo list + +2001-05-18 Will Estes + + * flex.1: describe reentrant api changes + +2001-05-18 Will Estes + + * TODO: mention work needed for tests/ + +2001-05-18 Will Estes + + * configure.in: tell auto* about the test directory + +2001-05-18 Will Estes + + * README: make punctuation uniform, mention the new tests/ directory + +2001-05-18 Will Estes + + * NEWS: reformat items; cut out old items and move them to ONEWS + +2001-05-18 Will Estes + + * ONEWS: move old NEWS items to ONEWS + +2001-05-18 Will Estes + + * 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 + + * to.do/flex.rmail: more mail in flex.rmail + +2001-05-03 Will Estes + + * 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 + + * README: mention RoadMap + +2001-05-01 Will Estes + + * 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 + + * README: mention misc/ directory + +2001-05-01 Will Estes + + * version.h: version is 2.5.5b + +2001-05-01 Will Estes + + * Makefile.in: remove header from top; add rule to generate + initscan.c just in case + +2001-05-01 Will Estes + + * configure.in: dont check for initscan.c; check for scan.l instead + +2001-05-01 Will Estes + + * RoadMap: list of source files + +2001-05-01 Will Estes + + * README: rewrite README to reflect changes in layout of directories + +2001-05-01 Will Estes + + * AUTHORS, THANKS, TODO: initial attempt at the files + +2001-05-01 Will Estes + + * COPYING: add 2001 copyright notice + +2001-05-01 Will Estes + + * autogen.sh: initial attempt at a bootstrap script for developers + +2001-05-01 Will Estes + + * flex.texi: texinfo manual, old contributed version + +2000-08-21 Vern Paxson + + * flex.1: fixed some bugs in examples of [[:...:]] ccls + +2000-08-21 Vern Paxson + + * version.h: version shipped to Dick King + +2000-08-21 Vern Paxson + + * flex.skl: explicit include of iostream.h + +2000-08-21 Vern Paxson + + * scan.l: if a newline is seen in , assume it + terminates the string. + +2000-08-21 Vern Paxson + + * flexdef.h, sym.c: moved symbol table definitions from flexdef.h + into sym.c + +2000-08-21 Vern Paxson + + * dfa.c: fixed underallocation for accset + +1997-06-27 Vern Paxson + + * COPYING: revised for rms + +1997-06-23 Vern Paxson + + * flex.skl: fixed memory leak + +1997-06-23 Vern Paxson + + * flex.1: input() doesn't destroy yytext + +1997-06-23 Vern Paxson + + * FlexLexer.h: wrapped with extern "C++" + +1996-12-13 Vern Paxson + + * flex.skl: use delete [] for yy_state_buf + +1996-10-29 Vern Paxson + + * flex.skl: fixed %option noinput + +1996-10-29 Vern Paxson + + * flex.skl: free(char*) fix ... Sigh ... + +1996-10-11 Vern Paxson + + * gen.c: bug fix for yymore()/yylineno interaction + +1996-10-11 Vern Paxson + + * gen.c: fixed memory leak + +1996-09-10 Vern Paxson + + * NEWS: release 2.5.4 + +1996-09-10 Vern Paxson + + * Makefile.in: more stuff for distclean + +1996-09-10 Vern Paxson + + * flex.skl: "str" -> "yy_str" + +1996-09-10 Vern Paxson + + * version.h: 2.5.4 + +1996-07-02 Vern Paxson + + * flex.skl: (attempted) fix for input() crossing a file boundary + +1996-05-29 Vern Paxson + + * NEWS: don't do Acorn diffs + +1996-05-29 Vern Paxson + + * NEWS: some minor additions for 2.5.3 + +1996-05-29 Vern Paxson + + * NEWS, version.h: 2.5.3 + +1996-05-25 Vern Paxson + + * flex.skl: initialize yy_more_offset etc. for yyFlexLexer class + +1996-05-25 Vern Paxson + + * flex.skl: niggling cosmetic tweak + +1996-05-25 Vern Paxson + + * flex.skl: bug fixes for yymore (especially with %array) + +1996-05-25 Vern Paxson + + * gen.c: yymore + %array tweaks + +1996-05-25 Vern Paxson + + * FlexLexer.h: added yy_{,prev_}more_offset + +1996-05-25 Vern Paxson + + * main.c: removed decl of unused library function + +1996-05-25 Vern Paxson + + * flex.skl: snapshot of cscope yymore fixes, prior to switching + yymore-on-%array approach + +1995-12-18 Vern Paxson + + * gen.c: don't stack states on NUL-transitions that are jams + +1995-09-27 Vern Paxson + + * libmain.c: fixed re Esmond Pitt's ancient suggestion + +1995-04-28 Vern Paxson + + * misc.c: ANSI C / Solaris tweak + +1995-04-24 Vern Paxson + + * flex.1: credits + +1995-04-24 Vern Paxson + + * NEWS: multiple FlexLexer.h includes + +1995-04-24 Vern Paxson + + * FlexLexer.h: fix multiple inclusions + +1995-04-24 Vern Paxson + + * scan.l: lint tweak + +1995-04-24 Vern Paxson + + * flex.1: typo fixed + +1995-04-24 Vern Paxson + + * flex.1: credits update + +1995-04-24 Vern Paxson + + * flex.skl: (char*) cast for realloc + +1995-04-24 Vern Paxson + + * NEWS: (char*) tweak + +1995-04-21 Vern Paxson + + * NEWS: VMS update for 2.5.2 + +1995-04-21 Vern Paxson + + * Makefile.in: clarify when 8-bit scanners are created by default, + vs. 7-bit + +1995-04-21 Vern Paxson + + * parse.y: reworked alloca() chud, from Francois + +1995-04-20 Vern Paxson + + * NEWS, version.h: 2.5.2 + +1995-04-20 Vern Paxson + + * flex.1: 2.5.2 update + +1995-04-20 Vern Paxson + + * dfa.c, main.c: const -> yyconst + +1995-04-20 Vern Paxson + + * Makefile.in: fixed some old libfl.a references + +1995-04-20 Vern Paxson + + * Makefile.in: some (but not all) of Francois' tweaks + +1995-04-20 Vern Paxson + + * configure.in: tweaks from Francois + +1995-04-20 Vern Paxson + + * flex.skl: yy_delete_buffer allows nil buffer pointer + +1995-04-20 Vern Paxson + + * main.c: do_stdinit now defaults to false + +1995-04-20 Vern Paxson + + * FlexLexer.h: remove first default for yylex(new_in, new_out) + +1995-04-20 Vern Paxson + + * flex.skl: rearrange some definitions; fix YY_NO_UNPUT + +1995-04-20 Vern Paxson + + * parse.y: more alloca() bullshit + +1995-04-20 Vern Paxson + + * misc.c: octal escape sequence must have just digits 0-7 + +1995-04-20 Vern Paxson + + * scan.l: '-' means stdin octal escape sequence must just be digits + 0-7 + +1995-04-20 Vern Paxson + + * main.c: -- terminates options + +1995-04-20 Vern Paxson + + * flexdef.h: added dataflush() prototype + +1995-04-20 Vern Paxson + + * misc.c: move dataflush, otoi prototypes into flexdef.h + +1995-04-20 Vern Paxson + + * flex.skl, gen.c: const -> yyconst + +1995-04-20 Vern Paxson + + * gen.c: fixed bug in needing yy_cp for -Cf w/ backing up + +1995-03-28 Vern Paxson + + * README, flex.1: Stan Adermann credit + +1995-03-27 Vern Paxson + + * README: beta-tester update + +1995-03-27 Vern Paxson + + * NEWS, version.h: 2.5.1 + +1995-03-27 Vern Paxson + + * flex.1: update date for 2.5.1 release, some feedbacker credits + +1995-03-27 Vern Paxson + + * gen.c: fixed lint problem with declaring yy_cp unnecessarily + +1995-03-27 Vern Paxson + + * dfa.c: {}'s around full-table initializations + +1995-03-21 Vern Paxson + + * README: for version 2.5 + +1995-03-21 Vern Paxson + + * flex.1: added note regarding yylineno should be maintained on a + per-buffer basis + +1995-03-21 Vern Paxson + + * NEWS: new C++ member functions + +1995-03-21 Vern Paxson + + * NEWS, flex.1: 2.5.0.8 update + +1995-03-21 Vern Paxson + + * main.c: rename yylineno if -P + +1995-03-20 Vern Paxson + + * flexdef.h: do_yylineno MARKER_DIFFERENCE depends on MAXIMUM_MNS + +1995-03-20 Vern Paxson + + * Makefile.in: removed redundant skel.c from DISTFILES + +1995-03-20 Vern Paxson + + * FlexLexer.h: debug(), setdebug(), lineno() + +1995-03-20 Vern Paxson + + * flex.skl: %option yylineno support + +1995-03-20 Vern Paxson + + * gen.c: read up to newline for interactive reads, rather than one + char + +1995-03-20 Vern Paxson + + * main.c, scan.l: added %option yylineno + +1995-03-18 Vern Paxson + + * gen.c: added do_yylineno + +1995-03-06 Vern Paxson + + * NEWS, flex.1: 2.5.0.7 + +1995-03-05 Vern Paxson + + * Makefile.in: realclean -> maintainer-clean + +1995-03-05 Vern Paxson + + * flex.skl: Added yy_flush_buffer + +1995-03-05 Vern Paxson + + * FlexLexer.h: added yy_flush_buffer + +1995-03-05 Vern Paxson + + * main.c: prefix support for yy_flush_buffer + +1995-03-05 Vern Paxson + + * parse.y: added %option yyclass + +1995-03-05 Vern Paxson + + * flexdef.h, main.c, scan.l: added yyclass + +1995-03-05 Vern Paxson + + * FlexLexer.h: Added switch_streams + +1995-03-05 Vern Paxson + + * flex.skl: added switch_streams + +1995-03-05 Vern Paxson + + * main.c: don't rename yy_flex_debug for C++ + +1995-03-05 Vern Paxson + + * gen.c: yy_flex_debug extern only if not C++ + +1995-03-05 Vern Paxson + + * FlexLexer.h: added yy_flex_debug member variable + +1995-03-05 Vern Paxson + + * flex.skl: yyFlexLexer initialization of yy_flex_debug + +1995-03-04 Vern Paxson + + * flexdef.h, main.c: VMS POSIX stuff + +1995-03-04 Vern Paxson + + * flex.skl: moved position of yy_init = 0 + +1995-03-04 Vern Paxson + + * flex.skl: added YY_EXIT_FAILURE + +1995-03-04 Vern Paxson + + * main.c: removed VMS-specific exit + +1995-03-04 Vern Paxson + + * 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 + + * main.c: do yy_flex_debug prefix for both C++ and C + +1995-02-06 Vern Paxson + + * main.c: fixed program_name tweak again + +1995-01-11 Vern Paxson + + * main.c: oops, fixed program_name tweak + +1995-01-11 Vern Paxson + + * main.c: program_name is "flex" if argv[0] nil + +1995-01-10 Vern Paxson + + * NEWS: 2.5.0.5 + +1995-01-10 Vern Paxson + + * flex.1: Documented YY_NUM_RULES + +1995-01-10 Vern Paxson + + * Makefile.in: added formatted man page to MISC + +1995-01-10 Vern Paxson + + * main.c: help messages to stdout + +1995-01-09 Vern Paxson + + * gen.c: Added YY_NUM_RULES + +1995-01-09 Vern Paxson + + * flex.skl: better fix for #pragma problem + +1995-01-09 Vern Paxson + + * flexdef.h: better fix for #pragma portability problem + +1995-01-09 Vern Paxson + + * misc.c: "# line" -> #line + +1995-01-09 Vern Paxson + + * flex.skl, flexdef.h: comment out Turbo C #pragma's + +1995-01-09 Vern Paxson + + * scan.l: reset linenum on new file + +1995-01-09 Vern Paxson + + * flex.skl: isatty() extern + +1995-01-09 Vern Paxson + + * NEWS, flex.1: 2.5.0.4 + +1995-01-09 Vern Paxson + + * main.c: long options, VMS tweaks + +1995-01-09 Vern Paxson + + * Makefile.in: Added parse.c, parse.h for dist MISC directory + +1995-01-09 Vern Paxson + + * flexdef.h: some "const" cleansing + +1995-01-09 Vern Paxson + + * mkskel.sh: skel[] is now const + +1995-01-09 Vern Paxson + + * misc.c: some const cleansing + +1995-01-09 Vern Paxson + + * scan.l: #line in section 1 + +1995-01-05 Vern Paxson + + * sym.c: preen + +1994-12-29 Vern Paxson + + * configure.in: config.h from conf.in + +1994-12-29 Vern Paxson + + * flexdef.h: for VMS, delete -> remove + +1994-12-29 Vern Paxson + + * Makefile.in: config.h.in -> conf.in rm config.h on distclean + +1994-12-29 Vern Paxson + + * main.c: stdinit tweaks + +1994-12-29 Vern Paxson + + * scan.l: added nostdinit + +1994-12-28 Vern Paxson + + * NEWS: added MS-DOS note for 2.5.0.2 + +1994-12-28 Vern Paxson + + * flex.1: typos, tweaks + +1994-12-28 Vern Paxson + + * Makefile.in: removed flexdoc + +1994-12-28 Vern Paxson + + * flex.1: flexdoc/flex merge + +1994-12-28 Vern Paxson + + * flex.1: typos + +1994-12-28 Vern Paxson + + * NEWS: typo + +1994-12-28 Vern Paxson + + * flex.1: 2.5 update + +1994-12-28 Vern Paxson + + * NEWS: 2.5.0.2 + +1994-12-28 Vern Paxson + + * scan.l: fixed sense of %option main implying %option noyywrap + +1994-12-28 Vern Paxson + + * flex.skl: YY_FLEX_{MAJOR,MINOR}_VERSION fixed bug in unput + trashing yytext even with %array + +1994-12-17 Vern Paxson + + * flex.1: prior to 2.5 update + +1994-12-17 Vern Paxson + + * main.c: C++/-P fixes + +1994-12-17 Vern Paxson + + * FlexLexer.h: -P fixes constructor, destructor moved to flex.skl + +1994-12-17 Vern Paxson + + * flex.skl: YY_SKIP_YYWRAP yyFlexLexer constructor, destructor + +1994-12-15 Vern Paxson + + * gen.c: formatting + +1994-12-15 Vern Paxson + + * gen.c: fixed bug in adjusting yytext before backing up + +1994-12-10 Vern Paxson + + * scan.l: switched scanner itself over to [:xxx:] + +1994-12-10 Vern Paxson + + * flex.skl: added YY_FLEX_VERSION + +1994-12-10 Vern Paxson + + * scan.l: Fixed CCL-match pattern for [:whatever:] + +1994-12-10 Vern Paxson + + * parse.y: treat [:upper:] as [:lower:] if -i + +1994-12-06 Vern Paxson + + * NEWS: 2.5.0.1 + +1994-12-06 Vern Paxson + + * flex.skl, gen.c: input() maintains BOL + +1994-12-06 Vern Paxson + + * flex.skl: check size of buffer in yy_scan_buffer + +1994-12-06 Vern Paxson + + * flex.skl: added %option main, fixed missing %* + +1994-12-06 Vern Paxson + + * parse.y: added ccl exprs + +1994-12-06 Vern Paxson + + * scan.l: added ccl exprs, %option main + +1994-12-06 Vern Paxson + + * yylex.c: added %options, ccl exprs + +1994-12-05 Vern Paxson + + * misc.c: undid previous change + +1994-12-04 Vern Paxson + + * Makefile.in: Makefile.in from srcdir + +1994-12-04 Vern Paxson + + * Makefile.in: added skel.c to DISTFILES + +1994-12-04 Vern Paxson + + * flex.skl: added YYSTATE alias + +1994-12-04 Vern Paxson + + * scan.l: NL is now \r?\n + +1994-12-04 Vern Paxson + + * gen.c: use cerr for C++ diagnostics + +1994-12-03 Vern Paxson + + * flex.skl: undid YY_UNIX_NEWLINE + +1994-12-03 Vern Paxson + + * flexdef.h: STDC_HEADERS to check for stdlib + +1994-12-03 Vern Paxson + + * configure.in: AC_STDC_HEADERS -> AC_HEADER_STDC + +1994-12-03 Vern Paxson + + * misc.c: \n -> '\012' + +1994-12-03 Vern Paxson + + * flex.skl: Added YY_UNIX_NEWLINE + +1994-12-03 Vern Paxson + + * flex.skl: BOL changes + +1994-12-03 Vern Paxson + + * dfa.c: fixed bug with caseins but not ecs + +1994-12-03 Vern Paxson + + * gen.c: BOL changes some casts for Turbo C + +1994-12-03 Vern Paxson + + * main.c: messages identify filenames + +1994-12-03 Vern Paxson + + * misc.c: Increase slowly if realloc double overflows + +1994-12-03 Vern Paxson + + * nfa.c: YY_RULE_SETUP + +1994-12-03 Vern Paxson + + * scan.l: Added yy_XX_state %option's Added yy_set_bol + +1994-11-29 Vern Paxson + + * Makefile.in: don't remove ~ files + +1994-11-24 Vern Paxson + + * Makefile.in: get CFLAGS from autoconf + +1994-11-24 Vern Paxson + + * 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 + + * version.h: 2.5.0 + +1994-11-24 Vern Paxson + + * flexdef.h: Added do_stdinit + +1994-11-24 Vern Paxson + + * FlexLexer.h: Added yy_delete_buffer() in destructor + +1994-11-24 Vern Paxson + + * 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 + + * main.c: Added do_stdinit, Think C hacks + +1994-11-24 Vern Paxson + + * scan.l: Added %options for input, always-interactive, + never-interactive, yy_scan_{buffer,bytes,string} + +1994-11-05 Vern Paxson + + * flex.skl: size_t #ifdef's for not compiling some statics + +1994-11-05 Vern Paxson + + * Makefile.in: $(FLEX) config.h + +1994-11-05 Vern Paxson + + * configure.in: config.h, size_t, malloc.h, sys/types.h + +1994-11-05 Vern Paxson + + * flexdef.h: config.h, size_t + +1994-11-05 Vern Paxson + + * main.c: yywrap option, no stdin/out init for VMS, mundane tweaks + +1994-11-05 Vern Paxson + + * parse.y: alloca, lint tweaks + +1994-11-05 Vern Paxson + + * scan.l: %option yywrap size_t tweaks + +1994-11-05 Vern Paxson + + * tblcmp.c: size_t tweaks + +1994-11-05 Vern Paxson + + * misc.c: size_t, STDC tweaks + +1994-11-05 Vern Paxson + + * flex.skl: Added yy_scan_{buffer,bytes,string}, plus tweaks + +1994-10-12 Vern Paxson + + * flex.skl: made stack code conditional on "stack" option + +1994-10-12 Vern Paxson + + * scan.l: added use of "stack" %option + +1994-08-03 Vern Paxson + + * gen.c: Fixed fencepost in call to yy_flex_strncpy + +1994-07-25 Vern Paxson + + * flex.skl: yy_eof_status -> yy_buffer_status + +1994-07-25 Vern Paxson + + * flex.skl: yy_flex_strcpy -> yy_flex_strncpy minor prototype tweak + +1994-07-25 Vern Paxson + + * 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 + + * nfa.c: No YY_USER_ACTION if continued action + +1994-03-16 Vern Paxson + + * flex.skl: Added fix for 8-bit chars returned by input() + +1994-03-16 Vern Paxson + + * flex.skl: Move definition of yy_flex_strcpy to come after #define + of yytext_ptr + +1994-01-08 Vern Paxson + + * mkskel.sh: flex.skel -> flex.skl + +1994-01-08 Vern Paxson + + * mkskel.sh: Initial revision + +1993-12-29 Vern Paxson + + * Makefile.in: Fixed scan.c target so "make" detects flex failure + +1993-12-27 Vern Paxson + + * scan.l: Added %option's + +1993-12-27 Vern Paxson + + * Makefile.in: Nuked FLEX_FLAGS that are now done using %option + +1993-12-27 Vern Paxson + + * parse.y, scan.l: %option + +1993-12-27 Vern Paxson + + * main.c: Reworked for %option + +1993-12-27 Vern Paxson + + * flexdef.h: Added "unspecified", globals for %option + +1993-12-27 Vern Paxson + + * sym.c: start condition #define's go to action file + +1993-12-27 Vern Paxson + + * misc.c: Added action_define() + +1993-12-27 Vern Paxson + + * scan.l: Minor consolidation using scon scopes etc + +1993-12-27 Vern Paxson + + * scan.l: Modified to use scon scopes + +1993-12-27 Vern Paxson + + * scan.l: indented rules + +1993-12-26 Vern Paxson + + * parse.y: Added scon_stk stuff, format_warn + +1993-12-26 Vern Paxson + + * flexdef.h: Added format_warn + +1993-12-26 Vern Paxson + + * parse.y: Working checkpoint prior to adding { stuff + +1993-12-26 Vern Paxson + + * flexdef.h, main.c: Added in_rule, deleted actvsc + +1993-12-26 Vern Paxson + + * misc.c: Added doubling of '\'s in filenames + +1993-12-26 Vern Paxson + + * scan.l: Added in_rule, doing_rule_action + +1993-12-26 Vern Paxson + + * sym.c: Removed actvsc + +1993-12-23 Vern Paxson + + * flex.1: -ooutput #line directives credits + +1993-12-23 Vern Paxson + + * flex.skl: Fixsed sense of test for %array + +1993-12-23 Vern Paxson + + * NEWS: 2.5.0 snapshot for Craig + +1993-12-23 Vern Paxson + + * parse.y: Added beginnings of { ... } + +1993-12-23 Vern Paxson + + * scan.l: Simplified scanning {}'s + +1993-12-20 Vern Paxson + + * flexdef.h: Added + +1993-12-17 Vern Paxson + + * flex.skl: prototypes for alloc/string routines + +1993-12-17 Vern Paxson + + * flex.skl: alloc, string routines internal + +1993-12-17 Vern Paxson + + * Makefile.in: Nuked lib{string,alloc}.c, added dependency of + yylex.o on parse.h + +1993-12-17 Vern Paxson + + * configure.in: Check for string.h + +1993-12-17 Vern Paxson + + * flexdef.h: Use autoconf for string/strings.h yy_flex_XXX -> + flex_XXX + +1993-12-17 Vern Paxson + + * scan.l: Added flex_XXX -> yy_flex_XXX wrappers + +1993-12-17 Vern Paxson + + * dfa.c, misc.c, sym.c: yy_flex_XXX -> flex_XXX + +1993-12-17 Vern Paxson + + * yylex.c: No more WHITESPACE token + +1993-12-16 Vern Paxson + + * FlexLexer.h, flex.skl: Added yy_top_state() + +1993-12-16 Vern Paxson + + * scan.l: simplified comment-scanning using push/pop states + +1993-12-16 Vern Paxson + + * parse.y: removed crufty WHITESPACE token, some uses of '\n' token + +1993-12-15 Vern Paxson + + * FlexLexer.h: start stack, extern "C++" moved + +1993-12-15 Vern Paxson + + * dfa.c: Bug fix for -CF + +1993-12-15 Vern Paxson + + * flexdef.h, misc.c: alloc routines take unsigned + +1993-12-15 Vern Paxson + + * flex.skl: start-state stacks, alloc routines take unsigned + +1993-12-15 Vern Paxson + + * flexdef.h, misc.c: bracket -CF table elements + +1993-12-13 Vern Paxson + + * misc.c: Do #bytes computation in {re,}allocate_array() only once + +1993-12-11 Vern Paxson + + * flex.skl, flexdef.h, gen.c, main.c, misc.c, scan.l, sym.c: + yy_str*() -> str*() + +1993-12-11 Vern Paxson + + * 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 + + * gen.c: lint tweak + +1993-12-11 Vern Paxson + + * NEWS: Expanded on extern "C++" news item + +1993-12-11 Vern Paxson + + * NEWS: 2.4.5 + +1993-12-11 Vern Paxson + + * flex.skl: Added yy_fill_buffer + +1993-12-11 Vern Paxson + + * gen.c: is_interactive -> yy_is_interactive + +1993-12-11 Vern Paxson + + * flex.1: Updated credits + +1993-12-11 Vern Paxson + + * Makefile.in: Fixed typo in "uninstall" target + +1993-12-11 Vern Paxson + + * gen.c: Updated comment regarding 0-based vs. 1-based arrays for + -CF. + +1993-12-11 Vern Paxson + + * dfa.c: Initialize dfaacc[0] for -CF representation Fixed minor + memory leak + +1993-12-11 Vern Paxson + + * main.c: #include "FlexLexer.h" -> + +1993-12-11 Vern Paxson + + * FlexLexer.h: Added extern "C++" wrapper + +1993-12-09 Vern Paxson + + * main.c: Detect REJECT etc. before generating YY_USES_REJECT! + +1993-12-09 Vern Paxson + + * gen.c: Fixed bug in interactive reads where char is unsigned + +1993-12-09 Vern Paxson + + * parse.y: Fixed bug in treating '$' as variable trailing context + +1993-12-09 Vern Paxson + + * version.h: 2.4.5 + +1993-12-07 Vern Paxson + + * README: pretester update + +1993-12-07 Vern Paxson + + * NEWS: 2.4.4 + +1993-12-07 Vern Paxson + + * flex.1: LexError(), C++ experiment warning, credits + +1993-12-07 Vern Paxson + + * scan.l: Fixed 8-bit bug + +1993-12-07 Vern Paxson + + * flex.skl, gen.c: Fixed nasty 8-bit bugs + +1993-12-07 Vern Paxson + + * 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 + + * FlexLexer.h, flex.skl: Support for yyFlexLexer::LexerError + +1993-12-06 Vern Paxson + + * version.h: 2.4.4 + +1993-12-05 Vern Paxson + + * flex.1: credits update + +1993-12-05 Vern Paxson + + * Makefile.in: very minor "install" tweaks + +1993-12-05 Vern Paxson + + * flex.skl, nfa.c: YY_USER_ACTION generated now for each case in + action switch + +1993-12-04 Vern Paxson + + * flex.skl: Fixed bug in pointing yyin at a new file and resuming + scanning + +1993-12-03 Vern Paxson + + * NEWS: Added note regarding g++ 2.5.X + +1993-12-03 Vern Paxson + + * flex.1: updated credits + +1993-12-03 Vern Paxson + + * NEWS: ranlib addition for 2.4.3 + +1993-12-03 Vern Paxson + + * Makefile.in: Minor tweak to last change + +1993-12-03 Vern Paxson + + * Makefile.in: run ranlib on libfl.a + +1993-12-03 Vern Paxson + + * NEWS: Hopefully last update prior to 2.4.3 + +1993-12-03 Vern Paxson + + * flexdef.h, gen.c, misc.c, sym.c: lint tweaks + +1993-12-03 Vern Paxson + + * Makefile.in: Added exec_prefix + +1993-12-03 Vern Paxson + + * flex.1: credit update + +1993-12-03 Vern Paxson + + * flex.skl: lint tweak + +1993-12-03 Vern Paxson + + * NEWS: FlexLexer.h fixed for separate inclusion + +1993-12-03 Vern Paxson + + * FlexLexer.h, flex.skl, main.c: mods so FlexLexer.h can be included + separately + +1993-12-03 Vern Paxson + + * flex.1: -F incompatible with -+ + +1993-12-02 Vern Paxson + + * NEWS: Elaborated comments for 2.4.3 + +1993-12-02 Vern Paxson + + * NEWS: 2.4.3 + +1993-12-02 Vern Paxson + + * flex.1: Updated message regarding missing libfl.a routines Added + thanks to Noah Friedman + +1993-12-02 Vern Paxson + + * 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 + + * flex.skl, flexdef.h, gen.c, main.c, misc.c, scan.l, sym.c: Use + yy_strXXX() routines instead of + +1993-12-01 Vern Paxson + + * version.h: 2.4.3 + +1993-12-01 Vern Paxson + + * flexdef.h, misc.c: yy_flex_xmalloc() moved to misc.c + +1993-12-01 Vern Paxson + + * flex.skl: Fixed bug in yy_fatal_error() + +1993-12-01 Vern Paxson + + * Makefile.in: ... and remove plain tar file after compression + +1993-12-01 Vern Paxson + + * NEWS: 2.4.2 + +1993-12-01 Vern Paxson + + * Makefile.in: Produce both compress'd and gzip'd distribution tar + files + +1993-12-01 Vern Paxson + + * version.h: Release 2.4.2 + +1993-11-30 Vern Paxson + + * NEWS: -a -> -Ca + +1993-11-30 Vern Paxson + + * README: described configuration files in manifest + +1993-11-30 Vern Paxson + + * Makefile.in: Added intermediate step of copying MISC/alloca.c -> + alloca.c Included CPPFLAGS when compiling alloca.c + +1993-11-30 Vern Paxson + + * README: Credit to 2.4 pre-testers. + +1993-11-30 Vern Paxson + + * gen.c: Fixed nasty bug in short/long decl decision + +1993-11-30 Vern Paxson + + * flexdef.h: Lowered MAX_SHORT out of increased general paranoia. + Added yy_flex_xmalloc() proto + +1993-11-30 Vern Paxson + + * main.c: Fixed very minor typo in -v output + +1993-11-30 Vern Paxson + + * misc.c: Removed vestigal cast to (char) in isupper() call + +1993-11-30 Vern Paxson + + * misc.c: Added casts to unsigned Char for isascii() calls + +1993-11-30 Vern Paxson + + * parse.y: Added #ifdef chud for alloca() + +1993-11-30 Vern Paxson + + * Makefile.in: Added alloca + +1993-11-30 Vern Paxson + + * configure.in: Add AC_ALLOCA if using bison + +1993-11-29 Vern Paxson + + * Makefile.in: Added intermediate file going scan.l -> scan.c + +1993-11-29 Vern Paxson + + * Makefile.in: Removed parse.{c,h} from distribution files, since + they may not be all that portable. + +1993-11-29 Vern Paxson + + * flex.skl: Fixed %array YYLMAX headaches, added error message if + buffer needs growing but REJECT used + +1993-11-29 Vern Paxson + + * gen.c, main.c: Fixed YYLMAX headaches + +1993-11-29 Vern Paxson + + * flex.1: Documented that buffer can't grow if REJECT used + +1993-11-29 Vern Paxson + + * Makefile.in: Added parse.{c,h} to dist files + +1993-11-29 Vern Paxson + + * flex.skl, flexdef.h, gen.c, main.c, misc.c, scan.l: Fixed to + buffer section 1 definitions + +1993-11-29 Vern Paxson + + * sym.c: Fixed ANSI-C glitch with '%' operator + +1993-11-29 Vern Paxson + + * scan.l: Fixed mis-definition of ndlookup() + +1993-11-29 Vern Paxson + + * NEWS: 2.4 -> 2.4.1 + +1993-11-29 Vern Paxson + + * Makefile.in: Added install.sh, mkinstalldirs to distribution files + +1993-11-29 Vern Paxson + + * flex.1: Added Nathan Zelle, "promoted" Francois + +1993-11-29 Vern Paxson + + * Makefile.in: only "realclean" removes flex dist depends on flex + +1993-11-29 Vern Paxson + + * flexdef.h, misc.c: myctoi takes char[] instead of Char[] + +1993-11-28 Vern Paxson + + * flexdef.h: -a -> -Ca all_lower, all_upper -> work on char* + +1993-11-28 Vern Paxson + + * Makefile.in: Added -Ca to bigcheck + +1993-11-28 Vern Paxson + + * main.c: -a -> -Ca; fixed help output + +1993-11-28 Vern Paxson + + * dfa.c, flex.1: -a -> -Ca + +1993-11-28 Vern Paxson + + * misc.c: all_lower, all_upper work on char* + +1993-11-28 Vern Paxson + + * scan.l: Fixed some casts now that yytext is always char* and never + unsigned char* + +1993-11-28 Vern Paxson + + * Makefile.in: Francois' tweaks + +1993-11-28 Vern Paxson + + * configure.in: AC_LN_S, AC_STDC_HEADERS (but not AC_ALLOCA) + +1993-11-27 Vern Paxson + + * NEWS: fixed typo + +1993-11-27 Vern Paxson + + * Makefile.in: Don't remove dist directory + +1993-11-27 Vern Paxson + + * Makefile.in: Include liballoc.c in lint targets + +1993-11-27 Vern Paxson + + * misc.c: lint tweak + +1993-11-27 Vern Paxson + + * Makefile.in: Added -l compression to bigcheck + +1993-11-27 Vern Paxson + + * Makefile.in: permission tweaking for "dist" + +1993-11-27 Vern Paxson + + * Makefile.in: more "dist" tweaks + +1993-11-27 Vern Paxson + + * Makefile.in: Changed "make dist" to use version.h, include scan.c + in initial dir copy + +1993-11-27 Vern Paxson + + * version.h: 2.4.1 + +1993-11-27 Vern Paxson + + * README: Revised as per Francois Pinard + +1993-11-27 Vern Paxson + + * COPYING: flex.skel -> flex.skl + +1993-11-27 Vern Paxson + + * NEWS: Updated date of 2.4 release + +1993-11-27 Vern Paxson + + * Makefile.in: Removed manual & nroff output from distribution + +1993-11-27 Vern Paxson + + * NEWS: 2.4.1 release + +1993-11-27 Vern Paxson + + * configure.in: Initial revision + +1993-11-27 Vern Paxson + + * Makefile.in: Merge w/ 2.4.1 changes added "dist2" target + +1993-11-26 Vern Paxson + + * Makefile.in: Initial revision + +1993-11-26 Vern Paxson + + * flexdef.h: Removed #ifndef FILE protection from include of stdio + +1993-11-26 Vern Paxson + + * flex.1: Added Francois Pinard to distribution headache helpers + +1993-11-26 Vern Paxson + + * flex.skl: Modified C++ scanners to get input a character at a time + for interactive scanners. + +1993-11-26 Vern Paxson + + * main.c: Added YY_INTERACTIVE. + +1993-11-26 Vern Paxson + + * scan.l: Put definitions inside ()'s so we can test -l option for + "make bigcheck" + +1993-11-26 Vern Paxson + + * flex.1: Documented YY_INTERACTIVE. + +1993-11-26 Vern Paxson + + * flex.1, flex.skl, flexdef.h, gen.c, main.c, parse.y, scan.l: -l + lex compatibility flag + +1993-11-20 Vern Paxson + + * flex.skl: Support for read()/fread() section 1 definitions precede + default macro definitions + +1993-11-20 Vern Paxson + + * flexdef.h: Added use_read global + +1993-11-20 Vern Paxson + + * gen.c: Cleaner definition for yymore() Fixed string broken across + multiple lines + +1993-11-20 Vern Paxson + + * main.c: Added -Cr + +1993-11-20 Vern Paxson + + * misc.c: K&R declaration for check_char() + +1993-11-20 Vern Paxson + + * flex.1: Documented -Cr + +1993-11-20 Vern Paxson + + * flex.1: No need to #undef before redefining prior to -Cr + documentation + +1993-11-10 Vern Paxson + + * README: Heavily massaged for 2.4 + +1993-11-10 Vern Paxson + + * flex.1: Added Landon Noll to thanks. + +1993-11-10 Vern Paxson + + * NEWS: 2.4 release + +1993-11-10 Vern Paxson + + * flex.1: 2.4 documentation + +1993-11-10 Vern Paxson + + * 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 + + * version.h: updated date for 2.4.0 :-( + +1993-10-10 Vern Paxson + + * FlexLexer.h: Whitespace tweaking + +1993-10-10 Vern Paxson + + * main.c: Use DEFAULT_CSIZE only if not using equivalence classes. + +1993-10-10 Vern Paxson + + * flex.1: Checkpoint prior to final 2.4 update + +1993-10-04 Vern Paxson + + * NEWS: Raw 2.4 changes + +1993-10-04 Vern Paxson + + * flex.skl: osfcn.h -> unistd.h + +1993-10-04 Vern Paxson + + * flex.skl: Added "static" to definition of yy_fatal_error as well + as fwd decl. + +1993-10-04 Vern Paxson + + * flex.skl: Added yy_fatal_error function. + +1993-10-03 Vern Paxson + + * flex.skl, gen.c: Got rid of (char *) casts of yytext, no longer + needed. + +1993-10-03 Vern Paxson + + * FlexLexer.h: YY_CHAR -> char added YYText(), YYLeng() + +1993-10-03 Vern Paxson + + * flex.skl, gen.c: Minimized use of YY_CHAR + +1993-10-03 Vern Paxson + + * main.c: Added "flex++" feature Minimized use of YY_CHAR + +1993-10-02 Vern Paxson + + * main.c: Clarified help message for -S + +1993-10-02 Vern Paxson + + * libyywrap.c, version.h: Initial revision + +1993-10-02 Vern Paxson + + * main.c: If -+ used, output to lex.yy.cc + +1993-10-02 Vern Paxson + + * FlexLexer.h, flex.skl: Switched from FILE*'s to stream's + +1993-10-02 Vern Paxson + + * flexdef.h: Added expand_nxt_chk() extern. + +1993-10-02 Vern Paxson + + * flex.skl: Added dynamic buffer growing. Added yyless() for + section 3. + +1993-10-02 Vern Paxson + + * dfa.c, flexdef.h, gen.c, main.c: Added -a option for long-align. + +1993-10-02 Vern Paxson + + * scan.l: formfeed no longer considered whitespace + +1993-09-21 Vern Paxson + + * flexdef.h: Nuked FILENAMESIZE + +1993-09-21 Vern Paxson + + * main.c: yyflexlexer.h -> FlexLexer.h minor portability tweak + +1993-09-21 Vern Paxson + + * gen.c: Added start condition to EOF trace output + +1993-09-21 Vern Paxson + + * flex.skl: Added YY_START changed yyFlexLexer to define yylex() + +1993-09-21 Vern Paxson + + * misc.c: Minor portability tweaks + +1993-09-21 Vern Paxson + + * FlexLexer.h: Split into two classes, one fully abstract. yylex() + no longer abstract in yyFlexLexer + +1993-09-21 Vern Paxson + + * scan.l: PC lint tweak + +1993-09-21 Vern Paxson + + * parse.y: YYSTYPE #define'd to int + +1993-09-21 Vern Paxson + + * nfa.c: minor lint tweak + +1993-09-16 Vern Paxson + + * FlexLexer.h: Initial revision + +1993-09-16 Vern Paxson + + * flexdef.h: Delete prototypes for Unix system calls. + +1993-09-16 Vern Paxson + + * 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 + + * main.c: %array not allowed with C++ scanners + +1993-09-16 Vern Paxson + + * scan.l: Fixed bugs regarding %{%} code in section 2 prolog %array + not allowed with C++ scanners + +1993-08-25 Vern Paxson + + * flexdef.h: Added C_plus_plus flag. + +1993-08-25 Vern Paxson + + * flex.skl: First version of C/C++ skeleton + +1993-08-25 Vern Paxson + + * gen.c: yy_state_type declared earlier. Made a bunch of statics + only output if not -+ + +1993-08-25 Vern Paxson + + * 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 + + * misc.c: Added %+/%-/%* to skelout() + +1993-08-25 Vern Paxson + + * scan.l: EOF in section 2 prolog leads to section 0, not section 3 + +1993-08-25 Vern Paxson + + * 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 + + * dfa.c: yy_nxt table should be "const" + +1993-08-24 Vern Paxson + + * flexdef.h: Removed a lot of #ifdef chud "backtracking" -> "backing + up" + +1993-08-24 Vern Paxson + + * main.c: "backtracking" -> "backing up" got rid of time reports + +1993-08-24 Vern Paxson + + * 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 + + * misc.c: isascii() moved to flexdef.h nuked flex_gettime() + +1993-08-24 Vern Paxson + + * scan.l: Fixed bug with empty section 2 + +1993-08-24 Vern Paxson + + * yylex.c: Chucked definition of isascii() + +1993-08-24 Vern Paxson + + * flex.skl: preserve yytext on input() bug fix when combining + yyless() with yymore() checkpoint prior to C++ option + +1993-08-24 Vern Paxson + + * dfa.c: "backtracking" -> "backing up" + +1993-07-09 Vern Paxson + + * flex.skl: Fixed to not generate extra EOF's after reading one. + +1993-07-05 Vern Paxson + + * main.c: Spit out definition of YY_CHAR early + +1993-07-05 Vern Paxson + + * flex.skl: Some rearranging to make sure things get declared in the + right order + +1993-07-05 Vern Paxson + + * tblcmp.c: Some comment fixes as per Wilhelms + +1993-07-05 Vern Paxson + + * scan.l: Nuked #undef of yywrap, now that it's a function + +1993-07-05 Vern Paxson + + * parse.y: Fixed bug with Z-a character classes as per Wilhelms + +1993-07-05 Vern Paxson + + * nfa.c: added check_char call in mkstate() to prevent bad xtion + chars + +1993-07-05 Vern Paxson + + * gen.c: Fixed some reallocation bugs, etc. as per Wilhelms + +1993-07-05 Vern Paxson + + * flexdef.h: Added check_char(), readable_form() + +1993-07-05 Vern Paxson + + * 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 + + * dfa.c: Wilhems bug fixes. + +1993-07-05 Vern Paxson + + * ccl.c, misc.c: Added check_char() + +1993-06-12 Vern Paxson + + * flexdef.h: Changed to use yy_flex_alloc() and friends + +1993-06-12 Vern Paxson + + * main.c: Added -P flag + +1993-06-12 Vern Paxson + + * scan.l: Fixed bug in lex % directives + +1993-06-12 Vern Paxson + + * misc.c: Modified to use yy_flex_alloc() and friends + +1993-06-12 Vern Paxson + + * sym.c: Modified to use yy_flex_alloc() + +1993-06-12 Vern Paxson + + * 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 + + * dfa.c: Got rid of code needed for %t + +1993-04-14 Vern Paxson + + * 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 + + * flex.1: Fixed bug in description of backtracking + +1993-04-05 Vern Paxson + + * NEWS: 2.3.8 + +1993-04-05 Vern Paxson + + * flex.skl, main.c: %array support + +1993-04-05 Vern Paxson + + * misc.c: Added non-STDC clause for '\a' + +1993-04-05 Vern Paxson + + * scan.l: Fixed subtle problems regarding '*'s in comments + %pointer/%array match entire lines + +1993-04-05 Vern Paxson + + * gen.c: Added %array support + +1993-02-06 Vern Paxson + + * README: Finally updated email addr + +1993-02-06 Vern Paxson + + * flex.1: Mostly .LP -> .PP + +1993-02-06 Vern Paxson + + * flexdef.h: [no log message] + +1993-02-06 Vern Paxson + + * main.c, scan.l: A lot of tweaks ... + +1993-02-06 Vern Paxson + + * ccl.c: reallocate_character_array -> reallocate_Character_array + +1993-02-06 Vern Paxson + + * gen.c: Bug/lint fixes Modified to work with "action" array instead + of temp file + +1993-02-06 Vern Paxson + + * sym.c: Fixed bug in 8-bit hashing + +1993-02-06 Vern Paxson + + * 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 + + * ecs.c: Remove %t cruft + +1993-02-06 Vern Paxson + + * flex.skl: Beginning of %pointer/%array support + +1993-02-06 Vern Paxson + + * 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 + + * nfa.c: Added checking for whether rules are useful modified to + work with internal "action" array + +1993-02-06 Vern Paxson + + * misc.c: Added internal "action" array, internal skeleton, + zero_out() in lieu of bzero + +1993-02-06 Vern Paxson + + * tblcmp.c: Fixed a bunch of fencepost errors in increasing tables. + +1993-02-06 Vern Paxson + + * yylex.c: -Wall fix + +1991-03-28 Vern Paxson + + * gen.c: Fixed out-of-bounds access bug; patch #7 for release 2.3 + +1991-03-28 Vern Paxson + + * NEWS: Patch #7 for 2.3 + +1990-10-23 Vern Paxson + + * gen.c: fixed missing "rule_type" entry for end-of-buffer action + +1990-08-29 Vern Paxson + + * gen.c: Fixed yymore() but in not resetting yy_more_len + +1990-08-29 Vern Paxson + + * NEWS: Patch #6 for 2.3 + +1990-08-16 Vern Paxson + + * NEWS: Patch #5 + +1990-08-14 Vern Paxson + + * misc.c: fixed comment in myesc() + +1990-08-14 Vern Paxson + + * NEWS: fixed date in patch #4 + +1990-08-14 Vern Paxson + + * NEWS: patch #4 + +1990-08-14 Vern Paxson + + * misc.c: fixed hexadecimal escapes; added is_hex_digit() + +1990-08-03 Vern Paxson + + * NEWS: Patch #3 + +1990-08-03 Vern Paxson + + * flex.skl, flexdef.h: changed to include for __GNUC__ + +1990-08-02 Vern Paxson + + * NEWS: 2.3 patch #2 + +1990-08-02 Vern Paxson + + * flex.skl: Another try at getting the malloc() definitions correct; + this time for g++, too + +1990-08-02 Vern Paxson + + * flex.skl, flexdef.h: fixed to declare malloc() and free() by hand + if __GNUC__ + +1990-07-28 Vern Paxson + + * flexdef.h: Changed to get malloc definition in identical fashion + to that used by flex.skel + +1990-06-28 Vern Paxson + + * NEWS: [no log message] + +1990-06-28 Vern Paxson + + * 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 + + * 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 + + * README: Changed prolog to reflect 2.3 release. + +1990-05-26 Vern Paxson + + * NEWS: pointed reader at Makefile instead of README for porting + considerations added Makefile comments: support for SCO Unix; + parameterization + +1990-05-26 Vern Paxson + + * flex.skl: Added DONT_HAVE_STDLIB_H and declarations of malloc() + +1990-05-26 Vern Paxson + + * NEWS: 2.3 changes + +1990-05-26 Vern Paxson + + * 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 + + * 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 + + * yylex.c: Added macro definition for isascii() if not already + present + +1990-05-26 Vern Paxson + + * 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 + + * 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 + + * parse.y: introduced format_pinpoint_message() declared void + functions as such changed lone <> to apply to all outstanding + start conditions + +1990-05-26 Vern Paxson + + * nfa.c, tblcmp.c: declared void functions as such added prototypes + for forward references + +1990-05-26 Vern Paxson + + * 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 + + * libmain.c: Added declaration of arguments made yylex() a function + +1990-05-26 Vern Paxson + + * 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 + + * 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 + + * 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 + + * ecs.c: declared void functions as such declared void functions as + such + +1990-05-26 Vern Paxson + + * dfa.c: prototypes for forward references declared void functions + as such + +1990-05-26 Vern Paxson + + * ccl.c: Declared void functions as such + +1990-04-12 Vern Paxson + + * flex.skl: added fix for allowing yy_switch_to_buffer() in yywrap() + +1990-04-03 Vern Paxson + + * NEWS: patch #3 - -I fix + +1990-03-30 Vern Paxson + + * gen.c: Changed generation of archaic "continue" to "goto + yy_find_action" + +1990-03-27 Vern Paxson + + * NEWS: Patch #2 changes + +1990-03-27 Vern Paxson + + * flex.skl: fixed fencepost errors with yy_buf_size and detecting + NUL's + +1990-03-26 Vern Paxson + + * NEWS: [no log message] + +1990-03-26 Vern Paxson + + * flex.skl: g++ tweaks + +1990-03-23 Vern Paxson + + * NEWS: Changes for Patch #1. + +1990-03-23 Vern Paxson + + * flex.skl: fix for g++ + +1990-03-23 Vern Paxson + + * flex.1: minor typos and formatting changes. Removed BITNET + address. + +1990-03-23 Vern Paxson + + * README: nuked BITNET address. + +1990-03-20 Vern Paxson + + * README: 2.2 README + +1990-03-20 Vern Paxson + + * NEWS: USG alias. + +1990-03-20 Vern Paxson + + * flexdef.h: Added USG alias for SYS_V + +1990-03-20 Vern Paxson + + * : [no log message] + +1990-03-20 Vern Paxson + + * flex.skl: Tweaks for lint and C++ + +1990-03-20 Vern Paxson + + * flex.1: -ll => -lfl + +1990-03-20 Vern Paxson + + * NEWS: 2.2 changes + +1990-03-20 Vern Paxson + + * flex.skl: Changed to use YY_BUFFER_STATE everywhere. + +1990-03-20 Vern Paxson + + * flex.1: [no log message] + +1990-03-20 Vern Paxson + + * dfa.c: "associated rules" changed to "associated rule line + numbers". + +1990-03-20 Vern Paxson + + * scan.l: cast added to malloc() call to keep lint happy. + +1990-03-20 Vern Paxson + + * yylex.c: Fixed handling of premature EOF's. + +1990-03-20 Vern Paxson + + * sym.c: Removed declaration of malloc() + +1990-03-20 Vern Paxson + + * scan.l: Removed malloc() declaration. Added detection of EOF in + actions. + +1990-03-20 Vern Paxson + + * parse.y: Rules rewritten so '/' and '$' parsed correctly. + +1990-03-20 Vern Paxson + + * nfa.c: Corrected line numbers for continued actions. + +1990-03-20 Vern Paxson + + * misc.c: Removed declarations of malloc() and realloc(). + +1990-03-20 Vern Paxson + + * main.c: Summary of generation flags. Minor -8 tweaks. + +1990-03-20 Vern Paxson + + * gen.c: full support for -d + +1990-03-20 Vern Paxson + + * flexdef.h: defines for malloc() and realloc() conditional defines + for abs(), min(), and max() + +1990-03-20 Vern Paxson + + * flex.skl: Many multiple-buffer additions. + +1990-03-20 Vern Paxson + + * dfa.c: -8 tweaks. + +1990-03-19 Vern Paxson + + * flex.skl: Proto hacks. NUL hacks. Debugging hacks. C++ hacks. + +1990-03-16 Vern Paxson + + * : RCS won't let me unedit! gets "Missing access list" + +1990-03-16 Vern Paxson + + * tblcmp.c: Minor tweaks for NUL's. + +1990-03-16 Vern Paxson + + * : no changes -- had checked out for testing smaller read buffer + sizes + +1990-03-16 Vern Paxson + + * nfa.c: hack for NUL's. + +1990-03-16 Vern Paxson + + * misc.c: Hack to cshell for NUL's. + +1990-03-16 Vern Paxson + + * main.c: NUL's. -8 + +1990-03-16 Vern Paxson + + * gen.c: NUL's. + +1990-03-16 Vern Paxson + + * flexdef.h: NUL's. 8-bit chars. + +1990-03-16 Vern Paxson + + * flex.skl: NUL's; indenting + +1990-03-16 Vern Paxson + + * dfa.c: more thrashing around with NUL's + +1990-03-16 Vern Paxson + + * ccl.c: removed NUL hack + +1990-03-14 Vern Paxson + + * yylex.c: Added <> token + +1990-03-14 Vern Paxson + + * ecs.c, flexdef.h: Tweaks for NUL chars. + +1990-03-14 Vern Paxson + + * dfa.c, gen.c, main.c, misc.c, parse.y, scan.l, tblcmp.c: Tweaks + for NUL chars. + +1990-03-14 Vern Paxson + + * ccl.c: Tweaks for handling NUL's. + +1990-02-28 Vern Paxson + + * flex.1: [no log message] + +1990-02-28 Vern Paxson + + * flex.1: Changed .so options.man to inlined version since flex.1 + will have a different (shorter) options description. + +1990-02-28 Vern Paxson + + * flex.1: [no log message] + +1990-02-28 Vern Paxson + + * flex.1: [no log message] + +1990-02-26 Vern Paxson + + * flex.1: [no log message] + +1990-02-25 Vern Paxson + + * flex.1: [no log message] + +1990-02-25 Vern Paxson + + * flex.1: Initial revision + +1990-01-16 Vern Paxson + + * gen.c: Restored EOB accepting list for REJECT. Second try at 2.2 + Release. + +1990-01-16 Vern Paxson + + * misc.c: Added missing ',' in error message. 2.2 Release, second + try. + +1990-01-16 Vern Paxson + + * yylex.c: 8-bit char support. 2.2 Release. + +1990-01-15 Vern Paxson + + * 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 + + * 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 + + * gen.c: Removed unused EOB_accepting_list array. 2.2 Release. + +1990-01-15 Vern Paxson + + * 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 + + * parse.y: 8-bit char support. Error-message pinpointing. 2.2 + Release. + +1990-01-15 Vern Paxson + + * 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 + + * sym.c: Unsigned char support. 2.2 Release. + +1990-01-15 Vern Paxson + + * nfa.c: Removed redundant test. 2.2 Release. + +1990-01-15 Vern Paxson + + * misc.c: Unsigned char support. \x support. 2.2 Release. + +1990-01-15 Vern Paxson + + * tblcmp.c: 8-bit char support. 2.2 Release. + +1990-01-15 Vern Paxson + + * 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 + + * ecs.c: %t support. 8-bit/unsigned char support. 2.2 Release. + +1990-01-15 Vern Paxson + + * dfa.c: %t hacks. minor cosmetics. 2.2 Relase. + +1990-01-15 Vern Paxson + + * ccl.c: Changes for unsigned/8-bit chars. 2.2 Release. + +1990-01-10 Vern Paxson + + * libmain.c: Initial revision + +1989-12-30 Vern Paxson + + * nfa.c: removed gratuitous trailing context code + +1989-12-30 Vern Paxson + + * main.c: made -c case-sensitive + +1989-12-30 Vern Paxson + + * flex.skl: unput() bug fix + +1989-12-30 Vern Paxson + + * README: [no log message] + +1989-06-20 Vern Paxson + + * scan.l: changed to not use '|' and trailing context combo so users + can test using -F ... + +1989-06-20 Vern Paxson + + * parse.y: made trailing context combined with '|' warning always + come out + +1989-06-20 Vern Paxson + + * README: [no log message] + +1989-06-20 Vern Paxson + + * COPYING: Initial revision + +1989-06-20 Vern Paxson + + * NEWS, README, main.c: [no log message] + +1989-06-20 Vern Paxson + + * README: [no log message] + +1989-06-20 Vern Paxson + + * NEWS, README, main.c: [no log message] + +1989-06-20 Vern Paxson + + * : Beta release + +1989-06-20 Vern Paxson + + * NEWS, main.c: [no log message] + +1989-06-20 Vern Paxson + + * 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 + + * README: [no log message] + +1989-05-25 Vern Paxson + + * gen.c: fixsed bug with -I and backtracking + +1989-05-25 Vern Paxson + + * flex.skl: Cleaned up forward declarations of yyunput() and input() + +1989-05-25 Vern Paxson + + * parse.y: Split copyright string. + +1989-05-25 Vern Paxson + + * nfa.c: Split copyright string. Added check for empty machine in + dupmachine(). + +1989-05-25 Vern Paxson + + * 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 \ sequences ... + +1989-05-24 Vern Paxson + + * README: updated for 2nd release Beta test added RCS header + +1989-05-24 Vern Paxson + + * flexdef.h: removed static char copyright + +1989-05-24 Vern Paxson + + * flexdef.h: Added BSD copyright notice. Removed + FAST_SKELETON_FILE. + +1989-05-24 Vern Paxson + + * main.c: added BSD copyright notice. Removed references to + FAST_SKELETON_FILE. + +1989-05-24 Vern Paxson + + * ecs.c, gen.c, nfa.c: Added BSD copyright notice + +1989-05-24 Vern Paxson + + * 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 + + * flex.skl: Initial revision + +1989-05-19 Vern Paxson + + * yylex.c: renamed accnum to num_rules + +1989-05-19 Vern Paxson + + * tblcmp.c: moved table generation code to gen.c moved ntod() to + dfa.c + +1989-05-19 Vern Paxson + + * sym.c: the most piddling format change imaginable + +1989-05-19 Vern Paxson + + * scan.l: changed to look for yymore, REJECT, %used and %unused + removed gross magic for dealing with section 3 + +1989-05-19 Vern Paxson + + * nfa.c, parse.y: changes for variable trailing context + +1989-05-19 Vern Paxson + + * misc.c: added all_lower() and all_upper() + +1989-05-19 Vern Paxson + + * main.c: added checking for features being Really used + backtracking, performance reports misc. cleanup + +1989-05-19 Vern Paxson + + * gen.c: major overhaul for merged skeleton + +1989-05-19 Vern Paxson + + * flexdef.h: a zillion changes/additions/cleanups + +1989-05-19 Vern Paxson + + * dfa.c: added backtrack report added checking for dangerous + trailing context considerable minor cleanup + +1989-05-19 Vern Paxson + + * ccl.c: list_character_set() modified to take a FILE to write to + ... + +1989-05-19 Vern Paxson + + * README: updated for beta release + +1988-11-25 Vern Paxson + + * main.c: added -p flag generation of #define's for scanner + +1988-11-25 Vern Paxson + + * flexdef.h: Added END_OF_BUFFER_ACTION and bol_needed + +1988-11-25 Vern Paxson + + * dfa.c: added ntod() + +1988-05-09 Vern Paxson + + * gen.c: Initial revision + +1988-05-08 Vern Paxson + + * yylex.c: RCS header changed display style of non-printings from ^x + to \0xx + +1988-05-08 Vern Paxson + + * 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 + + * sym.c: RCS header changed "entry" to "sym_entry" to avoid conflict + with old keyword + +1988-05-08 Vern Paxson + + * scan.l: RCS header removed \^ from ESCSEQ + +1988-05-08 Vern Paxson + + * 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 + + * nfa.c: RCS ident yy_cp, yy_bp support name shortenings assoc_rule + support + +1988-05-08 Vern Paxson + + * 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 + + * 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 + + * 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 + + * ecs.c: added RCS id added PROCFLG to avoid assumption of signed + char's + +1988-05-08 Vern Paxson + + * 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 + + * ccl.c: Added list_character_set() + +1988-05-07 Vern Paxson + + * ccl.c: added RCS id + +1988-04-10 Vern Paxson + + * README: minor tweaks + +1988-04-10 Vern Paxson + + * README: forgot sh flex.shar + +1988-04-10 Vern Paxson + + * README: final tweaking + +1988-04-10 Vern Paxson + + * tblcmp.c: removed minor lint fluff + +1988-04-10 Vern Paxson + + * NEWS: [no log message] + +1988-04-10 Vern Paxson + + * NEWS, README: Initial revision + +1988-04-10 Vern Paxson + + * yylex.c: added identifying comment. changed to include "parse.h" + instead of "y.tab.h" + +1988-04-10 Vern Paxson + + * tblcmp.c: Changed name from flexcmp.c -> tblcmp.c fixed misc. + typos made generating ec tables be a routine + +1988-04-10 Vern Paxson + + * 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 + + * scan.l: Changed name from flexscan.l -> scan.l fixed bug in + added block comments between rules. + +1988-04-10 Vern Paxson + + * parse.y: changed name from flexparse.y -> parse.y added start + condition "INITIAL" made a{3} have "variable length" + +1988-04-10 Vern Paxson + + * nfa.c: changed name from flexnfa.c -> nfa.c corrected some typos. + +1988-04-10 Vern Paxson + + * misc.c: changed name from flexmisc.c -> misc.c + +1988-04-10 Vern Paxson + + * 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 + + * flexdef.h: fixed typos, enhanced symbol table definition. + +1988-04-10 Vern Paxson + + * ecs.c: changed name from flexecs.c to ecs.c + +1988-04-10 Vern Paxson + + * dfa.c: changed name from flexdfa.c to dfa.c + +1988-04-10 Vern Paxson + + * ccl.c: changed name from flexccl.c -> ccl.c + +1988-02-13 Vern Paxson + + * 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 + + * Initial revision + diff --git a/contrib/flex/FlexLexer.h b/contrib/flex/FlexLexer.h new file mode 100644 index 000000000000..bad4ce03fb65 --- /dev/null +++ b/contrib/flex/FlexLexer.h @@ -0,0 +1,206 @@ +// -*-C++-*- +// FlexLexer.h -- define interfaces for lexical analyzer classes generated +// by flex + +// Copyright (c) 1993 The Regents of the University of California. +// All rights reserved. +// +// 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. + +// This file defines FlexLexer, an abstract class which specifies the +// external interface provided to flex C++ lexer objects, and yyFlexLexer, +// which defines a particular lexer class. +// +// If you want to create multiple lexer classes, you use the -P flag +// to rename each yyFlexLexer to some other xxFlexLexer. You then +// include in your other sources once per lexer class: +// +// #undef yyFlexLexer +// #define yyFlexLexer xxFlexLexer +// #include +// +// #undef yyFlexLexer +// #define yyFlexLexer zzFlexLexer +// #include +// ... + +#ifndef __FLEX_LEXER_H +// Never included before - need to define base class. +#define __FLEX_LEXER_H + +#include +# ifndef FLEX_STD +# define FLEX_STD std:: +# endif + +extern "C++" { + +struct yy_buffer_state; +typedef int yy_state_type; + +class FlexLexer { +public: + virtual ~FlexLexer() { } + + 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( FLEX_STD istream* s, int size ) = 0; + virtual void yy_delete_buffer( struct yy_buffer_state* b ) = 0; + virtual void yyrestart( FLEX_STD istream* s ) = 0; + + virtual int yylex() = 0; + + // Call yylex with new input/output sources. + int yylex( FLEX_STD istream* new_in, FLEX_STD ostream* new_out = 0 ) + { + switch_streams( new_in, new_out ); + return yylex(); + } + + // Switch to new input/output streams. A nil stream pointer + // indicates "keep the current one". + virtual void switch_streams( FLEX_STD istream* new_in = 0, + FLEX_STD ostream* new_out = 0 ) = 0; + + int lineno() const { return yylineno; } + + int debug() const { return yy_flex_debug; } + void set_debug( int flag ) { yy_flex_debug = flag; } + +protected: + char* yytext; + int yyleng; + int yylineno; // only maintained if you use %option yylineno + int yy_flex_debug; // only has effect with -d or "%option debug" +}; + +} +#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 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( 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( FLEX_STD istream* s, int size ); + void yy_delete_buffer( struct yy_buffer_state* b ); + 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( FLEX_STD istream* new_in, FLEX_STD ostream* new_out = 0 ); + virtual int yywrap(); + +protected: + virtual int LexerInput( char* buf, int max_size ); + virtual void LexerOutput( const char* buf, int size ); + virtual void LexerError( const char* msg ); + + void yyunput( int c, char* buf_ptr ); + int yyinput(); + + void yy_load_buffer_state(); + 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; + int yy_start_stack_depth; + int* yy_start_stack; + + void yy_push_state( int new_state ); + void yy_pop_state(); + int yy_top_state(); + + yy_state_type yy_get_previous_state(); + yy_state_type yy_try_NUL_trans( yy_state_type current_state ); + int yy_get_next_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; + + // Number of characters read into yy_ch_buf. + int yy_n_chars; + + // Points to current character in buffer. + char* yy_c_buf_p; + + int yy_init; // whether we need to initialize + int yy_start; // 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 ... + 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()). + + yy_state_type yy_last_accepting_state; + char* yy_last_accepting_cpos; + + yy_state_type* yy_state_buf; + yy_state_type* yy_state_ptr; + + char* yy_full_match; + int* yy_full_state; + int yy_full_lp; + + int yy_lp; + int yy_looking_for_trail_begin; + + int yy_more_flag; + int yy_more_len; + int yy_more_offset; + int yy_prev_more_offset; +}; + +} + +#endif // yyFlexLexer || ! yyFlexLexerOnce + diff --git a/contrib/flex/NEWS b/contrib/flex/NEWS new file mode 100644 index 000000000000..62d260d2c14c --- /dev/null +++ b/contrib/flex/NEWS @@ -0,0 +1,518 @@ +This is the file NEWS for the flex package. It records user -visible +changes between releases of flex. + +See the file COPYING for copying conditions. + +* version 2.5.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 + +** 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 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 + ) + +** 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 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/contrib/flex/ONEWS b/contrib/flex/ONEWS new file mode 100644 index 000000000000..33415772185b --- /dev/null +++ b/contrib/flex/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: + + { + + where SCs is a list of one or more start conditions. Inside + the start condition scope, every rule automatically has the + prefix applied to it, until a '}' which matches the + initial '{'. So, for example: + + { + "\\n" return '\n'; + "\\r" return '\r'; + "\\f" return '\f'; + "\\0" return '\0'; + } + + is equivalent to: + + "\\n" return '\n'; + "\\r" return '\r'; + "\\f" return '\f'; + "\\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="" equivalent to -o + prefix="" equivalent to -P + yyclass="" 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 + once per scanner - see comments in + (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 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 <> 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 . + 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 <> 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 <> actions + given. To specify an end-of-file action for just the initial + state, use <>. + + - -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 "<>" 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. + + - \ now works for octal escape sequences; previously + \0 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/contrib/flex/README b/contrib/flex/README new file mode 100644 index 000000000000..0a6a70c1a021 --- /dev/null +++ b/contrib/flex/README @@ -0,0 +1,79 @@ +This is flex, the fast lexical analyzer generator. + +flex is a tool for generating scanners: programs which recognize +lexical patterns in text. + +More information about flex as well as the latest official release of +flex can be found at: + +http://flex.sourceforge.net/ + +Bug reports should be submitted using the SourceForge Bug Tracker +facilities which can be found from flex's SourceForge project page at: + +http://sourceforge.net/projects/flex + +There are several mailing lists available as well: + +flex-announce@lists.sourceforge.net - where posts will be made +announcing new releases of flex. + +flex-help@lists.sourceforge.net - where you can post questions about +using flex + +flex-devel@lists.sourceforge.net - where you can discuss development of +flex itself + +Note that flex is distributed under a copyright very similar to that of +BSD Unix, and not under the GNU General Public License (GPL). + +This file is part of flex. + +This code is derived from software contributed to Berkeley by +Vern Paxson. + +The United States Government has rights in this work pursuant +to contract no. DE-AC03-76SF00098 between the United States +Department of Energy and the University of California. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +Neither the name of the University nor the names of its contributors +may be used to endorse or promote products derived from this software +without specific prior written permission. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. + +The flex distribution contains the following files which may be of interest: + +README - This file. + +NEWS - current version number and list of user-visible changes. + +INSTALL - basic installation information. + +ABOUT-NLS - description of internationalization support in flex. + +COPYING - flex's copyright and license. + +doc/ - user documentation. + +examples/ - containing examples of some possible flex scanners and a +few other things. See the file examples/README for more details. + +TODO - outstanding bug reports, desired features, etc. + +tests/ - regression tests. See TESTS/README for details. + +po/ - internationalization support files. diff --git a/contrib/flex/buf.c b/contrib/flex/buf.c new file mode 100644 index 000000000000..e5deb4e81c3a --- /dev/null +++ b/contrib/flex/buf.c @@ -0,0 +1,273 @@ +/* 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) +{ + char *dst, *src, *t; + + t = flex_alloc (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 + sprintf (t, "#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/contrib/flex/ccl.c b/contrib/flex/ccl.c new file mode 100644 index 000000000000..8d66bb62b18f --- /dev/null +++ b/contrib/flex/ccl.c @@ -0,0 +1,310 @@ +/* ccl - routines for character classes */ + +/* Copyright (c) 1990 The Regents of the University of California. */ +/* All rights reserved. */ + +/* This code is derived from software contributed to Berkeley by */ +/* Vern Paxson. */ + +/* The United States Government has rights in this work pursuant */ +/* to contract no. DE-AC03-76SF00098 between the United States */ + /* Department of Energy and the University of California. */ + +/* This file is part of flex. */ + +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ + +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ + +/* Neither the name of the University nor the names of its contributors */ +/* may be used to endorse or promote products derived from this software */ +/* without specific prior written permission. */ + +/* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */ +/* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ +/* PURPOSE. */ + +#include "flexdef.h" + +/* return true if the chr is in the ccl. Takes negation into account. */ +static bool +ccl_contains (const int cclp, const int ch) +{ + int ind, len, i; + + len = ccllen[cclp]; + ind = cclmap[cclp]; + + for (i = 0; i < len; ++i) + if (ccltbl[ind + i] == ch) + return !cclng[cclp]; + + return cclng[cclp]; +} + + +/* ccladd - add a single character to a ccl */ + +void ccladd (cclp, ch) + int cclp; + int ch; +{ + int ind, len, newpos, i; + + check_char (ch); + + len = ccllen[cclp]; + ind = cclmap[cclp]; + + /* check to see if the character is already in the ccl */ + + for (i = 0; i < len; ++i) + if (ccltbl[ind + i] == ch) + return; + + /* mark newlines */ + if (ch == nlch) + ccl_has_nl[cclp] = true; + + newpos = ind + len; + + if (newpos >= current_max_ccl_tbl_size) { + current_max_ccl_tbl_size += MAX_CCL_TBL_SIZE_INCREMENT; + + ++num_reallocs; + + ccltbl = reallocate_Character_array (ccltbl, + current_max_ccl_tbl_size); + } + + ccllen[cclp] = len + 1; + ccltbl[newpos] = ch; +} + +/* dump_cclp - same thing as list_character_set, but for cclps. */ + +static void dump_cclp (FILE* file, int cclp) +{ + register int i; + + putc ('[', file); + + for (i = 0; i < csize; ++i) { + if (ccl_contains(cclp, i)){ + register int start_char = i; + + putc (' ', file); + + fputs (readable_form (i), file); + + while (++i < csize && ccl_contains(cclp,i)) ; + + if (i - 1 > start_char) + /* this was a run */ + fprintf (file, "-%s", + readable_form (i - 1)); + + putc (' ', file); + } + } + + putc (']', file); +} + + + +/* ccl_set_diff - create a new ccl as the set difference of the two given ccls. */ +int +ccl_set_diff (int a, int b) +{ + int d, ch; + + /* create new class */ + d = cclinit(); + + /* In order to handle negation, we spin through all possible chars, + * addding each char in a that is not in b. + * (This could be O(n^2), but n is small and bounded.) + */ + for ( ch = 0; ch < csize; ++ch ) + if (ccl_contains (a, ch) && !ccl_contains(b, ch)) + ccladd (d, ch); + + /* debug */ + if (0){ + fprintf(stderr, "ccl_set_diff ("); + fprintf(stderr, "\n "); + dump_cclp (stderr, a); + fprintf(stderr, "\n "); + dump_cclp (stderr, b); + fprintf(stderr, "\n "); + dump_cclp (stderr, d); + fprintf(stderr, "\n)\n"); + } + return d; +} + +/* ccl_set_union - create a new ccl as the set union of the two given ccls. */ +int +ccl_set_union (int a, int b) +{ + int d, i; + + /* create new class */ + d = cclinit(); + + /* Add all of a */ + for (i = 0; i < ccllen[a]; ++i) + ccladd (d, ccltbl[cclmap[a] + i]); + + /* Add all of b */ + for (i = 0; i < ccllen[b]; ++i) + ccladd (d, ccltbl[cclmap[b] + i]); + + /* debug */ + if (0){ + fprintf(stderr, "ccl_set_union (%d + %d = %d", a, b, d); + fprintf(stderr, "\n "); + dump_cclp (stderr, a); + fprintf(stderr, "\n "); + dump_cclp (stderr, b); + fprintf(stderr, "\n "); + dump_cclp (stderr, d); + fprintf(stderr, "\n)\n"); + } + return d; +} + + +/* cclinit - return an empty ccl */ + +int cclinit () +{ + if (++lastccl >= current_maxccls) { + current_maxccls += MAX_CCLS_INCREMENT; + + ++num_reallocs; + + cclmap = + reallocate_integer_array (cclmap, current_maxccls); + ccllen = + reallocate_integer_array (ccllen, current_maxccls); + cclng = reallocate_integer_array (cclng, current_maxccls); + ccl_has_nl = + reallocate_bool_array (ccl_has_nl, + current_maxccls); + } + + if (lastccl == 1) + /* we're making the first ccl */ + cclmap[lastccl] = 0; + + else + /* The new pointer is just past the end of the last ccl. + * Since the cclmap points to the \first/ character of a + * ccl, adding the length of the ccl to the cclmap pointer + * will produce a cursor to the first free space. + */ + cclmap[lastccl] = + cclmap[lastccl - 1] + ccllen[lastccl - 1]; + + ccllen[lastccl] = 0; + cclng[lastccl] = 0; /* ccl's start out life un-negated */ + ccl_has_nl[lastccl] = false; + + return lastccl; +} + + +/* cclnegate - negate the given ccl */ + +void cclnegate (cclp) + int cclp; +{ + cclng[cclp] = 1; + ccl_has_nl[cclp] = !ccl_has_nl[cclp]; +} + + +/* list_character_set - list the members of a set of characters in CCL form + * + * Writes to the given file a character-class representation of those + * characters present in the given CCL. A character is present if it + * has a non-zero value in the cset array. + */ + +void list_character_set (file, cset) + FILE *file; + int cset[]; +{ + register int i; + + putc ('[', file); + + for (i = 0; i < csize; ++i) { + if (cset[i]) { + register int start_char = i; + + putc (' ', file); + + fputs (readable_form (i), file); + + while (++i < csize && cset[i]) ; + + if (i - 1 > start_char) + /* this was a run */ + fprintf (file, "-%s", + readable_form (i - 1)); + + putc (' ', file); + } + } + + putc (']', file); +} + +/** Determines if the range [c1-c2] is unambiguous in a case-insensitive + * scanner. Specifically, if a lowercase or uppercase character, x, is in the + * range [c1-c2], then we require that UPPERCASE(x) and LOWERCASE(x) must also + * be in the range. If not, then this range is ambiguous, and the function + * returns false. For example, [@-_] spans [a-z] but not [A-Z]. Beware that + * [a-z] will be labeled ambiguous because it does not include [A-Z]. + * + * @param c1 the lower end of the range + * @param c2 the upper end of the range + * @return true if [c1-c2] is not ambiguous for a caseless scanner. + */ +bool range_covers_case (int c1, int c2) +{ + int i, o; + + for (i = c1; i <= c2; i++) { + if (has_case (i)) { + o = reverse_case (i); + if (o < c1 || c2 < o) + return false; + } + } + return true; +} + +/** Reverse the case of a character, if possible. + * @return c if case-reversal does not apply. + */ +int reverse_case (int c) +{ + return isupper (c) ? tolower (c) : (islower (c) ? toupper (c) : c); +} + +/** Return true if c is uppercase or lowercase. */ +bool has_case (int c) +{ + return (isupper (c) || islower (c)) ? true : false; +} diff --git a/contrib/flex/dfa.c b/contrib/flex/dfa.c new file mode 100644 index 000000000000..b8b68ebad8eb --- /dev/null +++ b/contrib/flex/dfa.c @@ -0,0 +1,1096 @@ +/* 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. */ + +#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[])); + + +/* check_for_backing_up - check a DFA state for backing up + * + * synopsis + * void check_for_backing_up( int ds, int state[numecs] ); + * + * ds is the number of the state to check and state[] is its out-transitions, + * 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 */ + ++num_backing_up; + + 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); + + /* Now identify it further using the out- and + * jam-transitions. + */ + dump_transitions (backing_up_file, state); + + putc ('\n', backing_up_file); + } + } +} + + +/* check_trailing_context - check to see if NFA state set constitutes + * "dangerous" trailing context + * + * synopsis + * void check_trailing_context( int nfa_states[num_states+1], int num_states, + * int accset[nacc+1], int nacc ); + * + * NOTES + * Trailing context is "dangerous" if both the head and the trailing + * part are of variable size \and/ there's a DFA state which contains + * both an accepting state for the head part of the rule and NFA states + * which occur after the beginning of the trailing context. + * + * When such a rule is matched, it's impossible to tell if having been + * in the DFA state indicates the beginning of the trailing context or + * further-along scanning of the pattern. In these cases, a warning + * message is issued. + * + * nfa_states[1 .. num_states] is the list of NFA states in the DFA. + * 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; +{ + register int i, j; + + for (i = 1; i <= num_states; ++i) { + int ns = nfa_states[i]; + register int type = state_type[ns]; + register int ar = assoc_rule[ns]; + + if (type == STATE_NORMAL || rule_type[ar] != RULE_VARIABLE) { /* do nothing */ + } + + 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]); + return; + } + } + } +} + + +/* dump_associated_rules - list the rules associated with a DFA state + * + * Goes through the set of NFA states associated with the DFA and + * extracts the first MAX_ASSOC_RULES unique rules, sorts them, + * and writes a report to the given file. + */ + +void dump_associated_rules (file, ds) + FILE *file; + int ds; +{ + register int i, j; + register int num_associated_rules = 0; + int rule_set[MAX_ASSOC_RULES + 1]; + int *dset = dss[ds]; + int size = dfasiz[ds]; + + for (i = 1; i <= size; ++i) { + register int rule_num = rule_linenum[assoc_rule[dset[i]]]; + + for (j = 1; j <= num_associated_rules; ++j) + if (rule_num == rule_set[j]) + break; + + if (j > num_associated_rules) { /* new rule */ + if (num_associated_rules < MAX_ASSOC_RULES) + rule_set[++num_associated_rules] = + rule_num; + } + } + + qsort (&rule_set [1], num_associated_rules, sizeof (rule_set [1]), intcmp); + + fprintf (file, _(" associated rule line numbers:")); + + 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); +} + + +/* dump_transitions - list the transitions associated with a DFA state + * + * synopsis + * dump_transitions( FILE *file, int state[numecs] ); + * + * Goes through the set of out-transitions and lists them in human-readable + * form (i.e., not as equivalence classes); also lists jam transitions + * (i.e., all those which are not out-transitions, plus EOF). The dump + * is done to the given file. + */ + +void dump_transitions (file, state) + FILE *file; + int state[]; +{ + register int i, ec; + int out_char_set[CSIZE]; + + for (i = 0; i < csize; ++i) { + ec = ABS (ecgroup[i]); + out_char_set[i] = state[ec]; + } + + fprintf (file, _(" out-transitions: ")); + + 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]; + + fprintf (file, _("\n jam-transitions: EOF ")); + + list_character_set (file, out_char_set); + + putc ('\n', file); +} + + +/* epsclosure - construct the epsilon closure of a set of ndfa states + * + * synopsis + * int *epsclosure( int t[num_states], int *numstates_addr, + * int accset[num_rules+1], int *nacc_addr, + * int *hashval_addr ); + * + * NOTES + * The epsilon closure is the set of all states reachable by an arbitrary + * number of epsilon transitions, which themselves do not have epsilon + * transitions going out, unioned with the set of states which have non-null + * accepting numbers. t is an array of size numstates of nfa state numbers. + * Upon return, t holds the epsilon closure and *numstates_addr is updated. + * accset holds a list of the accepting numbers, and the size of accset is + * given by *nacc_addr. t may be subjected to reallocation if it is not + * large enough to hold the epsilon closure. + * + * 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; +{ + register int stkpos, ns, tsp; + int numstates = *ns_addr, nacc, hashval, transsym, nfaccnum; + int stkend, nstate; + static int did_stk_init = false, *stk; + +#define MARK_STATE(state) \ +do{ trans1[state] = trans1[state] - MARKER_DIFFERENCE;} while(0) + +#define IS_MARKED(state) (trans1[state] < 0) + +#define UNMARK_STATE(state) \ +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() \ +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(); \ +stk[stkend] = state; \ +MARK_STATE(state); \ +}while(0) + +#define ADD_STATE(state) \ +do { \ +if ( ++numstates >= current_max_dfa_size ) \ +DO_REALLOCATION(); \ +t[numstates] = state; \ +hashval += state; \ +}while(0) + +#define STACK_STATE(state) \ +do { \ +PUT_ON_STACK(state); \ +CHECK_ACCEPT(state); \ +if ( nfaccnum != NIL || transchar[state] != SYM_EPSILON ) \ +ADD_STATE(state); \ +}while(0) + + + 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) { + 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); + hashval += ns; + } + } + + for (stkpos = 1; stkpos <= stkend; ++stkpos) { + ns = stk[stkpos]; + transsym = transchar[ns]; + + if (transsym == SYM_EPSILON) { + tsp = trans1[ns] + MARKER_DIFFERENCE; + + if (tsp != NO_TRANSITION) { + if (!IS_MARKED (tsp)) + STACK_STATE (tsp); + + tsp = trans2[ns]; + + 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]); + else + 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 () +{ + 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); + + if (nultrans) + nultrans = + reallocate_integer_array (nultrans, + current_max_dfas); +} + + +/* ntod - convert an ndfa to a dfa + * + * Creates the dfa corresponding to the ndfa we've constructed. The + * dfa starts out in state #1. + */ + +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 + * beginning with 1, even if the scanner accepts NUL's, this + * means that (since every character is potentially in its own + * 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]; + + /* 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 + * next DFA state number available (not in use). We depend on the + * fact that snstods() returns DFA's \in increasing order/, and thus + * need only know the bounds of the dfas to be processed. + */ + todo_head = todo_next = 0; + + for (i = 0; i <= csize; ++i) { + duplist[i] = NIL; + symlist[i] = false; + } + + for (i = 0; i <= num_rules; ++i) + accset[i] = NIL; + + if (trace) { + dumpnfa (scset[1]); + fputs (_("\n\nDFA Dump:\n\n"), stderr); + } + + inittbl (); + + /* Check to see whether we should build a separate table for + * transitions on NUL characters. We don't do this for full-speed + * (-F) scanners, since for them we don't have a simple state + * number lying around with which to index the table. We also + * don't bother doing it for scanners unless (1) NUL is in its own + * equivalence class (indicated by a positive value of + * ecgroup[NUL]), (2) NUL's equivalence class is the last + * equivalence class, and (3) the number of equivalence classes is + * the same as the number of characters. This latter case comes + * about when useecs is false or when it's true but every character + * still manages to land in its own class (unlikely, but it's + * cheap to check for). If all these things are true then the + * character code needed to represent NUL's equivalence class for + * indexing the tables is going to take one more bit than the + * number of characters, and therefore we won't be assured of + * being able to fit it into a YY_CHAR variable. This rules out + * storing the transitions in a compressed table, since the code + * for interpreting them uses a YY_CHAR variable (perhaps it + * should just use an integer, though; this is worth pondering ... + * ###). + * + * Finally, for full tables, we want the number of entries in the + * table to be a power of two so the array references go fast (it + * will just take a shift to compute the major index). If + * encoding NUL's transitions in the table will spoil this, we + * give it its own table (note that this will be the case if we're + * not using equivalence classes). + */ + + /* Note that the test for ecgroup[0] == numecs below accomplishes + * both (1) and (2) above + */ + if (!fullspd && ecgroup[0] == numecs) { + /* NUL is alone in its equivalence class, which is the + * last one. + */ + int use_NUL_table = (numecs == csize); + + if (fulltbl && !use_NUL_table) { + /* We still may want to use the table if numecs + * is a power of 2. + */ + int 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); + + /* From now on, nultrans != nil indicates that we're + * saving null transitions for later, separate encoding. + */ + } + + + if (fullspd) { + for (i = 0; i <= numecs; ++i) + state[i] = 0; + + place_state (state, 0, 0); + dfaacc[0].dfaacc_state = 0; + } + + 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. + */ + num_full_table_rows = numecs; + + else + /* Take into account the fact that we'll be including + * the NUL entries in the transition table. Build it + * from 0 .. numecs. + */ + 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. + */ + 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"); + } + + + if (gentables) + outn (" {"); + + /* 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) { + 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) + nset[numstates] = scset[(i / 2) + 1]; + else + nset[numstates] = + mkbranch (scbol[i / 2], scset[i / 2]); + + nset = epsclosure (nset, &numstates, accset, &nacc, + &hashval); + + 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 (!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) { + targptr = 0; + totaltrans = 0; + + for (i = 1; i <= numecs; ++i) + state[i] = 0; + + ds = ++todo_head; + + dset = dss[ds]; + dsize = dfasiz[ds]; + + if (trace) + fprintf (stderr, _("state # %d:\n"), ds); + + sympartition (dset, dsize, symlist, duplist); + + for (sym = 1; sym <= numecs; ++sym) { + if (symlist[sym]) { + symlist[sym] = 0; + + 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; + ++todo_next; + numas += 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); + + targfreq[++targptr] = 1; + targstate[targptr] = newds; + ++numuniq; + } + + else { + /* sym's equivalence class has the same + * transitions as duplist(sym)'s + * equivalence class. + */ + targ = state[duplist[sym]]; + state[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) ; + + ++targfreq[i]; + ++numdup; + } + + ++totaltrans; + duplist[sym] = NIL; + } + } + + + numsnpairs += totaltrans; + + if (ds > num_start_states) + check_for_backing_up (ds, state); + + if (nultrans) { + nultrans[ds] = state[NUL_ec]; + state[NUL_ec] = 0; /* remove transition */ + } + + 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); + 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) { + /* Jams are marked by negative of state + * number. + */ + mk2data (state[i] ? state[i] : -ds); + yynxt_data[yynxt_curr++] = + state[i] ? state[i] : -ds; + } + + dataflush (); + if (gentables) + outn (" },\n"); + } + + else if (fullspd) + place_state (state, ds, totaltrans); + + 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); + + else { /* normal, compressed state */ + + /* Determine which destination state is the most + * common, and how many transitions to it there are. + */ + + comfreq = 0; + comstate = 0; + + for (i = 1; i <= targptr; ++i) + if (targfreq[i] > comfreq) { + comfreq = targfreq[i]; + comstate = targstate[i]; + } + + bldtbl (state, ds, totaltrans, comstate, comfreq); + } + } + + 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 */ + + /* Create tables for all the states with only one + * out-transition. + */ + while (onesp > 0) { + mk1tbl (onestate[onesp], onesym[onesp], + onenext[onesp], onedef[onesp]); + --onesp; + } + + mkdeftbl (); + } + + flex_free ((void *) accset); + flex_free ((void *) nset); +} + + +/* snstods - converts a set of ndfa states into a dfa state + * + * synopsis + * is_new_state = snstods( int sns[numstates], int numstates, + * int accset[num_rules+1], int nacc, + * int hashval, int *newds_addr ); + * + * 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; + register int i, j; + int newds, *oldsns; + + for (i = 1; i <= lastdfa; ++i) + if (hashval == dhash[i]) { + if (numstates == dfasiz[i]) { + oldsns = dss[i]; + + if (!didsort) { + /* We sort the states in sns so we + * can compare it to oldsns quickly. + */ + qsort (&sns [1], numstates, sizeof (sns [1]), intcmp); + didsort = 1; + } + + for (j = 1; j <= numstates; ++j) + if (sns[j] != oldsns[j]) + break; + + if (j > numstates) { + ++dfaeql; + *newds_addr = i; + return 0; + } + + ++hshcol; + } + + else + ++hshsave; + } + + /* Make a new dfa. */ + + if (++lastdfa >= current_max_dfas) + increase_max_dfas (); + + newds = lastdfa; + + 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) + qsort (&sns [1], numstates, sizeof (sns [1]), intcmp); + + for (i = 1; i <= numstates; ++i) + dss[newds][i] = sns[i]; + + dfasiz[newds] = numstates; + dhash[newds] = hashval; + + if (nacc == 0) { + if (reject) + dfaacc[newds].dfaacc_set = (int *) 0; + else + dfaacc[newds].dfaacc_state = 0; + + accsiz[newds] = 0; + } + + 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. + */ + + qsort (&accset [1], nacc, sizeof (accset [1]), intcmp); + + dfaacc[newds].dfaacc_set = + allocate_integer_array (nacc + 1); + + /* Save the accepting set for later */ + for (i = 1; i <= nacc; ++i) { + dfaacc[newds].dfaacc_set[i] = accset[i]; + + if (accset[i] <= num_rules) + /* Who knows, perhaps a REJECT can yield + * this rule. + */ + rule_useful[accset[i]] = true; + } + + accsiz[newds] = nacc; + } + + 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) + j = accset[i]; + + dfaacc[newds].dfaacc_state = j; + + if (j <= num_rules) + rule_useful[j] = true; + } + + *newds_addr = newds; + + return 1; +} + + +/* symfollowset - follow the symbol transitions one step + * + * synopsis + * numstates = symfollowset( int ds[current_max_dfa_size], int dsize, + * 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; + + numstates = 0; + + 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 */ + sym = -sym; + ccllist = cclmap[sym]; + lenccl = ccllen[sym]; + + if (cclng[sym]) { + for (j = 0; j < lenccl; ++j) { + /* Loop through negated character + * class. + */ + ch = ccltbl[ccllist + j]; + + if (ch == 0) + ch = NUL_ec; + + if (ch > transsym) + /* Transsym isn't in negated + * ccl. + */ + break; + + else if (ch == transsym) + /* next 2 */ + goto bottom; + } + + /* Didn't find transsym in ccl. */ + nset[++numstates] = tsp; + } + + else + for (j = 0; j < lenccl; ++j) { + ch = ccltbl[ccllist + j]; + + if (ch == 0) + ch = NUL_ec; + + if (ch > transsym) + break; + else if (ch == transsym) { + nset[++numstates] = tsp; + break; + } + } + } + + else if (sym == SYM_EPSILON) { /* do nothing */ + } + + else if (ABS (ecgroup[sym]) == transsym) + nset[++numstates] = tsp; + + bottom:; + } + + return numstates; +} + + +/* sympartition - partition characters with same out-transitions + * + * synopsis + * sympartition( int ds[current_max_dfa_size], int numstates, + * 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; + + /* 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 */ + duplist[i] = i - 1; + dupfwd[i] = i + 1; + } + + duplist[1] = NIL; + dupfwd[numecs] = NIL; + + 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 >= 0) { /* character transition */ + int ec = ecgroup[tch]; + + mkechar (ec, dupfwd, duplist); + symlist[ec] = 1; + } + + else { /* character class */ + tch = -tch; + + lenccl = ccllen[tch]; + cclp = cclmap[tch]; + mkeccl (ccltbl + cclp, lenccl, dupfwd, + duplist, numecs, NUL_ec); + + if (cclng[tch]) { + j = 0; + + for (k = 0; k < lenccl; ++k) { + ich = ccltbl[cclp + k]; + + if (ich == 0) + ich = NUL_ec; + + for (++j; j < ich; ++j) + symlist[j] = 1; + } + + for (++j; j <= numecs; ++j) + symlist[j] = 1; + } + + else + for (k = 0; k < lenccl; ++k) { + ich = ccltbl[cclp + k]; + + if (ich == 0) + ich = NUL_ec; + + symlist[ich] = 1; + } + } + } + } +} diff --git a/contrib/flex/ecs.c b/contrib/flex/ecs.c new file mode 100644 index 000000000000..e2abbe486239 --- /dev/null +++ b/contrib/flex/ecs.c @@ -0,0 +1,219 @@ +/* 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. */ + +/* 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" + +/* ccl2ecl - convert character classes to set of equivalence classes */ + +void ccl2ecl () +{ + int i, ich, newlen, cclp, ccls, cclmec; + + 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 + * done, character classes will really consist of collections + * of equivalence classes + */ + + newlen = 0; + cclp = cclmap[i]; + + for (ccls = 0; ccls < ccllen[i]; ++ccls) { + ich = ccltbl[cclp + ccls]; + cclmec = ecgroup[ich]; + + if (cclmec > 0) { + ccltbl[cclp + newlen] = cclmec; + ++newlen; + } + } + + ccllen[i] = newlen; + } +} + + +/* cre8ecs - associate equivalence class numbers with class members + * + * fwd is the forward linked-list of equivalence class members. bck + * is the backward linked-list, and num is the number of class members. + * + * Returned is the number of classes. + */ + +int cre8ecs (fwd, bck, num) + int fwd[], bck[], num; +{ + int i, j, numcl; + + numcl = 0; + + /* Create equivalence class numbers. From now on, ABS( bck(x) ) + * is the equivalence class number for object x. If bck(x) + * is positive, then x is the representative of its equivalence + * class. + */ + for (i = 1; i <= num; ++i) + if (bck[i] == NIL) { + bck[i] = ++numcl; + for (j = fwd[i]; j != NIL; j = fwd[j]) + bck[j] = -numcl; + } + + return numcl; +} + + +/* mkeccl - update equivalence classes based on character class xtions + * + * synopsis + * Char ccls[]; + * int lenccl, fwd[llsiz], bck[llsiz], llsiz, NUL_mapping; + * void mkeccl( Char ccls[], int lenccl, int fwd[llsiz], int bck[llsiz], + * int llsiz, int NUL_mapping ); + * + * ccls contains the elements of the character class, lenccl is the + * number of elements in the ccl, fwd is the forward link-list of equivalent + * characters, bck is the backward link-list, and llsiz size of the link-list. + * + * 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; + static unsigned char cclflags[CSIZE]; /* initialized to all '\0' */ + + /* Note that it doesn't matter whether or not the character class is + * negated. The same results will be obtained in either case. + */ + + cclp = 0; + + while (cclp < lenccl) { + cclm = ccls[cclp]; + + if (NUL_mapping && cclm == 0) + cclm = NUL_mapping; + + oldec = bck[cclm]; + newec = cclm; + + 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) { + register int ccl_char; + + if (NUL_mapping && ccls[j] == 0) + ccl_char = NUL_mapping; + else + ccl_char = ccls[j]; + + if (ccl_char > i) + break; + + 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 + * having been processed. + */ + + bck[i] = newec; + fwd[newec] = i; + newec = i; + /* Set flag so we don't reprocess. */ + cclflags[j] = 1; + + /* Get next equivalence class member. */ + /* continue 2 */ + goto next_pt; + } + } + + /* Symbol isn't in character class. Put it in the old + * equivalence class. + */ + + bck[i] = oldec; + + if (oldec != NIL) + fwd[oldec] = i; + + oldec = i; + + next_pt:; + } + + 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) { + /* 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[]; +{ + /* 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) + bck[fwd[tch]] = bck[tch]; + + if (bck[tch] != NIL) + fwd[bck[tch]] = fwd[tch]; + + fwd[tch] = NIL; + bck[tch] = NIL; +} diff --git a/contrib/flex/filter.c b/contrib/flex/filter.c new file mode 100644 index 000000000000..c82f7f8938a1 --- /dev/null +++ b/contrib/flex/filter.c @@ -0,0 +1,444 @@ +/* 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 : ""); + + } + + 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 : ""); + + 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 : ""); + + else if (fclose (to_c)) + lerrsf (_("error closing output file %s"), + outfilename ? outfilename : ""); + + 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 : "") + == 0 + || strcmp (fname, + headerfilename ? headerfilename : "") + == 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 : ""); + + else if (fclose (stdout)) + lerrsf (_("error closing output file %s"), + outfilename ? outfilename : ""); + + return 0; +} + +/* vim:set expandtab cindent tabstop=4 softtabstop=4 shiftwidth=4 textwidth=0: */ diff --git a/contrib/flex/flex.skl b/contrib/flex/flex.skl new file mode 100644 index 000000000000..c981b1082b9a --- /dev/null +++ b/contrib/flex/flex.skl @@ -0,0 +1,3437 @@ +%# -*-C-*- vi: set ft=c: +%# This file is processed in several stages. +%# Here are the stages, as best as I can describe: +%# +%# 1. flex.skl is processed through GNU m4 during the +%# pre-compilation stage of flex. Only macros starting +%# with `m4preproc_' are processed, and quoting is normal. +%# +%# 2. The preprocessed skeleton is translated verbatim into a +%# C array, saved as "skel.c" and compiled into the flex binary. +%# +%# 3. At runtime, the skeleton is generated and filtered (again) +%# through m4. Macros beginning with `m4_' will be processed. +%# The quoting is "[[" and "]]" so we don't interfere with +%# user code. +%# +%# All generate macros for the m4 stage contain the text "m4" or "M4" +%# in them. This is to distinguish them from CPP macros. +%# The exception to this rule is YY_G, which is an m4 macro, +%# but it needs to be remain short because it is used everywhere. +%# +/* A lexical scanner generated by flex */ + +%# Macros for preproc stage. +m4preproc_changecom + +%# Macros for runtime processing stage. +m4_changecom +m4_changequote +m4_changequote([[, ]]) + +%# +%# Lines in this skeleton starting with a "%" character are "control lines" +%# and affect the generation of the scanner. The possible control codes are +%# listed and processed in misc.c. +%# +%# %# - A comment. The current line is omitted from the generated scanner. +%# %if-c++-only - The following lines are printed for C++ scanners ONLY. +%# %if-c-only - The following lines are NOT printed for C++ scanners. +%# %if-c-or-c++ - The following lines are printed in BOTH C and C++ scanners. +%# %if-reentrant - Print for reentrant scanners.(push) +%# %if-not-reentrant - Print for non-reentrant scanners. (push) +%# %if-bison-bridge - Print for bison-bridge. (push) +%# %if-not-bison-bridge - Print for non-bison-bridge. (push) +%# %endif - pop from the previous if code. +%# %% - A stop-point, where code is inserted by flex. +%# Each stop-point is numbered here and also in the code generator. +%# (See gen.c, etc. for details.) +%# %not-for-header - Begin code that should NOT appear in a ".h" file. +%# %ok-for-header - %c and %e are used for building a header file. +%# %if-tables-serialization +%# +%# All control-lines EXCEPT comment lines ("%#") will be inserted into +%# the generated scanner as a C-style comment. This is to aid those who +%# edit the skeleton. +%# + +%not-for-header +%if-c-only +%if-not-reentrant +m4_ifelse(M4_YY_PREFIX,yy,, +#define yy_create_buffer M4_YY_PREFIX[[_create_buffer]] +#define yy_delete_buffer M4_YY_PREFIX[[_delete_buffer]] +#define yy_flex_debug M4_YY_PREFIX[[_flex_debug]] +#define yy_init_buffer M4_YY_PREFIX[[_init_buffer]] +#define yy_flush_buffer M4_YY_PREFIX[[_flush_buffer]] +#define yy_load_buffer_state M4_YY_PREFIX[[_load_buffer_state]] +#define yy_switch_to_buffer M4_YY_PREFIX[[_switch_to_buffer]] +#define yyin M4_YY_PREFIX[[in]] +#define yyleng M4_YY_PREFIX[[leng]] +#define yylex M4_YY_PREFIX[[lex]] +#define yylineno M4_YY_PREFIX[[lineno]] +#define yyout M4_YY_PREFIX[[out]] +#define yyrestart M4_YY_PREFIX[[restart]] +#define yytext M4_YY_PREFIX[[text]] +#define yywrap M4_YY_PREFIX[[wrap]] +#define yyalloc M4_YY_PREFIX[[alloc]] +#define yyrealloc M4_YY_PREFIX[[realloc]] +#define yyfree M4_YY_PREFIX[[free]] +) +%endif +%endif +%ok-for-header + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION FLEX_MAJOR_VERSION +#define YY_FLEX_MINOR_VERSION FLEX_MINOR_VERSION +#define YY_FLEX_SUBMINOR_VERSION FLEX_SUBMINOR_VERSION +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +%# Some negated symbols +m4_ifdef( [[M4_YY_IN_HEADER]], , [[m4_define([[M4_YY_NOT_IN_HEADER]], [[]])]]) +m4_ifdef( [[M4_YY_REENTRANT]], , [[m4_define([[M4_YY_NOT_REENTRANT]], [[]])]]) + +%# This is the m4 way to say "(stack_used || is_reentrant) +m4_ifdef( [[M4_YY_STACK_USED]], [[m4_define([[M4_YY_HAS_START_STACK_VARS]])]]) +m4_ifdef( [[M4_YY_REENTRANT]], [[m4_define([[M4_YY_HAS_START_STACK_VARS]])]]) + +%# Prefixes. +%# The complexity here is necessary so that m4 preserves +%# the argument lists to each C function. + + +m4_ifdef( [[M4_YY_PREFIX]],, [[m4_define([[M4_YY_PREFIX]], [[yy]])]]) + +m4preproc_define(`M4_GEN_PREFIX', + ``m4_define(yy[[$1]], [[M4_YY_PREFIX[[$1]]m4_ifelse($'`#,0,,[[($'`@)]])]])'') + +%if-c++-only + /* The c++ scanner is a mess. The FlexLexer.h header file relies on the + * following macro. This is required in order to pass the c++-multiple-scanners + * test in the regression suite. We get reports that it breaks inheritance. + * We will address this in a future release of flex, or omit the C++ scanner + * altogether. + */ + #define yyFlexLexer M4_YY_PREFIX[[FlexLexer]] +%endif + +%if-c-only + M4_GEN_PREFIX(`_create_buffer') + M4_GEN_PREFIX(`_delete_buffer') + M4_GEN_PREFIX(`_scan_buffer') + M4_GEN_PREFIX(`_scan_string') + M4_GEN_PREFIX(`_scan_bytes') + M4_GEN_PREFIX(`_init_buffer') + M4_GEN_PREFIX(`_flush_buffer') + M4_GEN_PREFIX(`_load_buffer_state') + M4_GEN_PREFIX(`_switch_to_buffer') + M4_GEN_PREFIX(`push_buffer_state') + M4_GEN_PREFIX(`pop_buffer_state') + M4_GEN_PREFIX(`ensure_buffer_stack') + M4_GEN_PREFIX(`lex') + M4_GEN_PREFIX(`restart') + M4_GEN_PREFIX(`lex_init') + M4_GEN_PREFIX(`lex_init_extra') + M4_GEN_PREFIX(`lex_destroy') + M4_GEN_PREFIX(`get_debug') + M4_GEN_PREFIX(`set_debug') + M4_GEN_PREFIX(`get_extra') + M4_GEN_PREFIX(`set_extra') + M4_GEN_PREFIX(`get_in') + M4_GEN_PREFIX(`set_in') + M4_GEN_PREFIX(`get_out') + M4_GEN_PREFIX(`set_out') + M4_GEN_PREFIX(`get_leng') + M4_GEN_PREFIX(`get_text') + M4_GEN_PREFIX(`get_lineno') + M4_GEN_PREFIX(`set_lineno') + m4_ifdef( [[M4_YY_REENTRANT]], + [[ + M4_GEN_PREFIX(`get_column') + M4_GEN_PREFIX(`set_column') + ]]) + M4_GEN_PREFIX(`wrap') +%endif + +m4_ifdef( [[M4_YY_BISON_LVAL]], +[[ + M4_GEN_PREFIX(`get_lval') + M4_GEN_PREFIX(`set_lval') +]]) + +m4_ifdef( [[]], +[[ + M4_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 +#include +#include +#include +%endif + +%if-tables-serialization +#include +#include +%endif +/* end standard C headers. */ + +%if-c-or-c++ +m4preproc_include(`flexint.h') +%endif + +%if-c++-only +/* begin standard C++ headers. */ +#include +#include +#include +#include +#include +/* 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_LESS_LINENO(n) + ]]) +]]) + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +/* Return all but the first "n" matched characters back to the input stream. */ +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + *yy_cp = YY_G(yy_hold_char); \ + YY_RESTORE_YY_MORE_OFFSET \ + YY_G(yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) +]]) + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +#define unput(c) yyunput( c, YY_G(yytext_ptr) M4_YY_CALL_LAST_ARG ) +]]) + +#ifndef YY_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 +%endif +%if-c++-only +#include +%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( [[]], +[[ + 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( [[]], + [[ + # 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_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 +m4preproc_include(`tables_shared.h') + +/* Load the DFA tables from the given stream. */ +int yytables_fload M4_YY_PARAMS(FILE * fp M4_YY_PROTO_LAST_ARG); + +/* Unload the tables from memory. */ +int yytables_destroy M4_YY_PARAMS(M4_YY_PROTO_ONLY_ARG); +%not-for-header + +/** Describes a mapping from a serialized table id to its deserialized state in + * this scanner. This is the bridge between our "generic" deserialization code + * and the specifics of this scanner. + */ +struct yytbl_dmap { + enum yytbl_id dm_id;/**< table identifier */ + void **dm_arr; /**< address of pointer to store the deserialized table. */ + size_t dm_sz; /**< local sizeof() each element in table. */ +}; + +/** A {0,0,0}-terminated list of structs, forming the map */ +static struct yytbl_dmap yydmap[] = +{ +%tables-yydmap generated elements + {0,0,0} +}; + +/** A tables-reader object to maintain some state in the read. */ +struct yytbl_reader { + FILE * fp; /**< input stream */ + flex_uint32_t bread; /**< bytes read since beginning of current tableset */ +}; + +%endif +/* end tables serialization structures and prototypes */ + +%ok-for-header + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 +%if-c-only Standard (non-C++) definition + + +m4_define( [[M4_YY_LEX_PROTO]], [[M4_YY_PARAMS(M4_YY_PROTO_ONLY_ARG)]]) +m4_define( [[M4_YY_LEX_DECLARATION]], [[YYFARGS0(void)]]) + +m4_ifdef( [[M4_YY_BISON_LVAL]], +[[ + m4_dnl The bison pure parser is used. Redefine yylex to + m4_dnl accept the lval parameter. + + m4_define( [[M4_YY_LEX_PROTO]], [[\]] + [[M4_YY_PARAMS(YYSTYPE * yylval_param M4_YY_PROTO_LAST_ARG)]]) + m4_define( [[M4_YY_LEX_DECLARATION]], [[\]] + [[YYFARGS1(YYSTYPE *,yylval_param)]]) +]]) + +m4_ifdef( [[]], +[[ + m4_dnl Locations are used. yylex should also accept the ylloc parameter. + + m4_define( [[M4_YY_LEX_PROTO]], [[\]] + [[M4_YY_PARAMS(YYSTYPE * yylval_param, YYLTYPE * yylloc_param M4_YY_PROTO_LAST_ARG)]]) + m4_define( [[M4_YY_LEX_DECLARATION]], [[\]] + [[YYFARGS2(YYSTYPE *,yylval_param, YYLTYPE *,yylloc_param)]]) +]]) + +extern int yylex M4_YY_LEX_PROTO; + +#define YY_DECL int yylex M4_YY_LEX_DECLARATION +%endif +%if-c++-only C++ definition +#define YY_DECL int yyFlexLexer::yylex() +%endif +#endif /* !YY_DECL */ + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif +]]) + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif +]]) + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +%% [6.0] YY_RULE_SETUP definition goes here +]]) + +%not-for-header +/** The main scanner function which does all the work. + */ +YY_DECL +{ + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + M4_YY_DECL_GUTS_VAR(); + +m4_ifdef( [[M4_YY_NOT_REENTRANT]], +[[ + m4_ifdef( [[M4_YY_BISON_LVAL]], + [[ + YYSTYPE * yylval; + ]]) + m4_ifdef( [[]], + [[ + YYLTYPE * yylloc; + ]]) +]]) + +%% [7.0] user's declarations go here + +m4_ifdef( [[M4_YY_BISON_LVAL]], +[[ + yylval = yylval_param; +]]) + +m4_ifdef( [[]], +[[ + yylloc = yylloc_param; +]]) + + if ( !YY_G(yy_init) ) + { + YY_G(yy_init) = 1; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + +m4_ifdef( [[M4_YY_USES_REJECT]], +[[ + /* Create the reject buffer large enough to save one state per allowed character. */ + if ( ! YY_G(yy_state_buf) ) + YY_G(yy_state_buf) = (yy_state_type *)yyalloc(YY_STATE_BUF_SIZE M4_YY_CALL_LAST_ARG); + if ( ! YY_G(yy_state_buf) ) + YY_FATAL_ERROR( "out of dynamic memory in yylex()" ); +]]) + + if ( ! YY_G(yy_start) ) + YY_G(yy_start) = 1; /* first start state */ + + if ( ! yyin ) +%if-c-only + yyin = stdin; +%endif +%if-c++-only + yyin = & std::cin; +%endif + + if ( ! yyout ) +%if-c-only + yyout = stdout; +%endif +%if-c++-only + yyout = & std::cout; +%endif + + if ( ! YY_CURRENT_BUFFER ) { + yyensure_buffer_stack (M4_YY_CALL_ONLY_ARG); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer( yyin, YY_BUF_SIZE M4_YY_CALL_LAST_ARG); + } + + yy_load_buffer_state( M4_YY_CALL_ONLY_ARG ); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { +%% [8.0] yymore()-related code goes here + yy_cp = YY_G(yy_c_buf_p); + + /* Support of yytext. */ + *yy_cp = YY_G(yy_hold_char); + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + +%% [9.0] code to set up and find next match goes here + +yy_find_action: +%% [10.0] code to find the action number goes here + + YY_DO_BEFORE_ACTION; + +%% [11.0] code for yylineno update goes here + +do_action: /* This label is used only to access EOF actions. */ + +%% [12.0] debug code goes here + + switch ( yy_act ) + { /* beginning of action switch */ +%% [13.0] actions go here + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - YY_G(yytext_ptr)) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = YY_G(yy_hold_char); + YY_RESTORE_YY_MORE_OFFSET + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between YY_CURRENT_BUFFER and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + YY_G(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( YY_G(yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[YY_G(yy_n_chars)] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + YY_G(yy_c_buf_p) = YY_G(yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( M4_YY_CALL_ONLY_ARG ); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state M4_YY_CALL_LAST_ARG); + + yy_bp = YY_G(yytext_ptr) + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++YY_G(yy_c_buf_p); + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { +%% [14.0] code to do back-up for compressed tables and set up yy_cp goes here + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer( M4_YY_CALL_ONLY_ARG ) ) + { + case EOB_ACT_END_OF_FILE: + { + YY_G(yy_did_buffer_switch_on_eof) = 0; + + if ( yywrap( M4_YY_CALL_ONLY_ARG ) ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + YY_G(yy_c_buf_p) = YY_G(yytext_ptr) + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! YY_G(yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + YY_G(yy_c_buf_p) = + YY_G(yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( M4_YY_CALL_ONLY_ARG ); + + yy_cp = YY_G(yy_c_buf_p); + yy_bp = YY_G(yytext_ptr) + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + YY_G(yy_c_buf_p) = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[YY_G(yy_n_chars)]; + + yy_current_state = yy_get_previous_state( M4_YY_CALL_ONLY_ARG ); + + yy_cp = YY_G(yy_c_buf_p); + yy_bp = YY_G(yytext_ptr) + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ +} /* end of yylex */ +%ok-for-header + +%if-c++-only +%not-for-header +/* The contents of this function are C++ specific, so the YY_G macro is not used. + */ +yyFlexLexer::yyFlexLexer( std::istream* arg_yyin, std::ostream* arg_yyout ) +{ + yyin = arg_yyin; + yyout = arg_yyout; + yy_c_buf_p = 0; + yy_init = 0; + yy_start = 0; + yy_flex_debug = 0; + yylineno = 1; // this will only get updated if %option yylineno + + yy_did_buffer_switch_on_eof = 0; + + yy_looking_for_trail_begin = 0; + yy_more_flag = 0; + yy_more_len = 0; + yy_more_offset = yy_prev_more_offset = 0; + + yy_start_stack_ptr = yy_start_stack_depth = 0; + yy_start_stack = NULL; + + yy_buffer_stack = 0; + yy_buffer_stack_top = 0; + yy_buffer_stack_max = 0; + + +m4_ifdef( [[M4_YY_USES_REJECT]], +[[ + yy_state_buf = new yy_state_type[YY_STATE_BUF_SIZE]; +]], +[[ + yy_state_buf = 0; +]]) +} + +/* The contents of this function are C++ specific, so the YY_G macro is not used. + */ +yyFlexLexer::~yyFlexLexer() +{ + delete [] yy_state_buf; + yyfree( yy_start_stack M4_YY_CALL_LAST_ARG ); + yy_delete_buffer( YY_CURRENT_BUFFER M4_YY_CALL_LAST_ARG); + yyfree( yy_buffer_stack M4_YY_CALL_LAST_ARG ); +} + +/* The contents of this function are C++ specific, so the YY_G macro is not used. + */ +void yyFlexLexer::switch_streams( std::istream* new_in, std::ostream* new_out ) +{ + if ( new_in ) + { + yy_delete_buffer( YY_CURRENT_BUFFER M4_YY_CALL_LAST_ARG); + yy_switch_to_buffer( yy_create_buffer( new_in, YY_BUF_SIZE M4_YY_CALL_LAST_ARG) M4_YY_CALL_LAST_ARG); + } + + if ( new_out ) + yyout = new_out; +} + +#ifdef YY_INTERACTIVE +int yyFlexLexer::LexerInput( char* buf, int /* max_size */ ) +#else +int yyFlexLexer::LexerInput( char* buf, int max_size ) +#endif +{ + if ( yyin->eof() || yyin->fail() ) + return 0; + +#ifdef YY_INTERACTIVE + yyin->get( buf[0] ); + + if ( yyin->eof() ) + return 0; + + if ( yyin->bad() ) + return -1; + + return 1; + +#else + (void) yyin->read( buf, max_size ); + + if ( yyin->bad() ) + return -1; + else + return yyin->gcount(); +#endif +} + +void yyFlexLexer::LexerOutput( const char* buf, int size ) +{ + (void) yyout->write( buf, size ); +} +%ok-for-header +%endif + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ +%if-c-only +static int yy_get_next_buffer YYFARGS0(void) +%endif +%if-c++-only +int yyFlexLexer::yy_get_next_buffer() +%endif +{ + M4_YY_DECL_GUTS_VAR(); + register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + register char *source = YY_G(yytext_ptr); + register int number_to_move, i; + int ret_val; + + if ( YY_G(yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[YY_G(yy_n_chars) + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( YY_G(yy_c_buf_p) - YY_G(yytext_ptr) - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) (YY_G(yy_c_buf_p) - YY_G(yytext_ptr)) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = YY_G(yy_n_chars) = 0; + + else + { + 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 +{ + register yy_state_type yy_current_state; + register char *yy_cp; + M4_YY_DECL_GUTS_VAR(); + +%% [15.0] code to get the start state into yy_current_state goes here + + for ( yy_cp = YY_G(yytext_ptr) + YY_MORE_ADJ; yy_cp < YY_G(yy_c_buf_p); ++yy_cp ) + { +%% [16.0] code to find the next state goes here + } + + return yy_current_state; +} + + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ +%if-c-only + static yy_state_type yy_try_NUL_trans YYFARGS1( yy_state_type, yy_current_state) +%endif +%if-c++-only + yy_state_type yyFlexLexer::yy_try_NUL_trans( yy_state_type yy_current_state ) +%endif +{ + register int yy_is_jam; + M4_YY_DECL_GUTS_VAR(); /* This var may be unused depending upon options. */ +%% [17.0] code to find the next state, and perhaps do backing up, goes here + + 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, register char *,yy_bp) +%endif +%if-c++-only + void yyFlexLexer::yyunput( int c, register char* yy_bp) +%endif +{ + register char *yy_cp; + M4_YY_DECL_GUTS_VAR(); + + yy_cp = YY_G(yy_c_buf_p); + + /* undo effects of setting up yytext */ + *yy_cp = YY_G(yy_hold_char); + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register yy_size_t number_to_move = YY_G(yy_n_chars) + 2; + register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; + register char *source = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; + + while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = + YY_G(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + +%% [18.0] update yylineno here +m4_ifdef( [[M4_YY_USE_LINENO]], +[[ + if ( c == '\n' ){ + --yylineno; + } +]]) + + YY_G(yytext_ptr) = yy_bp; + YY_G(yy_hold_char) = *yy_cp; + YY_G(yy_c_buf_p) = yy_cp; +} +%if-c-only +]]) +%endif + +%if-c-only +#ifndef YY_NO_INPUT +#ifdef __cplusplus + static int yyinput YYFARGS0(void) +#else + static int input YYFARGS0(void) +#endif + +%endif +%if-c++-only + int yyFlexLexer::yyinput() +%endif +{ + int c; + M4_YY_DECL_GUTS_VAR(); + + *YY_G(yy_c_buf_p) = YY_G(yy_hold_char); + + if ( *YY_G(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( YY_G(yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[YY_G(yy_n_chars)] ) + /* This was really a NUL. */ + *YY_G(yy_c_buf_p) = '\0'; + + else + { /* need more input */ + 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_ifdef( [[M4_YY_NO_GET_LLOC]],, + [[ +YYLTYPE *yyget_lloc YYFARGS0(void) +{ + M4_YY_DECL_GUTS_VAR(); + return yylloc; +} + ]]) + + m4_ifdef( [[M4_YY_NO_SET_LLOC]],, + [[ +void yyset_lloc YYFARGS1( YYLTYPE * ,yylloc_param) +{ + M4_YY_DECL_GUTS_VAR(); + yylloc = yylloc_param; +} + ]]) +]]) + +%endif + + +/* User-visible API */ + +/* yylex_init is special because it creates the scanner itself, so it is + * the ONLY reentrant function that doesn't take the scanner as the last argument. + * That's why we explicitly handle the declaration, instead of using our macros. + */ +m4_ifdef( [[M4_YY_NO_ANSI_FUNC_DEFS]], +[[ +int yylex_init( ptr_yy_globals ) + yyscan_t* ptr_yy_globals; +]], +[[ +int yylex_init(yyscan_t* ptr_yy_globals) +]]) +{ + if (ptr_yy_globals == NULL){ + errno = EINVAL; + return 1; + } + + *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), NULL ); + + if (*ptr_yy_globals == NULL){ + errno = ENOMEM; + return 1; + } + + /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */ + memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); + + return yy_init_globals ( *ptr_yy_globals ); +} + + +/* yylex_init_extra has the same functionality as yylex_init, but follows the + * convention of taking the scanner as the last argument. Note however, that + * this is a *pointer* to a scanner, as it will be allocated by this call (and + * is the reason, too, why this function also must handle its own declaration). + * The user defined value in the first argument will be available to yyalloc in + * the yyextra field. + */ +m4_ifdef( [[M4_YY_NO_ANSI_FUNC_DEFS]], +[[ +int yylex_init_extra( yy_user_defined, ptr_yy_globals ) + YY_EXTRA_TYPE yy_user_defined; + yyscan_t* ptr_yy_globals; +]], +[[ +int yylex_init_extra( YY_EXTRA_TYPE yy_user_defined, yyscan_t* ptr_yy_globals ) +]]) +{ + struct yyguts_t dummy_yyguts; + + yyset_extra (yy_user_defined, &dummy_yyguts); + + if (ptr_yy_globals == NULL){ + errno = EINVAL; + return 1; + } + + *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts ); + + if (*ptr_yy_globals == NULL){ + errno = ENOMEM; + return 1; + } + + /* By setting to 0xAA, we expose bugs in + yy_init_globals. Leave at 0x00 for releases. */ + memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); + + yyset_extra (yy_user_defined, *ptr_yy_globals); + + return yy_init_globals ( *ptr_yy_globals ); +} + +%endif if-c-only + + +%if-c-only +static int yy_init_globals YYFARGS0(void) +{ + M4_YY_DECL_GUTS_VAR(); + /* Initialization is the same as for the non-reentrant scanner. + * This function is called from yylex_destroy(), so don't allocate here. + */ + +m4_ifdef( [[M4_YY_USE_LINENO]], +[[ + m4_ifdef( [[M4_YY_NOT_REENTRANT]], + [[ + /* We do not touch yylineno unless the option is enabled. */ + yylineno = 1; + ]]) +]]) + YY_G(yy_buffer_stack) = 0; + YY_G(yy_buffer_stack_top) = 0; + YY_G(yy_buffer_stack_max) = 0; + YY_G(yy_c_buf_p) = (char *) 0; + YY_G(yy_init) = 0; + YY_G(yy_start) = 0; + +m4_ifdef( [[M4_YY_HAS_START_STACK_VARS]], +[[ + YY_G(yy_start_stack_ptr) = 0; + YY_G(yy_start_stack_depth) = 0; + YY_G(yy_start_stack) = NULL; +]]) + +m4_ifdef( [[M4_YY_USES_REJECT]], +[[ + YY_G(yy_state_buf) = 0; + YY_G(yy_state_ptr) = 0; + YY_G(yy_full_match) = 0; + YY_G(yy_lp) = 0; +]]) + +m4_ifdef( [[M4_YY_TEXT_IS_ARRAY]], +[[ + YY_G(yytext_ptr) = 0; + YY_G(yy_more_offset) = 0; + YY_G(yy_prev_more_offset) = 0; +]]) + +/* Defined in main.c */ +#ifdef YY_STDINIT + yyin = stdin; + yyout = stdout; +#else + yyin = (FILE *) 0; + yyout = (FILE *) 0; +#endif + + /* For future reference: Set errno on error, since we are called by + * yylex_init() + */ + return 0; +} +%endif + + +%if-c-only SNIP! this currently causes conflicts with the c++ scanner +/* yylex_destroy is for both reentrant and non-reentrant scanners. */ +int yylex_destroy YYFARGS0(void) +{ + M4_YY_DECL_GUTS_VAR(); + + /* Pop the buffer stack, destroying each element. */ + while(YY_CURRENT_BUFFER){ + yy_delete_buffer( YY_CURRENT_BUFFER M4_YY_CALL_LAST_ARG ); + YY_CURRENT_BUFFER_LVALUE = NULL; + yypop_buffer_state(M4_YY_CALL_ONLY_ARG); + } + + /* Destroy the stack itself. */ + yyfree(YY_G(yy_buffer_stack) M4_YY_CALL_LAST_ARG); + YY_G(yy_buffer_stack) = NULL; + +m4_ifdef( [[M4_YY_HAS_START_STACK_VARS]], +[[ + /* Destroy the start condition stack. */ + yyfree( YY_G(yy_start_stack) M4_YY_CALL_LAST_ARG ); + YY_G(yy_start_stack) = NULL; +]]) + +m4_ifdef( [[M4_YY_USES_REJECT]], +[[ + yyfree ( YY_G(yy_state_buf) M4_YY_CALL_LAST_ARG); + YY_G(yy_state_buf) = NULL; +]]) + + /* Reset the globals. This is important in a non-reentrant scanner so the next time + * yylex() is called, initialization will occur. */ + yy_init_globals( M4_YY_CALL_ONLY_ARG); + +%if-reentrant + /* Destroy the main struct (reentrant only). */ + yyfree ( yyscanner M4_YY_CALL_LAST_ARG ); + yyscanner = NULL; +%endif + return 0; +} +%endif + + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +/* + * Internal utility routines. + */ +]]) + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +#ifndef yytext_ptr +static void yy_flex_strncpy YYFARGS3( char*,s1, yyconst char *,s2, int,n) +{ + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; +} +#endif +]]) + +m4_ifdef( [[M4_YY_NOT_IN_HEADER]], +[[ +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen YYFARGS1( yyconst char *,s) +{ + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; +} +#endif +]]) + +m4_ifdef( [[M4_YY_NO_FLEX_ALLOC]],, +[[ +void *yyalloc YYFARGS1( yy_size_t ,size) +{ + return (void *) malloc( size ); +} +]]) + +m4_ifdef( [[M4_YY_NO_FLEX_REALLOC]],, +[[ +void *yyrealloc YYFARGS2( void *,ptr, yy_size_t ,size) +{ + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); +} +]]) + +m4_ifdef( [[M4_YY_NO_FLEX_FREE]],, +[[ +void yyfree YYFARGS1( void *,ptr) +{ + free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ +} +]]) + +%if-tables-serialization definitions +m4preproc_include(`tables_shared.c') + +static int yytbl_read8 (void *v, struct yytbl_reader * rd) +{ + errno = 0; + if (fread (v, sizeof (flex_uint8_t), 1, rd->fp) != 1){ + errno = EIO; + return -1; + } + rd->bread += sizeof(flex_uint8_t); + return 0; +} + +static int yytbl_read16 (void *v, struct yytbl_reader * rd) +{ + errno = 0; + if (fread (v, sizeof (flex_uint16_t), 1, rd->fp) != 1){ + errno = EIO; + return -1; + } + *((flex_uint16_t *) v) = ntohs (*((flex_uint16_t *) v)); + rd->bread += sizeof(flex_uint16_t); + return 0; +} + +static int yytbl_read32 (void *v, struct yytbl_reader * rd) +{ + errno = 0; + if (fread (v, sizeof (flex_uint32_t), 1, rd->fp) != 1){ + errno = EIO; + return -1; + } + *((flex_uint32_t *) v) = ntohl (*((flex_uint32_t *) v)); + rd->bread += sizeof(flex_uint32_t); + return 0; +} + +/** Read the header */ +static int yytbl_hdr_read YYFARGS2(struct yytbl_hdr *, th, struct yytbl_reader *, rd) +{ + int bytes; + memset (th, 0, sizeof (struct yytbl_hdr)); + + if (yytbl_read32 (&(th->th_magic), rd) != 0) + return -1; + + if (th->th_magic != YYTBL_MAGIC){ + YY_FATAL_ERROR( "bad magic number" ); /* TODO: not fatal. */ + 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 +]]) diff --git a/contrib/flex/flexdef.h b/contrib/flex/flexdef.h new file mode 100644 index 000000000000..046dd9aa794d --- /dev/null +++ b/contrib/flex/flexdef.h @@ -0,0 +1,1226 @@ + +/* 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. */ + +/* 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 FLEXDEF_H +#define FLEXDEF_H 1 + +#ifdef HAVE_CONFIG_H +#include +#endif + +/* AIX requires this to be the first thing in the file. */ +#ifndef __GNUC__ +# if HAVE_ALLOCA_H +# include +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca /* predefined by HP cc +Olibcalls */ +char *alloca (); +# endif +# endif +# endif +#endif + +#ifdef STDC_HEADERS +#include +#include +#include +#include +#include +#include +#include +#endif +#ifdef HAVE_ASSERT_H +#include +#else +#define assert(Pred) +#endif + +#ifdef HAVE_LIMITS_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_SYS_PARAMS_H +#include +#endif +#ifdef HAVE_SYS_WAIT_H +#include +#endif +#ifdef HAVE_STDBOOL_H +#include +#else +#define bool int +#define true 1 +#define false 0 +#endif +#ifdef HAVE_REGEX_H +#include +#endif +#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 +#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 +#define Char unsigned char + +/* Size of input alphabet - should be size of ASCII set. */ +#ifndef DEFAULT_CSIZE +#define DEFAULT_CSIZE 128 +#endif + +#ifndef PROTO +#if defined(__STDC__) +#define PROTO(proto) proto +#else +#define PROTO(proto) () +#endif +#endif + +#ifdef VMS +#ifndef __VMS_POSIX +#define unlink remove +#define SHORT_FILE_NAMES +#endif +#endif + +#ifdef MS_DOS +#define SHORT_FILE_NAMES +#endif + + +/* Maximum line length we'll have to deal with. */ +#define MAXLINE 2048 + +#ifndef MIN +#define MIN(x,y) ((x) < (y) ? (x) : (y)) +#endif +#ifndef MAX +#define MAX(x,y) ((x) > (y) ? (x) : (y)) +#endif +#ifndef ABS +#define ABS(x) ((x) < 0 ? -(x) : (x)) +#endif + + +/* ANSI C does not guarantee that isascii() is defined */ +#ifndef isascii +#define isascii(c) ((c) <= 0177) +#endif + +#define unspecified -1 + +/* Special chk[] values marking the slots taking by end-of-buffer and action + * numbers. + */ +#define EOB_POSITION -1 +#define ACTION_POSITION -2 + +/* Number of data items per line for -f output. */ +#define NUMDATAITEMS 10 + +/* Number of lines of data in -f output before inserting a blank line for + * readability. + */ +#define NUMDATALINES 10 + +/* transition_struct_out() definitions. */ +#define TRANS_STRUCT_PRINT_LENGTH 14 + +/* Returns true if an nfa state has an epsilon out-transition slot + * that can be used. This definition is currently not used. + */ +#define FREE_EPSILON(state) \ + (transchar[state] == SYM_EPSILON && \ + trans2[state] == NO_TRANSITION && \ + finalst[state] != state) + +/* Returns true if an nfa state has an epsilon out-transition character + * and both slots are free + */ +#define SUPER_FREE_EPSILON(state) \ + (transchar[state] == SYM_EPSILON && \ + trans1[state] == NO_TRANSITION) \ + +/* Maximum number of NFA states that can comprise a DFA state. It's real + * big because if there's a lot of rules, the initial state will have a + * huge epsilon closure. + */ +#define INITIAL_MAX_DFA_SIZE 750 +#define MAX_DFA_SIZE_INCREMENT 750 + + +/* A note on the following masks. They are used to mark accepting numbers + * as being special. As such, they implicitly limit the number of accepting + * numbers (i.e., rules) because if there are too many rules the rule numbers + * will overload the mask bits. Fortunately, this limit is \large/ (0x2000 == + * 8192) so unlikely to actually cause any problems. A check is made in + * new_rule() to ensure that this limit is not reached. + */ + +/* Mask to mark a trailing context accepting number. */ +#define YY_TRAILING_MASK 0x2000 + +/* Mask to mark the accepting number of the "head" of a trailing context + * rule. + */ +#define YY_TRAILING_HEAD_MASK 0x4000 + +/* Maximum number of rules, as outlined in the above note. */ +#define MAX_RULE (YY_TRAILING_MASK - 1) + + +/* NIL must be 0. If not, its special meaning when making equivalence classes + * (it marks the representative of a given e.c.) will be unidentifiable. + */ +#define NIL 0 + +#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 INFINITE_REPEAT -1 /* for x{5,} constructions */ + +#define INITIAL_MAX_CCLS 100 /* max number of unique character classes */ +#define MAX_CCLS_INCREMENT 100 + +/* Size of table holding members of character classes. */ +#define INITIAL_MAX_CCL_TBL_SIZE 500 +#define MAX_CCL_TBL_SIZE_INCREMENT 250 + +#define INITIAL_MAX_RULES 100 /* default maximum number of rules */ +#define MAX_RULES_INCREMENT 100 + +#define INITIAL_MNS 2000 /* default maximum number of nfa states */ +#define MNS_INCREMENT 1000 /* amount to bump above by if it's not enough */ + +#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 */ + +/* 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) + +/* Maximum number of nxt/chk pairs for non-templates. */ +#define INITIAL_MAX_XPAIRS 2000 +#define MAX_XPAIRS_INCREMENT 2000 + +/* Maximum number of nxt/chk pairs needed for templates. */ +#define INITIAL_MAX_TEMPLATE_XPAIRS 2500 +#define MAX_TEMPLATE_XPAIRS_INCREMENT 2500 + +#define SYM_EPSILON (CSIZE + 1) /* to mark transitions on the symbol epsilon */ + +#define INITIAL_MAX_SCS 40 /* maximum number of start conditions */ +#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 */ + +/* The following percentages are used to tune table compression: + + * The percentage the number of out-transitions a state must be of the + * number of equivalence classes in order to be considered for table + * compaction by using protos. + */ +#define PROTO_SIZE_PERCENTAGE 15 + +/* 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 + * template of the most common out-transition instead of with the first + * proto in the proto queue. + */ +#define CHECK_COM_PERCENTAGE 50 + +/* The percentage the number of differences between a state's transition + * table and the proto it was first compared with must be of the total + * number of out-transitions of the state in order to keep the first + * proto as a good match and not search any further. + */ +#define FIRST_MATCH_DIFF_PERCENTAGE 10 + +/* The percentage the number of differences between a state's transition + * table and the most similar proto must be of the state's total number + * of out-transitions to use the proto as an acceptable close match. + */ +#define ACCEPTABLE_DIFF_PERCENTAGE 50 + +/* 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 + * to consider making a template from the state. + */ +#define TEMPLATE_SAME_PERCENTAGE 60 + +/* The percentage the number of differences between a state's transition + * table and the most similar proto must be of the state's total number + * of out-transitions to create a new proto from the state. + */ +#define NEW_PROTO_DIFF_PERCENTAGE 20 + +/* The percentage the total number of out-transitions of a state must be + * of the number of equivalence classes in order to consider trying to + * fit the transition table into "holes" inside the nxt/chk table. + */ +#define INTERIOR_FIT_PERCENTAGE 15 + +/* Size of region set aside to cache the complete transition table of + * protos on the proto queue to enable quick comparisons. + */ +#define PROT_SAVE_SIZE 2000 + +#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 + * spot for it. + */ +#define MAX_XTIONS_FULL_INTERIOR_FIT 4 + +/* Maximum number of rules which will be reported as being associated + * with a DFA state. + */ +#define MAX_ASSOC_RULES 100 + +/* Number that, if used to subscript an array, has a good chance of producing + * an error; should be small enough to fit into a short. + */ +#define BAD_SUBSCRIPT -32767 + +/* Absolute value of largest number that can be stored in a short, with a + * bit of slop thrown in for general paranoia. + */ +#define MAX_SHORT 32700 + + +/* Declarations for global variables. */ + + +/* Variables for flags: + * printstats - if true (-v), dump statistics + * syntaxerror - true if a syntax error has been found + * eofseen - true if we've seen an eof in the input file + * ddebug - if true (-d), make a "debug" scanner + * trace - if true (-T), trace processing + * nowarn - if true (-w), do not generate warnings + * spprdflt - if true (-s), suppress the default rule + * interactive - if true (-I), generate an interactive 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 + * usemecs - if true (-Cm flag), use meta-equivalence classes + * fullspd - if true (-F flag), use Jacobson method of table representation + * gen_line_dirs - if true (i.e., no -L flag), generate #line directives + * performance_report - if > 0 (i.e., -p flag), generate a report relating + * to scanner performance; if > 1 (-p -p), report on minor performance + * problems, too + * backing_up_report - if true (i.e., -b flag), generate "lex.backup" file + * 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(). + * yytext_is_array - if true (i.e., %array directive), then declare + * yytext as a array instead of a character pointer. Nice and inefficient. + * do_yywrap - do yywrap() processing on EOF. If false, EOF treated as + * "no more files". + * csize - size of character set for the scanner we're generating; + * 128 for 7-bit chars and 256 for 8-bit + * yymore_used - if true, yymore() is used in input rules + * reject - if true, generate back-up tables for REJECT macro + * real_reject - if true, scanner really uses REJECT (as opposed to just + * having "reject" set for variable trailing context) + * continued_action - true if this rule's action is to "fall through" to + * the next rule's action (i.e., the '|' action) + * in_rule - true if we're inside an individual rule, false if not. + * yymore_really_used - whether to treat yymore() as really used, regardless + * of what we think based on references to it in the user's actions. + * reject_really_used - same for REJECT + */ + +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; + +extern int yymore_really_used, reject_really_used; + + +/* Variables used in the flex input routines: + * datapos - characters on current output line + * dataline - number of contiguous lines of data in current data + * statement. Used to generate readable -f output + * linenum - current input line number + * skelfile - the skeleton file + * skel - compiled-in skeleton array + * skel_ind - index into "skel" array, if skelfile is nil + * yyin - input file + * 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 + * do_stdinit - whether to initialize yyin/yyout to stdin/stdout + * 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 + * + * action_array - array to hold the rule actions + * action_size - size of action_array + * defs1_offset - index where the user's section 1 definitions start + * in action_array + * prolog_offset - index where the prolog starts in action_array + * action_offset - index where the non-prolog starts in action_array + * action_index - index where the next action should go, with respect + * to "action_array" + */ + +extern int datapos, dataline, linenum; +extern FILE *skelfile, *yyin, *backing_up_file; +extern const char *skel[]; +extern int skel_ind; +extern char *infilename, *outfilename, *headerfilename; +extern int did_outfilename; +extern char *prefix, *yyclass, *extra_type; +extern int do_stdinit, use_stdout; +extern char **input_files; +extern int num_input_files; +extern char *program_name; + +extern char *action_array; +extern int action_size; +extern int defs1_offset, prolog_offset, action_offset, action_index; + + +/* Variables for stack of states having only one out-transition: + * onestate - state number + * onesym - transition symbol + * onenext - target state + * onedef - default base entry + * onesp - stack pointer + */ + +extern int onestate[ONE_STACK_SIZE], onesym[ONE_STACK_SIZE]; +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 + * num_eof_rules - number of <> rules + * default_rule - number of the default rule + * current_max_rules - current maximum number of rules + * lastnfa - last nfa state number created + * firstst - physically the first state of a fragment + * lastst - last physical state of fragment + * finalst - last logical state of fragment + * transchar - transition character + * trans1 - transition state + * trans2 - 2nd transition state for epsilons + * accptnum - accepting number + * assoc_rule - rule associated with this NFA state (or 0 if none) + * state_type - a STATE_xxx type identifying whether the state is part + * of a normal rule, the leading state in a trailing context + * rule (i.e., the state which marks the transition from + * recognizing the text-to-be-matched to the beginning of + * the trailing context), or a subsequent state in a trailing + * context rule + * rule_type - a RULE_xxx type identifying whether this a ho-hum + * normal rule or one which has variable head & trailing + * 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 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(). + */ +#define STATE_NORMAL 0x1 +#define STATE_TRAILING_CONTEXT 0x2 + +/* Global holding current type of state we're making. */ + +extern int current_state_type; + +/* Different types of rules. */ +#define RULE_NORMAL 0 +#define RULE_VARIABLE 1 + +/* True if the input rules include a rule with both variable-length head + * and trailing context, false otherwise. + */ +extern int variable_trailing_context_rules; + + +/* Variables for protos: + * numtemps - number of templates created + * numprots - number of protos created + * protprev - backlink to a more-recently used proto + * protnext - forward link to a less-recently used proto + * prottbl - base/def table entry for proto + * protcomst - common state of proto + * firstprot - number of the most recently used proto + * lastprot - number of the least recently used proto + * protsave contains the entire state array for protos + */ + +extern int numtemps, numprots, protprev[MSP], protnext[MSP], prottbl[MSP]; +extern int protcomst[MSP], firstprot, lastprot, protsave[PROT_SAVE_SIZE]; + + +/* Variables for managing equivalence classes: + * numecs - number of equivalence classes + * nextecm - forward link of Equivalence Class members + * ecgroup - class number or backward link of EC members + * nummecs - number of meta-equivalence classes (used to compress + * templates) + * tecfwd - forward link of meta-equivalence classes members + * tecbck - backward link of MEC's + */ + +/* Reserve enough room in the equivalence class arrays so that we + * can use the CSIZE'th element to hold equivalence class information + * for the NUL character. Later we'll move this information into + * the 0th element. + */ +extern int numecs, nextecm[CSIZE + 1], ecgroup[CSIZE + 1], nummecs; + +/* Meta-equivalence classes are indexed starting at 1, so it's possible + * that they will require positions from 1 .. CSIZE, i.e., CSIZE + 1 + * slots total (since the arrays are 0-based). nextecm[] and ecgroup[] + * don't require the extra position since they're indexed from 1 .. CSIZE - 1. + */ +extern int tecfwd[CSIZE + 1], tecbck[CSIZE + 1]; + + +/* Variables for start conditions: + * lastsc - last start condition created + * current_max_scs - current limit on number of start conditions + * scset - set of rules active in start condition + * scbol - set of rules active only at the beginning of line in a s.c. + * scxclu - true if start condition is exclusive + * sceof - true if start condition has EOF rule + * scname - start condition name + */ + +extern int lastsc, *scset, *scbol, *scxclu, *sceof; +extern int current_max_scs; +extern char **scname; + + +/* Variables for dfa machine data: + * current_max_dfa_size - current maximum number of NFA states in DFA + * current_max_xpairs - current maximum number of non-template xtion pairs + * current_max_template_xpairs - current maximum number of template pairs + * current_max_dfas - current maximum number DFA states + * lastdfa - last dfa state number created + * nxt - state to enter upon reading character + * chk - check value to see if "nxt" applies + * tnxt - internal nxt table for templates + * base - offset into "nxt" for given state + * def - where to go if "chk" disallows "nxt" entry + * nultrans - NUL transition for each state + * NUL_ec - equivalence class of the NUL character + * tblend - last "nxt/chk" table entry being used + * firstfree - first empty entry in "nxt/chk" table + * dss - nfa state set for each dfa + * dfasiz - size of nfa state set for each dfa + * dfaacc - accepting set for each dfa state (if using REJECT), or accepting + * number, if not + * accsiz - size of accepting set for each dfa state + * dhash - dfa state hash value + * numas - number of DFA accepting states created; note that this + * is not necessarily the same value as num_rules, which is the analogous + * value for the NFA + * numsnpairs - number of state/nextstate transition pairs + * jambase - position in base/def where the default jam table starts + * jamstate - state number corresponding to "jam" state + * end_of_buffer_state - end-of-buffer dfa state number + */ + +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 *accsiz, *dhash, numas; +extern int numsnpairs, jambase, jamstate; +extern int end_of_buffer_state; + +/* Variables for ccl information: + * lastccl - ccl index of the last created ccl + * current_maxccls - current limit on the maximum number of unique ccl's + * cclmap - maps a ccl index to its set pointer + * ccllen - gives the length of a ccl + * cclng - true for a given ccl if the ccl is negated + * cclreuse - counts how many times a ccl is re-used + * current_max_ccl_tbl_size - current limit on number of characters needed + * to represent the unique ccl's + * ccltbl - holds the characters in each ccl - indexed by cclmap + */ + +extern int lastccl, *cclmap, *ccllen, *cclng, cclreuse; +extern int current_maxccls, current_max_ccl_tbl_size; +extern Char *ccltbl; + + +/* Variables for miscellaneous information: + * nmstr - last NAME scanned by the scanner + * sectnum - section number currently being parsed + * nummt - number of empty nxt/chk table entries + * hshcol - number of hash collisions detected by snstods + * dfaeql - number of times a newly created dfa was equal to an old one + * numeps - number of epsilon NFA states created + * eps2 - number of epsilon states which have 2 out-transitions + * num_reallocs - number of times it was necessary to realloc() a group + * of arrays + * tmpuses - number of DFA states that chain to templates + * totnst - total number of NFA states used to make DFA states + * peakpairs - peak number of transition pairs we had to store internally + * numuniq - number of unique transitions + * numdup - number of duplicate transitions + * hshsave - number of hash collisions saved by checking number of states + * num_backing_up - number of DFA states requiring backing up + * bol_needed - whether scanner needs beginning-of-line recognition + */ + +extern char nmstr[MAXLINE]; +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 *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 ) ) + +#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 * ) ) + +#define allocate_char_ptr_array(size) \ + (char **) allocate_array( size, sizeof( char * ) ) + +#define allocate_dfaacc_union(size) \ + (union dfaacc_union *) \ + allocate_array( size, sizeof( union dfaacc_union ) ) + +#define reallocate_int_ptr_array(array,size) \ + (int **) reallocate_array( (void *) array, size, sizeof( int * ) ) + +#define reallocate_char_ptr_array(array,size) \ + (char **) reallocate_array( (void *) array, size, sizeof( char * ) ) + +#define reallocate_dfaacc_union(array, size) \ + (union dfaacc_union *) \ + reallocate_array( (void *) array, size, sizeof( union dfaacc_union ) ) + +#define allocate_character_array(size) \ + (char *) allocate_array( size, sizeof( char ) ) + +#define reallocate_character_array(array,size) \ + (char *) reallocate_array( (void *) array, size, sizeof( char ) ) + +#define allocate_Character_array(size) \ + (Char *) allocate_array( size, sizeof( Char ) ) + +#define reallocate_Character_array(array,size) \ + (Char *) reallocate_array( (void *) array, size, sizeof( Char ) ) + + +/* Used to communicate between scanner and parser. The type should really + * be YYSTYPE, but we can't easily get our hands on it. + */ +extern int yylval; + + +/* External functions that are cross-referenced among the flex source files. */ + + +/* 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 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[])); + + +/* from file dfa.c */ + +/* Check a DFA state for backing up. */ +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)); + +/* Construct the epsilon closure of a set of ndfa states. */ +extern int *epsclosure PROTO ((int *, int *, int[], int *, int *)); + +/* Increase the maximum number of dfas. */ +extern void increase_max_dfas PROTO ((void)); + +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 *)); + + +/* from file ecs.c */ + +/* Convert character classes to set of equivalence classes. */ +extern void ccl2ecl PROTO ((void)); + +/* Associate equivalence class numbers with class members. */ +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)); + +/* Create equivalence class for single character. */ +extern void mkechar PROTO ((int, int[], int[])); + + +/* from file gen.c */ + +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)); + +/* Generate the code to perform the backing up. */ +extern void gen_bu_action PROTO ((void)); + +/* Generate full speed compressed transition table. */ +extern void genctbl PROTO ((void)); + +/* Generate the code to find the action number. */ +extern void gen_find_action PROTO ((void)); + +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 *)); + +/* Generate the code to find the next match. */ +extern void gen_next_match PROTO ((void)); + +/* Generate the code to find the next state. */ +extern void gen_next_state PROTO ((int)); + +/* Generate the code to make a NUL transition. */ +extern void gen_NUL_trans PROTO ((void)); + +/* Generate the code to find the start state. */ +extern void gen_start_state PROTO ((void)); + +/* Generate data statements for the transition tables. */ +extern void gentabs PROTO ((void)); + +/* Write out a formatted string at the current indentation level. */ +extern void indent_put2s PROTO ((const char *, const char *)); + +/* Write out a string + newline at the current indentation level. */ +extern void indent_puts PROTO ((const char *)); + +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)); + + +/* from file misc.c */ + +/* Add a #define to the action file. */ +extern void action_define PROTO ((const char *defname, int value)); + +/* Add the given text to the stored actions. */ +extern void add_action PROTO ((const char *new_text)); + +/* True if a string is all lower case. */ +extern int all_lower PROTO ((register char *)); + +/* True if a string is all upper case. */ +extern int all_upper PROTO ((register char *)); + +/* 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)); + +/* Replace upper-case letter to lower-case. */ +extern Char clower PROTO ((int)); + +/* Returns a dynamically allocated copy of a string. */ +extern char *copy_string PROTO ((register const char *)); + +/* Returns a dynamically allocated copy of a (potentially) unsigned string. */ +extern Char *copy_unsigned_string PROTO ((register Char *)); + +/* 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)); + +/* Flush generated data statements. */ +extern void dataflush PROTO ((void)); + +/* Report an error message and terminate. */ +extern void flexerror PROTO ((const char *)); + +/* Report a fatal error message and terminate. */ +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[])); + +/* Report an error message formatted with one integer argument. */ +extern void lerrif PROTO ((const char *, int)); + +/* Report an error message formatted with one string argument. */ +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)); + +/* Mark the current position in the action array as the end of the section 1 + * user defs. + */ +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)); + +/* Generate a data statment for a two-dimensional array. */ +extern void mk2data PROTO ((int)); + +extern void mkdata PROTO ((int)); /* generate a data statement */ + +/* Return the integer represented by a string of digits. */ +extern int myctoi PROTO ((const char *)); + +/* Return character corresponding to escape sequence. */ +extern Char myesc PROTO ((Char[])); + +/* Convert an octal digit string to an integer value. */ +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_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 *)); +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)); + +/* Write out one section of the skeleton file. */ +extern void skelout PROTO ((void)); + +/* Output a yy_trans_info structure. */ +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)); + +/* Set a region of memory to 0. */ +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)); + +/* Make a given number of copies of a singleton machine. */ +extern int copysingl PROTO ((int, int)); + +/* Debugging routine to write out an nfa. */ +extern void dumpnfa PROTO ((int)); + +/* Finish up the processing for a rule. */ +extern void finish_rule PROTO ((int, int, int, int, int)); + +/* Connect two machines together. */ +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)); + +/* Make a machine that branches to two machines. */ +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 */ + +/* Make a machine that matches either one of two machines. */ +extern int mkor PROTO ((int, int)); + +/* Convert a machine into a positive closure. */ +extern int mkposcl PROTO ((int)); + +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 void new_rule PROTO ((void)); /* initialize for a new rule */ + + +/* from file parse.y */ + +/* Build the "<>" action for the active start conditions. */ +extern void build_eof_action PROTO ((void)); + +/* Write out a message formatted with one string, pinpointing its location. */ +extern void format_pinpoint_message PROTO ((const char *, const char *)); + +/* Write out a message, pinpointing its location. */ +extern void pinpoint_message PROTO ((const char *)); + +/* Write out a warning, pinpointing it at the given line. */ +extern void line_warning PROTO ((const char *, int)); + +/* Write out a message, pinpointing it at the given line. */ +extern void line_pinpoint PROTO ((const char *, int)); + +/* Report a formatted syntax error. */ +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)); + +/* Open the given file (if NULL, stdin) for scanning. */ +extern void set_input_file PROTO ((char *)); + +/* Wrapup a file in the lexical analyzer. */ +extern int yywrap PROTO ((void)); + + +/* from file sym.c */ + +/* Save the text of a character class. */ +extern void cclinstal PROTO ((Char[], int)); + +/* Lookup the number associated with character class. */ +extern int ccllookup PROTO ((Char[])); + +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 ((const char *, int)); /* make a start condition */ + +/* Lookup the number associated with a start condition. */ +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 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 */ + +/* Make the default, "jam" table entries. */ +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)); + +/* Place a state into full speed transition table. */ +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)); + + +/* from file yylex.c */ + +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/contrib/flex/flexint.h b/contrib/flex/flexint.h new file mode 100644 index 000000000000..f9fa80cb08c0 --- /dev/null +++ b/contrib/flex/flexint.h @@ -0,0 +1,63 @@ +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have . 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 +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/contrib/flex/gen.c b/contrib/flex/gen.c new file mode 100644 index 000000000000..8261951c065e --- /dev/null +++ b/contrib/flex/gen.c @@ -0,0 +1,2169 @@ +/* gen - actual generation (writing) of flex scanners */ + +/* Copyright (c) 1990 The Regents of the University of California. */ +/* All rights reserved. */ + +/* This code is derived from software contributed to Berkeley by */ +/* Vern Paxson. */ + +/* The United States Government has rights in this work pursuant */ +/* to contract no. DE-AC03-76SF00098 between the United States */ +/* Department of Energy and the University of California. */ + +/* This file is part of flex. */ + +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ + +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ + +/* Neither the name of the University nor the names of its contributors */ +/* may be used to endorse or promote products derived from this software */ +/* without specific prior written permission. */ + +/* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */ +/* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ +/* PURPOSE. */ + +#include "flexdef.h" +#include "tables.h" + + +/* declare functions that have forward references */ + +void gen_next_state PROTO ((int)); +void genecs PROTO ((void)); +void indent_put2s PROTO ((const char *, const char *)); +void indent_puts PROTO ((const char *)); + + +static int indent_level = 0; /* each level is 8 spaces */ + +#define indent_up() (++indent_level) +#define indent_down() (--indent_level) +#define set_indent(indent_val) indent_level = indent_val + +/* Almost everything is done in terms of arrays starting at 1, so provide + * a null entry for the zero element of all C arrays. (The exception + * to this is that the fast table representation generally uses the + * 0 elements of its arrays, too.) + */ + +static const char *get_int16_decl (void) +{ + return (gentables) + ? "static yyconst flex_int16_t %s[%d] =\n { 0,\n" + : "static yyconst flex_int16_t * %s = 0;\n"; +} + + +static const char *get_int32_decl (void) +{ + return (gentables) + ? "static yyconst flex_int32_t %s[%d] =\n { 0,\n" + : "static yyconst flex_int32_t * %s = 0;\n"; +} + +static const char *get_state_decl (void) +{ + return (gentables) + ? "static yyconst yy_state_type %s[%d] =\n { 0,\n" + : "static yyconst yy_state_type * %s = 0;\n"; +} + +/* Indent to the current level. */ + +void do_indent () +{ + register int i = indent_level * 8; + + while (i >= 8) { + outc ('\t'); + i -= 8; + } + + while (i > 0) { + outc (' '); + --i; + } +} + + +/** Make the table for possible eol matches. + * @return the newly allocated rule_can_match_eol table + */ +static struct yytbl_data *mkeoltbl (void) +{ + int i; + flex_int8_t *tdata = 0; + struct yytbl_data *tbl; + + tbl = (struct yytbl_data *) calloc (1, sizeof (struct yytbl_data)); + yytbl_data_init (tbl, YYTD_ID_RULE_CAN_MATCH_EOL); + tbl->td_flags = YYTD_DATA8; + tbl->td_lolen = num_rules + 1; + tbl->td_data = tdata = + (flex_int8_t *) calloc (tbl->td_lolen, sizeof (flex_int8_t)); + + for (i = 1; i <= num_rules; i++) + tdata[i] = rule_has_nl[i] ? 1 : 0; + + buf_prints (&yydmap_buf, + "\t{YYTD_ID_RULE_CAN_MATCH_EOL, (void**)&yy_rule_can_match_eol, sizeof(%s)},\n", + "flex_int32_t"); + return tbl; +} + +/* Generate the table for possible eol matches. */ +static void geneoltbl () +{ + int i; + + outn ("m4_ifdef( [[M4_YY_USE_LINENO]],[["); + outn ("/* Table of booleans, true if rule could match eol. */"); + out_str_dec (get_int32_decl (), "yy_rule_can_match_eol", + num_rules + 1); + + if (gentables) { + for (i = 1; i <= num_rules; i++) { + out_dec ("%d, ", rule_has_nl[i] ? 1 : 0); + /* format nicely, 20 numbers per line. */ + if ((i % 20) == 19) + out ("\n "); + } + out (" };\n"); + } + outn ("]])"); +} + + +/* Generate the code to keep backing-up information. */ + +void gen_backing_up () +{ + if (reject || num_backing_up == 0) + return; + + if (fullspd) + indent_puts ("if ( yy_current_state[-1].yy_nxt )"); + else + indent_puts ("if ( yy_accept[yy_current_state] )"); + + indent_up (); + indent_puts ("{"); + indent_puts ("YY_G(yy_last_accepting_state) = yy_current_state;"); + indent_puts ("YY_G(yy_last_accepting_cpos) = yy_cp;"); + indent_puts ("}"); + indent_down (); +} + + +/* Generate the code to perform the backing up. */ + +void gen_bu_action () +{ + if (reject || num_backing_up == 0) + return; + + set_indent (3); + + indent_puts ("case 0: /* must back up */"); + indent_puts ("/* undo the effects of YY_DO_BEFORE_ACTION */"); + indent_puts ("*yy_cp = YY_G(yy_hold_char);"); + + if (fullspd || fulltbl) + indent_puts ("yy_cp = YY_G(yy_last_accepting_cpos) + 1;"); + else + /* Backing-up info for compressed tables is taken \after/ + * yy_cp has been incremented for the next state. + */ + indent_puts ("yy_cp = YY_G(yy_last_accepting_cpos);"); + + indent_puts ("yy_current_state = YY_G(yy_last_accepting_state);"); + indent_puts ("goto yy_find_action;"); + outc ('\n'); + + set_indent (0); +} + +/** mkctbl - make full speed compressed transition table + * This is an array of structs; each struct a pair of integers. + * You should call mkssltbl() immediately after this. + * Then, I think, mkecstbl(). Arrrg. + * @return the newly allocated trans table + */ + +static struct yytbl_data *mkctbl (void) +{ + register int i; + struct yytbl_data *tbl = 0; + flex_int32_t *tdata = 0, curr = 0; + int end_of_buffer_action = num_rules + 1; + + buf_prints (&yydmap_buf, + "\t{YYTD_ID_TRANSITION, (void**)&yy_transition, sizeof(%s)},\n", + ((tblend + numecs + 1) >= INT16_MAX + || long_align) ? "flex_int32_t" : "flex_int16_t"); + + tbl = (struct yytbl_data *) calloc (1, sizeof (struct yytbl_data)); + yytbl_data_init (tbl, YYTD_ID_TRANSITION); + tbl->td_flags = YYTD_DATA32 | YYTD_STRUCT; + tbl->td_hilen = 0; + tbl->td_lolen = tblend + numecs + 1; /* number of structs */ + + tbl->td_data = tdata = + (flex_int32_t *) calloc (tbl->td_lolen * 2, sizeof (flex_int32_t)); + + /* We want the transition to be represented as the offset to the + * next state, not the actual state number, which is what it currently + * is. The offset is base[nxt[i]] - (base of current state)]. That's + * just the difference between the starting points of the two involved + * states (to - from). + * + * First, though, we need to find some way to put in our end-of-buffer + * flags and states. We do this by making a state with absolutely no + * transitions. We put it at the end of the table. + */ + + /* We need to have room in nxt/chk for two more slots: One for the + * action and one for the end-of-buffer transition. We now *assume* + * that we're guaranteed the only character we'll try to index this + * nxt/chk pair with is EOB, i.e., 0, so we don't have to make sure + * there's room for jam entries for other characters. + */ + + while (tblend + 2 >= current_max_xpairs) + expand_nxt_chk (); + + while (lastdfa + 1 >= current_max_dfas) + increase_max_dfas (); + + base[lastdfa + 1] = tblend + 2; + nxt[tblend + 1] = end_of_buffer_action; + chk[tblend + 1] = numecs + 1; + chk[tblend + 2] = 1; /* anything but EOB */ + + /* So that "make test" won't show arb. differences. */ + nxt[tblend + 2] = 0; + + /* Make sure every state has an end-of-buffer transition and an + * action #. + */ + for (i = 0; i <= lastdfa; ++i) { + int anum = dfaacc[i].dfaacc_state; + int offset = base[i]; + + chk[offset] = EOB_POSITION; + chk[offset - 1] = ACTION_POSITION; + nxt[offset - 1] = anum; /* action number */ + } + + for (i = 0; i <= tblend; ++i) { + if (chk[i] == EOB_POSITION) { + tdata[curr++] = 0; + tdata[curr++] = base[lastdfa + 1] - i; + } + + else if (chk[i] == ACTION_POSITION) { + tdata[curr++] = 0; + tdata[curr++] = nxt[i]; + } + + else if (chk[i] > numecs || chk[i] == 0) { + tdata[curr++] = 0; + tdata[curr++] = 0; + } + else { /* verify, transition */ + + tdata[curr++] = chk[i]; + tdata[curr++] = base[nxt[i]] - (i - chk[i]); + } + } + + + /* Here's the final, end-of-buffer state. */ + tdata[curr++] = chk[tblend + 1]; + tdata[curr++] = nxt[tblend + 1]; + + tdata[curr++] = chk[tblend + 2]; + tdata[curr++] = nxt[tblend + 2]; + + return tbl; +} + + +/** Make start_state_list table. + * @return the newly allocated start_state_list table + */ +static struct yytbl_data *mkssltbl (void) +{ + struct yytbl_data *tbl = 0; + flex_int32_t *tdata = 0; + flex_int32_t i; + + tbl = (struct yytbl_data *) calloc (1, sizeof (struct yytbl_data)); + yytbl_data_init (tbl, YYTD_ID_START_STATE_LIST); + tbl->td_flags = YYTD_DATA32 | YYTD_PTRANS; + tbl->td_hilen = 0; + tbl->td_lolen = lastsc * 2 + 1; + + tbl->td_data = tdata = + (flex_int32_t *) calloc (tbl->td_lolen, sizeof (flex_int32_t)); + + for (i = 0; i <= lastsc * 2; ++i) + tdata[i] = base[i]; + + buf_prints (&yydmap_buf, + "\t{YYTD_ID_START_STATE_LIST, (void**)&yy_start_state_list, sizeof(%s)},\n", + "struct yy_trans_info*"); + + return tbl; +} + + + +/* genctbl - generates full speed compressed transition table */ + +void genctbl () +{ + register int i; + int end_of_buffer_action = num_rules + 1; + + /* Table of verify for transition and offset to next state. */ + if (gentables) + out_dec ("static yyconst struct yy_trans_info yy_transition[%d] =\n {\n", tblend + numecs + 1); + else + outn ("static yyconst struct yy_trans_info *yy_transition = 0;"); + + /* We want the transition to be represented as the offset to the + * next state, not the actual state number, which is what it currently + * is. The offset is base[nxt[i]] - (base of current state)]. That's + * just the difference between the starting points of the two involved + * states (to - from). + * + * First, though, we need to find some way to put in our end-of-buffer + * flags and states. We do this by making a state with absolutely no + * transitions. We put it at the end of the table. + */ + + /* We need to have room in nxt/chk for two more slots: One for the + * action and one for the end-of-buffer transition. We now *assume* + * that we're guaranteed the only character we'll try to index this + * nxt/chk pair with is EOB, i.e., 0, so we don't have to make sure + * there's room for jam entries for other characters. + */ + + while (tblend + 2 >= current_max_xpairs) + expand_nxt_chk (); + + while (lastdfa + 1 >= current_max_dfas) + increase_max_dfas (); + + base[lastdfa + 1] = tblend + 2; + nxt[tblend + 1] = end_of_buffer_action; + chk[tblend + 1] = numecs + 1; + chk[tblend + 2] = 1; /* anything but EOB */ + + /* So that "make test" won't show arb. differences. */ + nxt[tblend + 2] = 0; + + /* Make sure every state has an end-of-buffer transition and an + * action #. + */ + for (i = 0; i <= lastdfa; ++i) { + int anum = dfaacc[i].dfaacc_state; + int offset = base[i]; + + chk[offset] = EOB_POSITION; + chk[offset - 1] = ACTION_POSITION; + nxt[offset - 1] = anum; /* action number */ + } + + for (i = 0; i <= tblend; ++i) { + if (chk[i] == EOB_POSITION) + transition_struct_out (0, base[lastdfa + 1] - i); + + else if (chk[i] == ACTION_POSITION) + transition_struct_out (0, nxt[i]); + + else if (chk[i] > numecs || chk[i] == 0) + transition_struct_out (0, 0); /* unused slot */ + + else /* verify, transition */ + transition_struct_out (chk[i], + base[nxt[i]] - (i - + chk[i])); + } + + + /* Here's the final, end-of-buffer state. */ + transition_struct_out (chk[tblend + 1], nxt[tblend + 1]); + transition_struct_out (chk[tblend + 2], nxt[tblend + 2]); + + if (gentables) + outn (" };\n"); + + /* Table of pointers to start states. */ + if (gentables) + out_dec ("static yyconst struct yy_trans_info *yy_start_state_list[%d] =\n", lastsc * 2 + 1); + else + outn ("static yyconst struct yy_trans_info **yy_start_state_list =0;"); + + if (gentables) { + outn (" {"); + + for (i = 0; i <= lastsc * 2; ++i) + out_dec (" &yy_transition[%d],\n", base[i]); + + dataend (); + } + + if (useecs) + genecs (); +} + + +/* mkecstbl - Make equivalence-class tables. */ + +struct yytbl_data *mkecstbl (void) +{ + register int i; + struct yytbl_data *tbl = 0; + flex_int32_t *tdata = 0; + + tbl = (struct yytbl_data *) calloc (1, sizeof (struct yytbl_data)); + yytbl_data_init (tbl, YYTD_ID_EC); + tbl->td_flags |= YYTD_DATA32; + tbl->td_hilen = 0; + tbl->td_lolen = csize; + + tbl->td_data = tdata = + (flex_int32_t *) calloc (tbl->td_lolen, sizeof (flex_int32_t)); + + for (i = 1; i < csize; ++i) { + ecgroup[i] = ABS (ecgroup[i]); + tdata[i] = ecgroup[i]; + } + + buf_prints (&yydmap_buf, + "\t{YYTD_ID_EC, (void**)&yy_ec, sizeof(%s)},\n", + "flex_int32_t"); + + return tbl; +} + +/* Generate equivalence-class tables. */ + +void genecs () +{ + register int i, j; + int numrows; + + out_str_dec (get_int32_decl (), "yy_ec", csize); + + for (i = 1; i < csize; ++i) { + ecgroup[i] = ABS (ecgroup[i]); + mkdata (ecgroup[i]); + } + + dataend (); + + if (trace) { + fputs (_("\n\nEquivalence Classes:\n\n"), stderr); + + numrows = csize / 8; + + for (j = 0; j < numrows; ++j) { + for (i = j; i < csize; i = i + numrows) { + fprintf (stderr, "%4s = %-2d", + readable_form (i), ecgroup[i]); + + putc (' ', stderr); + } + + putc ('\n', stderr); + } + } +} + + +/* Generate the code to find the action number. */ + +void gen_find_action () +{ + if (fullspd) + indent_puts ("yy_act = yy_current_state[-1].yy_nxt;"); + + else if (fulltbl) + indent_puts ("yy_act = yy_accept[yy_current_state];"); + + else if (reject) { + indent_puts ("yy_current_state = *--YY_G(yy_state_ptr);"); + indent_puts ("YY_G(yy_lp) = yy_accept[yy_current_state];"); + + outn ("find_rule: /* we branch to this label when backing up */"); + + indent_puts + ("for ( ; ; ) /* until we find what rule we matched */"); + + indent_up (); + + indent_puts ("{"); + + indent_puts + ("if ( YY_G(yy_lp) && YY_G(yy_lp) < yy_accept[yy_current_state + 1] )"); + indent_up (); + indent_puts ("{"); + indent_puts ("yy_act = yy_acclist[YY_G(yy_lp)];"); + + if (variable_trailing_context_rules) { + indent_puts + ("if ( yy_act & YY_TRAILING_HEAD_MASK ||"); + indent_puts (" YY_G(yy_looking_for_trail_begin) )"); + indent_up (); + indent_puts ("{"); + + indent_puts + ("if ( yy_act == YY_G(yy_looking_for_trail_begin) )"); + indent_up (); + indent_puts ("{"); + indent_puts ("YY_G(yy_looking_for_trail_begin) = 0;"); + indent_puts ("yy_act &= ~YY_TRAILING_HEAD_MASK;"); + indent_puts ("break;"); + indent_puts ("}"); + indent_down (); + + indent_puts ("}"); + indent_down (); + + indent_puts + ("else if ( yy_act & YY_TRAILING_MASK )"); + indent_up (); + indent_puts ("{"); + indent_puts + ("YY_G(yy_looking_for_trail_begin) = yy_act & ~YY_TRAILING_MASK;"); + indent_puts + ("YY_G(yy_looking_for_trail_begin) |= YY_TRAILING_HEAD_MASK;"); + + if (real_reject) { + /* Remember matched text in case we back up + * due to REJECT. + */ + indent_puts + ("YY_G(yy_full_match) = yy_cp;"); + indent_puts + ("YY_G(yy_full_state) = YY_G(yy_state_ptr);"); + indent_puts ("YY_G(yy_full_lp) = YY_G(yy_lp);"); + } + + indent_puts ("}"); + indent_down (); + + indent_puts ("else"); + indent_up (); + indent_puts ("{"); + indent_puts ("YY_G(yy_full_match) = yy_cp;"); + indent_puts + ("YY_G(yy_full_state) = YY_G(yy_state_ptr);"); + indent_puts ("YY_G(yy_full_lp) = YY_G(yy_lp);"); + indent_puts ("break;"); + indent_puts ("}"); + indent_down (); + + indent_puts ("++YY_G(yy_lp);"); + indent_puts ("goto find_rule;"); + } + + else { + /* Remember matched text in case we back up due to + * trailing context plus REJECT. + */ + indent_up (); + indent_puts ("{"); + indent_puts ("YY_G(yy_full_match) = yy_cp;"); + indent_puts ("break;"); + indent_puts ("}"); + indent_down (); + } + + indent_puts ("}"); + indent_down (); + + indent_puts ("--yy_cp;"); + + /* We could consolidate the following two lines with those at + * the beginning, but at the cost of complaints that we're + * branching inside a loop. + */ + indent_puts ("yy_current_state = *--YY_G(yy_state_ptr);"); + indent_puts ("YY_G(yy_lp) = yy_accept[yy_current_state];"); + + indent_puts ("}"); + + indent_down (); + } + + else { /* compressed */ + indent_puts ("yy_act = yy_accept[yy_current_state];"); + + if (interactive && !reject) { + /* Do the guaranteed-needed backing up to figure out + * the match. + */ + indent_puts ("if ( yy_act == 0 )"); + indent_up (); + indent_puts ("{ /* have to back up */"); + indent_puts + ("yy_cp = YY_G(yy_last_accepting_cpos);"); + indent_puts + ("yy_current_state = YY_G(yy_last_accepting_state);"); + indent_puts + ("yy_act = yy_accept[yy_current_state];"); + indent_puts ("}"); + indent_down (); + } + } +} + +/* mkftbl - make the full table and return the struct . + * you should call mkecstbl() after this. + */ + +struct yytbl_data *mkftbl (void) +{ + register int i; + int end_of_buffer_action = num_rules + 1; + struct yytbl_data *tbl; + flex_int32_t *tdata = 0; + + tbl = (struct yytbl_data *) calloc (1, sizeof (struct yytbl_data)); + yytbl_data_init (tbl, YYTD_ID_ACCEPT); + tbl->td_flags |= YYTD_DATA32; + tbl->td_hilen = 0; /* it's a one-dimensional array */ + tbl->td_lolen = lastdfa + 1; + + tbl->td_data = tdata = + (flex_int32_t *) calloc (tbl->td_lolen, sizeof (flex_int32_t)); + + dfaacc[end_of_buffer_state].dfaacc_state = end_of_buffer_action; + + for (i = 1; i <= lastdfa; ++i) { + register int anum = dfaacc[i].dfaacc_state; + + tdata[i] = anum; + + if (trace && anum) + fprintf (stderr, _("state # %d accepts: [%d]\n"), + i, anum); + } + + buf_prints (&yydmap_buf, + "\t{YYTD_ID_ACCEPT, (void**)&yy_accept, sizeof(%s)},\n", + long_align ? "flex_int32_t" : "flex_int16_t"); + return tbl; +} + + +/* genftbl - generate full transition table */ + +void genftbl () +{ + register int i; + int end_of_buffer_action = num_rules + 1; + + out_str_dec (long_align ? get_int32_decl () : get_int16_decl (), + "yy_accept", lastdfa + 1); + + dfaacc[end_of_buffer_state].dfaacc_state = end_of_buffer_action; + + for (i = 1; i <= lastdfa; ++i) { + register int anum = dfaacc[i].dfaacc_state; + + mkdata (anum); + + if (trace && anum) + fprintf (stderr, _("state # %d accepts: [%d]\n"), + i, anum); + } + + dataend (); + + if (useecs) + genecs (); + + /* Don't have to dump the actual full table entries - they were + * created on-the-fly. + */ +} + + +/* Generate the code to find the next compressed-table state. */ + +void gen_next_compressed_state (char_map) + char *char_map; +{ + indent_put2s ("register YY_CHAR yy_c = %s;", char_map); + + /* Save the backing-up info \before/ computing the next state + * because we always compute one more state than needed - we + * always proceed until we reach a jam state + */ + gen_backing_up (); + + indent_puts + ("while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )"); + indent_up (); + indent_puts ("{"); + indent_puts ("yy_current_state = (int) yy_def[yy_current_state];"); + + if (usemecs) { + /* We've arrange it so that templates are never chained + * to one another. This means we can afford to make a + * very simple test to see if we need to convert to + * yy_c's meta-equivalence class without worrying + * about erroneously looking up the meta-equivalence + * class twice + */ + do_indent (); + + /* lastdfa + 2 is the beginning of the templates */ + out_dec ("if ( yy_current_state >= %d )\n", lastdfa + 2); + + indent_up (); + indent_puts ("yy_c = yy_meta[(unsigned int) yy_c];"); + indent_down (); + } + + indent_puts ("}"); + indent_down (); + + indent_puts + ("yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];"); +} + + +/* Generate the code to find the next match. */ + +void gen_next_match () +{ + /* NOTE - changes in here should be reflected in gen_next_state() and + * gen_NUL_trans(). + */ + char *char_map = useecs ? + "yy_ec[YY_SC_TO_UI(*yy_cp)] " : "YY_SC_TO_UI(*yy_cp)"; + + char *char_map_2 = useecs ? + "yy_ec[YY_SC_TO_UI(*++yy_cp)] " : "YY_SC_TO_UI(*++yy_cp)"; + + if (fulltbl) { + if (gentables) + indent_put2s + ("while ( (yy_current_state = yy_nxt[yy_current_state][ %s ]) > 0 )", + char_map); + else + indent_put2s + ("while ( (yy_current_state = yy_nxt[yy_current_state*YY_NXT_LOLEN + %s ]) > 0 )", + char_map); + + indent_up (); + + if (num_backing_up > 0) { + indent_puts ("{"); + gen_backing_up (); + outc ('\n'); + } + + indent_puts ("++yy_cp;"); + + if (num_backing_up > 0) + + indent_puts ("}"); + + indent_down (); + + outc ('\n'); + indent_puts ("yy_current_state = -yy_current_state;"); + } + + else if (fullspd) { + indent_puts ("{"); + indent_puts + ("register yyconst struct yy_trans_info *yy_trans_info;\n"); + indent_puts ("register YY_CHAR yy_c;\n"); + indent_put2s ("for ( yy_c = %s;", char_map); + indent_puts + (" (yy_trans_info = &yy_current_state[(unsigned int) yy_c])->"); + indent_puts ("yy_verify == yy_c;"); + indent_put2s (" yy_c = %s )", char_map_2); + + indent_up (); + + if (num_backing_up > 0) + indent_puts ("{"); + + indent_puts ("yy_current_state += yy_trans_info->yy_nxt;"); + + if (num_backing_up > 0) { + outc ('\n'); + gen_backing_up (); + indent_puts ("}"); + } + + indent_down (); + indent_puts ("}"); + } + + else { /* compressed */ + indent_puts ("do"); + + indent_up (); + indent_puts ("{"); + + gen_next_state (false); + + indent_puts ("++yy_cp;"); + + + indent_puts ("}"); + indent_down (); + + do_indent (); + + if (interactive) + out_dec ("while ( yy_base[yy_current_state] != %d );\n", jambase); + else + out_dec ("while ( yy_current_state != %d );\n", + jamstate); + + if (!reject && !interactive) { + /* Do the guaranteed-needed backing up to figure out + * the match. + */ + indent_puts + ("yy_cp = YY_G(yy_last_accepting_cpos);"); + indent_puts + ("yy_current_state = YY_G(yy_last_accepting_state);"); + } + } +} + + +/* Generate the code to find the next state. */ + +void gen_next_state (worry_about_NULs) + int worry_about_NULs; +{ /* NOTE - changes in here should be reflected in gen_next_match() */ + char char_map[256]; + + if (worry_about_NULs && !nultrans) { + if (useecs) + snprintf (char_map, sizeof(char_map), + "(*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : %d)", + NUL_ec); + else + snprintf (char_map, sizeof(char_map), + "(*yy_cp ? YY_SC_TO_UI(*yy_cp) : %d)", + NUL_ec); + } + + else + strcpy (char_map, useecs ? + "yy_ec[YY_SC_TO_UI(*yy_cp)] " : + "YY_SC_TO_UI(*yy_cp)"); + + if (worry_about_NULs && nultrans) { + if (!fulltbl && !fullspd) + /* Compressed tables back up *before* they match. */ + gen_backing_up (); + + indent_puts ("if ( *yy_cp )"); + indent_up (); + indent_puts ("{"); + } + + if (fulltbl) { + if (gentables) + indent_put2s + ("yy_current_state = yy_nxt[yy_current_state][%s];", + char_map); + else + indent_put2s + ("yy_current_state = yy_nxt[yy_current_state*YY_NXT_LOLEN + %s];", + char_map); + } + + else if (fullspd) + indent_put2s + ("yy_current_state += yy_current_state[%s].yy_nxt;", + char_map); + + else + gen_next_compressed_state (char_map); + + if (worry_about_NULs && nultrans) { + + indent_puts ("}"); + indent_down (); + indent_puts ("else"); + indent_up (); + indent_puts + ("yy_current_state = yy_NUL_trans[yy_current_state];"); + indent_down (); + } + + if (fullspd || fulltbl) + gen_backing_up (); + + if (reject) + indent_puts ("*YY_G(yy_state_ptr)++ = yy_current_state;"); +} + + +/* Generate the code to make a NUL transition. */ + +void gen_NUL_trans () +{ /* NOTE - changes in here should be reflected in gen_next_match() */ + /* Only generate a definition for "yy_cp" if we'll generate code + * that uses it. Otherwise lint and the like complain. + */ + int need_backing_up = (num_backing_up > 0 && !reject); + + if (need_backing_up && (!nultrans || fullspd || fulltbl)) + /* We're going to need yy_cp lying around for the call + * below to gen_backing_up(). + */ + indent_puts ("register char *yy_cp = YY_G(yy_c_buf_p);"); + + outc ('\n'); + + if (nultrans) { + indent_puts + ("yy_current_state = yy_NUL_trans[yy_current_state];"); + indent_puts ("yy_is_jam = (yy_current_state == 0);"); + } + + else if (fulltbl) { + do_indent (); + if (gentables) + out_dec ("yy_current_state = yy_nxt[yy_current_state][%d];\n", NUL_ec); + else + out_dec ("yy_current_state = yy_nxt[yy_current_state*YY_NXT_LOLEN + %d];\n", NUL_ec); + indent_puts ("yy_is_jam = (yy_current_state <= 0);"); + } + + else if (fullspd) { + do_indent (); + out_dec ("register int yy_c = %d;\n", NUL_ec); + + indent_puts + ("register yyconst struct yy_trans_info *yy_trans_info;\n"); + indent_puts + ("yy_trans_info = &yy_current_state[(unsigned int) yy_c];"); + indent_puts ("yy_current_state += yy_trans_info->yy_nxt;"); + + indent_puts + ("yy_is_jam = (yy_trans_info->yy_verify != yy_c);"); + } + + else { + char NUL_ec_str[20]; + + snprintf (NUL_ec_str, sizeof(NUL_ec_str), "%d", NUL_ec); + gen_next_compressed_state (NUL_ec_str); + + do_indent (); + out_dec ("yy_is_jam = (yy_current_state == %d);\n", + jamstate); + + if (reject) { + /* Only stack this state if it's a transition we + * actually make. If we stack it on a jam, then + * the state stack and yy_c_buf_p get out of sync. + */ + indent_puts ("if ( ! yy_is_jam )"); + indent_up (); + indent_puts + ("*YY_G(yy_state_ptr)++ = yy_current_state;"); + indent_down (); + } + } + + /* If we've entered an accepting state, back up; note that + * compressed tables have *already* done such backing up, so + * we needn't bother with it again. + */ + if (need_backing_up && (fullspd || fulltbl)) { + outc ('\n'); + indent_puts ("if ( ! yy_is_jam )"); + indent_up (); + indent_puts ("{"); + gen_backing_up (); + indent_puts ("}"); + indent_down (); + } +} + + +/* Generate the code to find the start state. */ + +void gen_start_state () +{ + if (fullspd) { + if (bol_needed) { + indent_puts + ("yy_current_state = yy_start_state_list[YY_G(yy_start) + YY_AT_BOL()];"); + } + else + indent_puts + ("yy_current_state = yy_start_state_list[YY_G(yy_start)];"); + } + + else { + indent_puts ("yy_current_state = YY_G(yy_start);"); + + if (bol_needed) + indent_puts ("yy_current_state += YY_AT_BOL();"); + + if (reject) { + /* Set up for storing up states. */ + outn ("m4_ifdef( [[M4_YY_USES_REJECT]],\n[["); + indent_puts + ("YY_G(yy_state_ptr) = YY_G(yy_state_buf);"); + indent_puts + ("*YY_G(yy_state_ptr)++ = yy_current_state;"); + outn ("]])"); + } + } +} + + +/* gentabs - generate data statements for the transition tables */ + +void gentabs () +{ + int i, j, k, *accset, nacc, *acc_array, total_states; + int end_of_buffer_action = num_rules + 1; + struct yytbl_data *yyacc_tbl = 0, *yymeta_tbl = 0, *yybase_tbl = 0, + *yydef_tbl = 0, *yynxt_tbl = 0, *yychk_tbl = 0, *yyacclist_tbl=0; + flex_int32_t *yyacc_data = 0, *yybase_data = 0, *yydef_data = 0, + *yynxt_data = 0, *yychk_data = 0, *yyacclist_data=0; + flex_int32_t yybase_curr = 0, yyacclist_curr=0,yyacc_curr=0; + + acc_array = allocate_integer_array (current_max_dfas); + nummt = 0; + + /* The compressed table format jams by entering the "jam state", + * losing information about the previous state in the process. + * In order to recover the previous state, we effectively need + * to keep backing-up information. + */ + ++num_backing_up; + + if (reject) { + /* Write out accepting list and pointer list. + + * First we generate the "yy_acclist" array. In the process, + * we compute the indices that will go into the "yy_accept" + * array, and save the indices in the dfaacc array. + */ + int EOB_accepting_list[2]; + + /* Set up accepting structures for the End Of Buffer state. */ + EOB_accepting_list[0] = 0; + EOB_accepting_list[1] = end_of_buffer_action; + accsiz[end_of_buffer_state] = 1; + dfaacc[end_of_buffer_state].dfaacc_set = + EOB_accepting_list; + + out_str_dec (long_align ? get_int32_decl () : + get_int16_decl (), "yy_acclist", MAX (numas, + 1) + 1); + + buf_prints (&yydmap_buf, + "\t{YYTD_ID_ACCLIST, (void**)&yy_acclist, sizeof(%s)},\n", + long_align ? "flex_int32_t" : "flex_int16_t"); + + yyacclist_tbl = (struct yytbl_data*)calloc(1,sizeof(struct yytbl_data)); + yytbl_data_init (yyacclist_tbl, YYTD_ID_ACCLIST); + yyacclist_tbl->td_lolen = MAX(numas,1) + 1; + yyacclist_tbl->td_data = yyacclist_data = + (flex_int32_t *) calloc (yyacclist_tbl->td_lolen, sizeof (flex_int32_t)); + yyacclist_curr = 1; + + j = 1; /* index into "yy_acclist" array */ + + for (i = 1; i <= lastdfa; ++i) { + acc_array[i] = j; + + if (accsiz[i] != 0) { + accset = dfaacc[i].dfaacc_set; + nacc = accsiz[i]; + + if (trace) + fprintf (stderr, + _("state # %d accepts: "), + i); + + for (k = 1; k <= nacc; ++k) { + int accnum = accset[k]; + + ++j; + + if (variable_trailing_context_rules + && !(accnum & + YY_TRAILING_HEAD_MASK) + && accnum > 0 + && accnum <= num_rules + && rule_type[accnum] == + RULE_VARIABLE) { + /* Special hack to flag + * accepting number as part + * of trailing context rule. + */ + accnum |= YY_TRAILING_MASK; + } + + mkdata (accnum); + yyacclist_data[yyacclist_curr++] = accnum; + + if (trace) { + fprintf (stderr, "[%d]", + accset[k]); + + if (k < nacc) + fputs (", ", + stderr); + else + putc ('\n', + stderr); + } + } + } + } + + /* add accepting number for the "jam" state */ + acc_array[i] = j; + + dataend (); + if (tablesext) { + yytbl_data_compress (yyacclist_tbl); + if (yytbl_data_fwrite (&tableswr, yyacclist_tbl) < 0) + flexerror (_("Could not write yyacclist_tbl")); + yytbl_data_destroy (yyacclist_tbl); + yyacclist_tbl = NULL; + } + } + + else { + dfaacc[end_of_buffer_state].dfaacc_state = + end_of_buffer_action; + + for (i = 1; i <= lastdfa; ++i) + acc_array[i] = dfaacc[i].dfaacc_state; + + /* add accepting number for jam state */ + acc_array[i] = 0; + } + + /* Begin generating yy_accept */ + + /* Spit out "yy_accept" array. If we're doing "reject", it'll be + * pointers into the "yy_acclist" array. Otherwise it's actual + * accepting numbers. In either case, we just dump the numbers. + */ + + /* "lastdfa + 2" is the size of "yy_accept"; includes room for C arrays + * beginning at 0 and for "jam" state. + */ + k = lastdfa + 2; + + if (reject) + /* We put a "cap" on the table associating lists of accepting + * numbers with state numbers. This is needed because we tell + * where the end of an accepting list is by looking at where + * the list for the next state starts. + */ + ++k; + + out_str_dec (long_align ? get_int32_decl () : get_int16_decl (), + "yy_accept", k); + + buf_prints (&yydmap_buf, + "\t{YYTD_ID_ACCEPT, (void**)&yy_accept, sizeof(%s)},\n", + long_align ? "flex_int32_t" : "flex_int16_t"); + + yyacc_tbl = + (struct yytbl_data *) calloc (1, + sizeof (struct yytbl_data)); + yytbl_data_init (yyacc_tbl, YYTD_ID_ACCEPT); + yyacc_tbl->td_lolen = k; + yyacc_tbl->td_data = yyacc_data = + (flex_int32_t *) calloc (yyacc_tbl->td_lolen, sizeof (flex_int32_t)); + yyacc_curr=1; + + for (i = 1; i <= lastdfa; ++i) { + mkdata (acc_array[i]); + yyacc_data[yyacc_curr++] = acc_array[i]; + + if (!reject && trace && acc_array[i]) + fprintf (stderr, _("state # %d accepts: [%d]\n"), + i, acc_array[i]); + } + + /* Add entry for "jam" state. */ + mkdata (acc_array[i]); + yyacc_data[yyacc_curr++] = acc_array[i]; + + if (reject) { + /* Add "cap" for the list. */ + mkdata (acc_array[i]); + yyacc_data[yyacc_curr++] = acc_array[i]; + } + + dataend (); + if (tablesext) { + yytbl_data_compress (yyacc_tbl); + if (yytbl_data_fwrite (&tableswr, yyacc_tbl) < 0) + flexerror (_("Could not write yyacc_tbl")); + yytbl_data_destroy (yyacc_tbl); + yyacc_tbl = NULL; + } + /* End generating yy_accept */ + + if (useecs) { + + genecs (); + if (tablesext) { + struct yytbl_data *tbl; + + tbl = mkecstbl (); + yytbl_data_compress (tbl); + if (yytbl_data_fwrite (&tableswr, tbl) < 0) + flexerror (_("Could not write ecstbl")); + yytbl_data_destroy (tbl); + tbl = 0; + } + } + + if (usemecs) { + /* Begin generating yy_meta */ + /* Write out meta-equivalence classes (used to index + * templates with). + */ + flex_int32_t *yymecs_data = 0; + yymeta_tbl = + (struct yytbl_data *) calloc (1, + sizeof (struct + yytbl_data)); + yytbl_data_init (yymeta_tbl, YYTD_ID_META); + yymeta_tbl->td_lolen = numecs + 1; + yymeta_tbl->td_data = yymecs_data = + (flex_int32_t *) calloc (yymeta_tbl->td_lolen, + sizeof (flex_int32_t)); + + if (trace) + fputs (_("\n\nMeta-Equivalence Classes:\n"), + stderr); + + out_str_dec (get_int32_decl (), "yy_meta", numecs + 1); + buf_prints (&yydmap_buf, + "\t{YYTD_ID_META, (void**)&yy_meta, sizeof(%s)},\n", + "flex_int32_t"); + + for (i = 1; i <= numecs; ++i) { + if (trace) + fprintf (stderr, "%d = %d\n", + i, ABS (tecbck[i])); + + mkdata (ABS (tecbck[i])); + yymecs_data[i] = ABS (tecbck[i]); + } + + dataend (); + if (tablesext) { + yytbl_data_compress (yymeta_tbl); + if (yytbl_data_fwrite (&tableswr, yymeta_tbl) < 0) + flexerror (_ + ("Could not write yymeta_tbl")); + yytbl_data_destroy (yymeta_tbl); + yymeta_tbl = NULL; + } + /* End generating yy_meta */ + } + + total_states = lastdfa + numtemps; + + /* Begin generating yy_base */ + out_str_dec ((tblend >= INT16_MAX || long_align) ? + get_int32_decl () : get_int16_decl (), + "yy_base", total_states + 1); + + buf_prints (&yydmap_buf, + "\t{YYTD_ID_BASE, (void**)&yy_base, sizeof(%s)},\n", + (tblend >= INT16_MAX + || long_align) ? "flex_int32_t" : "flex_int16_t"); + yybase_tbl = + (struct yytbl_data *) calloc (1, + sizeof (struct yytbl_data)); + yytbl_data_init (yybase_tbl, YYTD_ID_BASE); + yybase_tbl->td_lolen = total_states + 1; + yybase_tbl->td_data = yybase_data = + (flex_int32_t *) calloc (yybase_tbl->td_lolen, + sizeof (flex_int32_t)); + yybase_curr = 1; + + for (i = 1; i <= lastdfa; ++i) { + register int d = def[i]; + + if (base[i] == JAMSTATE) + base[i] = jambase; + + if (d == JAMSTATE) + def[i] = jamstate; + + else if (d < 0) { + /* Template reference. */ + ++tmpuses; + def[i] = lastdfa - d + 1; + } + + mkdata (base[i]); + yybase_data[yybase_curr++] = base[i]; + } + + /* Generate jam state's base index. */ + mkdata (base[i]); + yybase_data[yybase_curr++] = base[i]; + + for (++i /* skip jam state */ ; i <= total_states; ++i) { + mkdata (base[i]); + yybase_data[yybase_curr++] = base[i]; + def[i] = jamstate; + } + + dataend (); + if (tablesext) { + yytbl_data_compress (yybase_tbl); + if (yytbl_data_fwrite (&tableswr, yybase_tbl) < 0) + flexerror (_("Could not write yybase_tbl")); + yytbl_data_destroy (yybase_tbl); + yybase_tbl = NULL; + } + /* End generating yy_base */ + + + /* Begin generating yy_def */ + out_str_dec ((total_states >= INT16_MAX || long_align) ? + get_int32_decl () : get_int16_decl (), + "yy_def", total_states + 1); + + buf_prints (&yydmap_buf, + "\t{YYTD_ID_DEF, (void**)&yy_def, sizeof(%s)},\n", + (total_states >= INT16_MAX + || long_align) ? "flex_int32_t" : "flex_int16_t"); + + yydef_tbl = + (struct yytbl_data *) calloc (1, + sizeof (struct yytbl_data)); + yytbl_data_init (yydef_tbl, YYTD_ID_DEF); + yydef_tbl->td_lolen = total_states + 1; + yydef_tbl->td_data = yydef_data = + (flex_int32_t *) calloc (yydef_tbl->td_lolen, sizeof (flex_int32_t)); + + for (i = 1; i <= total_states; ++i) { + mkdata (def[i]); + yydef_data[i] = def[i]; + } + + dataend (); + if (tablesext) { + yytbl_data_compress (yydef_tbl); + if (yytbl_data_fwrite (&tableswr, yydef_tbl) < 0) + flexerror (_("Could not write yydef_tbl")); + yytbl_data_destroy (yydef_tbl); + yydef_tbl = NULL; + } + /* End generating yy_def */ + + + /* Begin generating yy_nxt */ + out_str_dec ((total_states >= INT16_MAX || long_align) ? + get_int32_decl () : get_int16_decl (), "yy_nxt", + tblend + 1); + + buf_prints (&yydmap_buf, + "\t{YYTD_ID_NXT, (void**)&yy_nxt, sizeof(%s)},\n", + (total_states >= INT16_MAX + || long_align) ? "flex_int32_t" : "flex_int16_t"); + + yynxt_tbl = + (struct yytbl_data *) calloc (1, + sizeof (struct yytbl_data)); + yytbl_data_init (yynxt_tbl, YYTD_ID_NXT); + yynxt_tbl->td_lolen = tblend + 1; + yynxt_tbl->td_data = yynxt_data = + (flex_int32_t *) calloc (yynxt_tbl->td_lolen, sizeof (flex_int32_t)); + + for (i = 1; i <= tblend; ++i) { + /* Note, the order of the following test is important. + * If chk[i] is 0, then nxt[i] is undefined. + */ + if (chk[i] == 0 || nxt[i] == 0) + nxt[i] = jamstate; /* new state is the JAM state */ + + mkdata (nxt[i]); + yynxt_data[i] = nxt[i]; + } + + dataend (); + if (tablesext) { + yytbl_data_compress (yynxt_tbl); + if (yytbl_data_fwrite (&tableswr, yynxt_tbl) < 0) + flexerror (_("Could not write yynxt_tbl")); + yytbl_data_destroy (yynxt_tbl); + yynxt_tbl = NULL; + } + /* End generating yy_nxt */ + + /* Begin generating yy_chk */ + out_str_dec ((total_states >= INT16_MAX || long_align) ? + get_int32_decl () : get_int16_decl (), "yy_chk", + tblend + 1); + + buf_prints (&yydmap_buf, + "\t{YYTD_ID_CHK, (void**)&yy_chk, sizeof(%s)},\n", + (total_states >= INT16_MAX + || long_align) ? "flex_int32_t" : "flex_int16_t"); + + yychk_tbl = + (struct yytbl_data *) calloc (1, + sizeof (struct yytbl_data)); + yytbl_data_init (yychk_tbl, YYTD_ID_CHK); + yychk_tbl->td_lolen = tblend + 1; + yychk_tbl->td_data = yychk_data = + (flex_int32_t *) calloc (yychk_tbl->td_lolen, sizeof (flex_int32_t)); + + for (i = 1; i <= tblend; ++i) { + if (chk[i] == 0) + ++nummt; + + mkdata (chk[i]); + yychk_data[i] = chk[i]; + } + + dataend (); + if (tablesext) { + yytbl_data_compress (yychk_tbl); + if (yytbl_data_fwrite (&tableswr, yychk_tbl) < 0) + flexerror (_("Could not write yychk_tbl")); + yytbl_data_destroy (yychk_tbl); + yychk_tbl = NULL; + } + /* End generating yy_chk */ + + flex_free ((void *) acc_array); +} + + +/* Write out a formatted string (with a secondary string argument) at the + * current indentation level, adding a final newline. + */ + +void indent_put2s (fmt, arg) + const char *fmt, *arg; +{ + do_indent (); + out_str (fmt, arg); + outn (""); +} + + +/* Write out a string at the current indentation level, adding a final + * newline. + */ + +void indent_puts (str) + const char *str; +{ + do_indent (); + outn (str); +} + + +/* make_tables - generate transition tables and finishes generating output file + */ + +void make_tables () +{ + register int i; + int did_eof_rule = false; + struct yytbl_data *yynultrans_tbl; + + + skelout (); /* %% [2.0] - break point in skel */ + + /* First, take care of YY_DO_BEFORE_ACTION depending on yymore + * being used. + */ + set_indent (1); + + if (yymore_used && !yytext_is_array) { + indent_puts ("YY_G(yytext_ptr) -= YY_G(yy_more_len); \\"); + indent_puts + ("yyleng = (size_t) (yy_cp - YY_G(yytext_ptr)); \\"); + } + + else + indent_puts ("yyleng = (size_t) (yy_cp - yy_bp); \\"); + + /* Now also deal with copying yytext_ptr to yytext if needed. */ + skelout (); /* %% [3.0] - break point in skel */ + if (yytext_is_array) { + if (yymore_used) + indent_puts + ("if ( yyleng + YY_G(yy_more_offset) >= YYLMAX ) \\"); + else + indent_puts ("if ( yyleng >= YYLMAX ) \\"); + + indent_up (); + indent_puts + ("YY_FATAL_ERROR( \"token too large, exceeds YYLMAX\" ); \\"); + indent_down (); + + if (yymore_used) { + indent_puts + ("yy_flex_strncpy( &yytext[YY_G(yy_more_offset)], YY_G(yytext_ptr), yyleng + 1 M4_YY_CALL_LAST_ARG); \\"); + indent_puts ("yyleng += YY_G(yy_more_offset); \\"); + indent_puts + ("YY_G(yy_prev_more_offset) = YY_G(yy_more_offset); \\"); + indent_puts ("YY_G(yy_more_offset) = 0; \\"); + } + else { + indent_puts + ("yy_flex_strncpy( yytext, YY_G(yytext_ptr), yyleng + 1 M4_YY_CALL_LAST_ARG); \\"); + } + } + + set_indent (0); + + skelout (); /* %% [4.0] - break point in skel */ + + + /* This is where we REALLY begin generating the tables. */ + + out_dec ("#define YY_NUM_RULES %d\n", num_rules); + out_dec ("#define YY_END_OF_BUFFER %d\n", num_rules + 1); + + if (fullspd) { + /* Need to define the transet type as a size large + * enough to hold the biggest offset. + */ + int total_table_size = tblend + numecs + 1; + char *trans_offset_type = + (total_table_size >= INT16_MAX || long_align) ? + "flex_int32_t" : "flex_int16_t"; + + set_indent (0); + indent_puts ("struct yy_trans_info"); + indent_up (); + indent_puts ("{"); + + /* We require that yy_verify and yy_nxt must be of the same size int. */ + indent_put2s ("%s yy_verify;", trans_offset_type); + + /* In cases where its sister yy_verify *is* a "yes, there is + * a transition", yy_nxt is the offset (in records) to the + * next state. In most cases where there is no transition, + * the value of yy_nxt is irrelevant. If yy_nxt is the -1th + * record of a state, though, then yy_nxt is the action number + * for that state. + */ + + indent_put2s ("%s yy_nxt;", trans_offset_type); + indent_puts ("};"); + indent_down (); + } + else { + /* We generate a bogus 'struct yy_trans_info' data type + * so we can guarantee that it is always declared in the skel. + * This is so we can compile "sizeof(struct yy_trans_info)" + * in any scanner. + */ + indent_puts + ("/* This struct is not used in this scanner,"); + indent_puts (" but its presence is necessary. */"); + indent_puts ("struct yy_trans_info"); + indent_up (); + indent_puts ("{"); + indent_puts ("flex_int32_t yy_verify;"); + indent_puts ("flex_int32_t yy_nxt;"); + indent_puts ("};"); + indent_down (); + } + + if (fullspd) { + genctbl (); + if (tablesext) { + struct yytbl_data *tbl; + + tbl = mkctbl (); + yytbl_data_compress (tbl); + if (yytbl_data_fwrite (&tableswr, tbl) < 0) + flexerror (_("Could not write ftbl")); + yytbl_data_destroy (tbl); + + tbl = mkssltbl (); + yytbl_data_compress (tbl); + if (yytbl_data_fwrite (&tableswr, tbl) < 0) + flexerror (_("Could not write ssltbl")); + yytbl_data_destroy (tbl); + tbl = 0; + + if (useecs) { + tbl = mkecstbl (); + yytbl_data_compress (tbl); + if (yytbl_data_fwrite (&tableswr, tbl) < 0) + flexerror (_ + ("Could not write ecstbl")); + yytbl_data_destroy (tbl); + tbl = 0; + } + } + } + else if (fulltbl) { + genftbl (); + if (tablesext) { + struct yytbl_data *tbl; + + tbl = mkftbl (); + yytbl_data_compress (tbl); + if (yytbl_data_fwrite (&tableswr, tbl) < 0) + flexerror (_("Could not write ftbl")); + yytbl_data_destroy (tbl); + tbl = 0; + + if (useecs) { + tbl = mkecstbl (); + yytbl_data_compress (tbl); + if (yytbl_data_fwrite (&tableswr, tbl) < 0) + flexerror (_ + ("Could not write ecstbl")); + yytbl_data_destroy (tbl); + tbl = 0; + } + } + } + else + gentabs (); + + if (do_yylineno) { + + geneoltbl (); + + if (tablesext) { + struct yytbl_data *tbl; + + tbl = mkeoltbl (); + yytbl_data_compress (tbl); + if (yytbl_data_fwrite (&tableswr, tbl) < 0) + flexerror (_("Could not write eoltbl")); + yytbl_data_destroy (tbl); + tbl = 0; + } + } + + /* Definitions for backing up. We don't need them if REJECT + * is being used because then we use an alternative backin-up + * technique instead. + */ + if (num_backing_up > 0 && !reject) { + if (!C_plus_plus && !reentrant) { + indent_puts + ("static yy_state_type yy_last_accepting_state;"); + indent_puts + ("static char *yy_last_accepting_cpos;\n"); + } + } + + if (nultrans) { + flex_int32_t *yynultrans_data = 0; + + /* Begin generating yy_NUL_trans */ + out_str_dec (get_state_decl (), "yy_NUL_trans", + lastdfa + 1); + buf_prints (&yydmap_buf, + "\t{YYTD_ID_NUL_TRANS, (void**)&yy_NUL_trans, sizeof(%s)},\n", + (fullspd) ? "struct yy_trans_info*" : + "flex_int32_t"); + + yynultrans_tbl = + (struct yytbl_data *) calloc (1, + sizeof (struct + yytbl_data)); + yytbl_data_init (yynultrans_tbl, YYTD_ID_NUL_TRANS); + if (fullspd) + yynultrans_tbl->td_flags |= YYTD_PTRANS; + yynultrans_tbl->td_lolen = lastdfa + 1; + yynultrans_tbl->td_data = yynultrans_data = + (flex_int32_t *) calloc (yynultrans_tbl->td_lolen, + sizeof (flex_int32_t)); + + for (i = 1; i <= lastdfa; ++i) { + if (fullspd) { + out_dec (" &yy_transition[%d],\n", + base[i]); + yynultrans_data[i] = base[i]; + } + else { + mkdata (nultrans[i]); + yynultrans_data[i] = nultrans[i]; + } + } + + dataend (); + if (tablesext) { + yytbl_data_compress (yynultrans_tbl); + if (yytbl_data_fwrite (&tableswr, yynultrans_tbl) < + 0) + flexerror (_ + ("Could not write yynultrans_tbl")); + yytbl_data_destroy (yynultrans_tbl); + yynultrans_tbl = NULL; + } + /* End generating yy_NUL_trans */ + } + + if (!C_plus_plus && !reentrant) { + indent_puts ("extern int yy_flex_debug;"); + indent_put2s ("int yy_flex_debug = %s;\n", + ddebug ? "1" : "0"); + } + + if (ddebug) { /* Spit out table mapping rules to line numbers. */ + out_str_dec (long_align ? get_int32_decl () : + get_int16_decl (), "yy_rule_linenum", + num_rules); + for (i = 1; i < num_rules; ++i) + mkdata (rule_linenum[i]); + dataend (); + } + + if (reject) { + outn ("m4_ifdef( [[M4_YY_USES_REJECT]],\n[["); + /* Declare state buffer variables. */ + if (!C_plus_plus && !reentrant) { + outn ("static yy_state_type *yy_state_buf=0, *yy_state_ptr=0;"); + outn ("static char *yy_full_match;"); + outn ("static int yy_lp;"); + } + + if (variable_trailing_context_rules) { + if (!C_plus_plus && !reentrant) { + outn ("static int yy_looking_for_trail_begin = 0;"); + outn ("static int yy_full_lp;"); + outn ("static int *yy_full_state;"); + } + + out_hex ("#define YY_TRAILING_MASK 0x%x\n", + (unsigned int) YY_TRAILING_MASK); + out_hex ("#define YY_TRAILING_HEAD_MASK 0x%x\n", + (unsigned int) YY_TRAILING_HEAD_MASK); + } + + outn ("#define REJECT \\"); + outn ("{ \\"); + outn ("*yy_cp = YY_G(yy_hold_char); /* undo effects of setting up yytext */ \\"); + outn ("yy_cp = YY_G(yy_full_match); /* restore poss. backed-over text */ \\"); + + if (variable_trailing_context_rules) { + outn ("YY_G(yy_lp) = YY_G(yy_full_lp); /* restore orig. accepting pos. */ \\"); + outn ("YY_G(yy_state_ptr) = YY_G(yy_full_state); /* restore orig. state */ \\"); + outn ("yy_current_state = *YY_G(yy_state_ptr); /* restore curr. state */ \\"); + } + + outn ("++YY_G(yy_lp); \\"); + outn ("goto find_rule; \\"); + + outn ("}"); + outn ("]])\n"); + } + + else { + outn ("/* The intent behind this definition is that it'll catch"); + outn (" * any uses of REJECT which flex missed."); + outn (" */"); + outn ("#define REJECT reject_used_but_not_detected"); + } + + if (yymore_used) { + if (!C_plus_plus) { + if (yytext_is_array) { + if (!reentrant){ + indent_puts ("static int yy_more_offset = 0;"); + indent_puts ("static int yy_prev_more_offset = 0;"); + } + } + else if (!reentrant) { + indent_puts + ("static int yy_more_flag = 0;"); + indent_puts + ("static int yy_more_len = 0;"); + } + } + + if (yytext_is_array) { + indent_puts + ("#define yymore() (YY_G(yy_more_offset) = yy_flex_strlen( yytext M4_YY_CALL_LAST_ARG))"); + indent_puts ("#define YY_NEED_STRLEN"); + indent_puts ("#define YY_MORE_ADJ 0"); + indent_puts + ("#define YY_RESTORE_YY_MORE_OFFSET \\"); + indent_up (); + indent_puts ("{ \\"); + indent_puts + ("YY_G(yy_more_offset) = YY_G(yy_prev_more_offset); \\"); + indent_puts ("yyleng -= YY_G(yy_more_offset); \\"); + indent_puts ("}"); + indent_down (); + } + else { + indent_puts + ("#define yymore() (YY_G(yy_more_flag) = 1)"); + indent_puts + ("#define YY_MORE_ADJ YY_G(yy_more_len)"); + indent_puts ("#define YY_RESTORE_YY_MORE_OFFSET"); + } + } + + else { + indent_puts + ("#define yymore() yymore_used_but_not_detected"); + indent_puts ("#define YY_MORE_ADJ 0"); + indent_puts ("#define YY_RESTORE_YY_MORE_OFFSET"); + } + + if (!C_plus_plus) { + if (yytext_is_array) { + outn ("#ifndef YYLMAX"); + outn ("#define YYLMAX 8192"); + outn ("#endif\n"); + if (!reentrant){ + outn ("char yytext[YYLMAX];"); + outn ("char *yytext_ptr;"); + } + } + + else { + if(! reentrant) + outn ("char *yytext;"); + } + } + + out (&action_array[defs1_offset]); + + line_directive_out (stdout, 0); + + skelout (); /* %% [5.0] - break point in skel */ + + if (!C_plus_plus) { + if (use_read) { + outn ("\terrno=0; \\"); + outn ("\twhile ( (result = read( fileno(yyin), (char *) buf, max_size )) < 0 ) \\"); + outn ("\t{ \\"); + outn ("\t\tif( errno != EINTR) \\"); + outn ("\t\t{ \\"); + outn ("\t\t\tYY_FATAL_ERROR( \"input in flex scanner failed\" ); \\"); + outn ("\t\t\tbreak; \\"); + outn ("\t\t} \\"); + outn ("\t\terrno=0; \\"); + outn ("\t\tclearerr(yyin); \\"); + outn ("\t}\\"); + } + + else { + outn ("\tif ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \\"); + outn ("\t\t{ \\"); + outn ("\t\tint c = '*'; \\"); + outn ("\t\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}\\"); + } + } + + skelout (); /* %% [6.0] - break point in skel */ + + indent_puts ("#define YY_RULE_SETUP \\"); + indent_up (); + if (bol_needed) { + indent_puts ("if ( yyleng > 0 ) \\"); + indent_up (); + indent_puts ("YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \\"); + indent_puts ("\t\t(yytext[yyleng - 1] == '\\n'); \\"); + indent_down (); + } + indent_puts ("YY_USER_ACTION"); + indent_down (); + + skelout (); /* %% [7.0] - break point in skel */ + + /* Copy prolog to output file. */ + out (&action_array[prolog_offset]); + + line_directive_out (stdout, 0); + + skelout (); /* %% [8.0] - break point in skel */ + + set_indent (2); + + if (yymore_used && !yytext_is_array) { + indent_puts ("YY_G(yy_more_len) = 0;"); + indent_puts ("if ( YY_G(yy_more_flag) )"); + indent_up (); + indent_puts ("{"); + indent_puts + ("YY_G(yy_more_len) = YY_G(yy_c_buf_p) - YY_G(yytext_ptr);"); + indent_puts ("YY_G(yy_more_flag) = 0;"); + indent_puts ("}"); + indent_down (); + } + + skelout (); /* %% [9.0] - break point in skel */ + + gen_start_state (); + + /* Note, don't use any indentation. */ + outn ("yy_match:"); + gen_next_match (); + + skelout (); /* %% [10.0] - break point in skel */ + set_indent (2); + gen_find_action (); + + skelout (); /* %% [11.0] - break point in skel */ + outn ("m4_ifdef( [[M4_YY_USE_LINENO]],[["); + indent_puts + ("if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] )"); + indent_up (); + indent_puts ("{"); + indent_puts ("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\","); + + indent_puts + (" (long)yy_rule_linenum[yy_act], yytext );"); + } + + indent_down (); + + do_indent (); + out_dec ("else if ( yy_act == %d )\n", num_rules); + indent_up (); + + if (C_plus_plus) { + indent_puts + ("std::cerr << \"--accepting default rule (\\\"\" << yytext << \"\\\")\\n\";"); + } + else { + indent_puts + ("fprintf( stderr, \"--accepting default rule (\\\"%s\\\")\\n\","); + indent_puts (" yytext );"); + } + + indent_down (); + + do_indent (); + out_dec ("else if ( yy_act == %d )\n", num_rules + 1); + indent_up (); + + indent_puts (C_plus_plus ? + "std::cerr << \"--(end of buffer or a NUL)\\n\";" : + "fprintf( stderr, \"--(end of buffer or a NUL)\\n\" );"); + + indent_down (); + + do_indent (); + outn ("else"); + indent_up (); + + if (C_plus_plus) { + indent_puts + ("std::cerr << \"--EOF (start condition \" << YY_START << \")\\n\";"); + } + else { + indent_puts + ("fprintf( stderr, \"--EOF (start condition %d)\\n\", YY_START );"); + } + + indent_down (); + + indent_puts ("}"); + indent_down (); + } + + /* Copy actions to output file. */ + skelout (); /* %% [13.0] - break point in skel */ + indent_up (); + gen_bu_action (); + out (&action_array[action_offset]); + + line_directive_out (stdout, 0); + + /* generate cases for any missing EOF rules */ + for (i = 1; i <= lastsc; ++i) + if (!sceof[i]) { + do_indent (); + out_str ("case YY_STATE_EOF(%s):\n", scname[i]); + did_eof_rule = true; + } + + if (did_eof_rule) { + indent_up (); + indent_puts ("yyterminate();"); + indent_down (); + } + + + /* Generate code for handling NUL's, if needed. */ + + /* First, deal with backing up and setting up yy_cp if the scanner + * finds that it should JAM on the NUL. + */ + skelout (); /* %% [14.0] - break point in skel */ + set_indent (4); + + if (fullspd || fulltbl) + indent_puts ("yy_cp = YY_G(yy_c_buf_p);"); + + else { /* compressed table */ + if (!reject && !interactive) { + /* Do the guaranteed-needed backing up to figure + * out the match. + */ + indent_puts + ("yy_cp = YY_G(yy_last_accepting_cpos);"); + indent_puts + ("yy_current_state = YY_G(yy_last_accepting_state);"); + } + + else + /* Still need to initialize yy_cp, though + * yy_current_state was set up by + * yy_get_previous_state(). + */ + indent_puts ("yy_cp = YY_G(yy_c_buf_p);"); + } + + + /* Generate code for yy_get_previous_state(). */ + set_indent (1); + skelout (); /* %% [15.0] - break point in skel */ + + gen_start_state (); + + set_indent (2); + skelout (); /* %% [16.0] - break point in skel */ + gen_next_state (true); + + set_indent (1); + skelout (); /* %% [17.0] - break point in skel */ + gen_NUL_trans (); + + skelout (); /* %% [18.0] - break point in skel */ + skelout (); /* %% [19.0] - break point in skel */ + /* Update BOL and yylineno inside of input(). */ + if (bol_needed) { + indent_puts + ("YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\\n');"); + if (do_yylineno) { + indent_puts + ("if ( YY_CURRENT_BUFFER_LVALUE->yy_at_bol )"); + indent_up (); + indent_puts ("M4_YY_INCR_LINENO();"); + indent_down (); + } + } + + else if (do_yylineno) { + indent_puts ("if ( c == '\\n' )"); + indent_up (); + indent_puts ("M4_YY_INCR_LINENO();"); + indent_down (); + } + + skelout (); + + /* Copy remainder of input to output. */ + + line_directive_out (stdout, 1); + + if (sectnum == 3) { + OUT_BEGIN_CODE (); + (void) flexscan (); /* copy remainder of input to output */ + OUT_END_CODE (); + } +} diff --git a/contrib/flex/libmain.c b/contrib/flex/libmain.c new file mode 100644 index 000000000000..49262e462bb0 --- /dev/null +++ b/contrib/flex/libmain.c @@ -0,0 +1,33 @@ +/* libmain - flex run-time support library "main" function */ + +/* This file is part of flex. */ + +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ + +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ + +/* Neither the name of the University nor the names of its contributors */ +/* may be used to endorse or promote products derived from this software */ +/* without specific prior written permission. */ + +/* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */ +/* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ +/* PURPOSE. */ + +extern int yylex (); + +int main (argc, argv) + int argc; + char *argv[]; +{ + while (yylex () != 0) ; + + return 0; +} diff --git a/contrib/flex/libyywrap.c b/contrib/flex/libyywrap.c new file mode 100644 index 000000000000..8561a43f4cdd --- /dev/null +++ b/contrib/flex/libyywrap.c @@ -0,0 +1,27 @@ +/* libyywrap - flex run-time support library "yywrap" function */ + +/* This file is part of flex. */ + +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ + +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ + +/* Neither the name of the University nor the names of its contributors */ +/* may be used to endorse or promote products derived from this software */ +/* without specific prior written permission. */ + +/* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */ +/* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ +/* PURPOSE. */ + +int yywrap (void) +{ + return 1; +} diff --git a/contrib/flex/main.c b/contrib/flex/main.c new file mode 100644 index 000000000000..069b7b228c6f --- /dev/null +++ b/contrib/flex/main.c @@ -0,0 +1,1858 @@ +/* flex - tool to generate fast lexical analyzers */ + +/* Copyright (c) 1990 The Regents of the University of California. */ +/* All rights reserved. */ + +/* This code is derived from software contributed to Berkeley by */ +/* Vern Paxson. */ + +/* The United States Government has rights in this work pursuant */ +/* to contract no. DE-AC03-76SF00098 between the United States */ +/* Department of Energy and the University of California. */ + +/* This file is part of flex. */ + +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ + +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ + +/* Neither the name of the University nor the names of its contributors */ +/* may be used to endorse or promote products derived from this software */ +/* without specific prior written permission. */ + +/* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */ +/* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ +/* PURPOSE. */ + + +#include "flexdef.h" +#include "version.h" +#include "options.h" +#include "tables.h" + +static char flex_version[] = FLEX_VERSION; + +/* declare functions that have forward references */ + +void flexinit PROTO ((int, char **)); +void readin PROTO ((void)); +void set_up_initial_allocations PROTO ((void)); +static char *basename2 PROTO ((char *path, int should_strip_ext)); + + +/* these globals are all defined and commented in flexdef.h */ +int printstats, syntaxerror, eofseen, ddebug, trace, nowarn, spprdflt; +int interactive, lex_compat, posix_compat, do_yylineno, + useecs, fulltbl, usemecs; +int fullspd, gen_line_dirs, performance_report, backing_up_report; +int C_plus_plus, long_align, use_read, yytext_is_array, do_yywrap, + csize; +int reentrant, bison_bridge_lval, bison_bridge_lloc; +int yymore_used, reject, real_reject, continued_action, in_rule; +int yymore_really_used, reject_really_used; +int datapos, dataline, linenum; +FILE *skelfile = NULL; +int skel_ind = 0; +char *action_array; +int action_size, defs1_offset, prolog_offset, action_offset, + action_index; +char *infilename = NULL, *outfilename = NULL, *headerfilename = NULL; +int did_outfilename; +char *prefix, *yyclass, *extra_type = NULL; +int do_stdinit, use_stdout; +int onestate[ONE_STACK_SIZE], onesym[ONE_STACK_SIZE]; +int onenext[ONE_STACK_SIZE], onedef[ONE_STACK_SIZE], onesp; +int maximum_mns, current_mns, current_max_rules; +int num_rules, num_eof_rules, default_rule, lastnfa; +int *firstst, *lastst, *finalst, *transchar, *trans1, *trans2; +int *accptnum, *assoc_rule, *state_type; +int *rule_type, *rule_linenum, *rule_useful; +int current_state_type; +int variable_trailing_context_rules; +int numtemps, numprots, protprev[MSP], protnext[MSP], prottbl[MSP]; +int protcomst[MSP], firstprot, lastprot, protsave[PROT_SAVE_SIZE]; +int numecs, nextecm[CSIZE + 1], ecgroup[CSIZE + 1], nummecs, + tecfwd[CSIZE + 1]; +int tecbck[CSIZE + 1]; +int lastsc, *scset, *scbol, *scxclu, *sceof; +int current_max_scs; +char **scname; +int current_max_dfa_size, current_max_xpairs; +int current_max_template_xpairs, current_max_dfas; +int lastdfa, *nxt, *chk, *tnxt; +int *base, *def, *nultrans, NUL_ec, tblend, firstfree, **dss, *dfasiz; +union dfaacc_union *dfaacc; +int *accsiz, *dhash, numas; +int numsnpairs, jambase, jamstate; +int lastccl, *cclmap, *ccllen, *cclng, cclreuse; +int current_maxccls, current_max_ccl_tbl_size; +Char *ccltbl; +char nmstr[MAXLINE]; +int sectnum, nummt, hshcol, dfaeql, numeps, eps2, num_reallocs; +int tmpuses, totnst, peakpairs, numuniq, numdup, hshsave; +int num_backing_up, bol_needed; +FILE *backing_up_file; +int end_of_buffer_state; +char **input_files; +int num_input_files; +jmp_buf flex_main_jmp_buf; +bool *rule_has_nl, *ccl_has_nl; +int nlch = '\n'; +bool ansi_func_defs, ansi_func_protos; + +bool tablesext, tablesverify, gentables; +char *tablesfilename=0,*tablesname=0; +struct yytbl_writer tableswr; + +/* Make sure program_name is initialized so we don't crash if writing + * out an error message before getting the program name from argv[0]. + */ +char *program_name = "flex"; + +#ifndef SHORT_FILE_NAMES +static char *outfile_template = "lex.%s.%s"; +static char *backing_name = "lex.backup"; +static char *tablesfile_template = "lex.%s.tables"; +#else +static char *outfile_template = "lex%s.%s"; +static char *backing_name = "lex.bck"; +static char *tablesfile_template = "lex%s.tbl"; +#endif + +#ifdef MS_DOS +extern unsigned _stklen = 16384; +#endif + +/* From scan.l */ +extern FILE* yyout; + +static char outfile_path[MAXLINE]; +static int outfile_created = 0; +static char *skelname = NULL; +static int _stdout_closed = 0; /* flag to prevent double-fclose() on stdout. */ +const char *escaped_qstart = "[[]]M4_YY_NOOP[M4_YY_NOOP[M4_YY_NOOP[[]]"; +const char *escaped_qend = "[[]]M4_YY_NOOP]M4_YY_NOOP]M4_YY_NOOP[[]]"; + +/* For debugging. The max number of filters to apply to skeleton. */ +static int preproc_level = 1000; + +int flex_main PROTO ((int argc, char *argv[])); +int main PROTO ((int argc, char *argv[])); + +int flex_main (argc, argv) + int argc; + char *argv[]; +{ + int i, exit_status, child_status; + + /* Set a longjmp target. Yes, I know it's a hack, but it gets worse: The + * return value of setjmp, if non-zero, is the desired exit code PLUS ONE. + * For example, if you want 'main' to return with code '2', then call + * longjmp() with an argument of 3. This is because it is invalid to + * specify a value of 0 to longjmp. FLEX_EXIT(n) should be used instead of + * exit(n); + */ + exit_status = setjmp (flex_main_jmp_buf); + if (exit_status){ + if (stdout && !_stdout_closed && !ferror(stdout)){ + fflush(stdout); + fclose(stdout); + } + while (wait(&child_status) > 0){ + if (!WIFEXITED (child_status) + || WEXITSTATUS (child_status) != 0){ + /* report an error of a child + */ + if( exit_status <= 1 ) + exit_status = 2; + + } + } + return exit_status - 1; + } + + flexinit (argc, argv); + + readin (); + + 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 (); + + /* Note, flexend does not return. It exits with its argument + * as status. + */ + flexend (0); + + return 0; /* keep compilers/lint happy */ +} + +/* Wrapper around flex_main, so flex_main can be built as a library. */ +int main (argc, argv) + int argc; + char *argv[]; +{ +#if ENABLE_NLS +#if HAVE_LOCALE_H + setlocale (LC_MESSAGES, ""); + setlocale (LC_CTYPE, ""); + textdomain (PACKAGE); + bindtextdomain (PACKAGE, LOCALEDIR); +#endif +#endif + + return flex_main (argc, argv); +} + +/* check_options - check user-specified options */ + +void check_options () +{ + int i; + const char * m4 = NULL; + + if (lex_compat) { + if (C_plus_plus) + flexerror (_("Can't use -+ with -l option")); + + if (fulltbl || fullspd) + flexerror (_("Can't use -f or -F with -l option")); + + if (reentrant || bison_bridge_lval) + flexerror (_ + ("Can't use --reentrant or --bison-bridge with -l option")); + + yytext_is_array = true; + do_yylineno = true; + use_read = false; + } + + +#if 0 + /* This makes no sense whatsoever. I'm removing it. */ + if (do_yylineno) + /* This should really be "maintain_backup_tables = true" */ + reject_really_used = true; +#endif + + if (csize == unspecified) { + if ((fulltbl || fullspd) && !useecs) + csize = DEFAULT_CSIZE; + else + csize = CSIZE; + } + + if (interactive == unspecified) { + if (fulltbl || fullspd) + interactive = false; + else + interactive = true; + } + + if (fulltbl || fullspd) { + if (usemecs) + flexerror (_ + ("-Cf/-CF and -Cm don't make sense together")); + + if (interactive) + flexerror (_("-Cf/-CF and -I are incompatible")); + + if (lex_compat) + flexerror (_ + ("-Cf/-CF are incompatible with lex-compatibility mode")); + + + if (fulltbl && fullspd) + flexerror (_ + ("-Cf and -CF are mutually exclusive")); + } + + if (C_plus_plus && fullspd) + flexerror (_("Can't use -+ with -CF option")); + + if (C_plus_plus && yytext_is_array) { + warn (_("%array incompatible with -+ option")); + yytext_is_array = false; + } + + if (C_plus_plus && (reentrant)) + flexerror (_("Options -+ and --reentrant are mutually exclusive.")); + + if (C_plus_plus && bison_bridge_lval) + flexerror (_("bison bridge not supported for the C++ scanner.")); + + + if (useecs) { /* Set up doubly-linked equivalence classes. */ + + /* We loop all the way up to csize, since ecgroup[csize] is + * the position used for NUL characters. + */ + ecgroup[1] = NIL; + + for (i = 2; i <= csize; ++i) { + ecgroup[i] = i - 1; + nextecm[i - 1] = i; + } + + nextecm[csize] = NIL; + } + + else { + /* Put everything in its own equivalence class. */ + for (i = 1; i <= csize; ++i) { + ecgroup[i] = i; + nextecm[i] = BAD_SUBSCRIPT; /* to catch errors */ + } + } + + if (!ansi_func_defs) + buf_m4_define( &m4defs_buf, "M4_YY_NO_ANSI_FUNC_DEFS", NULL); + + if (!ansi_func_protos) + buf_m4_define( &m4defs_buf, "M4_YY_NO_ANSI_FUNC_PROTOS", NULL); + + if (extra_type) + buf_m4_define( &m4defs_buf, "M4_EXTRA_TYPE_DEFS", extra_type); + + if (!use_stdout) { + FILE *prev_stdout; + + if (!did_outfilename) { + char *suffix; + + if (C_plus_plus) + suffix = "cc"; + else + suffix = "c"; + + snprintf (outfile_path, sizeof(outfile_path), outfile_template, + prefix, suffix); + + outfilename = outfile_path; + } + + prev_stdout = freopen (outfilename, "w+", stdout); + + if (prev_stdout == NULL) + lerrsf (_("could not create %s"), outfilename); + + outfile_created = 1; + } + + + /* Setup the filter chain. */ + output_chain = filter_create_int(NULL, filter_tee_header, headerfilename); + if ( !(m4 = getenv("M4"))) + m4 = M4; + filter_create_ext(output_chain, m4, "-P", 0); + filter_create_int(output_chain, filter_fix_linedirs, NULL); + + /* For debugging, only run the requested number of filters. */ + if (preproc_level > 0) { + filter_truncate(output_chain, preproc_level); + filter_apply_chain(output_chain); + } + yyout = stdout; + + + /* always generate the tablesverify flag. */ + buf_m4_define (&m4defs_buf, "M4_YY_TABLES_VERIFY", tablesverify ? "1" : "0"); + if (tablesext) + gentables = false; + + if (tablesverify) + /* force generation of C tables. */ + gentables = true; + + + if (tablesext) { + FILE *tablesout; + struct yytbl_hdr hdr; + char *pname = 0; + int nbytes = 0; + + buf_m4_define (&m4defs_buf, "M4_YY_TABLES_EXTERNAL", NULL); + + if (!tablesfilename) { + nbytes = strlen (prefix) + strlen (tablesfile_template) + 2; + tablesfilename = pname = (char *) calloc (nbytes, 1); + snprintf (pname, nbytes, tablesfile_template, prefix); + } + + if ((tablesout = fopen (tablesfilename, "w")) == NULL) + lerrsf (_("could not create %s"), tablesfilename); + if (pname) + free (pname); + tablesfilename = 0; + + yytbl_writer_init (&tableswr, tablesout); + + nbytes = strlen (prefix) + strlen ("tables") + 2; + tablesname = (char *) calloc (nbytes, 1); + snprintf (tablesname, nbytes, "%stables", prefix); + yytbl_hdr_init (&hdr, flex_version, tablesname); + + if (yytbl_hdr_fwrite (&tableswr, &hdr) <= 0) + flexerror (_("could not write tables header")); + } + + if (skelname && (skelfile = fopen (skelname, "r")) == NULL) + lerrsf (_("can't open skeleton file %s"), skelname); + + if (reentrant) { + buf_m4_define (&m4defs_buf, "M4_YY_REENTRANT", NULL); + if (yytext_is_array) + buf_m4_define (&m4defs_buf, "M4_YY_TEXT_IS_ARRAY", NULL); + } + + if ( bison_bridge_lval) + buf_m4_define (&m4defs_buf, "M4_YY_BISON_LVAL", NULL); + + if ( bison_bridge_lloc) + buf_m4_define (&m4defs_buf, "", 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 + * + * note + * This routine does not return. + */ + +void flexend (exit_status) + int exit_status; + +{ + static int called_before = -1; /* prevent infinite recursion. */ + int tblsiz; + + if (++called_before) + FLEX_EXIT (exit_status); + + if (skelfile != NULL) { + if (ferror (skelfile)) + lerrsf (_("input error reading skeleton file %s"), + skelname); + + else if (fclose (skelfile)) + lerrsf (_("error closing skeleton file %s"), + skelname); + } + +#if 0 + fprintf (header_out, + "#ifdef YY_HEADER_EXPORT_START_CONDITIONS\n"); + fprintf (header_out, + "/* Beware! Start conditions are not prefixed. */\n"); + + /* Special case for "INITIAL" */ + fprintf (header_out, + "#undef INITIAL\n#define INITIAL 0\n"); + for (i = 2; i <= lastsc; i++) + fprintf (header_out, "#define %s %d\n", scname[i], i - 1); + fprintf (header_out, + "#endif /* YY_HEADER_EXPORT_START_CONDITIONS */\n\n"); + + /* Kill ALL flex-related macros. This is so the user + * can #include more than one generated header file. */ + fprintf (header_out, "#ifndef YY_HEADER_NO_UNDEFS\n"); + fprintf (header_out, + "/* Undefine all internal macros, etc., that do no belong in the header. */\n\n"); + + { + const char * undef_list[] = { + + "BEGIN", + "ECHO", + "EOB_ACT_CONTINUE_SCAN", + "EOB_ACT_END_OF_FILE", + "EOB_ACT_LAST_MATCH", + "FLEX_SCANNER", + "FLEX_STD", + "REJECT", + "YYFARGS0", + "YYFARGS1", + "YYFARGS2", + "YYFARGS3", + "YYLMAX", + "YYSTATE", + "YY_AT_BOL", + "YY_BREAK", + "YY_BUFFER_EOF_PENDING", + "YY_BUFFER_NEW", + "YY_BUFFER_NORMAL", + "YY_BUF_SIZE", + "M4_YY_CALL_LAST_ARG", + "M4_YY_CALL_ONLY_ARG", + "YY_CURRENT_BUFFER", + "YY_DECL", + "M4_YY_DECL_LAST_ARG", + "M4_YY_DEF_LAST_ARG", + "M4_YY_DEF_ONLY_ARG", + "YY_DO_BEFORE_ACTION", + "YY_END_OF_BUFFER", + "YY_END_OF_BUFFER_CHAR", + "YY_EXIT_FAILURE", + "YY_EXTRA_TYPE", + "YY_FATAL_ERROR", + "YY_FLEX_DEFINED_ECHO", + "YY_FLEX_LEX_COMPAT", + "YY_FLEX_MAJOR_VERSION", + "YY_FLEX_MINOR_VERSION", + "YY_FLEX_SUBMINOR_VERSION", + "YY_FLUSH_BUFFER", + "YY_G", + "YY_INPUT", + "YY_INTERACTIVE", + "YY_INT_ALIGNED", + "YY_LAST_ARG", + "YY_LESS_LINENO", + "YY_LEX_ARGS", + "YY_LEX_DECLARATION", + "YY_LEX_PROTO", + "YY_MAIN", + "YY_MORE_ADJ", + "YY_NEED_STRLEN", + "YY_NEW_FILE", + "YY_NULL", + "YY_NUM_RULES", + "YY_ONLY_ARG", + "YY_PARAMS", + "YY_PROTO", + "M4_YY_PROTO_LAST_ARG", + "M4_YY_PROTO_ONLY_ARG void", + "YY_READ_BUF_SIZE", + "YY_REENTRANT", + "YY_RESTORE_YY_MORE_OFFSET", + "YY_RULE_SETUP", + "YY_SC_TO_UI", + "YY_SKIP_YYWRAP", + "YY_START", + "YY_START_STACK_INCR", + "YY_STATE_EOF", + "YY_STDINIT", + "YY_TRAILING_HEAD_MASK", + "YY_TRAILING_MASK", + "YY_USER_ACTION", + "YY_USE_CONST", + "YY_USE_PROTOS", + "unput", + "yyTABLES_NAME", + "yy_create_buffer", + "yy_delete_buffer", + "yy_flex_debug", + "yy_flush_buffer", + "yy_init_buffer", + "yy_load_buffer_state", + "yy_new_buffer", + "yy_scan_buffer", + "yy_scan_bytes", + "yy_scan_string", + "yy_set_bol", + "yy_set_interactive", + "yy_switch_to_buffer", + "yypush_buffer_state", + "yypop_buffer_state", + "yyensure_buffer_stack", + "yyalloc", + "yyconst", + "yyextra", + "yyfree", + "yyget_debug", + "yyget_extra", + "yyget_in", + "yyget_leng", + "yyget_lineno", + "yyget_lloc", + "yyget_lval", + "yyget_out", + "yyget_text", + "yyin", + "yyleng", + "yyless", + "yylex", + "yylex_destroy", + "yylex_init", + "yylex_init_extra", + "yylineno", + "yylloc", + "yylval", + "yymore", + "yyout", + "yyrealloc", + "yyrestart", + "yyset_debug", + "yyset_extra", + "yyset_in", + "yyset_lineno", + "yyset_lloc", + "yyset_lval", + "yyset_out", + "yytables_destroy", + "yytables_fload", + "yyterminate", + "yytext", + "yytext_ptr", + "yywrap", + + /* must be null-terminated */ + NULL}; + + + for (i=0; undef_list[i] != NULL; i++) + fprintf (header_out, "#undef %s\n", undef_list[i]); + } + + /* undef any of the auto-generated symbols. */ + for (i = 0; i < defs_buf.nelts; i++) { + + /* don't undef start conditions */ + if (sclookup (((char **) defs_buf.elts)[i]) > 0) + continue; + fprintf (header_out, "#undef %s\n", + ((char **) defs_buf.elts)[i]); + } + + fprintf (header_out, + "#endif /* !YY_HEADER_NO_UNDEFS */\n"); + fprintf (header_out, "\n"); + fprintf (header_out, "#undef %sIN_HEADER\n", prefix); + fprintf (header_out, "#endif /* %sHEADER_H */\n", prefix); + + if (ferror (header_out)) + lerrsf (_("error creating header file %s"), + headerfilename); + fflush (header_out); + fclose (header_out); +#endif + + if (exit_status != 0 && outfile_created) { + if (ferror (stdout)) + lerrsf (_("error writing output file %s"), + outfilename); + + else if ((_stdout_closed = 1) && fclose (stdout)) + lerrsf (_("error closing output file %s"), + outfilename); + + else if (unlink (outfilename)) + lerrsf (_("error deleting output file %s"), + outfilename); + } + + + if (backing_up_report && backing_up_file) { + if (num_backing_up == 0) + fprintf (backing_up_file, _("No backing up.\n")); + else if (fullspd || fulltbl) + fprintf (backing_up_file, + _ + ("%d backing up (non-accepting) states.\n"), + num_backing_up); + else + fprintf (backing_up_file, + _("Compressed tables always back up.\n")); + + if (ferror (backing_up_file)) + lerrsf (_("error writing backup file %s"), + backing_name); + + else if (fclose (backing_up_file)) + lerrsf (_("error closing backup file %s"), + backing_name); + } + + if (printstats) { + fprintf (stderr, _("%s version %s usage statistics:\n"), + program_name, flex_version); + + fprintf (stderr, _(" scanner options: -")); + + if (C_plus_plus) + putc ('+', stderr); + if (backing_up_report) + putc ('b', stderr); + if (ddebug) + putc ('d', stderr); + if (sf_case_ins()) + putc ('i', stderr); + if (lex_compat) + putc ('l', stderr); + if (posix_compat) + putc ('X', stderr); + if (performance_report > 0) + putc ('p', stderr); + if (performance_report > 1) + putc ('p', stderr); + if (spprdflt) + putc ('s', stderr); + if (reentrant) + fputs ("--reentrant", stderr); + if (bison_bridge_lval) + fputs ("--bison-bridge", stderr); + if (bison_bridge_lloc) + fputs ("--bison-locations", stderr); + if (use_stdout) + putc ('t', stderr); + if (printstats) + putc ('v', stderr); /* always true! */ + if (nowarn) + putc ('w', stderr); + if (interactive == false) + putc ('B', stderr); + if (interactive == true) + putc ('I', stderr); + if (!gen_line_dirs) + putc ('L', stderr); + if (trace) + putc ('T', stderr); + + if (csize == unspecified) + /* We encountered an error fairly early on, so csize + * never got specified. Define it now, to prevent + * bogus table sizes being written out below. + */ + csize = 256; + + if (csize == 128) + putc ('7', stderr); + else + putc ('8', stderr); + + fprintf (stderr, " -C"); + + if (long_align) + putc ('a', stderr); + if (fulltbl) + putc ('f', stderr); + if (fullspd) + putc ('F', stderr); + if (useecs) + putc ('e', stderr); + if (usemecs) + putc ('m', stderr); + if (use_read) + putc ('r', stderr); + + if (did_outfilename) + fprintf (stderr, " -o%s", outfilename); + + if (skelname) + fprintf (stderr, " -S%s", skelname); + + if (strcmp (prefix, "yy")) + fprintf (stderr, " -P%s", prefix); + + putc ('\n', stderr); + + fprintf (stderr, _(" %d/%d NFA states\n"), + lastnfa, current_mns); + fprintf (stderr, _(" %d/%d DFA states (%d words)\n"), + lastdfa, current_max_dfas, totnst); + fprintf (stderr, _(" %d rules\n"), + num_rules + num_eof_rules - + 1 /* - 1 for def. rule */ ); + + if (num_backing_up == 0) + fprintf (stderr, _(" No backing up\n")); + else if (fullspd || fulltbl) + fprintf (stderr, + _ + (" %d backing-up (non-accepting) states\n"), + num_backing_up); + else + fprintf (stderr, + _ + (" Compressed tables always back-up\n")); + + if (bol_needed) + fprintf (stderr, + _(" Beginning-of-line patterns used\n")); + + fprintf (stderr, _(" %d/%d start conditions\n"), lastsc, + current_max_scs); + fprintf (stderr, + _ + (" %d epsilon states, %d double epsilon states\n"), + numeps, eps2); + + if (lastccl == 0) + fprintf (stderr, _(" no character classes\n")); + else + fprintf (stderr, + _ + (" %d/%d character classes needed %d/%d words of storage, %d reused\n"), + lastccl, current_maxccls, + cclmap[lastccl] + ccllen[lastccl], + current_max_ccl_tbl_size, cclreuse); + + fprintf (stderr, _(" %d state/nextstate pairs created\n"), + numsnpairs); + fprintf (stderr, + _(" %d/%d unique/duplicate transitions\n"), + numuniq, numdup); + + if (fulltbl) { + tblsiz = lastdfa * numecs; + fprintf (stderr, _(" %d table entries\n"), + tblsiz); + } + + else { + tblsiz = 2 * (lastdfa + numtemps) + 2 * tblend; + + fprintf (stderr, + _(" %d/%d base-def entries created\n"), + lastdfa + numtemps, current_max_dfas); + fprintf (stderr, + _ + (" %d/%d (peak %d) nxt-chk entries created\n"), + tblend, current_max_xpairs, peakpairs); + fprintf (stderr, + _ + (" %d/%d (peak %d) template nxt-chk entries created\n"), + numtemps * nummecs, + current_max_template_xpairs, + numtemps * numecs); + fprintf (stderr, _(" %d empty table entries\n"), + nummt); + fprintf (stderr, _(" %d protos created\n"), + numprots); + fprintf (stderr, + _(" %d templates created, %d uses\n"), + numtemps, tmpuses); + } + + if (useecs) { + tblsiz = tblsiz + csize; + fprintf (stderr, + _ + (" %d/%d equivalence classes created\n"), + numecs, csize); + } + + if (usemecs) { + tblsiz = tblsiz + numecs; + fprintf (stderr, + _ + (" %d/%d meta-equivalence classes created\n"), + nummecs, csize); + } + + fprintf (stderr, + _ + (" %d (%d saved) hash collisions, %d DFAs equal\n"), + hshcol, hshsave, dfaeql); + fprintf (stderr, _(" %d sets of reallocations needed\n"), + num_reallocs); + fprintf (stderr, _(" %d total table entries needed\n"), + tblsiz); + } + + FLEX_EXIT (exit_status); +} + + +/* flexinit - initialize flex */ + +void flexinit (argc, argv) + int argc; + char **argv; +{ + int i, sawcmpflag, rv, optind; + char *arg; + scanopt_t sopt; + + printstats = syntaxerror = trace = spprdflt = false; + lex_compat = posix_compat = C_plus_plus = backing_up_report = + ddebug = fulltbl = false; + fullspd = long_align = nowarn = yymore_used = continued_action = + false; + do_yylineno = yytext_is_array = in_rule = reject = do_stdinit = + false; + yymore_really_used = reject_really_used = unspecified; + interactive = csize = unspecified; + do_yywrap = gen_line_dirs = usemecs = useecs = true; + reentrant = bison_bridge_lval = bison_bridge_lloc = false; + performance_report = 0; + did_outfilename = 0; + prefix = "yy"; + yyclass = 0; + use_read = use_stdout = false; + tablesext = tablesverify = false; + gentables = true; + tablesfilename = tablesname = NULL; + ansi_func_defs = ansi_func_protos = true; + + sawcmpflag = false; + + /* Initialize dynamic array for holding the rule actions. */ + action_size = 2048; /* default size of action array in bytes */ + action_array = allocate_character_array (action_size); + defs1_offset = prolog_offset = action_offset = action_index = 0; + action_array[0] = '\0'; + + /* Initialize any buffers. */ + buf_init (&userdef_buf, sizeof (char)); /* one long string */ + buf_init (&defs_buf, sizeof (char *)); /* list of strings */ + buf_init (&yydmap_buf, sizeof (char)); /* one long string */ + buf_init (&top_buf, sizeof (char)); /* one long string */ + + { + const char * m4defs_init_str[] = {"m4_changequote\n", + "m4_changequote([[, ]])\n"}; + buf_init (&m4defs_buf, sizeof (char *)); + buf_append (&m4defs_buf, &m4defs_init_str, 2); + } + + sf_init (); + + /* initialize regex lib */ + flex_init_regex(); + + /* Enable C++ if program name ends with '+'. */ + program_name = basename2 (argv[0], 0); + + if (program_name[0] != '\0' && + program_name[strlen (program_name) - 1] == '+') + C_plus_plus = true; + + /* read flags */ + sopt = scanopt_init (flexopts, argc, argv, 0); + if (!sopt) { + /* This will only happen when flexopts array is altered. */ + fprintf (stderr, + _("Internal error. flexopts are malformed.\n")); + FLEX_EXIT (1); + } + + while ((rv = scanopt (sopt, &arg, &optind)) != 0) { + + if (rv < 0) { + /* Scanopt has already printed an option-specific error message. */ + fprintf (stderr, + _ + ("Try `%s --help' for more information.\n"), + program_name); + FLEX_EXIT (1); + } + + switch ((enum flexopt_flag_t) rv) { + case OPT_CPLUSPLUS: + C_plus_plus = true; + break; + + case OPT_BATCH: + interactive = false; + break; + + case OPT_BACKUP: + backing_up_report = true; + break; + + case OPT_DONOTHING: + break; + + case OPT_COMPRESSION: + if (!sawcmpflag) { + useecs = false; + usemecs = false; + fulltbl = false; + sawcmpflag = true; + } + + for (i = 0; arg && arg[i] != '\0'; i++) + switch (arg[i]) { + case 'a': + long_align = true; + break; + + case 'e': + useecs = true; + break; + + case 'F': + fullspd = true; + break; + + case 'f': + fulltbl = true; + break; + + case 'm': + usemecs = true; + break; + + case 'r': + use_read = true; + break; + + default: + lerrif (_ + ("unknown -C option '%c'"), + (int) arg[i]); + break; + } + break; + + case OPT_DEBUG: + ddebug = true; + break; + + case OPT_NO_DEBUG: + ddebug = false; + break; + + case OPT_FULL: + useecs = usemecs = false; + use_read = fulltbl = true; + break; + + case OPT_FAST: + useecs = usemecs = false; + use_read = fullspd = true; + break; + + case OPT_HELP: + usage (); + FLEX_EXIT (0); + + case OPT_INTERACTIVE: + interactive = true; + break; + + case OPT_CASE_INSENSITIVE: + sf_set_case_ins(true); + break; + + case OPT_LEX_COMPAT: + lex_compat = true; + break; + + case OPT_POSIX_COMPAT: + posix_compat = true; + break; + + case OPT_PREPROC_LEVEL: + preproc_level = strtol(arg,NULL,0); + break; + + case OPT_MAIN: + buf_strdefine (&userdef_buf, "YY_MAIN", "1"); + do_yywrap = false; + break; + + case OPT_NO_MAIN: + buf_strdefine (&userdef_buf, "YY_MAIN", "0"); + break; + + case OPT_NO_LINE: + gen_line_dirs = false; + break; + + case OPT_OUTFILE: + outfilename = arg; + did_outfilename = 1; + break; + + case OPT_PREFIX: + prefix = arg; + break; + + case OPT_PERF_REPORT: + ++performance_report; + break; + + case OPT_BISON_BRIDGE: + bison_bridge_lval = true; + break; + + case OPT_BISON_BRIDGE_LOCATIONS: + bison_bridge_lval = bison_bridge_lloc = true; + break; + + case OPT_REENTRANT: + reentrant = true; + break; + + case OPT_NO_REENTRANT: + reentrant = false; + break; + + case OPT_SKEL: + skelname = arg; + break; + + case OPT_DEFAULT: + spprdflt = false; + break; + + case OPT_NO_DEFAULT: + spprdflt = true; + break; + + case OPT_STDOUT: + use_stdout = true; + break; + + case OPT_NO_UNISTD_H: + //buf_strdefine (&userdef_buf, "YY_NO_UNISTD_H", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_UNISTD_H",0); + break; + + case OPT_TABLES_FILE: + tablesext = true; + tablesfilename = arg; + break; + + case OPT_TABLES_VERIFY: + tablesverify = true; + break; + + case OPT_TRACE: + trace = true; + break; + + case OPT_VERBOSE: + printstats = true; + break; + + case OPT_VERSION: + printf (_("%s %s\n"), program_name, flex_version); + FLEX_EXIT (0); + + case OPT_WARN: + nowarn = false; + break; + + case OPT_NO_WARN: + nowarn = true; + break; + + case OPT_7BIT: + csize = 128; + break; + + case OPT_8BIT: + csize = CSIZE; + break; + + case OPT_ALIGN: + long_align = true; + break; + + case OPT_NO_ALIGN: + long_align = false; + break; + + case OPT_ALWAYS_INTERACTIVE: + buf_m4_define (&m4defs_buf, "M4_YY_ALWAYS_INTERACTIVE", 0); + break; + + case OPT_NEVER_INTERACTIVE: + buf_m4_define( &m4defs_buf, "M4_YY_NEVER_INTERACTIVE", 0); + break; + + case OPT_ARRAY: + yytext_is_array = true; + break; + + case OPT_POINTER: + yytext_is_array = false; + break; + + case OPT_ECS: + useecs = true; + break; + + case OPT_NO_ECS: + useecs = false; + break; + + case OPT_HEADER_FILE: + headerfilename = arg; + break; + + case OPT_META_ECS: + usemecs = true; + break; + + case OPT_NO_META_ECS: + usemecs = false; + break; + + case OPT_PREPROCDEFINE: + { + /* arg is "symbol" or "symbol=definition". */ + char *def; + + for (def = arg; + *def != '\0' && *def != '='; ++def) ; + + buf_strappend (&userdef_buf, "#define "); + if (*def == '\0') { + buf_strappend (&userdef_buf, arg); + buf_strappend (&userdef_buf, + " 1\n"); + } + else { + buf_strnappend (&userdef_buf, arg, + def - arg); + buf_strappend (&userdef_buf, " "); + buf_strappend (&userdef_buf, + def + 1); + buf_strappend (&userdef_buf, "\n"); + } + } + break; + + case OPT_READ: + use_read = true; + break; + + case OPT_STACK: + //buf_strdefine (&userdef_buf, "YY_STACK_USED", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_STACK_USED",0); + break; + + case OPT_STDINIT: + do_stdinit = true; + break; + + case OPT_NO_STDINIT: + do_stdinit = false; + break; + + case OPT_YYCLASS: + yyclass = arg; + break; + + case OPT_YYLINENO: + do_yylineno = true; + break; + + case OPT_NO_YYLINENO: + do_yylineno = false; + break; + + case OPT_YYWRAP: + do_yywrap = true; + break; + + case OPT_NO_YYWRAP: + do_yywrap = false; + break; + + case OPT_YYMORE: + yymore_really_used = true; + break; + + case OPT_NO_YYMORE: + yymore_really_used = false; + break; + + case OPT_REJECT: + reject_really_used = true; + break; + + case OPT_NO_REJECT: + reject_really_used = false; + break; + + case OPT_NO_ANSI_FUNC_DEFS: + ansi_func_defs = false; + break; + + case OPT_NO_ANSI_FUNC_PROTOS: + ansi_func_protos = false; + break; + + case OPT_NO_YY_PUSH_STATE: + //buf_strdefine (&userdef_buf, "YY_NO_PUSH_STATE", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_PUSH_STATE",0); + break; + case OPT_NO_YY_POP_STATE: + //buf_strdefine (&userdef_buf, "YY_NO_POP_STATE", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_POP_STATE",0); + break; + case OPT_NO_YY_TOP_STATE: + //buf_strdefine (&userdef_buf, "YY_NO_TOP_STATE", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_TOP_STATE",0); + break; + case OPT_NO_UNPUT: + //buf_strdefine (&userdef_buf, "YY_NO_UNPUT", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_UNPUT",0); + break; + case OPT_NO_YY_SCAN_BUFFER: + //buf_strdefine (&userdef_buf, "YY_NO_SCAN_BUFFER", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_SCAN_BUFFER",0); + break; + case OPT_NO_YY_SCAN_BYTES: + //buf_strdefine (&userdef_buf, "YY_NO_SCAN_BYTES", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_SCAN_BYTES",0); + break; + case OPT_NO_YY_SCAN_STRING: + //buf_strdefine (&userdef_buf, "YY_NO_SCAN_STRING", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_SCAN_STRING",0); + break; + case OPT_NO_YYGET_EXTRA: + //buf_strdefine (&userdef_buf, "YY_NO_GET_EXTRA", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_GET_EXTRA",0); + break; + case OPT_NO_YYSET_EXTRA: + //buf_strdefine (&userdef_buf, "YY_NO_SET_EXTRA", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_SET_EXTRA",0); + break; + case OPT_NO_YYGET_LENG: + //buf_strdefine (&userdef_buf, "YY_NO_GET_LENG", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_GET_LENG",0); + break; + case OPT_NO_YYGET_TEXT: + //buf_strdefine (&userdef_buf, "YY_NO_GET_TEXT", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_GET_TEXT",0); + break; + case OPT_NO_YYGET_LINENO: + //buf_strdefine (&userdef_buf, "YY_NO_GET_LINENO", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_GET_LINENO",0); + break; + case OPT_NO_YYSET_LINENO: + //buf_strdefine (&userdef_buf, "YY_NO_SET_LINENO", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_SET_LINENO",0); + break; + case OPT_NO_YYGET_IN: + //buf_strdefine (&userdef_buf, "YY_NO_GET_IN", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_GET_IN",0); + break; + case OPT_NO_YYSET_IN: + //buf_strdefine (&userdef_buf, "YY_NO_SET_IN", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_SET_IN",0); + break; + case OPT_NO_YYGET_OUT: + //buf_strdefine (&userdef_buf, "YY_NO_GET_OUT", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_GET_OUT",0); + break; + case OPT_NO_YYSET_OUT: + //buf_strdefine (&userdef_buf, "YY_NO_SET_OUT", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_SET_OUT",0); + break; + case OPT_NO_YYGET_LVAL: + //buf_strdefine (&userdef_buf, "YY_NO_GET_LVAL", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_GET_LVAL",0); + break; + case OPT_NO_YYSET_LVAL: + //buf_strdefine (&userdef_buf, "YY_NO_SET_LVAL", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_SET_LVAL",0); + break; + case OPT_NO_YYGET_LLOC: + //buf_strdefine (&userdef_buf, "YY_NO_GET_LLOC", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_GET_LLOC",0); + break; + case OPT_NO_YYSET_LLOC: + //buf_strdefine (&userdef_buf, "YY_NO_SET_LLOC", "1"); + buf_m4_define( &m4defs_buf, "M4_YY_NO_SET_LLOC",0); + break; + + } /* switch */ + } /* while scanopt() */ + + scanopt_destroy (sopt); + + num_input_files = argc - optind; + input_files = argv + optind; + set_input_file (num_input_files > 0 ? input_files[0] : NULL); + + lastccl = lastsc = lastdfa = lastnfa = 0; + num_rules = num_eof_rules = default_rule = 0; + numas = numsnpairs = tmpuses = 0; + numecs = numeps = eps2 = num_reallocs = hshcol = dfaeql = totnst = + 0; + numuniq = numdup = hshsave = eofseen = datapos = dataline = 0; + num_backing_up = onesp = numprots = 0; + variable_trailing_context_rules = bol_needed = false; + + linenum = sectnum = 1; + firstprot = NIL; + + /* Used in mkprot() so that the first proto goes in slot 1 + * of the proto queue. + */ + lastprot = 1; + + set_up_initial_allocations (); +} + + +/* readin - read in the rules section of the input file(s) */ + +void readin () +{ + static char yy_stdinit[] = "FILE *yyin = stdin, *yyout = stdout;"; + static char yy_nostdinit[] = + "FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;"; + + line_directive_out ((FILE *) 0, 1); + + if (yyparse ()) { + pinpoint_message (_("fatal parse error")); + flexend (1); + } + + if (syntaxerror) + flexend (1); + + /* If the user explicitly requested posix compatibility by specifing the + * posix-compat option, then we check for conflicting options. However, if + * the POSIXLY_CORRECT variable is set, then we quietly make flex as + * posix-compatible as possible. This is the recommended behavior + * according to the GNU Coding Standards. + * + * Note: The posix option was added to flex to provide the posix behavior + * of the repeat operator in regular expressions, e.g., `ab{3}' + */ + if (posix_compat) { + /* TODO: This is where we try to make flex behave according to + * posiz, AND check for conflicting options. How far should we go + * with this? Should we disable all the neat-o flex features? + */ + /* Update: Estes says no, since other flex features don't violate posix. */ + } + + if (getenv ("POSIXLY_CORRECT")) { + posix_compat = true; + } + + if (backing_up_report) { + backing_up_file = fopen (backing_name, "w"); + if (backing_up_file == NULL) + lerrsf (_ + ("could not create backing-up info file %s"), + backing_name); + } + + else + backing_up_file = NULL; + + if (yymore_really_used == true) + yymore_used = true; + else if (yymore_really_used == false) + yymore_used = false; + + if (reject_really_used == true) + reject = true; + else if (reject_really_used == false) + reject = false; + + if (performance_report > 0) { + if (lex_compat) { + fprintf (stderr, + _ + ("-l AT&T lex compatibility option entails a large performance penalty\n")); + fprintf (stderr, + _ + (" and may be the actual source of other reported performance penalties\n")); + } + + else if (do_yylineno) { + fprintf (stderr, + _ + ("%%option yylineno entails a performance penalty ONLY on rules that can match newline characters\n")); + } + + if (performance_report > 1) { + if (interactive) + fprintf (stderr, + _ + ("-I (interactive) entails a minor performance penalty\n")); + + if (yymore_used) + fprintf (stderr, + _ + ("yymore() entails a minor performance penalty\n")); + } + + if (reject) + fprintf (stderr, + _ + ("REJECT entails a large performance penalty\n")); + + if (variable_trailing_context_rules) + fprintf (stderr, + _ + ("Variable trailing context rules entail a large performance penalty\n")); + } + + if (reject) + real_reject = true; + + if (variable_trailing_context_rules) + reject = true; + + if ((fulltbl || fullspd) && reject) { + if (real_reject) + flexerror (_ + ("REJECT cannot be used with -f or -F")); + else if (do_yylineno) + flexerror (_ + ("%option yylineno cannot be used with REJECT")); + else + flexerror (_ + ("variable trailing context rules cannot be used with -f or -F")); + } + + if (reject){ + out_m4_define( "M4_YY_USES_REJECT", NULL); + //outn ("\n#define YY_USES_REJECT"); + } + + if (!do_yywrap) { + if (!C_plus_plus) + 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"); + + OUT_BEGIN_CODE (); + if (csize == 256) + outn ("typedef unsigned char YY_CHAR;"); + else + outn ("typedef char YY_CHAR;"); + OUT_END_CODE (); + + if (C_plus_plus) { + outn ("#define yytext_ptr yytext"); + + if (interactive) + outn ("#define YY_INTERACTIVE"); + } + + else { + OUT_BEGIN_CODE (); + /* In reentrant scanner, stdinit is handled in flex.skl. */ + if (do_stdinit) { + if (reentrant){ + outn ("#ifdef VMS"); + outn ("#ifdef __VMS_POSIX"); + outn ("#define YY_STDINIT"); + outn ("#endif"); + outn ("#else"); + outn ("#define YY_STDINIT"); + outn ("#endif"); + } + + outn ("#ifdef VMS"); + outn ("#ifndef __VMS_POSIX"); + outn (yy_nostdinit); + outn ("#else"); + outn (yy_stdinit); + outn ("#endif"); + outn ("#else"); + outn (yy_stdinit); + outn ("#endif"); + } + + else { + if(!reentrant) + outn (yy_nostdinit); + } + OUT_END_CODE (); + } + + OUT_BEGIN_CODE (); + if (fullspd) + outn ("typedef yyconst struct yy_trans_info *yy_state_type;"); + else if (!C_plus_plus) + outn ("typedef int yy_state_type;"); + OUT_END_CODE (); + + if (lex_compat) + outn ("#define YY_FLEX_LEX_COMPAT"); + + if (!C_plus_plus && !reentrant) { + outn ("extern int yylineno;"); + OUT_BEGIN_CODE (); + outn ("int yylineno = 1;"); + OUT_END_CODE (); + } + + if (C_plus_plus) { + outn ("\n#include "); + + if (!do_yywrap) { + outn("\nint yyFlexLexer::yywrap() { return 1; }"); + } + + if (yyclass) { + outn ("int yyFlexLexer::yylex()"); + outn ("\t{"); + outn ("\tLexerError( \"yyFlexLexer::yylex invoked but %option yyclass used\" );"); + outn ("\treturn 0;"); + outn ("\t}"); + + out_str ("\n#define YY_DECL int %s::yylex()\n", + yyclass); + } + } + + else { + + /* Watch out: yytext_ptr is a variable when yytext is an array, + * but it's a macro when yytext is a pointer. + */ + if (yytext_is_array) { + if (!reentrant) + outn ("extern char yytext[];\n"); + } + else { + if (reentrant) { + outn ("#define yytext_ptr yytext_r"); + } + else { + outn ("extern char *yytext;"); + outn ("#define yytext_ptr yytext"); + } + } + + if (yyclass) + flexerror (_ + ("%option yyclass only meaningful for C++ scanners")); + } + + if (useecs) + numecs = cre8ecs (nextecm, ecgroup, csize); + else + numecs = csize; + + /* Now map the equivalence class for NUL to its expected place. */ + ecgroup[0] = ecgroup[csize]; + NUL_ec = ABS (ecgroup[0]); + + if (useecs) + ccl2ecl (); +} + + +/* set_up_initial_allocations - allocate memory for internal tables */ + +void set_up_initial_allocations () +{ + maximum_mns = (long_align ? MAXIMUM_MNS_LONG : MAXIMUM_MNS); + current_mns = INITIAL_MNS; + firstst = allocate_integer_array (current_mns); + lastst = allocate_integer_array (current_mns); + finalst = allocate_integer_array (current_mns); + transchar = allocate_integer_array (current_mns); + trans1 = allocate_integer_array (current_mns); + trans2 = allocate_integer_array (current_mns); + accptnum = allocate_integer_array (current_mns); + assoc_rule = allocate_integer_array (current_mns); + state_type = allocate_integer_array (current_mns); + + current_max_rules = INITIAL_MAX_RULES; + rule_type = allocate_integer_array (current_max_rules); + rule_linenum = allocate_integer_array (current_max_rules); + rule_useful = allocate_integer_array (current_max_rules); + rule_has_nl = allocate_bool_array (current_max_rules); + + current_max_scs = INITIAL_MAX_SCS; + scset = allocate_integer_array (current_max_scs); + scbol = allocate_integer_array (current_max_scs); + scxclu = allocate_integer_array (current_max_scs); + sceof = allocate_integer_array (current_max_scs); + scname = allocate_char_ptr_array (current_max_scs); + + current_maxccls = INITIAL_MAX_CCLS; + cclmap = allocate_integer_array (current_maxccls); + ccllen = allocate_integer_array (current_maxccls); + cclng = allocate_integer_array (current_maxccls); + ccl_has_nl = allocate_bool_array (current_maxccls); + + current_max_ccl_tbl_size = INITIAL_MAX_CCL_TBL_SIZE; + ccltbl = allocate_Character_array (current_max_ccl_tbl_size); + + current_max_dfa_size = INITIAL_MAX_DFA_SIZE; + + current_max_xpairs = INITIAL_MAX_XPAIRS; + nxt = allocate_integer_array (current_max_xpairs); + chk = allocate_integer_array (current_max_xpairs); + + current_max_template_xpairs = INITIAL_MAX_TEMPLATE_XPAIRS; + tnxt = allocate_integer_array (current_max_template_xpairs); + + current_max_dfas = INITIAL_MAX_DFAS; + base = allocate_integer_array (current_max_dfas); + def = allocate_integer_array (current_max_dfas); + dfasiz = allocate_integer_array (current_max_dfas); + accsiz = allocate_integer_array (current_max_dfas); + dhash = allocate_integer_array (current_max_dfas); + dss = allocate_int_ptr_array (current_max_dfas); + dfaacc = allocate_dfaacc_union (current_max_dfas); + + nultrans = (int *) 0; +} + + +/* extracts basename from path, optionally stripping the extension "\.*" + * (same concept as /bin/sh `basename`, but different handling of extension). */ +static char *basename2 (path, strip_ext) + char *path; + int strip_ext; /* boolean */ +{ + char *b, *e = 0; + + b = path; + for (b = path; *path; path++) + if (*path == '/') + b = path + 1; + else if (*path == '.') + e = path; + + if (strip_ext && e && e > b) + *e = '\0'; + return b; +} + +void usage () +{ + FILE *f = stdout; + + if (!did_outfilename) { + snprintf (outfile_path, sizeof(outfile_path), outfile_template, + prefix, C_plus_plus ? "cc" : "c"); + outfilename = outfile_path; + } + + fprintf (f, _("Usage: %s [OPTIONS] [FILE]...\n"), program_name); + fprintf (f, + _ + ("Generates programs that perform pattern-matching on text.\n" + "\n" "Table Compression:\n" + " -Ca, --align trade off larger tables for better memory alignment\n" + " -Ce, --ecs construct equivalence classes\n" + " -Cf do not compress tables; use -f representation\n" + " -CF do not compress tables; use -F representation\n" + " -Cm, --meta-ecs construct meta-equivalence classes\n" + " -Cr, --read use read() instead of stdio for scanner input\n" + " -f, --full generate fast, large scanner. Same as -Cfr\n" + " -F, --fast use alternate table representation. Same as -CFr\n" + " -Cem default compression (same as --ecs --meta-ecs)\n" + "\n" "Debugging:\n" + " -d, --debug enable debug mode in scanner\n" + " -b, --backup write backing-up information to %s\n" + " -p, --perf-report write performance report to stderr\n" + " -s, --nodefault suppress default rule to ECHO unmatched text\n" + " -T, --trace %s should run in trace mode\n" + " -w, --nowarn do not generate warnings\n" + " -v, --verbose write summary of scanner statistics to stdout\n" + "\n" "Files:\n" + " -o, --outfile=FILE specify output filename\n" + " -S, --skel=FILE specify skeleton file\n" + " -t, --stdout write scanner on stdout instead of %s\n" + " --yyclass=NAME name of C++ class\n" + " --header-file=FILE create a C header file in addition to the scanner\n" + " --tables-file[=FILE] write tables to FILE\n" "\n" + "Scanner behavior:\n" + " -7, --7bit generate 7-bit scanner\n" + " -8, --8bit generate 8-bit scanner\n" + " -B, --batch generate batch scanner (opposite of -I)\n" + " -i, --case-insensitive ignore case in patterns\n" + " -l, --lex-compat maximal compatibility with original lex\n" + " -X, --posix-compat maximal compatibility with POSIX lex\n" + " -I, --interactive generate interactive scanner (opposite of -B)\n" + " --yylineno track line count in yylineno\n" + "\n" "Generated code:\n" + " -+, --c++ generate C++ scanner class\n" + " -Dmacro[=defn] #define macro defn (default defn is '1')\n" + " -L, --noline suppress #line directives in scanner\n" + " -P, --prefix=STRING use STRING as prefix instead of \"yy\"\n" + " -R, --reentrant generate a reentrant C scanner\n" + " --bison-bridge scanner for bison pure parser.\n" + " --bison-locations include yylloc support.\n" + " --stdinit initialize yyin/yyout to stdin/stdout\n" + " --noansi-definitions old-style function definitions\n" + " --noansi-prototypes empty parameter list in prototypes\n" + " --nounistd do not include \n" + " --noFUNCTION do not generate a particular FUNCTION\n" + "\n" "Miscellaneous:\n" + " -c do-nothing POSIX option\n" + " -n do-nothing POSIX option\n" + " -?\n" + " -h, --help produce this help message\n" + " -V, --version report %s version\n"), + backing_name, program_name, outfile_path, program_name); + +} diff --git a/contrib/flex/misc.c b/contrib/flex/misc.c new file mode 100644 index 000000000000..e3fdd50cdd9b --- /dev/null +++ b/contrib/flex/misc.c @@ -0,0 +1,1023 @@ +/* misc - miscellaneous flex routines */ + +/* Copyright (c) 1990 The Regents of the University of California. */ +/* All rights reserved. */ + +/* This code is derived from software contributed to Berkeley by */ +/* Vern Paxson. */ + +/* The United States Government has rights in this work pursuant */ +/* to contract no. DE-AC03-76SF00098 between the United States */ +/* Department of Energy and the University of California. */ + +/* This file is part of flex. */ + +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ + +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ + +/* Neither the name of the University nor the names of its contributors */ +/* may be used to endorse or promote products derived from this software */ +/* without specific prior written permission. */ + +/* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */ +/* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ +/* PURPOSE. */ + +#include "flexdef.h" +#include "tables.h" + +#define CMD_IF_TABLES_SER "%if-tables-serialization" +#define CMD_TABLES_YYDMAP "%tables-yydmap" +#define CMD_DEFINE_YYTABLES "%define-yytables" +#define CMD_IF_CPP_ONLY "%if-c++-only" +#define CMD_IF_C_ONLY "%if-c-only" +#define CMD_IF_C_OR_CPP "%if-c-or-c++" +#define CMD_NOT_FOR_HEADER "%not-for-header" +#define CMD_OK_FOR_HEADER "%ok-for-header" +#define CMD_PUSH "%push" +#define CMD_POP "%pop" +#define CMD_IF_REENTRANT "%if-reentrant" +#define CMD_IF_NOT_REENTRANT "%if-not-reentrant" +#define CMD_IF_BISON_BRIDGE "%if-bison-bridge" +#define CMD_IF_NOT_BISON_BRIDGE "%if-not-bison-bridge" +#define CMD_ENDIF "%endif" + +/* we allow the skeleton to push and pop. */ +struct sko_state { + bool dc; /**< do_copy */ +}; +static struct sko_state *sko_stack=0; +static int sko_len=0,sko_sz=0; +static void sko_push(bool dc) +{ + if(!sko_stack){ + sko_sz = 1; + sko_stack = (struct sko_state*)flex_alloc(sizeof(struct sko_state)*sko_sz); + 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!"); + + if ((int) strlen (defname) > MAXLINE / 2) { + format_pinpoint_message (_ + ("name \"%s\" ridiculously long"), + defname); + return; + } + + snprintf (buf, sizeof(buf), "m4_define([[%s]],[[%s]])m4_dnl\n", defname, value?value:""); + add_action (buf); +} + +/* Append "new_text" to the running buffer. */ +void add_action (new_text) + const char *new_text; +{ + int len = strlen (new_text); + + while (len + action_index >= action_size - 10 /* slop */ ) { + int new_size = action_size * 2; + + if (new_size <= 0) + /* Increase just a little, to try to avoid overflow + * on 16-bit machines. + */ + action_size += action_size / 8; + else + action_size = new_size; + + action_array = + reallocate_character_array (action_array, + action_size); + } + + strcpy (&action_array[action_index], new_text); + + action_index += len; +} + + +/* allocate_array - allocate memory for an integer array of the given size */ + +void *allocate_array (size, element_size) + int size; + size_t element_size; +{ + register void *mem; + size_t num_bytes = element_size * size; + + mem = flex_alloc (num_bytes); + if (!mem) + flexfatal (_ + ("memory allocation failed in allocate_array()")); + + return mem; +} + + +/* all_lower - true if a string is all lower-case */ + +int all_lower (str) + register char *str; +{ + while (*str) { + if (!isascii ((Char) * str) || !islower ((Char) * str)) + return 0; + ++str; + } + + return 1; +} + + +/* all_upper - true if a string is all upper-case */ + +int all_upper (str) + register char *str; +{ + while (*str) { + if (!isascii ((Char) * str) || !isupper ((Char) * str)) + return 0; + ++str; + } + + return 1; +} + + +/* intcmp - compares two integers for use by qsort. */ + +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 + * we're expecting. If not, generates fatal error message + * and exits. + */ + +void check_char (c) + int c; +{ + if (c >= CSIZE) + lerrsf (_("bad character '%s' detected in check_char()"), + readable_form (c)); + + if (c >= csize) + lerrsf (_ + ("scanner requires -8 flag to use the character %s"), + readable_form (c)); +} + + + +/* clower - replace upper-case letter to lower-case */ + +Char clower (c) + register int c; +{ + return (Char) ((isascii (c) && isupper (c)) ? tolower (c) : c); +} + + +/* copy_string - returns a dynamically allocated copy of a string */ + +char *copy_string (str) + register const char *str; +{ + register const char *c1; + register char *c2; + char *copy; + unsigned int size; + + /* find length */ + for (c1 = str; *c1; ++c1) ; + + size = (c1 - str + 1) * sizeof (char); + + copy = (char *) flex_alloc (size); + + if (copy == NULL) + flexfatal (_("dynamic memory failure in copy_string()")); + + for (c2 = copy; (*c2++ = *str++) != 0;) ; + + return copy; +} + + +/* copy_unsigned_string - + * returns a dynamically allocated copy of a (potentially) unsigned string + */ + +Char *copy_unsigned_string (str) + register Char *str; +{ + register Char *c; + Char *copy; + + /* find length */ + for (c = str; *c; ++c) ; + + copy = allocate_Character_array (c - str + 1); + + for (c = copy; (*c++ = *str++) != 0;) ; + + return copy; +} + + +/* cclcmp - compares two characters for use by qsort with '\0' sorting last. */ + +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 () +{ + /* short circuit any output */ + if (gentables) { + + if (datapos > 0) + dataflush (); + + /* add terminator for initialization; { for vi */ + outn (" } ;\n"); + } + dataline = 0; + datapos = 0; +} + + +/* dataflush - flush generated data statements */ + +void dataflush () +{ + /* short circuit any output */ + if (!gentables) + return; + + outc ('\n'); + + if (++dataline >= NUMDATALINES) { + /* Put out a blank line so that the table is grouped into + * large blocks that enable the user to find elements easily. + */ + outc ('\n'); + dataline = 0; + } + + /* Reset the number of characters written on the current line. */ + datapos = 0; +} + + +/* flexerror - report an error message and terminate */ + +void flexerror (msg) + const char *msg; +{ + fprintf (stderr, "%s: %s\n", program_name, msg); + flexend (1); +} + + +/* flexfatal - report a fatal error message and terminate */ + +void flexfatal (msg) + const char *msg; +{ + fprintf (stderr, _("%s: fatal internal error, %s\n"), + program_name, msg); + FLEX_EXIT (1); +} + + +/* htoi - convert a hexadecimal digit string to an integer value */ + +int htoi (str) + Char str[]; +{ + unsigned int result; + + (void) sscanf ((char *) str, "%x", &result); + + return result; +} + + +/* lerrif - report an error message formatted with one integer argument */ + +void lerrif (msg, arg) + const char *msg; + int arg; +{ + char errmsg[MAXLINE]; + + snprintf (errmsg, sizeof(errmsg), msg, arg); + flexerror (errmsg); +} + + +/* lerrsf - report an error message formatted with one string argument */ + +void lerrsf (msg, arg) + const char *msg, arg[]; +{ + char errmsg[MAXLINE]; + + snprintf (errmsg, sizeof(errmsg)-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"; + + if (!gen_line_dirs) + return; + + s1 = do_infile ? infilename : "M4_YY_OUTFILE_NAME"; + + if (do_infile && !s1) + s1 = ""; + + s2 = filename; + s3 = &filename[sizeof (filename) - 2]; + + while (s2 < s3 && *s1) { + if (*s1 == '\\') + /* Escape the '\' */ + *s2++ = '\\'; + + *s2++ = *s1++; + } + + *s2 = '\0'; + + if (do_infile) + snprintf (directive, sizeof(directive), line_fmt, linenum, filename); + else { + 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); +} + + +/* mark_defs1 - mark the current position in the action array as + * representing where the user's section 1 definitions end + * and the prolog begins + */ +void mark_defs1 () +{ + defs1_offset = 0; + action_array[action_index++] = '\0'; + action_offset = prolog_offset = action_index; + action_array[action_index] = '\0'; +} + + +/* mark_prolog - mark the current position in the action array as + * representing the end of the action prolog + */ +void mark_prolog () +{ + action_array[action_index++] = '\0'; + action_offset = action_index; + action_array[action_index] = '\0'; +} + + +/* mk2data - generate a data statement for a two-dimensional array + * + * Generates a data statement initializing the current 2-D array to "value". + */ +void mk2data (value) + int value; +{ + /* short circuit any output */ + if (!gentables) + return; + + if (datapos >= NUMDATAITEMS) { + outc (','); + dataflush (); + } + + if (datapos == 0) + /* Indent. */ + out (" "); + + else + outc (','); + + ++datapos; + + out_dec ("%5d", value); +} + + +/* mkdata - generate a data statement + * + * Generates a data statement initializing the current array element to + * "value". + */ +void mkdata (value) + int value; +{ + /* short circuit any output */ + if (!gentables) + return; + + if (datapos >= NUMDATAITEMS) { + outc (','); + dataflush (); + } + + if (datapos == 0) + /* Indent. */ + out (" "); + else + outc (','); + + ++datapos; + + out_dec ("%5d", value); +} + + +/* myctoi - return the integer represented by a string of digits */ + +int myctoi (array) + const char *array; +{ + int val = 0; + + (void) sscanf (array, "%d", &val); + + return val; +} + + +/* myesc - return character corresponding to escape sequence */ + +Char myesc (array) + Char array[]; +{ + Char c, esc_char; + + switch (array[1]) { + case 'b': + return '\b'; + case 'f': + return '\f'; + case 'n': + return '\n'; + case 'r': + return '\r'; + case 't': + return '\t'; + +#if defined (__STDC__) + case 'a': + return '\a'; + case 'v': + return '\v'; +#else + case 'a': + return '\007'; + case 'v': + return '\013'; +#endif + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + { /* \ */ + int sptr = 1; + + while (isascii (array[sptr]) && + isdigit (array[sptr])) + /* Don't increment inside loop control + * because if isdigit() is a macro it might + * expand into multiple increments ... + */ + ++sptr; + + c = array[sptr]; + array[sptr] = '\0'; + + esc_char = otoi (array + 1); + + array[sptr] = c; + + return esc_char; + } + + case 'x': + { /* \x */ + int sptr = 2; + + 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 ... + */ + ++sptr; + + c = array[sptr]; + array[sptr] = '\0'; + + esc_char = htoi (array + 2); + + array[sptr] = c; + + return esc_char; + } + + default: + return array[1]; + } +} + + +/* otoi - convert an octal digit string to an integer value */ + +int otoi (str) + Char str[]; +{ + unsigned int result; + + (void) sscanf ((char *) str, "%o", &result); + return result; +} + + +/* out - various flavors of outputing a (possibly formatted) string for the + * generated scanner, keeping track of the line count. + */ + +void out (str) + const char *str; +{ + fputs (str, stdout); +} + +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 the human-readable form of a character + * + * The returned string is in static storage. + */ + +char *readable_form (c) + register int c; +{ + static char rform[10]; + + if ((c >= 0 && c < 32) || c >= 127) { + switch (c) { + case '\b': + return "\\b"; + case '\f': + return "\\f"; + case '\n': + return "\\n"; + case '\r': + return "\\r"; + case '\t': + return "\\t"; + +#if defined (__STDC__) + case '\a': + return "\\a"; + case '\v': + return "\\v"; +#endif + + default: + snprintf (rform, sizeof(rform), "\\%.3o", (unsigned int) c); + return rform; + } + } + + else if (c == ' ') + return "' '"; + + else { + rform[0] = c; + rform[1] = '\0'; + + return rform; + } +} + + +/* reallocate_array - increase the size of a dynamic array */ + +void *reallocate_array (array, size, element_size) + void *array; + int size; + size_t element_size; +{ + register void *new_array; + size_t num_bytes = element_size * size; + + new_array = flex_realloc (array, num_bytes); + if (!new_array) + flexfatal (_("attempt to increase array size failed")); + + return new_array; +} + + +/* skelout - write out one section of the skeleton file + * + * Description + * Copies skelfile or skel array to stdout until a line beginning with + * "%%" or EOF is found. + */ +void skelout () +{ + char buf_storage[MAXLINE]; + char *buf = buf_storage; + bool do_copy = true; + + /* "reset" the state by clearing the buffer and pushing a '1' */ + if(sko_len > 0) + sko_peek(&do_copy); + sko_len = 0; + sko_push(do_copy=true); + + + /* Loop pulling lines either from the skelfile, if we're using + * one, or from the skel[] array. + */ + while (skelfile ? + (fgets (buf, MAXLINE, skelfile) != NULL) : + ((buf = (char *) skel[skel_ind++]) != 0)) { + + if (skelfile) + chomp (buf); + + /* copy from skel array */ + if (buf[0] == '%') { /* control line */ + /* print the control line as a comment. */ + if (ddebug && buf[1] != '#') { + if (buf[strlen (buf) - 1] == '\\') + out_str ("/* %s */\\\n", buf); + else + out_str ("/* %s */\n", buf); + } + + /* We've been accused of using cryptic markers in the skel. + * So we'll use emacs-style-hyphenated-commands. + * We might consider a hash if this if-else-if-else + * chain gets too large. + */ +#define cmd_match(s) (strncmp(buf,(s),strlen(s))==0) + + if (buf[1] == '%') { + /* %% is a break point for skelout() */ + return; + } + else if (cmd_match (CMD_PUSH)){ + sko_push(do_copy); + if(ddebug){ + out_str("/*(state = (%s) */",do_copy?"true":"false"); + } + out_str("%s\n", buf[strlen (buf) - 1] =='\\' ? "\\" : ""); + } + else if (cmd_match (CMD_POP)){ + sko_pop(&do_copy); + if(ddebug){ + out_str("/*(state = (%s) */",do_copy?"true":"false"); + } + out_str("%s\n", buf[strlen (buf) - 1] =='\\' ? "\\" : ""); + } + else if (cmd_match (CMD_IF_REENTRANT)){ + sko_push(do_copy); + do_copy = reentrant && do_copy; + } + else if (cmd_match (CMD_IF_NOT_REENTRANT)){ + sko_push(do_copy); + do_copy = !reentrant && do_copy; + } + else if (cmd_match(CMD_IF_BISON_BRIDGE)){ + sko_push(do_copy); + do_copy = bison_bridge_lval && do_copy; + } + else if (cmd_match(CMD_IF_NOT_BISON_BRIDGE)){ + sko_push(do_copy); + do_copy = !bison_bridge_lval && do_copy; + } + else if (cmd_match (CMD_ENDIF)){ + sko_pop(&do_copy); + } + else if (cmd_match (CMD_IF_TABLES_SER)) { + do_copy = do_copy && tablesext; + } + else if (cmd_match (CMD_TABLES_YYDMAP)) { + if (tablesext && yydmap_buf.elts) + outn ((char *) (yydmap_buf.elts)); + } + else if (cmd_match (CMD_DEFINE_YYTABLES)) { + out_str("#define YYTABLES_NAME \"%s\"\n", + tablesname?tablesname:"yytables"); + } + else if (cmd_match (CMD_IF_CPP_ONLY)) { + /* only for C++ */ + sko_push(do_copy); + do_copy = C_plus_plus; + } + else if (cmd_match (CMD_IF_C_ONLY)) { + /* %- only for C */ + sko_push(do_copy); + do_copy = !C_plus_plus; + } + else if (cmd_match (CMD_IF_C_OR_CPP)) { + /* %* for C and C++ */ + sko_push(do_copy); + do_copy = true; + } + else if (cmd_match (CMD_NOT_FOR_HEADER)) { + /* %c begin linkage-only (non-header) code. */ + OUT_BEGIN_CODE (); + } + else if (cmd_match (CMD_OK_FOR_HEADER)) { + /* %e end linkage-only code. */ + OUT_END_CODE (); + } + else if (buf[1] == '#') { + /* %# a comment in the skel. ignore. */ + } + else { + flexfatal (_("bad line in skeleton file")); + } + } + + else if (do_copy) + outn (buf); + } /* end while */ +} + + +/* transition_struct_out - output a yy_trans_info structure + * + * outputs the yy_trans_info structure with the two elements, element_v and + * element_n. Formats the output with spaces and carriage returns. + */ + +void transition_struct_out (element_v, element_n) + int element_v, element_n; +{ + + /* short circuit any output */ + if (!gentables) + return; + + out_dec2 (" {%4d,%4d },", element_v, element_n); + + datapos += TRANS_STRUCT_PRINT_LENGTH; + + if (datapos >= 79 - TRANS_STRUCT_PRINT_LENGTH) { + outc ('\n'); + + if (++dataline % 10 == 0) + outc ('\n'); + + datapos = 0; + } +} + + +/* The following is only needed when building flex's parser using certain + * broken versions of bison. + */ +void *yy_flex_xmalloc (size) + int size; +{ + void *result = flex_alloc ((size_t) size); + + if (!result) + flexfatal (_ + ("memory allocation failed in yy_flex_xmalloc()")); + + return result; +} + + +/* zero_out - set a region of memory to 0 + * + * Sets region_ptr[0] through region_ptr[size_in_bytes - 1] to zero. + */ + +void zero_out (region_ptr, size_in_bytes) + char *region_ptr; + size_t size_in_bytes; +{ + register char *rp, *rp_end; + + rp = region_ptr; + rp_end = region_ptr + size_in_bytes; + + while (rp < rp_end) + *rp++ = 0; +} + +/* Remove all '\n' and '\r' characters, if any, from the end of str. + * str can be any null-terminated string, or NULL. + * returns str. */ +char *chomp (str) + char *str; +{ + char *p = str; + + if (!str || !*str) /* s is null or empty string */ + return str; + + /* find end of string minus one */ + while (*p) + ++p; + --p; + + /* eat newlines */ + while (p >= str && (*p == '\r' || *p == '\n')) + *p-- = 0; + return str; +} diff --git a/contrib/flex/mkskel.sh b/contrib/flex/mkskel.sh new file mode 100755 index 000000000000..02c397a81c96 --- /dev/null +++ b/contrib/flex/mkskel.sh @@ -0,0 +1,37 @@ +#! /bin/sh + +# This file is part of flex. + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: + +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. + +# Neither the name of the University nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. + +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE. + +cat < 0) + fprintf (stderr, + _ + ("Variable trailing context rule at line %d\n"), + rule_linenum[num_rules]); + + variable_trailing_context_rules = true; + } + + else { + rule_type[num_rules] = RULE_NORMAL; + + if (headcnt > 0 || trailcnt > 0) { + /* Do trailing context magic to not match the trailing + * characters. + */ + char *scanner_cp = "YY_G(yy_c_buf_p) = yy_cp"; + char *scanner_bp = "yy_bp"; + + add_action + ("*yy_cp = YY_G(yy_hold_char); /* undo effects of setting up yytext */\n"); + + if (headcnt > 0) { + snprintf (action_text, sizeof(action_text), "%s = %s + %d;\n", + scanner_cp, scanner_bp, headcnt); + add_action (action_text); + } + + else { + snprintf (action_text, sizeof(action_text), "%s -= %d;\n", + scanner_cp, trailcnt); + add_action (action_text); + } + + add_action + ("YY_DO_BEFORE_ACTION; /* set up yytext again */\n"); + } + } + + /* Okay, in the action code at this point yytext and yyleng have + * their proper final values for this rule, so here's the point + * to do any user action. But don't do it for continued actions, + * as that'll result in multiple YY_RULE_SETUP's. + */ + if (!continued_action) + add_action ("YY_RULE_SETUP\n"); + + line_directive_out ((FILE *) 0, 1); +} + + +/* link_machines - connect two machines together + * + * synopsis + * + * new = link_machines( first, last ); + * + * new - a machine constructed by connecting first to last + * first - the machine whose successor is to be last + * last - the machine whose predecessor is to be first + * + * note: this routine concatenates the machine first with the machine + * last to produce a machine new which will pattern-match first first + * and then last, and will fail if either of the sub-patterns fails. + * FIRST is set to new by the operation. last is unmolested. + */ + +int link_machines (first, last) + int first, last; +{ + if (first == NIL) + return last; + + else if (last == NIL) + return first; + + else { + mkxtion (finalst[first], last); + finalst[first] = finalst[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 + * as being a "normal" (i.e., not trailing context- + * associated) states + * + * The "beginning" states are the epsilon closure of the first state + */ + +void mark_beginning_as_normal (mach) + register int mach; +{ + switch (state_type[mach]) { + case STATE_NORMAL: + /* Oh, we've already visited here. */ + return; + + case STATE_TRAILING_CONTEXT: + state_type[mach] = STATE_NORMAL; + + if (transchar[mach] == SYM_EPSILON) { + if (trans1[mach] != NO_TRANSITION) + mark_beginning_as_normal (trans1[mach]); + + if (trans2[mach] != NO_TRANSITION) + mark_beginning_as_normal (trans2[mach]); + } + break; + + default: + flexerror (_ + ("bad state type in mark_beginning_as_normal()")); + break; + } +} + + +/* mkbranch - make a machine that branches to two machines + * + * synopsis + * + * branch = mkbranch( first, second ); + * + * branch - a machine which matches either first's pattern or second's + * first, second - machines whose patterns are to be or'ed (the | operator) + * + * Note that first and second are NEITHER destroyed by the operation. Also, + * the resulting machine CANNOT be used with any other "mk" operation except + * more mkbranch's. Compare with mkor() + */ + +int mkbranch (first, second) + int first, second; +{ + int eps; + + if (first == NO_TRANSITION) + return second; + + else if (second == NO_TRANSITION) + return first; + + eps = mkstate (SYM_EPSILON); + + mkxtion (eps, first); + mkxtion (eps, second); + + return eps; +} + + +/* mkclos - convert a machine into a closure + * + * synopsis + * new = mkclos( state ); + * + * new - a new state which matches the closure of "state" + */ + +int mkclos (state) + int state; +{ + return mkopt (mkposcl (state)); +} + + +/* mkopt - make a machine optional + * + * synopsis + * + * new = mkopt( mach ); + * + * new - a machine which optionally matches whatever mach matched + * mach - the machine to make optional + * + * notes: + * 1. mach must be the last machine created + * 2. mach is destroyed by the call + */ + +int mkopt (mach) + int mach; +{ + int 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); + + mkxtion (mach, finalst[mach]); + + return mach; +} + + +/* mkor - make a machine that matches either one of two machines + * + * synopsis + * + * new = mkor( first, second ); + * + * new - a machine which matches either first's pattern or second's + * first, second - machines whose patterns are to be or'ed (the | operator) + * + * note that first and second are both destroyed by the operation + * the code is rather convoluted because an attempt is made to minimize + * the number of epsilon states needed + */ + +int mkor (first, second) + int first, second; +{ + int eps, orend; + + if (first == NIL) + return second; + + else if (second == NIL) + return first; + + 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); + + first = link_machines (eps, first); + + mkxtion (first, second); + + if (SUPER_FREE_EPSILON (finalst[first]) && + accptnum[finalst[first]] == NIL) { + orend = finalst[first]; + mkxtion (finalst[second], orend); + } + + else if (SUPER_FREE_EPSILON (finalst[second]) && + accptnum[finalst[second]] == NIL) { + orend = finalst[second]; + mkxtion (finalst[first], orend); + } + + else { + eps = mkstate (SYM_EPSILON); + + first = link_machines (first, eps); + orend = finalst[first]; + + mkxtion (finalst[second], orend); + } + } + + finalst[first] = orend; + return first; +} + + +/* mkposcl - convert a machine into a positive closure + * + * synopsis + * new = mkposcl( state ); + * + * new - a machine matching the positive closure of "state" + */ + +int mkposcl (state) + int state; +{ + int eps; + + 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); + } +} + + +/* mkrep - make a replicated machine + * + * synopsis + * new = mkrep( mach, lb, ub ); + * + * new - a machine that matches whatever "mach" matched from "lb" + * number of times to "ub" number of times + * + * note + * 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; + + base_mach = copysingl (mach, lb - 1); + + if (ub == INFINITE_REPEAT) { + copy = dupmachine (mach); + mach = link_machines (mach, + link_machines (base_mach, + mkclos (copy))); + } + + else { + tail = mkstate (SYM_EPSILON); + + for (i = lb; i < ub; ++i) { + copy = dupmachine (mach); + tail = mkopt (link_machines (copy, tail)); + } + + mach = + link_machines (mach, + link_machines (base_mach, tail)); + } + + return mach; +} + + +/* mkstate - create a state with a transition on a given symbol + * + * synopsis + * + * state = mkstate( sym ); + * + * state - a new state matching sym + * sym - the symbol the new state is to have an out-transition on + * + * note that this routine makes new states in ascending order through the + * state array (and increments LASTNFA accordingly). The routine DUPMACHINE + * relies on machines being made in ascending order and that they are + * CONTIGUOUS. Change it and you will have to rewrite DUPMACHINE (kludge + * 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); + + ++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); + assoc_rule = + reallocate_integer_array (assoc_rule, current_mns); + state_type = + reallocate_integer_array (state_type, current_mns); + } + + firstst[lastnfa] = lastnfa; + finalst[lastnfa] = lastnfa; + lastst[lastnfa] = lastnfa; + transchar[lastnfa] = sym; + trans1[lastnfa] = NO_TRANSITION; + trans2[lastnfa] = NO_TRANSITION; + accptnum[lastnfa] = NIL; + assoc_rule[lastnfa] = num_rules; + state_type[lastnfa] = current_state_type; + + /* Fix up equivalence classes base on this transition. Note that any + * character which has its own transition gets its own equivalence + * class. Thus only characters which are only in character classes + * have a chance at being in the same equivalence class. E.g. "a|b" + * puts 'a' and 'b' into two different equivalence classes. "[ab]" + * puts them in the same equivalence class (barring other differences + * elsewhere in the input). + */ + + 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) + ++numeps; + + else { + check_char (sym); + + if (useecs) + /* Map NUL's to csize. */ + mkechar (sym ? sym : csize, nextecm, ecgroup); + } + + return lastnfa; +} + + +/* mkxtion - make a transition from one state to another + * + * synopsis + * + * mkxtion( statefrom, stateto ); + * + * statefrom - the state from which the transition is to be made + * stateto - the state to which the transition is to be made + */ + +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 { /* 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) { + ++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_has_nl = reallocate_bool_array (rule_has_nl, + current_max_rules); + } + + 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/contrib/flex/options.c b/contrib/flex/options.c new file mode 100644 index 000000000000..c6731738a19b --- /dev/null +++ b/contrib/flex/options.c @@ -0,0 +1,280 @@ +/* flex - tool to generate fast lexical analyzers */ + +/* Copyright (c) 1990 The Regents of the University of California. */ +/* All rights reserved. */ + +/* This code is derived from software contributed to Berkeley by */ +/* Vern Paxson. */ + +/* The United States Government has rights in this work pursuant */ +/* to contract no. DE-AC03-76SF00098 between the United States */ +/* Department of Energy and the University of California. */ + +/* This file is part of flex. */ + +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ + +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ + +/* Neither the name of the University nor the names of its contributors */ +/* may be used to endorse or promote products derived from this software */ +/* without specific prior written permission. */ + +/* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */ +/* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ +/* PURPOSE. */ + +#include "options.h" + +/* Be sure to synchronize these options with those defined in "options.h", + * the giant switch() statement in "main.c", and the %option processing in + * "scan.l". + */ + + +/* The command-line options, passed to scanopt_init() */ +optspec_t flexopts[] = { + + {"-7", OPT_7BIT, 0} + , + {"--7bit", OPT_7BIT, 0} + , /* Generate 7-bit scanner. */ + {"-8", OPT_8BIT, 0} + , + {"--8bit", OPT_8BIT, 0} + , /* Generate 8-bit scanner. */ + {"--align", OPT_ALIGN, 0} + , /* Trade off larger tables for better memory alignment. */ + {"--noalign", OPT_NO_ALIGN, 0} + , + {"--always-interactive", OPT_ALWAYS_INTERACTIVE, 0} + , + {"--array", OPT_ARRAY, 0} + , + {"-b", OPT_BACKUP, 0} + , + {"--backup", OPT_BACKUP, 0} + , /* Generate backing-up information to lex.backup. */ + {"-B", OPT_BATCH, 0} + , + {"--batch", OPT_BATCH, 0} + , /* Generate batch scanner (opposite of -I). */ + {"--bison-bridge", OPT_BISON_BRIDGE, 0} + , /* Scanner to be called by a bison pure parser. */ + {"--bison-locations", OPT_BISON_BRIDGE_LOCATIONS, 0} + , /* Scanner to be called by a bison pure parser. */ + {"-i", OPT_CASE_INSENSITIVE, 0} + , + {"--case-insensitive", OPT_CASE_INSENSITIVE, 0} + , /* Generate case-insensitive scanner. */ + + {"-C[aefFmr]", OPT_COMPRESSION, + "Specify degree of table compression (default is -Cem)"}, + {"-+", OPT_CPLUSPLUS, 0} + , + {"--c++", OPT_CPLUSPLUS, 0} + , /* Generate C++ scanner class. */ + {"-d", OPT_DEBUG, 0} + , + {"--debug", OPT_DEBUG, 0} + , /* Turn on debug mode in generated scanner. */ + {"--nodebug", OPT_NO_DEBUG, 0} + , + {"-s", OPT_NO_DEFAULT, 0} + , + {"--nodefault", OPT_NO_DEFAULT, 0} + , /* Suppress default rule to ECHO unmatched text. */ + {"--default", OPT_DEFAULT, 0} + , + {"-c", OPT_DONOTHING, 0} + , /* For POSIX lex compatibility. */ + {"-n", OPT_DONOTHING, 0} + , /* For POSIX lex compatibility. */ + {"--ecs", OPT_ECS, 0} + , /* Construct equivalence classes. */ + {"--noecs", OPT_NO_ECS, 0} + , + {"-F", OPT_FAST, 0} + , + {"--fast", OPT_FAST, 0} + , /* Same as -CFr. */ + {"-f", OPT_FULL, 0} + , + {"--full", OPT_FULL, 0} + , /* Same as -Cfr. */ + {"--header-file[=FILE]", OPT_HEADER_FILE, 0} + , + {"-?", OPT_HELP, 0} + , + {"-h", OPT_HELP, 0} + , + {"--help", OPT_HELP, 0} + , /* Produce this help message. */ + {"-I", OPT_INTERACTIVE, 0} + , + {"--interactive", OPT_INTERACTIVE, 0} + , /* Generate interactive scanner (opposite of -B). */ + {"-l", OPT_LEX_COMPAT, 0} + , + {"--lex-compat", OPT_LEX_COMPAT, 0} + , /* Maximal compatibility with original lex. */ + {"-X", OPT_POSIX_COMPAT, 0} + , + {"--posix-compat", OPT_POSIX_COMPAT, 0} + , /* Maximal compatibility with POSIX lex. */ + {"--preproc=NUM", OPT_PREPROC_LEVEL, 0} + , + {"-L", OPT_NO_LINE, 0} + , /* Suppress #line directives in scanner. */ + {"--noline", OPT_NO_LINE, 0} + , /* Suppress #line directives in scanner. */ + {"--main", OPT_MAIN, 0} + , /* use built-in main() function. */ + {"--nomain", OPT_NO_MAIN, 0} + , + {"--meta-ecs", OPT_META_ECS, 0} + , /* Construct meta-equivalence classes. */ + {"--nometa-ecs", OPT_NO_META_ECS, 0} + , + {"--never-interactive", OPT_NEVER_INTERACTIVE, 0} + , + {"-o FILE", OPT_OUTFILE, 0} + , + {"--outfile=FILE", OPT_OUTFILE, 0} + , /* Write to FILE (default is lex.yy.c) */ + {"-p", OPT_PERF_REPORT, 0} + , + {"--perf-report", OPT_PERF_REPORT, 0} + , /* Generate performance report to stderr. */ + {"--pointer", OPT_POINTER, 0} + , + {"-P PREFIX", OPT_PREFIX, 0} + , + {"--prefix=PREFIX", OPT_PREFIX, 0} + , /* Use PREFIX (default is yy) */ + {"-Dmacro", OPT_PREPROCDEFINE, 0} + , /* Define a preprocessor symbol. */ + {"--read", OPT_READ, 0} + , /* Use read(2) instead of stdio. */ + {"-R", OPT_REENTRANT, 0} + , + {"--reentrant", OPT_REENTRANT, 0} + , /* Generate a reentrant C scanner. */ + {"--noreentrant", OPT_NO_REENTRANT, 0} + , + {"--reject", OPT_REJECT, 0} + , + {"--noreject", OPT_NO_REJECT, 0} + , + {"-S FILE", OPT_SKEL, 0} + , + {"--skel=FILE", OPT_SKEL, 0} + , /* Use skeleton from FILE */ + {"--stack", OPT_STACK, 0} + , + {"--stdinit", OPT_STDINIT, 0} + , + {"--nostdinit", OPT_NO_STDINIT, 0} + , + {"-t", OPT_STDOUT, 0} + , + {"--stdout", OPT_STDOUT, 0} + , /* Write generated scanner to stdout. */ + {"-T", OPT_TRACE, 0} + , + {"--trace", OPT_TRACE, 0} + , /* Flex should run in trace mode. */ + {"--tables-file[=FILE]", OPT_TABLES_FILE, 0} + , /* Save tables to FILE */ + {"--tables-verify", OPT_TABLES_VERIFY, 0} + , /* Tables integrity check */ + {"--nounistd", OPT_NO_UNISTD_H, 0} + , /* Do not include unistd.h */ + {"-v", OPT_VERBOSE, 0} + , + {"--verbose", OPT_VERBOSE, 0} + , /* Write summary of scanner statistics to stdout. */ + {"-V", OPT_VERSION, 0} + , + {"--version", OPT_VERSION, 0} + , /* Report flex version. */ + {"--warn", OPT_WARN, 0} + , + {"-w", OPT_NO_WARN, 0} + , + {"--nowarn", OPT_NO_WARN, 0} + , /* Suppress warning messages. */ + {"--noansi-definitions", OPT_NO_ANSI_FUNC_DEFS, 0} + , + {"--noansi-prototypes", OPT_NO_ANSI_FUNC_PROTOS, 0} + , + {"--yyclass=NAME", OPT_YYCLASS, 0} + , + {"--yylineno", OPT_YYLINENO, 0} + , + {"--noyylineno", OPT_NO_YYLINENO, 0} + , + + {"--yymore", OPT_YYMORE, 0} + , + {"--noyymore", OPT_NO_YYMORE, 0} + , + {"--noyywrap", OPT_NO_YYWRAP, 0} + , + {"--yywrap", OPT_YYWRAP, 0} + , + + {"--nounput", OPT_NO_UNPUT, 0} + , + {"--noyy_push_state", OPT_NO_YY_PUSH_STATE, 0} + , + {"--noyy_pop_state", OPT_NO_YY_POP_STATE, 0} + , + {"--noyy_top_state", OPT_NO_YY_TOP_STATE, 0} + , + {"--noyy_scan_buffer", OPT_NO_YY_SCAN_BUFFER, 0} + , + {"--noyy_scan_bytes", OPT_NO_YY_SCAN_BYTES, 0} + , + {"--noyy_scan_string", OPT_NO_YY_SCAN_STRING, 0} + , + {"--noyyget_extra", OPT_NO_YYGET_EXTRA, 0} + , + {"--noyyset_extra", OPT_NO_YYSET_EXTRA, 0} + , + {"--noyyget_leng", OPT_NO_YYGET_LENG, 0} + , + {"--noyyget_text", OPT_NO_YYGET_TEXT, 0} + , + {"--noyyget_lineno", OPT_NO_YYGET_LINENO, 0} + , + {"--noyyset_lineno", OPT_NO_YYSET_LINENO, 0} + , + {"--noyyget_in", OPT_NO_YYGET_IN, 0} + , + {"--noyyset_in", OPT_NO_YYSET_IN, 0} + , + {"--noyyget_out", OPT_NO_YYGET_OUT, 0} + , + {"--noyyset_out", OPT_NO_YYSET_OUT, 0} + , + {"--noyyget_lval", OPT_NO_YYGET_LVAL, 0} + , + {"--noyyset_lval", OPT_NO_YYSET_LVAL, 0} + , + {"--noyyget_lloc", OPT_NO_YYGET_LLOC, 0} + , + {"--noyyset_lloc", OPT_NO_YYSET_LLOC, 0} + , + + {0, 0, 0} /* required final NULL entry. */ +}; + +/* vim:set tabstop=8 softtabstop=4 shiftwidth=4: */ diff --git a/contrib/flex/options.h b/contrib/flex/options.h new file mode 100644 index 000000000000..1f3925b9e94d --- /dev/null +++ b/contrib/flex/options.h @@ -0,0 +1,134 @@ +/* flex - tool to generate fast lexical analyzers */ + +/* Copyright (c) 1990 The Regents of the University of California. */ +/* All rights reserved. */ + +/* This code is derived from software contributed to Berkeley by */ +/* Vern Paxson. */ + +/* The United States Government has rights in this work pursuant */ +/* to contract no. DE-AC03-76SF00098 between the United States */ +/* Department of Energy and the University of California. */ + +/* This file is part of flex. */ + +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ + +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ + +/* Neither the name of the University nor the names of its contributors */ +/* may be used to endorse or promote products derived from this software */ +/* without specific prior written permission. */ + +/* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */ +/* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ +/* PURPOSE. */ + +#ifndef OPTIONS_H +#define OPTIONS_H +#include "scanopt.h" + +extern optspec_t flexopts[]; + +enum flexopt_flag_t { + /* Use positive integers only, since they are return codes for scanopt. + * Order is not important. */ + OPT_7BIT = 1, + OPT_8BIT, + OPT_ALIGN, + OPT_ALWAYS_INTERACTIVE, + OPT_ARRAY, + OPT_BACKUP, + OPT_BATCH, + OPT_BISON_BRIDGE, + OPT_BISON_BRIDGE_LOCATIONS, + OPT_CASE_INSENSITIVE, + OPT_COMPRESSION, + OPT_CPLUSPLUS, + OPT_DEBUG, + OPT_DEFAULT, + OPT_DONOTHING, + OPT_ECS, + OPT_FAST, + OPT_FULL, + OPT_HEADER_FILE, + OPT_HELP, + OPT_INTERACTIVE, + OPT_LEX_COMPAT, + OPT_POSIX_COMPAT, + OPT_MAIN, + OPT_META_ECS, + OPT_NEVER_INTERACTIVE, + OPT_NO_ALIGN, + OPT_NO_ANSI_FUNC_DEFS, + OPT_NO_ANSI_FUNC_PROTOS, + OPT_NO_DEBUG, + OPT_NO_DEFAULT, + OPT_NO_ECS, + OPT_NO_LINE, + OPT_NO_MAIN, + OPT_NO_META_ECS, + OPT_NO_REENTRANT, + OPT_NO_REJECT, + OPT_NO_STDINIT, + OPT_NO_UNPUT, + OPT_NO_WARN, + OPT_NO_YYGET_EXTRA, + OPT_NO_YYGET_IN, + OPT_NO_YYGET_LENG, + OPT_NO_YYGET_LINENO, + OPT_NO_YYGET_LLOC, + OPT_NO_YYGET_LVAL, + OPT_NO_YYGET_OUT, + OPT_NO_YYGET_TEXT, + OPT_NO_YYLINENO, + OPT_NO_YYMORE, + OPT_NO_YYSET_EXTRA, + OPT_NO_YYSET_IN, + OPT_NO_YYSET_LINENO, + OPT_NO_YYSET_LLOC, + OPT_NO_YYSET_LVAL, + OPT_NO_YYSET_OUT, + OPT_NO_YYWRAP, + OPT_NO_YY_POP_STATE, + OPT_NO_YY_PUSH_STATE, + OPT_NO_YY_SCAN_BUFFER, + OPT_NO_YY_SCAN_BYTES, + OPT_NO_YY_SCAN_STRING, + OPT_NO_YY_TOP_STATE, + OPT_OUTFILE, + OPT_PERF_REPORT, + OPT_POINTER, + OPT_PREFIX, + OPT_PREPROCDEFINE, + OPT_PREPROC_LEVEL, + OPT_READ, + OPT_REENTRANT, + OPT_REJECT, + OPT_SKEL, + OPT_STACK, + OPT_STDINIT, + OPT_STDOUT, + OPT_TABLES_FILE, + OPT_TABLES_VERIFY, + OPT_TRACE, + OPT_NO_UNISTD_H, + OPT_VERBOSE, + OPT_VERSION, + OPT_WARN, + OPT_YYCLASS, + OPT_YYLINENO, + OPT_YYMORE, + OPT_YYWRAP +}; + +#endif + +/* vim:set tabstop=8 softtabstop=4 shiftwidth=4 textwidth=0: */ diff --git a/contrib/flex/parse.y b/contrib/flex/parse.y new file mode 100644 index 000000000000..bbc738c8d4c9 --- /dev/null +++ b/contrib/flex/parse.y @@ -0,0 +1,1089 @@ +/* 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 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 + +%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. + * + * 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. + */ + +%token BEGIN_REPEAT_POSIX END_REPEAT_POSIX BEGIN_REPEAT_FLEX END_REPEAT_FLEX + + +%{ +/* Copyright (c) 1990 The Regents of the University of California. */ +/* All rights reserved. */ + +/* This code is derived from software contributed to Berkeley by */ +/* Vern Paxson. */ + +/* The United States Government has rights in this work pursuant */ +/* to contract no. DE-AC03-76SF00098 between the United States */ +/* Department of Energy and the University of California. */ + +/* This file is part of flex. */ + +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ + +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ + +/* Neither the name of the University nor the names of its contributors */ +/* may be used to endorse or promote products derived from this software */ +/* without specific prior written permission. */ + +/* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */ +/* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ +/* PURPOSE. */ + +#include "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 + +%} + +%% +goal : initlex sect1 sect1end sect2 initforrule + { /* 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" ); + } + ; + +initlex : + { /* initialize for processing rules */ + + /* Create default DFA start condition. */ + scinstal( "INITIAL", false ); + } + ; + +sect1 : sect1 startconddecl namelist1 + | sect1 options + | + | error + { synerr( _("unknown error processing section 1") ); } + ; + +sect1end : SECTEND + { + check_options(); + scon_stk = allocate_integer_array( lastsc + 1 ); + scon_stk_ptr = 0; + } + ; + +startconddecl : SCDECL + { xcluflg = false; } + + | XSCDECL + { xcluflg = true; } + ; + +namelist1 : namelist1 NAME + { scinstal( nmstr, xcluflg ); } + + | NAME + { scinstal( nmstr, xcluflg ); } + + | error + { synerr( _("bad start condition list") ); } + ; + +options : OPTION_OP optionlist + ; + +optionlist : optionlist option + | + ; + +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' + { scon_stk_ptr = $2; } + | sect2 scon '{' sect2 '}' + { scon_stk_ptr = $2; } + | + ; + +initforrule : + { + /* 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(); + } + ; + +flexrule : '^' rule + { + pat = $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" ); + } + } + + | rule + { + pat = $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 ); + } + } + + | EOF_OP + { + 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 <> rules" ); + + else + build_eof_action(); + } + } + + | error + { synerr( _("unrecognized rule") ); } + ; + +scon_stk_ptr : + { $$ = scon_stk_ptr; } + ; + +scon : '<' scon_stk_ptr namelist2 '>' + { $$ = $2; } + + | '<' '*' '>' + { + $$ = 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; + } + } + + | + { $$ = scon_stk_ptr; } + ; + +namelist2 : namelist2 ',' sconname + + | sconname + + | error + { synerr( _("bad start condition list") ); } + ; + +sconname : NAME + { + 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; + } + } + ; + +rule : re2 re + { + if ( transchar[lastst[$2]] != SYM_EPSILON ) + /* Provide final transition \now/ so it + * will be marked as a trailing context + * state. + */ + $2 = link_machines( $2, + mkstate( SYM_EPSILON ) ); + + mark_beginning_as_normal( $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( $1, + num_rules | YY_TRAILING_HEAD_MASK ); + variable_trail_rule = true; + } + + else + trailcnt = rulelen; + + $$ = link_machines( $1, $2 ); + } + + | re2 re '$' + { synerr( _("trailing context used twice") ); } + + | re '$' + { + headcnt = 0; + trailcnt = 1; + rulelen = 1; + varlength = false; + + current_state_type = STATE_TRAILING_CONTEXT; + + if ( trlcontxt ) + { + synerr( _("trailing context used twice") ); + $$ = 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( $1, + num_rules | YY_TRAILING_HEAD_MASK ); + variable_trail_rule = true; + } + + trlcontxt = true; + + eps = mkstate( SYM_EPSILON ); + $$ = link_machines( $1, + link_machines( eps, mkstate( '\n' ) ) ); + } + + | re + { + $$ = $1; + + if ( trlcontxt ) + { + if ( lex_compat || (varlength && headcnt == 0) ) + /* Both head and trail are + * variable-length. + */ + variable_trail_rule = true; + else + trailcnt = rulelen; + } + } + ; + + +re : re '|' series + { + varlength = true; + $$ = mkor( $1, $3 ); + } + + | series + { $$ = $1; } + ; + + +re2 : re '/' + { + /* 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; + $$ = $1; + } + ; + +series : series singleton + { + /* This is where concatenation of adjacent patterns + * gets done. + */ + $$ = link_machines( $1, $2 ); + } + + | 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 '*' + { + varlength = true; + + $$ = mkclos( $1 ); + } + + | singleton '+' + { + varlength = true; + $$ = mkposcl( $1 ); + } + + | singleton '?' + { + varlength = true; + $$ = mkopt( $1 ); + } + + | singleton BEGIN_REPEAT_FLEX NUMBER ',' NUMBER END_REPEAT_FLEX + { + 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 ); + } + } + + | singleton BEGIN_REPEAT_FLEX NUMBER ',' END_REPEAT_FLEX + { + varlength = true; + + if ( $3 <= 0 ) + { + synerr( _("iteration value must be positive") ); + $$ = $1; + } + + else + $$ = mkrep( $1, $3, INFINITE_REPEAT ); + } + + | 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 + * 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 ) ); + } + + | '.' + { + 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()) + $$ = mkstate( -cclany ); + else + $$ = mkstate( -ccldot ); + } + + | fullccl + { + /* Sort characters for fast searching. + */ + qsort( ccltbl + cclmap[$1], ccllen[$1], sizeof (*ccltbl), cclcmp ); + + if ( useecs ) + mkeccl( ccltbl + cclmap[$1], ccllen[$1], + nextecm, ecgroup, csize, csize ); + + ++rulelen; + + if (ccl_has_nl[$1]) + rule_has_nl[num_rules] = true; + + $$ = mkstate( -$1 ); + } + + | PREVCCL + { + ++rulelen; + + if (ccl_has_nl[$1]) + rule_has_nl[num_rules] = true; + + $$ = mkstate( -$1 ); + } + + | '"' string '"' + { $$ = $2; } + + | '(' re ')' + { $$ = $2; } + + | CHAR + { + ++rulelen; + + if ($1 == nlch) + rule_has_nl[num_rules] = true; + + 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 + ; + +braceccl: + + '[' ccl ']' { $$ = $2; } + + | '[' '^' ccl ']' + { + cclnegate( $3 ); + $$ = $3; + } + ; + +ccl : ccl CHAR '-' CHAR + { + + 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") ); + + else + { + for ( i = $2; i <= $4; ++i ) + ccladd( $1, i ); + + /* Keep track if this ccl is staying in + * alphabetical order. + */ + 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; + } + + | ccl CHAR + { + 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; + } + + | ccl ccl_expr + { + /* Too hard to properly maintain cclsorted. */ + cclsorted = false; + $$ = $1; + } + + | + { + cclsorted = true; + lastchar = 0; + currccl = $$ = cclinit(); + } + ; + +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 { + 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_NEG_EXPR(isupper); + } + ; + +string : string CHAR + { + if ( $2 == nlch ) + rule_has_nl[num_rules] = true; + + ++rulelen; + + if (sf_case_ins() && has_case($2)) + $$ = mkor (mkstate($2), mkstate(reverse_case($2))); + else + $$ = mkstate ($2); + + $$ = link_machines( $1, $$); + } + + | + { $$ = mkstate( SYM_EPSILON ); } + ; + +%% + + +/* build_eof_action - build the "<>" action for the active start + * conditions + */ + +void build_eof_action() + { + register int i; + char action_text[MAXLINE]; + + for ( i = 1; i <= scon_stk_ptr; ++i ) + { + if ( sceof[scon_stk[i]] ) + format_pinpoint_message( + "multiple <> 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/contrib/flex/regex.c b/contrib/flex/regex.c new file mode 100644 index 000000000000..e12cf6501819 --- /dev/null +++ b/contrib/flex/regex.c @@ -0,0 +1,172 @@ +/** 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/contrib/flex/scan.l b/contrib/flex/scan.l new file mode 100644 index 000000000000..1bcb09b42c33 --- /dev/null +++ b/contrib/flex/scan.l @@ -0,0 +1,1029 @@ +/* scan.l - scanner for flex input -*-C-*- */ + +%{ +/* Copyright (c) 1990 The Regents of the University of California. */ +/* All rights reserved. */ + +/* This code is derived from software contributed to Berkeley by */ +/* Vern Paxson. */ + +/* The United States Government has rights in this work pursuant */ +/* to contract no. DE-AC03-76SF00098 between the United States */ +/* Department of Energy and the University of California. */ + +/* This file is part of flex. */ + +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ + +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ + +/* Neither the name of the University nor the names of its contributors */ +/* may be used to endorse or promote products derived from this software */ +/* without specific prior written permission. */ + +/* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */ +/* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ +/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ +/* PURPOSE. */ + +#include "flexdef.h" +#include "parse.h" +extern bool tablesverify, tablesext; +extern int trlcontxt; /* Set in parse.y for each rule. */ +extern const char *escaped_qstart, *escaped_qend; + +#define ACTION_ECHO add_action( yytext ) +#define ACTION_IFDEF(def, should_define) \ + { \ + if ( should_define ) \ + action_define( def, 1 ); \ + } + +#define ACTION_ECHO_QSTART add_action (escaped_qstart) +#define ACTION_ECHO_QEND add_action (escaped_qend) + +#define ACTION_M4_IFDEF(def, should_define) \ + do{ \ + if ( should_define ) \ + buf_m4_define( &m4defs_buf, def, NULL);\ + else \ + buf_m4_undefine( &m4defs_buf, def);\ + } while(0) + +#define MARK_END_OF_PROLOG mark_prolog(); + +#define YY_DECL \ + int flexscan() + +#define RETURNCHAR \ + yylval = (unsigned char) yytext[0]; \ + return CHAR; + +#define RETURNNAME \ + if(yyleng < MAXLINE) \ + { \ + strcpy( nmstr, yytext ); \ + } \ + else \ + { \ + synerr(_("Input line too long\n")); \ + FLEX_EXIT(EXIT_FAILURE); \ + } \ + return NAME; + +#define PUT_BACK_STRING(str, start) \ + for ( i = strlen( str ) - 1; i >= start; --i ) \ + unput((str)[i]) + +#define CHECK_REJECT(str) \ + if ( all_upper( str ) ) \ + reject = true; + +#define CHECK_YYMORE(str) \ + if ( all_lower( str ) ) \ + yymore_used = true; + +#define YY_USER_INIT \ + if ( getenv("POSIXLY_CORRECT") ) \ + posix_compat = true; + +%} + +%option caseless nodefault stack noyy_top_state +%option nostdinit + +%x SECT2 SECT2PROLOG SECT3 CODEBLOCK PICKUPDEF SC CARETISBOL NUM QUOTE +%x FIRSTCCL CCL ACTION RECOVER COMMENT ACTION_STRING PERCENT_BRACE_ACTION +%x OPTION LINEDIR CODEBLOCK_MATCH_BRACE +%x GROUP_WITH_PARAMS +%x GROUP_MINUS_PARAMS +%x EXTENDED_COMMENT +%x COMMENT_DISCARD + +WS [[:blank:]]+ +OPTWS [[:blank:]]* +NOT_WS [^[:blank:]\r\n] + +NL \r?\n + +NAME ([[:alpha:]_][[:alnum:]_-]*) +NOT_NAME [^[:alpha:]_*\n]+ + +SCNAME {NAME} + +ESCSEQ (\\([^\n]|[0-7]{1,3}|x[[:xdigit:]]{1,2})) + +FIRST_CCL_CHAR ([^\\\n]|{ESCSEQ}) +CCL_CHAR ([^\\\n\]]|{ESCSEQ}) +CCL_EXPR ("[:"^?[[:alpha:]]+":]") + +LEXOPT [aceknopr] + +M4QSTART "[[" +M4QEND "]]" + +%% + static int bracelevel, didadef, indented_code; + static int doing_rule_action = false; + static int option_sense; + + int doing_codeblock = false; + int i, brace_depth=0, brace_start_line=0; + Char nmdef[MAXLINE]; + + +{ + ^{WS} indented_code = true; BEGIN(CODEBLOCK); + ^"/*" ACTION_ECHO; yy_push_state( COMMENT ); + ^#{OPTWS}line{WS} yy_push_state( LINEDIR ); + ^"%s"{NAME}? return SCDECL; + ^"%x"{NAME}? return XSCDECL; + ^"%{".*{NL} { + ++linenum; + line_directive_out( (FILE *) 0, 1 ); + indented_code = false; + BEGIN(CODEBLOCK); + } + ^"%top"[[:blank:]]*"{"[[:blank:]]*{NL} { + brace_start_line = linenum; + ++linenum; + buf_linedir( &top_buf, infilename?infilename:"", linenum); + brace_depth = 1; + yy_push_state(CODEBLOCK_MATCH_BRACE); + } + + ^"%top".* synerr( _("malformed '%top' directive") ); + + {WS} /* discard */ + + ^"%%".* { + sectnum = 2; + bracelevel = 0; + mark_defs1(); + line_directive_out( (FILE *) 0, 1 ); + BEGIN(SECT2PROLOG); + return SECTEND; + } + + ^"%pointer".*{NL} yytext_is_array = false; ++linenum; + ^"%array".*{NL} yytext_is_array = true; ++linenum; + + ^"%option" BEGIN(OPTION); return OPTION_OP; + + ^"%"{LEXOPT}{OPTWS}[[:digit:]]*{OPTWS}{NL} ++linenum; /* ignore */ + ^"%"{LEXOPT}{WS}.*{NL} ++linenum; /* ignore */ + + /* xgettext: no-c-format */ + ^"%"[^sxaceknopr{}].* synerr( _( "unrecognized '%' directive" ) ); + + ^{NAME} { + if(yyleng < MAXLINE) + { + strcpy( nmstr, yytext ); + } + else + { + synerr( _("Definition name too long\n")); + FLEX_EXIT(EXIT_FAILURE); + } + + didadef = false; + BEGIN(PICKUPDEF); + } + + {SCNAME} RETURNNAME; + ^{OPTWS}{NL} ++linenum; /* allows blank lines in section 1 */ + {OPTWS}{NL} ACTION_ECHO; ++linenum; /* maybe end of comment line */ +} + + +{ + "*/" ACTION_ECHO; yy_pop_state(); + "*" ACTION_ECHO; + {M4QSTART} ACTION_ECHO_QSTART; + {M4QEND} ACTION_ECHO_QEND; + [^*\n] ACTION_ECHO; + {NL} ++linenum; ACTION_ECHO; +} + +{ + /* This is the same as COMMENT, but is discarded rather than output. */ + "*/" yy_pop_state(); + "*" ; + [^*\n] ; + {NL} ++linenum; +} + +{ + ")" yy_pop_state(); + [^\n\)]+ ; + {NL} ++linenum; +} + +{ + \n yy_pop_state(); + [[:digit:]]+ linenum = myctoi( yytext ); + + \"[^"\n]*\" { + flex_free( (void *) infilename ); + infilename = copy_string( yytext + 1 ); + infilename[strlen( infilename ) - 1] = '\0'; + } + . /* ignore spurious characters */ +} + +{ + ^"%}".*{NL} ++linenum; BEGIN(INITIAL); + + {M4QSTART} ACTION_ECHO_QSTART; + {M4QEND} ACTION_ECHO_QEND; + . ACTION_ECHO; + + {NL} { + ++linenum; + ACTION_ECHO; + if ( indented_code ) + BEGIN(INITIAL); + } +} + +{ + "}" { + 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); + } + + <> { + linenum = brace_start_line; + synerr(_("Unmatched '{'")); + yyterminate(); + } +} + + +{ + {WS} /* separates name and definition */ + + {NOT_WS}[^\r\n]* { + if(yyleng < MAXLINE) + { + strcpy( (char *) nmdef, yytext ); + } + 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'); + --i ) + ; + + nmdef[i + 1] = '\0'; + + ndinstal( nmstr, nmdef ); + didadef = true; + } + + {NL} { + if ( ! didadef ) + synerr( _( "incomplete name definition" ) ); + BEGIN(INITIAL); + ++linenum; + } +} + + +