// 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 #include namespace client { namespace karma = boost::spirit::karma; template struct escaped_string : karma::grammar { 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 esc_str; karma::symbols esc_char; }; } /////////////////////////////////////////////////////////////////////////////// int main() { namespace karma = boost::spirit::karma; typedef std::back_insert_iterator 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 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; }