From 5661b404b0104c3065a40ad622bdd3c11d748a99 Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Thu, 20 Apr 2017 17:31:26 +0300 Subject: Implement string_parser --- tests/string-parser/driver.cxx | 93 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 tests/string-parser/driver.cxx (limited to 'tests/string-parser/driver.cxx') diff --git a/tests/string-parser/driver.cxx b/tests/string-parser/driver.cxx new file mode 100644 index 0000000..2aad3a7 --- /dev/null +++ b/tests/string-parser/driver.cxx @@ -0,0 +1,93 @@ +// file : tests/string-parser/driver.cxx -*- C++ -*- +// copyright : Copyright (c) 2014-2017 Code Synthesis Ltd +// license : MIT; see accompanying LICENSE file + +#include // ios::failbit, ios::badbit +#include +#include +#include +#include + +#include // operator<<(ostream,exception) +#include + +using namespace std; +using namespace butl; + +// Usage: argv[0] [-l] [-u] [-p] +// +// Read and parse lines into strings from STDIN and print them to STDOUT. +// +// -l output each string on a separate line +// -u unquote strings +// -p output positions +// +int +main (int argc, char* argv[]) +try +{ + bool spl (false); // Print string per line. + bool unquote (false); + bool pos (false); + + for (int i (1); i != argc; ++i) + { + string o (argv[i]); + + if (o == "-l") + spl = true; + else if (o == "-u") + unquote = true; + else if (o == "-p") + pos = true; + else + assert (false); + } + + // Do not throw when eofbit is set (end of stream reached), and when failbit + // is set (getline() failed to extract any character). + // + cin.exceptions (ios::badbit); + + cout.exceptions (ios::failbit | ios::badbit); + + string l; + while (getline (cin, l)) + { + vector> v ( + string_parser::parse_quoted_position (l, unquote)); + + if (!spl) + { + for (auto b (v.cbegin ()), i (b), e (v.cend ()); i != e; ++i) + { + if (i != b) + cout << ' '; + + if (pos) + cout << i->second << ":"; + + cout << i->first; + } + + cout << endl; + } + else + { + for (const auto& s: v) + { + if (pos) + cout << s.second << ":"; + + cout << s.first << endl; + } + } + } + + return 0; +} +catch (const invalid_string& e) +{ + cerr << e.position << ": " << e << endl; + return 1; +} -- cgit v1.1