1 // Copyright (c) 2001-2010 Hartmut Kaiser
2 //
3 // Distributed under the Boost Software License, Version 1.0. (See accompanying
4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5
6 // The purpose of this example is to show how any character sequence can be
7 // printed while being properly quoted.
8
9 #include <boost/config/warning_disable.hpp>
10 #include <boost/spirit/include/karma.hpp>
11
12 namespace client
13 {
14 namespace karma = boost::spirit::karma;
15
16 template <typename OutputIterator>
17 struct escaped_string
18 : karma::grammar<OutputIterator, std::string(char const*)>
19 {
escaped_stringclient::escaped_string20 escaped_string()
21 : escaped_string::base_type(esc_str)
22 {
23 esc_char.add('\a', "\\a")('\b', "\\b")('\f', "\\f")('\n', "\\n")
24 ('\r', "\\r")('\t', "\\t")('\v', "\\v")('\\', "\\\\")
25 ('\'', "\\\'")('\"', "\\\"")
26 ;
27
28 esc_str = karma::lit(karma::_r1)
29 << *(esc_char | karma::print | "\\x" << karma::hex)
30 << karma::lit(karma::_r1)
31 ;
32 }
33
34 karma::rule<OutputIterator, std::string(char const*)> esc_str;
35 karma::symbols<char, char const*> esc_char;
36 };
37 }
38
39 ///////////////////////////////////////////////////////////////////////////////
main()40 int main()
41 {
42 namespace karma = boost::spirit::karma;
43
44 typedef std::back_insert_iterator<std::string> sink_type;
45
46 std::string generated;
47 sink_type sink(generated);
48
49 std::string str("string to escape: \n\r\t\"'\x19");
50 char const* quote = "'''";
51
52 client::escaped_string<sink_type> g;
53 if (!karma::generate(sink, g(quote), str))
54 {
55 std::cout << "-------------------------\n";
56 std::cout << "Generating failed\n";
57 std::cout << "-------------------------\n";
58 }
59 else
60 {
61 std::cout << "-------------------------\n";
62 std::cout << "Generated: " << generated << "\n";
63 std::cout << "-------------------------\n";
64 }
65 return 0;
66 }
67