flex NEWS

* Noteworthy changes in release  ?.? (????-??-??) [?]

** build

*** Flex now includes its own <config.h> header before including
    system headers so that any system specific features detected by
    configure are taken into account during compilation of flex
    itself.

*** The flex build system now includes Makefile targets at the top
    level to allow just building and installing libfl.

*** The flex distribution now includes a file, src/libfl.pc, to allow
    using pkgconfig to find out what flags to use when building
    against libfl from flex.

*** Various edge cases, mostly involving out-of-tree builds have been
    accounted for in the autotools build system.

*** A crash during building on NetBSD has been fixed.

*** Flex is now automatically built by travis-ci. That should increase
    the visibility of bugs and help prevent regressions.

** documentation

*** new bg, eo, ka, pt, uk translations from the translation project

** scanner

*** Some memory leaks have been fixed.

*** A long standing bug that effected expressions of the form c{i,j}
    where 'c' is a character and {i,j} describes the number of times
    to match against 'c' when case sensitivity was turned on has been
    fixed.

*** New option: --backup-file allows setting the name of the file
    written containing backing up information. Useful if you need
    backing up information from multiple scanners in the same
    directory.

*** flex emits correct line number directives when line numbers refer
    to the file containing the line number directives.

*** The options {no,}yy{get,set}_column are now supported.

** test

*** Generating the various tableoptions make rules is now more portable.

*** Tests of the options -C*f and -C*F will now run correctly on
    filesystems that are not case sensitive.

* Noteworthy changes in release 2.6.4 (2017-05-06) [stable]

** build

*** The indent target now knows about flex's new (as of 2.6.0)
    layout. The indent rules it would apply are not correct and do
    need to be fixed.

*** The files included in the flex distribution are now built by the
    version of flex that is included in the distribution.

*** The configure script has a better idea of which headers are
    required to build flex. It will also error when missing functions
    are detected.

*** We have lowered the versions of automake and gettext that
    configure.ac lists as required for building flex. In autogen.sh,
    we now check for how to call libtoolize and use what we find in
    the rest of the script.

*** Since files in lib/ are picked up as needed by src/, we no longer
    generate a Makefile for that directory.

*** Flex can be cross compiled.

** documentation

*** Some typos were removed from the manual.

** scanner

*** Some minor performance enhancements.

*** We honor user defined yy_* macros again. We are also more careful
    to not leak macro definitions into header files.

*** A number of portability fixes were introduced so building flex is
    more reliable on more platforms. Additionally, outdated function
    calls were removed.

*** When building the flex executable itself, %# comments from
    flex.skl are removed when generating the C source code array. This
    reduces the size of flex.

** test suite

*** All scripts in the test suite are now run by $(SHELL) and the
    needed portability fixes have been included.

*** Test suite dependencies are handled much better. This only matters
    if you are actively developing flex or its test suite.

*** Tests that depend on platform dependent features now properly skip
    when those platforms are not present.

*** When running "make check", you can now pas V=0 to silence more of
    the build. This is useful when you're less concerned about the
    details of building and linking the test programs themselves.

* Noteworthy changes in release 2.6.3 (2016-12-30) [stable]

** scanner

*** several bug fixes resolved problems introduced in recent flex
    versions regarding processing of comments, literals and various
    quoting scenarios.

*** If the path to m4 was sufficiently long, a buffer overflow could
    occur. This has been resolved. The fix also removes dependence on
    the constant PATH_MAX.

** build

*** A new configure option --disable-bootstrap changes the behavior of
    the build system when building flex. The default
    "--enable-bootstrap" behavior is to build flex, then to use that
    flex to build flex again. With --disable-bootstrap, the scanner is
    simply built by sedding the scanner source. This is friendlier to
    cross compilation.

*** The compatibility functions in lib/ are no longer built as a
    library. Instead, they are built as $(LIBOBJ) objects. This is
    simpler and friendlier to cross compilation.

*** It is now possible to build flex without building the accompanying
    libfl. This is friendlier to cross compilation. See the
    --disable-libfl option to configure. Resolves #99.

*** the PIC version of libfl was not correctly built. It is no longer
    included in the build/installation targets of flex since it was
    unused.

*** the distributed man page is only rebuilt when the relevant source
    files change or when the binary doesn't exist. In particular, this
    is friendlier to cross compilation. Resolves #108

** test

*** the shell scripts in the test suite are more portable across different shell implementations.

