diff options
Diffstat (limited to 'tests/string-parser/driver.cxx')
-rw-r--r-- | tests/string-parser/driver.cxx | 93 |
1 files changed, 93 insertions, 0 deletions
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> // ios::failbit, ios::badbit +#include <vector> +#include <string> +#include <cassert> +#include <iostream> + +#include <butl/utility> // operator<<(ostream,exception) +#include <butl/string-parser> + +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<pair<string, size_t>> 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; +} |