diff --git a/include/boost/wave/grammars/cpp_chlit_grammar.hpp b/include/boost/wave/grammars/cpp_chlit_grammar.hpp index ade9921..41debce 100644 --- a/include/boost/wave/grammars/cpp_chlit_grammar.hpp +++ b/include/boost/wave/grammars/cpp_chlit_grammar.hpp @@ -54,17 +54,32 @@ namespace impl { /////////////////////////////////////////////////////////////////////////////// struct compose_character_literal { - template + template struct result { typedef unsigned int type; }; unsigned int - operator()(unsigned int res, unsigned int character) const + operator()(unsigned int& value, bool long_lit, unsigned int character) const { - unsigned int retval = (res << 8) | (character & 0xff); - return retval; + if (long_lit) { + unsigned int mask = 0; + for (int i = 0; i < sizeof(wchar_t); ++i) { + value <<= 8; + mask = (mask << 8) | 0xff; + } + value |= character & mask; + } + else { + unsigned int mask = 0; + for (int i = 0; i < sizeof(char); ++i) { + value <<= 8; + mask = (mask << 8) | 0xff; + } + value |= character & mask; + } + return value; } }; phoenix::function const compose; @@ -118,82 +133,82 @@ struct chlit_grammar : ch_p('\\') >> ( ch_p('a') // BEL [ - self.value = impl::compose(self.value, val(0x07)) + impl::compose(self.value, self.long_lit, val(0x07)) ] | ch_p('b') // BS [ - self.value = impl::compose(self.value, val(0x08)) + impl::compose(self.value, self.long_lit, val(0x08)) ] | ch_p('t') // HT [ - self.value = impl::compose(self.value, val(0x09)) + impl::compose(self.value, self.long_lit, val(0x09)) ] | ch_p('n') // NL [ - self.value = impl::compose(self.value, val(0x0a)) + impl::compose(self.value, self.long_lit, val(0x0a)) ] | ch_p('v') // VT [ - self.value = impl::compose(self.value, val(0x0b)) + impl::compose(self.value, self.long_lit, val(0x0b)) ] | ch_p('f') // FF [ - self.value = impl::compose(self.value, val(0x0c)) + impl::compose(self.value, self.long_lit, val(0x0c)) ] | ch_p('r') // CR [ - self.value = impl::compose(self.value, val(0x0d)) + impl::compose(self.value, self.long_lit, val(0x0d)) ] | ch_p('?') [ - self.value = impl::compose(self.value, val('?')) + impl::compose(self.value, self.long_lit, val('?')) ] | ch_p('\'') [ - self.value = impl::compose(self.value, val('\'')) + impl::compose(self.value, self.long_lit, val('\'')) ] | ch_p('\"') [ - self.value = impl::compose(self.value, val('\"')) + impl::compose(self.value, self.long_lit, val('\"')) ] | ch_p('\\') [ - self.value = impl::compose(self.value, val('\\')) + impl::compose(self.value, self.long_lit, val('\\')) ] | ch_p('x') >> if_p(self.long_lit) [ hex_wchar_parser_type() [ - self.value = impl::compose(self.value, arg1) + impl::compose(self.value, self.long_lit, arg1) ] ] .else_p [ hex_char_parser_type() [ - self.value = impl::compose(self.value, arg1) + impl::compose(self.value, self.long_lit, arg1) ] ] | ch_p('u') >> uint_parser() [ - self.value = impl::compose(self.value, arg1) + impl::compose(self.value, self.long_lit, arg1) ] | ch_p('U') >> uint_parser() [ - self.value = impl::compose(self.value, arg1) + impl::compose(self.value, self.long_lit, arg1) ] | uint_parser() [ - self.value = impl::compose(self.value, arg1) + impl::compose(self.value, self.long_lit, arg1) ] ) ) | ~eps_p(ch_p('\'')) >> anychar_p [ - self.value = impl::compose(self.value, arg1) + impl::compose(self.value, self.long_lit, arg1) ] ) >> ch_p('\'') diff --git a/test/testwave/testwave_app.cpp b/test/testwave/testwave_app.cpp index 6f52efa..e1f1217 100644 --- a/test/testwave/testwave_app.cpp +++ b/test/testwave/testwave_app.cpp @@ -270,8 +270,16 @@ testwave_app::test_a_file(std::string filename) if (debuglevel > 2) { std::cerr << filename << ": failed" << std::endl - << "result: " << std::endl << result << std::endl - << "expected error: " << std::endl << expected << std::endl; + << "result: " << std::endl << result << std::endl; + + if (!error.empty()) { + std::cerr << "expected result: " << std::endl + << expected << std::endl; + } + if (!expected_error.empty()) { + std::cerr << "expected error: " << std::endl + << expected_error << std::endl; + } } else if (debuglevel > 1) { std::cerr << filename << ": failed" << std::endl;