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/buildfile | 7 ++++ tests/string-parser/driver.cxx | 93 ++++++++++++++++++++++++++++++++++++++++++ tests/string-parser/testscript | 42 +++++++++++++++++++ 3 files changed, 142 insertions(+) create mode 100644 tests/string-parser/buildfile create mode 100644 tests/string-parser/driver.cxx create mode 100644 tests/string-parser/testscript (limited to 'tests/string-parser') diff --git a/tests/string-parser/buildfile b/tests/string-parser/buildfile new file mode 100644 index 0000000..9ccf480 --- /dev/null +++ b/tests/string-parser/buildfile @@ -0,0 +1,7 @@ +# file : tests/string-parser/buildfile +# copyright : Copyright (c) 2014-2017 Code Synthesis Ltd +# license : MIT; see accompanying LICENSE file + +exe{driver}: cxx{driver} ../../butl/lib{butl} test{testscript} + +include ../../butl/ 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; +} diff --git a/tests/string-parser/testscript b/tests/string-parser/testscript new file mode 100644 index 0000000..83c8346 --- /dev/null +++ b/tests/string-parser/testscript @@ -0,0 +1,42 @@ +# file : tests/string-parser/testscript +# copyright : Copyright (c) 2014-2017 Code Synthesis Ltd +# license : MIT; see accompanying LICENSE file + +: valid +: +{ + test.options += -l + sp=' ' # For line-terminating spaces. + + : quoted + : + { + $* -p <<"EOI" >>EOO + abc "d 'ef " 'x "y z'$sp + EOI + 0:abc + 5:"d 'ef " + 14:'x "y z' + EOO + } + + : unquoted + : + { + $* -u <<"EOI" >>"EOO" + abc "d 'ef " 'x "y z'$sp + EOI + abc + d 'ef$sp + x "y z + EOO + } +} + +: invalid +: +{ + : unterm-quoting + : + $* <'ab"c' 2>'4: unterminated quoted string' == 1 +} -- cgit v1.1