escaped_string.cpp 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  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. // The purpose of this example is to show how any character sequence can be
  6. // printed while being properly quoted.
  7. #include <boost/config/warning_disable.hpp>
  8. #include <boost/spirit/include/karma.hpp>
  9. namespace client
  10. {
  11. namespace karma = boost::spirit::karma;
  12. template <typename OutputIterator>
  13. struct escaped_string
  14. : karma::grammar<OutputIterator, std::string(char const*)>
  15. {
  16. escaped_string()
  17. : escaped_string::base_type(esc_str)
  18. {
  19. esc_char.add('\a', "\\a")('\b', "\\b")('\f', "\\f")('\n', "\\n")
  20. ('\r', "\\r")('\t', "\\t")('\v', "\\v")('\\', "\\\\")
  21. ('\'', "\\\'")('\"', "\\\"")
  22. ;
  23. esc_str = karma::lit(karma::_r1)
  24. << *(esc_char | karma::print | "\\x" << karma::hex)
  25. << karma::lit(karma::_r1)
  26. ;
  27. }
  28. karma::rule<OutputIterator, std::string(char const*)> esc_str;
  29. karma::symbols<char, char const*> esc_char;
  30. };
  31. }
  32. ///////////////////////////////////////////////////////////////////////////////
  33. int main()
  34. {
  35. namespace karma = boost::spirit::karma;
  36. typedef std::back_insert_iterator<std::string> sink_type;
  37. std::string generated;
  38. sink_type sink(generated);
  39. std::string str("string to escape: \n\r\t\"'\x19");
  40. char const* quote = "'''";
  41. client::escaped_string<sink_type> g;
  42. if (!karma::generate(sink, g(quote), str))
  43. {
  44. std::cout << "-------------------------\n";
  45. std::cout << "Generating failed\n";
  46. std::cout << "-------------------------\n";
  47. }
  48. else
  49. {
  50. std::cout << "-------------------------\n";
  51. std::cout << "Generated: " << generated << "\n";
  52. std::cout << "-------------------------\n";
  53. }
  54. return 0;
  55. }