• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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