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