| // 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; |
| } |