From 1eeae97a9c650421d056a8c249c29fe42244ccd8 Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Wed, 25 Mar 2020 21:38:42 +0300 Subject: Add peek_file() and peek_line() functions to argv_file_scanner --- cli/runtime-source.cxx | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) (limited to 'cli/runtime-source.cxx') diff --git a/cli/runtime-source.cxx b/cli/runtime-source.cxx index b836406..36d8968 100644 --- a/cli/runtime-source.cxx +++ b/cli/runtime-source.cxx @@ -365,6 +365,7 @@ generate_runtime_source (context& ctx, bool complete) << "//" << endl << "int argv_file_scanner::zero_argc_ = 0;" + << "std::string argv_file_scanner::empty_string_;" << endl << "bool argv_file_scanner::" << endl @@ -452,7 +453,25 @@ generate_runtime_source (context& ctx, bool complete) << "if (!more ())" << endl << "throw eos_reached ();" << endl - << "return args_.empty () ? base::peek () : args_.front ().c_str ();" + << "return args_.empty () ? base::peek () : args_.front ().value.c_str ();" + << "}" + + << "const std::string& argv_file_scanner::" << endl + << "peek_file ()" + << "{" + << "if (!more ())" << endl + << "throw eos_reached ();" + << endl + << "return args_.empty () ? empty_string_ : *args_.front ().file;" + << "}" + + << "std::size_t argv_file_scanner::" << endl + << "peek_line ()" + << "{" + << "if (!more ())" << endl + << "throw eos_reached ();" + << endl + << "return args_.empty () ? 0 : args_.front ().line;" << "}" << "const char* argv_file_scanner::" << endl @@ -465,7 +484,7 @@ generate_runtime_source (context& ctx, bool complete) << "return base::next ();" << "else" << "{" - << "hold_[i_ == 0 ? ++i_ : --i_].swap (args_.front ());" + << "hold_[i_ == 0 ? ++i_ : --i_].swap (args_.front ().value);" << "args_.pop_front ();" << "return hold_[i_].c_str ();" << "}" @@ -503,7 +522,12 @@ generate_runtime_source (context& ctx, bool complete) << "if (!is.is_open ())" << endl << "throw file_io_failure (file);" << endl - << "while (!is.eof ())" + << "files_.push_back (file);" + << endl + << "arg a;" + << "a.file = &*files_.rbegin ();" + << endl + << "for (a.line = 1; !is.eof (); ++a.line)" << "{" << "string line;" << "getline (is, line);" @@ -633,9 +657,11 @@ generate_runtime_source (context& ctx, bool complete) << endl << "continue;" << "}" - << "args_.push_back (s1);" + << "a.value = s1;" + << "args_.push_back (a);" << "}" - << "args_.push_back (s2);" + << "a.value = s2;" + << "args_.push_back (a);" << "}" // while << "}"; } -- cgit v1.1