Boost.Wave: A Standard compliant C++ preprocessor library
Copyright (c) 2001-2005 Hartmut Kaiser. Distributed under the Boost
Software License, Version 1.0. (See accompanying file
LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
TODO (known issues):
- Fix expansion of macros, which replacement-list terminates in a partial
- Fix the re2c lexer for iterators others then string::iterator (or more
generally for iterators, which aren't random access iterators)
- Try to remove the second parameter from the pp_iterator<>::force_include
- Fix the trigraph backslash problem in the re2c (C/C++ and IDL) scanners, if
there is the end of the (internal) buffer just in between a '??/' and a '\n'.
- Do a sourceforge release.
- Version 1.2.1
- Fixed bug reported as Sourceforge bug 1274584.
- Switched to Re2C V0.9.9.
- Fixed a bug where the 'parameters' and 'definition' parameters to the
defined_macro callback of the preprocessing hooks were always empty (thanks
to Stefan Seefeld for reporting).
- Fixed missing namespace specifiers in token definition macros (thanks to
Jozsef Mihalicza for reporting).
- Enabled --preserved and --long_long modes by default for the cpp_tokens
- Newline tokens reported a wrong line number (offset by one) when using the
Re2C generated lexer (thanks to Jozsef Mihalicza for pointing this out).
- Changed file positions to carry 'unsigned int' line and column numbers.
- Fixed tokens of a generated #line directive to carry the correct column
- Tokens now contain the correct filename, line and column numbers even if
a #line directive was encountered.
- Fixed wrong line numbering in reference comments of the tests t_5_002.cpp and
- Made sure, that preprocessor expression errors get ignored for 'passive'
- Fixed an issue reported by the gcc debug stl.
- Added the <vc-7_1-stlport><*><rtti>off directive to all of the V1 Jamfiles.
Wed Aug 17 20:21:00 CST 2005
- Fixed name clash wrt T_DIVIDE on FreeBSD.
- Fixed documentation of the different language_support flags.
- The support for long long suffixes is no longer bound to the variadics mode,
it has to be enabled by the new long_long mode (default in C99).
- Fixed compilation if BOOST_WAVE_DUMP_PARSE_TREE is defined.
- Fixed lexer error message wrt long_long mode.
- Stefan Seefeld fixed a bug in the lexer, where include_next was assumed for
includeed files containg a "include_" in their name.
- Fixed some trigraph token id's in the lexers.
- Added column information to the re2c generated lexer.
- Added tests for the different lexers.
- Fixed the found_include_directive preprocessing hook to carry the information
about #include_next directives as well.
- Separated the different lexer tests.
- Fixed a bug in the whitespace eater.
- Fixed a bug where Wave emitted the found C++ comments in --preserve mode even
if these were found inside of disabled #if/#endif blocks.
- Removed the function local static grammars to avoid possible raise conditions
and to make CW8.3 happy.
- Unified lexer interface, adjusted namespaces.
- Added lexer testcases to the regression tests.
- Fixed test cases to scale to 64 bit platforms.
- Disabled the MS specific extensions in the lexer tests in a platform related
- Added special handling of the eof tokens inside the lexer iterator classes
- Applied a workaround proposed by David Abrahams to make the slex lexer work
on the CodeWarrior platforms.
Sun May 8 17:22:59 WEDT 2005
- Added ill_formed_character_literal and ill_formed_integer_literal errors.
- Improved error handling and diagnostics for integer overflow in #if/#elif
- Fixed a bug in the testwave application which prevented the correct
recognition of expected errors under certain circumstances.
- Fixed a portability problem (for gcc 3.3.x) in the testwave application.
- Enforced that #if/#endif are balanced file wise.
- Changed the command line arguments for the Wave testrun to use absolute
- Changed the test application to return a value != zero if one of the given
config files were not found.
- Fixed a command line parsing problem caused by a change in the parameter
handling inside in the program_options library.
- Switched to the most recent version of re2c (V0.9.7.dev).
- Fixed a como compilation error and several como --a warnings.
- The T_EOF token doesn't carry the value of the previous token anymore.
- Added operator==() to the token classes to fix the ambiguity error reported
by the True64 compiler.
- Improved the error message, when empty arguments are used in pure C++ mode.
- Added character literal out of range testing and an additional corresponding
- Fixed parsing of long character literals (such as '\x1234').
- Fixed almost all problems diagnosed by the Boost inspection report.
- Several fixes to make the True64 compiler happy.
- Added the long long suffix handling to the C99 mode (LL/ll).
- Fixed a bug in the slex regex specifications.
Thu Apr 7 10:07:45 WEDT 2005
- Fixed a bug in the white space eating component, which prevented a C++
comment to be suppressed if it followed after another whitespace.
- Fixed the inconsistencies between the documentation and the behaviour wrt the
different include search paths. See the Wave driver docs for details of how
the '-I', '-I-', and '-S' options work.
- Allowed to specify more than one config file ('@' syntax) on the command line
of the wave driver executable.
- Changed copyrights in all files to reflect the acceptance of Wave into Boost.
- Unknown preprocessing directives were not recognised as such anymore.
- If comments shouldn't be preserved all C++ comments are replaced by newline
tokens (instead of beeing igored completely).
- Fixed a bug in the white space eater component.
- Fixed a bug which reported wrong line numbers for error encountered during
- Fixed a bug in the unescaping code.
- Fixed a compilation error of the testwave executable (added a missing
- Added a missing header to make cpp.re.cpp compile on CW.
- The predefined macro __BASE_FILE__ now returns a properly escaped file name
- Fixed the function boost::wave::util::impl::unescape_lit().
- Added the Wave unit test framework. For now it contains about 60 unit tests
executed by a special test driver (testwave).
- Added the '$F' replacement string to the testwave application. This allows
to handle file paths sensitive comparison of the expected and real results.
- Fixed a minor problem in the whitespace eating component.
- Added optional trigraph conversion.
- Changed all size_t, time_t etc. to std::size_t, std::time_t etc (for CW).
- If the comments should not be preserved every C comment containing at minimum
one newline is now converted to a newline token.
- Added the lexed_tokens sample.
- Fixed warnings and errors reported by the CodeWarrior compiler.
- Added the '$V' replacement string to the testwave application. It expands to
the current BOOST_LIB_VERSION.
- Diagnosed the attempt to redefine the alternative operators as and, or etc.
- Improved error handling.
- Disabled the flex_string class for VC7, enabled to fallback to std::string
for this compiler.
- Renamed files to comply with the Boost rules.
- Added the first part of the MCPP validation suite to the Wave unit tests.
- Added even more missing "using namespace std;" staements for functions from
the C runtime library. The Wave test suite now contains more than 100 unit
- Added the $P/$P(basename) replacement string to the testwave application
which expands to the full path of the current file ($P) or to the current
- Fixed a bunch of portability problmes revealed by the regression tests on
different platforms. Thanks to Stefan Slapeda for his support to make it work
on the cw-9_4 toolset (win32).
Tue Mar 22 14:52:45 WEST 2005
- Fixed a bug where the complete set of C99 predefined macros were pre-defined
when in C++ mode and variadics were enabled.
- When in variadics or C99 mode the __BASE_FILE__ predefined macro expanded to
- Added the --listincludes option to the Wave driver executable which allows to
log the file names of the include files opened.
- Fixed a gcc warning in token_cache.hpp (unused variable end).
- Changed the logic behind #include_next. It now starts searching with the
next directory after the directory the current file (the file containing the
#include_next directive) is located in.
- Changed the signature of the undefined_macro preprocessing hook to take the
token itself and not the macro name only. This is important to pass the full
context information about the position of the #undef directive to the
user provided hook (thanks to Stefan Seefeld for pointing that out).
- Fixed several broken links in the Context Policy topic.
- Fixed a bug in the handling of the #include_next directive inside of
non-evaluated #if blocks.
- Fixed a bug in the #include_next handling code (thanks to Stefan Seefeld).
- Changed the signature of the opened_include_file() preprocessing hook which
now receives not only the absolute file name of the openend include file but
additionally gets passed the (possibly) relative path of the openend include
file. This concrete format of the relative path depends on the format of the
include search directory given to the library.
- Added a new preprocessing hook 'found_include_directive()' which gets called
for every #include directive (even for those where the file to include
doesn't exist) and which gets passed the (expanded) token sequence found
after the #include directive token.
- The file names passed to the preprocessing hooks are now normalised.
- Changed the opened_include_file() preprocessing hook to receive the correct
relative path even if the included file was found in the current directory.
- Fixed a bug which reported 'defined(or)' as invalid (similarly all the other
alternative bit operation token types).
- Fixed a bug which prevented to define variadic macros from the command line.
- Added a 'preserve comments' mode to preserve the comments in the input stream
not inserted into macro definitions.
- Added a new --preserve (-p) command line switch to the wave driver
application to allow comments to be preserved in the generated output stream.
Mon Feb 21 09:30:04 WEST 2005
Version 1.1.14 (Fixes in response to the Boost review)
Wave was accepted into Boost!
With special thanks to Tom Brinkman, who volunteered to be the review manager.
With thanks to David Abrahams, Beman Dewes, Reece Dunn, Larry Evans,
Doug Gregor, Joel de Guzman, Baptiste Lepilleur, Andy Little, Paul Mensonides,
Dan Nuffer, Andreas Pokorny, Vladimir Prus, Gennadiy Rozental, Michiel Salters,
Jonathan Turkanis, Chris Uzdavinis, Pavel Vozenilek, Michael Walter for bug
reports, fixes and hints.
- Added support for the MS extensions #region and #endregion, which simply get
ignored by Wave. The support for these is enabled only, when the pp constant
BOOST_WAVE_SUPPORT_MS_EXTENSIONS is defined. Otherwise these get flagged as
an illegal preprocessor directive (as before).
- Fixed a problem, where the replacement text for a #pragma directive got lost
if this directive was on the last line of a processed (include-)file.
- Changed the default value for BOOST_WAVE_SUPPORT_MS_EXTENSIONS for non-
Windows systems to zero.
- Updated outdated external links in the documentation.
- Fixed certain grammatical and stylistic quirks in the documentation.
- Fixed a problem in libs/wave/build/Jamfile.v2 (as reported by Larry Evans).
Fixed the Jamfile.v2 in the samples directories accordingly.
- Added the '<toolset>vc-7_1:<rtti>off' to all Jamfile.v2 files to adjust for
the internal buffer overflow bug in the VC7.1 compiler (reported by Joel de
- Changed the '<toolset>vc-7_1:<rtti>off' to '<toolset>vc-7.1:<rtti>off' as
required by the Boost.Build.v2 library (suggested by Vladimir Prus).
- Finally fixed the Jamfile.v2 file (after a suggestion from Reece Dunn)
- Fixed the column number reported for tokens for Slex lexer based
configurations (reported by Baptiste Lepilleur).
- Added the __BASE_FILE__ predefined macro, which contains a string literal
of the main file name to preprocess (the one the context<> template was
created with). (suggested by Pavel Vozenilek)
- Used the boost::reverse_iterator instead of the std::reverse_iterator
for the flex_string class to allow compilation of Wave with VC7.0
(as suggested by Reece Dunn).
- Fixed a problem in the include_path template, which throwed a
boost::filesystem exception whenever a character was used in a file name
to include, which is marked as illegal by the default name checker of the
Version 1.1.13 (Boost review candidate 2, bug fixed version)
- Fixed a problem, where the context<> template referenced temporary iterator
objects from the underlying stream (thanks to Michiel Salters for reporting
- Fixed a bug in the re2c lexer, which allowed to dereference the end iterator
of the underlying input stream (thanks to Doug Gregor for pointing this out).
- Fixed several assertions fired by the iterator checking code of the VC8 stl.
Version 1.1.12 (Boost review candidate)
- A rough performance analysis showed, that 30% of the time is spent parsing
the input for pp directives (cpp_grammar), 35% of the time is spent inside
the flex_string code, mainly in the copy constructor and assignment
operator, 15% of the time is spent inside the list and vector member
functions, 10% is spent for memory allocation but only 1% of the time is
spent in the re2c lexer.
- Identified a performance problem, where the token_cache was instantiated
for every created lexer object, but needed to be initialised only once.
- Added #include <wave_version.hpp> to wave_config.hpp
- Fixed problems reported by the gcc 3.4.1 compiler.
- Adjusted Jamfiles for the new toolset names introduced in Boost V1.32.
- Updated copyrights.
- Fixed some bugs introduced by the latest refactoring.
- Tried to fix the expansion of macros, which replacement-list terminates in a
partial macro expansion. No success so far.
- Refactored some of the macro map (macro namespace) code (added comments,
splitted into separate files),
- Fixed some typename errors in cpp_macromap.hpp (thanks to Vladimir Prus).
- Fixed the BoostBuild V2 Jamfiles (thanks to Vladimir Prus).
- Moved all of the #pragma wave option(value) operators out of the wavelib into
the wave driver program. Removed enable_trace() and trace_flags() policy
functions. Renamed trace_policy into context_policy.
- Added the defined_macro() and undefined_macro() preprocessing hooks to allow
easily to build macro cross referencers and such.
- Replaced the usage of the string::erase() and string::insert() functions,
which were the only non-const string member functions used.
- Token pasting is now well defined in variadics mode (was in C++0x mode only).
- Changed the timing code in the wave driver to include the parsing of
files included by the --forceinclude command line switch.
- Performance measurements (very informal) [sec], the files are some of the
preprocessor specific test cases from Paul Mensonides chaos_pp library.
std::string flex_string const_string const_string
12 Byte 28 Byte
arithmetic.cpp 2.543 1.742 0.951 1.001
array.cpp 2.453 1.762 0.951 1.011
comparison.cpp 0.560 0.340 0.270 0.280
control.cpp 0.590 0.340 0.290 0.300
debug.cpp 0.370 0.310 0.190 0.190
detection.cpp 0.050 0.060 0.030 0.030
extended.cpp 0.370 0.260 0.190 0.190
facilities.cpp 0.610 0.340 0.290 0.300
iteration.cpp 1.081 0.550 0.410 0.450
list.cpp 1.742 1.141 0.811 0.851
logical.cpp 0.070 0.200 0.040 0.040
punctuation.cpp 0.030 0.080 0.020 0.020
repetition.cpp 1.392 0.851 0.650 0.690
selection.cpp 0.440 0.270 0.210 0.220
slot.cpp 0.680 0.350 0.240 0.270
tuple.cpp 0.420 0.240 0.190 0.210
Wed Aug 25 13:23:27 WEDT 2004
- Branched for Boost Release.
- Removed several features from the code base:
. removed C++0x support
. removed TST support
- Fixed the program_option validator syntax, which has changed since the last
- Removed misleading configuration options from the cpp_config.hpp file,
because the application will have to use the same config options as were used
during the compilation of the library.
- Changed the naming convention of typedef'd types in the library. Removed the
_t suffix, wherever possible.
- Updated the documentation to reflect the removal of the C++0x features.
- Changed the licensing scheme to:
// Copyright 2004 Joe Coder. Distributed under the Boost
// Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt