From d53c8a6ce3d868da66d97a9243365e88d0879343 Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Fri, 31 Mar 2017 23:29:49 +0300 Subject: Add tab_parser --- tests/tab-parser/buildfile | 7 +++++ tests/tab-parser/driver.cxx | 67 +++++++++++++++++++++++++++++++++++++++++++++ tests/tab-parser/testscript | 49 +++++++++++++++++++++++++++++++++ 3 files changed, 123 insertions(+) create mode 100644 tests/tab-parser/buildfile create mode 100644 tests/tab-parser/driver.cxx create mode 100644 tests/tab-parser/testscript (limited to 'tests/tab-parser') diff --git a/tests/tab-parser/buildfile b/tests/tab-parser/buildfile new file mode 100644 index 0000000..4afb691 --- /dev/null +++ b/tests/tab-parser/buildfile @@ -0,0 +1,7 @@ +# file : tests/tab-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/tab-parser/driver.cxx b/tests/tab-parser/driver.cxx new file mode 100644 index 0000000..8b0cc4d --- /dev/null +++ b/tests/tab-parser/driver.cxx @@ -0,0 +1,67 @@ +// file : tests/tab-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 // operator<<(ostream,exception) +#include + +using namespace std; +using namespace butl; + +// Usage: argv[0] [-l] +// +// Read and parse tab-file from STDIN and print fields to STDOUT. +// +// -l output each field on a separate line +// +int +main (int argc, char* argv[]) +try +{ + assert (argc <= 2); + bool fpl (false); // Print field per line. + + if (argc == 2) + { + assert (argv[1] == string ("-l")); + fpl = true; + } + + cin.exceptions (ios::failbit | ios::badbit); + cout.exceptions (ios::failbit | ios::badbit); + + tab_fields tl; + tab_parser parser (cin, "cin"); + + while (!(tl = parser.next ()).empty ()) + { + if (!fpl) + { + for (auto b (tl.cbegin ()), i (b), e (tl.cend ()); i != e; ++i) + { + if (i != b) + cout << ' '; + + cout << i->value; + } + + cout << '\n'; + } + else + { + for (const auto& tf: tl) + cout << tf.value << '\n'; + } + } + + return 0; +} +catch (const tab_parsing& e) +{ + cerr << e << endl; + return 1; +} diff --git a/tests/tab-parser/testscript b/tests/tab-parser/testscript new file mode 100644 index 0000000..1b0a816 --- /dev/null +++ b/tests/tab-parser/testscript @@ -0,0 +1,49 @@ +# file : tests/tab-parser/testscript +# copyright : Copyright (c) 2014-2017 Code Synthesis Ltd +# license : MIT; see accompanying LICENSE file + +: valid +: +: Roundtrip tab-files. +: +{ + : newline-term + : + $* <>EOF + abc + def xyz + fff + EOF + + : eos-term + : + $* <:'abc' >'abc' + + : empty-lines + : + $* <'def' + # abc + + # abc + def + + EOI + + : quoting + : + $* -l <>EOO + def k" l'"'m n"' xyz + EOI + def + k" l'"'m n"' + xyz + EOO +} + +: invalid +: +{ + : unterm-quoting + : + $* <'ab"c' 2>'cin:1:5: error: unterminated quoted string' == 1 +} -- cgit v1.1