123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- // Copyright (c) 2001-2010 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)
- // The purpose of this example is to show how any character sequence can be
- // printed while being properly quoted.
- #include <boost/config/warning_disable.hpp>
- #include <boost/spirit/include/karma.hpp>
- namespace client
- {
- namespace karma = boost::spirit::karma;
- template <typename OutputIterator>
- struct escaped_string
- : karma::grammar<OutputIterator, std::string(char const*)>
- {
- escaped_string()
- : escaped_string::base_type(esc_str)
- {
- esc_char.add('\a', "\\a")('\b', "\\b")('\f', "\\f")('\n', "\\n")
- ('\r', "\\r")('\t', "\\t")('\v', "\\v")('\\', "\\\\")
- ('\'', "\\\'")('\"', "\\\"")
- ;
- esc_str = karma::lit(karma::_r1)
- << *(esc_char | karma::print | "\\x" << karma::hex)
- << karma::lit(karma::_r1)
- ;
- }
- karma::rule<OutputIterator, std::string(char const*)> esc_str;
- karma::symbols<char, char const*> esc_char;
- };
- }
- ///////////////////////////////////////////////////////////////////////////////
- int main()
- {
- namespace karma = boost::spirit::karma;
- typedef std::back_insert_iterator<std::string> sink_type;
- std::string generated;
- sink_type sink(generated);
- std::string str("string to escape: \n\r\t\"'\x19");
- char const* quote = "'''";
- client::escaped_string<sink_type> g;
- if (!karma::generate(sink, g(quote), str))
- {
- std::cout << "-------------------------\n";
- std::cout << "Generating failed\n";
- std::cout << "-------------------------\n";
- }
- else
- {
- std::cout << "-------------------------\n";
- std::cout << "Generated: " << generated << "\n";
- std::cout << "-------------------------\n";
- }
- return 0;
- }
|