wave.state
まだBoost.Waveで引っ張ります。
Boost.Waveのインタラクティブモードには状態の保存/復帰機能があります。
この機能はcpp.cppのBOOST_WAVE_SERIALIZATIONの値を1に変えてビルドすることで利用できるようになります。
ただし、コンパイルエラーとロード処理のバグがあったので少し手を加えました。
Index: cpplexer/cpp_lex_token.hpp =================================================================== --- cpplexer/cpp_lex_token.hpp (リビジョン 58616) +++ cpplexer/cpp_lex_token.hpp (作業コピー) @@ -280,6 +280,8 @@ template<typename Archive> void serialize(Archive &ar, const unsigned int version) { + if (!data) + data = new data_type(0); data->serialize(ar, version); } #endif Index: util/cpp_include_paths.hpp =================================================================== --- util/cpp_include_paths.hpp (リビジョン 58616) +++ util/cpp_include_paths.hpp (作業コピー) @@ -482,7 +482,7 @@ >::type map_type; boost::serialization::stl::load_collection< Archive, map_type, - boost::serialization::stl::archive_input_unique<Archive, map_type>, + boost::serialization::stl::archive_input_map<Archive, map_type>, boost::serialization::stl::no_reserve_imp<map_type> >(ar, t); }
状態を保存しておくファイルは「-s」オプションで指定します。
ファイル名が「-」なら、「wave.state」になります。
C:\Boost>wave.exe -s -
Wave: A Standard conformant C++ preprocessor based on the Boost.Wave library
Version: 2.0.3.2941 [Win32/Microsoft Visual C++ version 9.0] (20090602)
>>> #define HOGE 123
>>> ^ZC:\Boost>wave.exe -s -
Wave: A Standard conformant C++ preprocessor based on the Boost.Wave library
Version: 2.0.3.2941 [Win32/Microsoft Visual C++ version 9.0] (20090602)
>>> HOGE
123
>>> ^ZC:\Boost>
マクロの名前で分かるとおり、状態の保存にはBoost.Serializationが利用されています。
元ソースではアーカイブにXMLを利用していて遅いので、
BOOST_WAVE_BINARY_SERIALIZATIONを1に、BOOST_WAVE_XML_SERIALIZATIONを0に変えて、
バイナリフォーマットを使うようにした方がよいです。
また、Boost.Waveで使っている文字列がstringではないため、バイナリフォーマットの方が中を覗きやすかったりもします。
よく使うヘッダをインクルードしたwave.stateを用意しておくと便利かもしれません。