* version 2.6.2 released 2016-10-24

** flex internals

*** a segfault involving yyrestart(NULL) has been fixed

*** flex should now handle quoting when mixed with m4 processing correctly

*** flex handles `[[' and `]]' correctly

*** flex no longer generates non-ANSI code

*** more compilation warnings were squashed in generated scanners

*** prevented a buffer overflow that could occur when input buffers were the exact wrong size

** test suite

*** input filenames on MSWindows are now calculated correctly

*** general code cleanups in a number of tests now make the test suite compile much more cleanly

** build system

*** the xz archive has been replaced with an lzip archive

*** a new option to configure --enable-warnings to encapsulate passing
    of warning-related flags which is useful in testing flex

*** make indent now works for out of source builds

*** Portability warnings when generating Makefile.in files are now suppressed; they were just noise and the use of GNU extensions in Makefile.{am,in,} was intentional and well known.

** bugs

*** resolved gh#67

** new sv translation from the translation project

* version 2.6.1 released 2016-03-01

** flex resources

*** The flex project is now hosted at github. Consider this a "period of transition". In particular, you should start at https://github.com/westes/flex for the flex codebase, issue tracking and pull requests.

*** New releases of flex are to be found at https://github.com/westes/flex/releases.

** flex internals

*** Flex now uses more modern and more standard names for variable types. There's more work to be done on that front yet, though.

*** A number of compiler warnings have been remedied.

*** Line directives should now  work as expected and be absent when that is expected.

** test suite

*** When running the test suite, c++ files are compiled with the c++ header inside the flex distribution, rather than relying on the build system's flex header , which might not be installed yet or which might be out of date with respect to what flex tests expect.

*** Some portability fixes in the test suite such as opening files for reading in binary mode

** Building flex

*** The file src/scan.c asdistributed  with flex source is now built with the current version of flex. Occasionally this had to be done manually to pick up new flex features. It's now just a part of flex's build system.

*** The pdf version of the manual is no longer distributed with flex, although if you have the texinfo package installed, you can still build it.

*** lots of general build system cleanup

*** the build system tries a bit harder to find libtoolize and texi2dvi.

*** When help2man and texi2dvi are missing, the error messages are now much more helpful.

** bug fixes

*** resolved github issues #53, #54, #55, #61.

*** Resolved sf bugs #128, #129, #155, #160, #184, #187, #195.

* version 2.6.0 released 2015-11-17

** User Visible Changes

*** C++ scanners now use references instead of pointers. See the manual for details.

*** A number of compiler warnings were addressed, so flex generated scanners should be quieter under compiler warning scenarios.

*** Allow error reporting routines to accept varying number of arguments

*** Removed deprecated 'register' storage class specifier

*** Changed output formats from octal to hexadecimal

*** check limits before using array index cclp; resolves sf-166

*** Suppress clang warning about empty @param paragraph; resolves sf#158

*** Fixed malloc/realloc replacement, resolves sf bug#151.

*** Adjusted buffer sizes on ia64.

*** various documentation and code clean up fixes: resolves sf bugs #167, #168, among other patches.

** Flex Internals

*** flex is now organized into subdirectories. This keeps the tree neater at the top level and puts like things near each other and unlike things away from each other.

*** The test suite has been reorganized and is now run with the parallel test suite harness from automake.

*** Cleaned up the automake parts of the build system to better reflect what automake does on its own. Also added a call to libtoolize in autogen.sh because autoreconf gets confused without a prior run of libtoolize.

*** po/Makefile now includes a rule to fetch the latest translations from the translation project. "make -f po/Makefile getpo" from the top level of the flex tree will fetch the files.

*** New da translation from the translation project

* flex version  2.5.39 released 2014-03-26

** no user visible changes in this release

* version 2.5.38 released 2014-02-14

** internationalization

*** add sr translation from the translation project

*** update da, es, ko, nl, pt_BR, ro, ru, sv, tr, vi, zh_CN translations from the translation project

*** rename zh_tw to its proper zh_TW name

* version 2.5.37 released 2012-08-03

** Import flex into git. See
   git://flex.git.sourceforge.net/gitroot/flex/flex.

** Fix make install target to not fail when the flex++ program is
   already installed

** New translations from the translation project: de, fi, pl, vi

* version 2.5.36 released 2012-07-20

** various portability fixes that quiet compiler warnings on 64-bit
   hosts

