// file : tests/buildfile-scanner/driver.cxx -*- C++ -*- // license : MIT; see accompanying LICENSE file #include // ios_base::failbit, ios_base::badbit #include #include #include #include // operator<<(ostream,exception) #include #include #undef NDEBUG #include using namespace std; using namespace butl; using namespace bpkg; // Usages: // // argv[0] (-e|-l []|-b) // // Read and scan the buildfile from stdin and print the scan result to stdout. // // -e scan evaluation context // -l [] scan single line, optionally terminated with the stop character // -b scan buildfile block // int main (int argc, char* argv[]) { assert (argc >= 2); string mode (argv[1]); cin.exceptions (ios_base::failbit | ios_base::badbit); cout.exceptions (ios_base::failbit | ios_base::badbit); using scanner = char_scanner; scanner s (cin); string bsn ("stdin"); buildfile_scanner bs (s, bsn); try { string r; if (mode == "-e") { scanner::xchar c (s.get ()); assert (c == '('); r += c; r += bs.scan_eval (); c = s.get (); assert (c == ')'); r += c; } else if (mode == "-l") { char stop ('\0'); if (argc == 3) { const char* chr (argv[2]); assert (chr[0] != '\0' && chr[1] == '\0'); stop = chr[0]; } r += bs.scan_line (stop); scanner::xchar c (s.get ()); assert (scanner::eos (c) || c == '\n' || (stop != '\0' && c == stop)); } else if (mode == "-b") { scanner::xchar c (s.get ()); assert (c == '{'); r += c; r += bs.scan_block (); assert (scanner::eos (s.peek ())); r += "}\n"; } else assert (false); cout << r; } catch (const buildfile_scanning& e) { cerr << e << endl; return 1; } return 0; }