diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 18:24:20 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 18:24:20 +0000 |
commit | 483eb2f56657e8e7f419ab1a4fab8dce9ade8609 (patch) | |
tree | e5d88d25d870d5dedacb6bbdbe2a966086a0a5cf /src/boost/libs/spirit/example/qi/unescaped_string.cpp | |
parent | Initial commit. (diff) | |
download | ceph-upstream.tar.xz ceph-upstream.zip |
Adding upstream version 14.2.21.upstream/14.2.21upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/boost/libs/spirit/example/qi/unescaped_string.cpp')
-rw-r--r-- | src/boost/libs/spirit/example/qi/unescaped_string.cpp | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/src/boost/libs/spirit/example/qi/unescaped_string.cpp b/src/boost/libs/spirit/example/qi/unescaped_string.cpp new file mode 100644 index 00000000..4a0d6002 --- /dev/null +++ b/src/boost/libs/spirit/example/qi/unescaped_string.cpp @@ -0,0 +1,72 @@ +// Copyright (c) 2010 Jeroen Habraken +// +// 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) + +#include <boost/spirit/include/qi.hpp> + +#include <iostream> +#include <ostream> +#include <string> + +namespace client +{ + namespace qi = boost::spirit::qi; + + template <typename InputIterator> + struct unescaped_string + : qi::grammar<InputIterator, std::string(char const*)> + { + unescaped_string() + : unescaped_string::base_type(unesc_str) + { + unesc_char.add("\\a", '\a')("\\b", '\b')("\\f", '\f')("\\n", '\n') + ("\\r", '\r')("\\t", '\t')("\\v", '\v')("\\\\", '\\') + ("\\\'", '\'')("\\\"", '\"') + ; + + unesc_str = qi::lit(qi::_r1) + >> *(unesc_char | qi::alnum | "\\x" >> qi::hex) + >> qi::lit(qi::_r1) + ; + } + + qi::rule<InputIterator, std::string(char const*)> unesc_str; + qi::symbols<char const, char const> unesc_char; + }; + +} + +/////////////////////////////////////////////////////////////////////////////// +// Main program +/////////////////////////////////////////////////////////////////////////////// +int main() +{ + namespace qi = boost::spirit::qi; + + typedef std::string::const_iterator iterator_type; + + std::string parsed; + + std::string str("'''string\\x20to\\x20unescape\\x3a\\x20\\n\\r\\t\\\"\\'\\x41'''"); + char const* quote = "'''"; + + iterator_type iter = str.begin(); + iterator_type end = str.end(); + + client::unescaped_string<iterator_type> p; + if (!qi::parse(iter, end, p(quote), parsed)) + { + std::cout << "-------------------------\n"; + std::cout << "Parsing failed\n"; + std::cout << "-------------------------\n"; + } + else + { + std::cout << "-------------------------\n"; + std::cout << "Parsed: " << parsed << "\n"; + std::cout << "-------------------------\n"; + } + + return 0; +} |