** various manual fixes, including correcting the name of a %option and
   updating some simple examples to use ANSI C syntax

** various bug fixes that prevent certain error conditions from
   persisting when they should not persist

** improvements to the test suite so it behaves better when linking
   compiled files

** new translations from the translation project: ca, da, es, fi, fr,
   ga, ko, pt_br, ro, ru, sv, tr, zh_cn

** the flex distribution is now built with automake 1.10.1 and automake
   2.61

* version 2.5.35 released 2008-02-26

** fixed bug that prevented flex from accepting certain comments in the
  scanner file (resolves bugs #1849809 and #1849805)

** fix bug that prevented headers for all functions from being generated
  (resolves bug #1628314)

** change yy_size_t to be size_t (resolves bug #1849812)

** new de, nl, pl, pt_br, vi translations from the translation project

* version 2.5.34 released 2007-12-12

** introduce yylex_init_extra; see the manual for details

** introduce %option extra-type="your_type *" (resolves bug #1744505)

** The flex program now parses multiple short concatenated options (resolves bug
  #1619820). Thanks to Petr Machata of Red Hat on this issue.

** better checking after yyalloc/yyrealloc (resolves bug #1595967)

** flex now provides for a libfl_pic.a compiled with position
   independent code. Particularly useful when including a flex scanner
   in a shared library and with more recent versions of gcc. Thanks to the Debian project for the idea.

** SourceForge feature request #1658379: Expose YY_BUF_SIZE in the
	header file.

** flex better escapes filenames with special characters in them
   (resolves bug #1623600)

** a memory leak was plugged(resolves bug #1601111)

** pattern language expanded; see the manual for details on the below
   highlights

*** pattern options added to specify patterns as case-insensitive or
    case-sensitive

*** pattern options to specify whether the "." character should match
    the newline character

*** pattern options added to allow ignoring of whitespace in patterns

*** POSIX character classes may be negated in patterns

*** patterns may now use set difference, union operators

** the manual now contains an appendix listing various common patterns
   which may be useful when writing scanners

** some memory leaks were removed from the C++ scanner (but the C++
  scanner is still experimental and may change radically without
  notice)

** c++ scanners can now use yywrap

** added new unit test for c++ and yywrap

** portability fixes to some unit tests

** flex man page and flex manual in pdf now distributed in the flex
distribution

** new ca, vi, ga, nl translations from the translation project

** flex no longer comes with an rpm spec file

** flex development now happens with automake 1.9.6

* version 2.5.33 released 2006-2-20

** all flex resources are now to be found from the website at
   http://flex.sourceforge.net/

** there was no release 2.5.32 published

** numerous bug and security fixes

** new nl, vi, sv, ro, po, ga, ca, fr, tr translations from the translation project

** upgrade to use gettext 0.12 (this now makes the "pdf" and "ps"
   targets in the build system able to be run successfully)

* version 2.5.31 released 2003-4-1

** remove --enable-maintainer-mode configure option; none of the
   Makefiles were using it and it can be unduly confusing

* version 2.5.30 released 2003-4-1

** yylineno is per-buffer in reentrant scanners

** added %top directive for placing code at the top of the generated
   scanner; see manual for details

** flex now uses m4 to generate scanners; while this means that
   scanners are more readable, it means that flex requires m4 to be
   installed; see manual for details

* version 2.5.29 released 2003-3-5

** Automatic stack management for multiple input buffers in C and C++ scanners

** moved the flex documentation to a new doc/ subdirectory

** cleanups to the yy namespace

* version 2.5.28 released 2003-2-12

** flex is now hosted at sourceforge

** Fixed trailing slash bug in YY_INPUT macro def

** Flex now warns if always-interactive is specified with fast or full

* version 2.5.27 released 2003-1-21

** flex now works with recent bison versions

** new pt_br translation from the translation project

* version 2.5.26 released 2003-1-14

** Fixed table deserialization bug on big-endian archs. Patch sent from Bryce Nichols <bryce@bnichols.org>

** yyleng has proper declarations now; this caused flex to generate
   unusable scanners for some programs

** the flex distribution now includes a spec file suitable for use
   with rpm

** some more c++ fixes

** new es translation from the translation project

** slight tweaks to the flex_int*_t types

** flex now warns about pattern ranges that might be ambiguous when
   generating a case-insensitive scanner


* version 2.5.25 released 2002-12-2

** flex now uses flex_int*_t types. For C99 systems, they are just the
   int*_t types; for non-C99 systems, we just make some typedefs

** new pt_br translation from the translation project

* version 2.5.24 released 2002-11-25

* more portability fixes

** the manual continues to be updated and edited, but it's still got a
   ways to go

** it is possible to have multiple c++ scanners in the same program again

** new turkish translation from the translation project

* version 2.5.23 released 2002-10-21

** more portability fixes

** the manual includes a title page and a table-of-contents when printed

** the test suite can be run with "make check" from the top-level
   directory

** configure now accepts the --enable-maintainer-mode option

** gettext functionality is now only available externally

** the constant FLEX_BETA is defined if flex is a beta release

** the script create-test was not included in the distribution and it
   should have been

* version 2.5.22 released 2002-10-10

** more portability fixes around how we get ahold of the integral
   types; there is a constant FLEX_NEED_INTEGRAL_TYPE_DEFINITIONS
   which you should define if you don't have the <inttypes.h> header
   file (after you complain to your C vendor for not providing a
   reasonable C environment)

** more test suite cleanups; in particular, the test suite should run
   correctly when build from a different directory

** upgraded automake to 1.7 and consequently autoconf to 2.54; this
   means, among other things, that there is some support for
formatting the manual in postscript and pdf in the distributed
   Makefile.in (and therefore in the Makefile built by configure)

** the flex.1 manpage is generated by help2man; (this has been true
   for quite a while but was not listed here)

** flex now includes three defined constants to indicate which version
  of flex generated a scanner (YY_FLEX_{MAJOR,MINOR,SUBMINOR}_VERSION)

** flex tries its best to output only the relevant portions of the
   skeleton when generating a scanner, thus avoiding as much
   conditional compilation as possible

* version 2.5.21 released 2002-9-17

** one of the tests in the test suite broke the dist target

* version 2.5.20 released 2002-9-16

** A flex scanner has the ability to save the DFA tables to a file,
   and load them at runtime when needed; see the manual for details

** Added %option bison-bridge (--bison-bridge)

** Removed %option reentrant-bison/--reentrant-bison/-Rb

** yylineno is present in all scanners; Modified nasty performance
   penalty warning with yylineno in documentation

** test-table-opts is now run last in the test suite because it's so fat

** flex can, to some extent, diagnose where internal problems occur

** new translations from the translation project: fr, ca, de, ru, sv

**Flex generates C99 defs now; see YY_TRADITIONAL_FUNC_DEFS in the
  manual if that's not a good thing for you

* version 2.5.19 released 2002-9-5

** prevent segfault on input lines which are longer than the allocated
   space (problem report from Manoj Srivastava
   <srivasta@golden-gryphon.com>)

** Changed option 'header' to 'header-file'

* version 2.5.18 released 2002-9-4

** portability fixes for integer constants and in the way the test
   suite reports its results

** the test for bison was reporting bison missing when it was, in
   fact, found

** if we don't find GNU indent, we're more careful when we're not
   finding it

* version 2.5.17 released 2002-8-29

** more portability fixes

** updated config.sub and config.guess

** flex is indented by GNU indent (this was done earlier but not
   explicitly documented)

* version 2.5.16 released 2002-8-28

** c++ scanners compile again

** there is now an indent target in the top-level Makefile; configure
   checks for GNU indent which is required for proper operation of the
   indent target

** some more portability fixes were made

** %options and invocation sections of manual merged

** a c++ test was added to the test suite

** we're trying to clean up more files in the test suite's make clean
   targets

* version 2.5.15 released 2002-8-21

** reject-state buffer is now dynamically allocated and REJECT buffer
   variables are reentrant-safe

** manual now discusses memory usage

** skeleton now processed by m4 before mkskel.sh; (this only matters
   if you want to change the skeleton or if you're doing flex development)

** zh_cn translation added from translation project

** a bug that caused a segfault has now been fixed

** the test suite now respects the usual CFLAGS, etc. variables

** removed some warnings which some tests triggered with the -s option

** the flex-generated header file now tries to be smarter about
   conditionally including start conditions

** tables code omitted from generated scanner when not used

* version 2.5.14 released 2002-8-15

** the tests using the reentrant c scanner as c++ were reworked
   slightly to be sure that the c++ was enforced

** de translation now included in the distribution

** various portability fixes regarding nls support, c++ include
   headers, etc.

* version 2.5.13 released 2002-8-15

** the header file output with %option header is now much smaller

** Fixed type mismatch in printf in scanner skeleton

** yylex_init now reports errors

* version 2.5.12 released 2002-8-8

** updated gettext support to 0.11.5

** new fr translation from the translation project

** bison is no longer needed to build flex; If you are building flex
   from a release (i.e., not from a cvs snapshot), then you don't need
   to have a pre-built lex around either (unless you modify scan.l, of
   course); (This has been true for some time, but was not mentioned
   here.)

* version 2.5.11 released 2002-7-31

** Fixed bug where yyless did not consider yylineno

** the yylineno performance hit is now gone

** fixed some typos in the manual and we now include texinfo.tex in
   the distribution

** traditional prototypes output for C scanners, controlled by a
   preprocessor symbol; see documentation for details

* version 2.5.10 released 2002-7-24

** yy_globals renamed to yyscanner and yy_globals_t renamed to
   yy_guts_t

** added dist-bzip2 option to Makefile.am so we now produce a bzip2'd
   archive in addition to the standard gzip archive

*  version 2.5.9

** new tests in test suite: test-mem-{nr,r}, test-posix,
   test-posixly-correct, test-debug-{nr,r}

** made changes to work with gcc-3.2 development code

** ability to choose which memory functions are used in flex

** new yylex_destroy() function for the non-reentrant scanner

** new handling of POSIXLY_CORRECT environment variable

** the test suite now has its copyrights explicitly described

** new ca, de, fr, ru, sv, tr translations

* version 2.5.8

** a new --posix option generates scanners with posix-style abc{1,3}
   compatible parsing, see manual for the screwy details

* version 2.5.7

** configure.in now includes a call to AC_PREREQ to enforce the
   requirement for autoconf at least 2.50 (This only effects you if
   you're doing flex development.)

** configure now uses autoconf's versioning information and configure
   --help reports the bug-reporting address for flex

** test suite now only reports success versus failure; reporting
   skipped is problematic under the current setup

** compilation with --disable-nls now works

** flex can now be built in a separate directory

* version 2.5.6

** gettext support added (from gettext 0.11)

*** translations for ca, da, de, es, fr, ko, ru, sv, tr included

** distribution now built under automake 1.6 and autoconf 2.53

** command-line option parsing happens differently now:

*** Added long option parsing

*** Options -n and -c, previously deprecated, now simply do nothing

*** Options are now parsed left to right

** added a number of new options

*** All positive %options are now accessible from the command line

*** Added option -D, to define a preprocessor symbol

*** Added option --header=FILE to specify a C .h file to generate

*** added option --yywrap to call yywrap on EOF

*** added option --yylineno to track line count in yylineno

*** --yyclass=NAME name of C++ class when generating c++ scanners

*** for long option names which are associated with existing short
options, see accompanying documentation

*** new %option nounistd or command-line --nounistd added to prevent
    flex from generating #include <unistd.h> on systems that don't
    have that include file

** Support for reentrant C scanners has been added

*** Updated the manual with the new reentrant API

*** Two new options %option reentrant (-R) and
%option reentrant-bison (-Rb)

*** All globals optionally placed into struct yyglobals_t

*** All access to globals replaced by macro invocations

*** All functions optionally take one additional
argument, yy_globals

*** New style for invoking reentrant scanner:
yylex_init(void** scanner );
yylex( scanner );
yylex_destroy( scanner );

*** Added get/set functions for members of struct yy_globals_t
e.g.,  yyget_text, yyget_leng, etc

*** Prefix substitution added for new functions

*** Macro shortcuts to the lengthy get/set functions
provided for use in actions, e.g.,  yytext, yyleng, etc

*** Arbitrary, user-defined data, "yyextra", may be added to scanner

** %option nomain no longer implies %option yywrap
But the inverse is still true

** Developer test suite added

*** TESTS/ directory has been added. Users can
'make test' in the TESTS directory to execute the test suite

** Support for bison variables yylval and yylloc added

** automake support for the build process

** manual is now in texinfo/info format

*** flex.1 removed from distribution

** flex no longer generates C-language scanners with C++-style
   comments

** flex now generates scanners in c++ which are compatible with
   recent c++ compilers

** flex input scanner now recognizes '\r' as an EOL character

See the file ONEWS for changes in earlier releases.

See the file COPYING for copying conditions.

Local Variables:
mode: text
mode: outline-minor
end:
