From 720c5a33b6a49cf328fdd7611f49153cf8f60247 Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Wed, 8 Apr 2020 14:51:57 +0300 Subject: Separate tests and examples into individual packages Also make cli module to be explicitly enabled via the config.cli configuration variable. --- cli/cli/runtime-inline.cxx | 508 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 508 insertions(+) create mode 100644 cli/cli/runtime-inline.cxx (limited to 'cli/cli/runtime-inline.cxx') diff --git a/cli/cli/runtime-inline.cxx b/cli/cli/runtime-inline.cxx new file mode 100644 index 0000000..8f0e84c --- /dev/null +++ b/cli/cli/runtime-inline.cxx @@ -0,0 +1,508 @@ +// file : cli/runtime-inline.cxx +// author : Boris Kolpackov +// license : MIT; see accompanying LICENSE file + +#include + +using namespace std; + +void +generate_runtime_inline (context& ctx) +{ + ostream& os (ctx.os); + + os << "#include " << endl + << endl; + + string const& inl (ctx.inl); + string const& os_type (ctx.options.ostream_type ()); + + ctx.ns_open (ctx.cli); + + // usage_para + // + if (!ctx.options.suppress_usage ()) + os << "// usage_para" << endl + << "//" << endl + + << inl << "usage_para::" << endl + << "usage_para (value v)" << endl + << ": v_ (v)" + << "{" + << "}"; + + // unknown_mode + // + os << "// unknown_mode" << endl + << "//" << endl + + << inl << "unknown_mode::" << endl + << "unknown_mode (value v)" << endl + << ": v_ (v)" + << "{" + << "}"; + + // exception + // + os << "// exception" << endl + << "//" << endl + + << inl << os_type << "&" << endl + << "operator<< (" << os_type << "& os, const exception& e)" + << "{" + << "e.print (os);" + << "return os;" + << "}"; + + // unknown_option + // + os << "// unknown_option" << endl + << "//" << endl + + << inl << "unknown_option::" << endl + << "unknown_option (const std::string& option)" << endl + << ": option_ (option)" + << "{" + << "}" + + << inl << "const std::string& unknown_option::" << endl + << "option () const" + << "{" + << "return option_;" + << "}"; + + // unknown_argument + // + os << "// unknown_argument" << endl + << "//" << endl + + << inl << "unknown_argument::" << endl + << "unknown_argument (const std::string& argument)" << endl + << ": argument_ (argument)" + << "{" + << "}" + + << inl << "const std::string& unknown_argument::" << endl + << "argument () const" + << "{" + << "return argument_;" + << "}"; + + // missing_value + // + os << "// missing_value" << endl + << "//" << endl + + << inl << "missing_value::" << endl + << "missing_value (const std::string& option)" << endl + << ": option_ (option)" + << "{" + << "}" + + << inl << "const std::string& missing_value::" << endl + << "option () const" + << "{" + << "return option_;" + << "}"; + + // invalid_value + // + os << "// invalid_value" << endl + << "//" << endl + + << inl << "invalid_value::" << endl + << "invalid_value (const std::string& option," << endl + << "const std::string& value," << endl + << "const std::string& message)" << endl + << ": option_ (option)," << endl + << " value_ (value)," << endl + << " message_ (message)" + << "{" + << "}" + + << inl << "const std::string& invalid_value::" << endl + << "option () const" + << "{" + << "return option_;" + << "}" + + << inl << "const std::string& invalid_value::" << endl + << "value () const" + << "{" + << "return value_;" + << "}" + + << inl << "const std::string& invalid_value::" << endl + << "message () const" + << "{" + << "return message_;" + << "}"; + + if (ctx.options.generate_file_scanner ()) + { + // file_io_failure + // + os << "// file_io_failure" << endl + << "//" << endl + + << inl << "file_io_failure::" << endl + << "file_io_failure (const std::string& file)" << endl + << ": file_ (file)" + << "{" + << "}" + + << inl << "const std::string& file_io_failure::" << endl + << "file () const" + << "{" + << "return file_;" + << "}"; + + // unmatched_option + // + os << "// unmatched_quote" << endl + << "//" << endl + + << inl << "unmatched_quote::" << endl + << "unmatched_quote (const std::string& argument)" << endl + << ": argument_ (argument)" + << "{" + << "}" + + << inl << "const std::string& unmatched_quote::" << endl + << "argument () const" + << "{" + << "return argument_;" + << "}"; + } + + if (ctx.options.generate_group_scanner ()) + { + // unexpected_group + // + os << "// unexpected_group" << endl + << "//" << endl + + << inl << "unexpected_group::" << endl + << "unexpected_group (const std::string& argument," << endl + << "const std::string& group)" << endl + << ": argument_ (argument), group_ (group)" + << "{" + << "}" + + << inl << "const std::string& unexpected_group::" << endl + << "argument () const" + << "{" + << "return argument_;" + << "}" + + << inl << "const std::string& unexpected_group::" << endl + << "group () const" + << "{" + << "return group_;" + << "}"; + + // group_separator + // + os << "// group_separator" << endl + << "//" << endl + + << inl << "group_separator::" << endl + << "group_separator (const std::string& encountered," << endl + << "const std::string& expected)" << endl + << ": encountered_ (encountered), expected_ (expected)" + << "{" + << "}" + + << inl << "const std::string& group_separator::" << endl + << "encountered () const" + << "{" + << "return encountered_;" + << "}" + + << inl << "const std::string& group_separator::" << endl + << "expected () const" + << "{" + << "return expected_;" + << "}"; + } + + // argv_scanner + // + os << "// argv_scanner" << endl + << "//" << endl; + + os << inl << "argv_scanner::" << endl + << "argv_scanner (int& argc, char** argv, bool erase)" << endl + << ": i_ (1), argc_ (argc), argv_ (argv), erase_ (erase)" + << "{" + << "}"; + + os << inl << "argv_scanner::" << endl + << "argv_scanner (int start, int& argc, char** argv, bool erase)" << endl + << ": i_ (start), argc_ (argc), argv_ (argv), erase_ (erase)" + << "{" + << "}"; + + os << inl << "int argv_scanner::" << endl + << "end () const" + << "{" + << "return i_;" + << "}"; + + // vector_scanner + // + if (ctx.options.generate_vector_scanner ()) + { + os << "// vector_scanner" << endl + << "//" << endl; + + os << inl << "vector_scanner::" << endl + << "vector_scanner (const std::vector& v, " << + "std::size_t i)" << endl + << ": v_ (v), i_ (i)" + << "{" + << "}"; + + os << inl << "std::size_t vector_scanner::" << endl + << "end () const" + << "{" + << "return i_;" + << "}"; + + os << inl << "void vector_scanner::" << endl + << "reset (std::size_t i)" + << "{" + << "i_ = i;" + << "}"; + } + + // argv_file_scanner + // + if (ctx.options.generate_file_scanner ()) + { + bool sep (!ctx.opt_sep.empty ()); + + os << "// argv_file_scanner" << endl + << "//" << endl; + + os << inl << "argv_file_scanner::" << endl + << "argv_file_scanner (int& argc," << endl + << "char** argv," << endl + << "const std::string& option," << endl + << "bool erase)" << endl + << ": argv_scanner (argc, argv, erase)," << endl + << " option_ (option)," << endl + << " options_ (&option_info_)," << endl + << " options_count_ (1)," << endl + << " i_ (1)"; + if (sep) + os << "," << endl + << " skip_ (false)"; + os << "{" + << "option_info_.option = option_.c_str ();" + << "option_info_.search_func = 0;" + << "}"; + + os << inl << "argv_file_scanner::" << endl + << "argv_file_scanner (int start," << endl + << "int& argc," << endl + << "char** argv," << endl + << "const std::string& option," << endl + << "bool erase)" << endl + << ": argv_scanner (start, argc, argv, erase)," << endl + << " option_ (option)," << endl + << " options_ (&option_info_)," << endl + << " options_count_ (1)," << endl + << " i_ (1)"; + if (sep) + os << "," << endl + << " skip_ (false)"; + os << "{" + << "option_info_.option = option_.c_str ();" + << "option_info_.search_func = 0;" + << "}"; + + os << inl << "argv_file_scanner::" << endl + << "argv_file_scanner (const std::string& file," << endl + << "const std::string& option)" << endl + << ": argv_scanner (0, zero_argc_, 0)," << endl + << " option_ (option)," << endl + << " options_ (&option_info_)," << endl + << " options_count_ (1)," << endl + << " i_ (1)"; + if (sep) + os << "," << endl + << " skip_ (false)"; + os << "{" + << "option_info_.option = option_.c_str ();" + << "option_info_.search_func = 0;" + << endl + << "load (file);" + << "}"; + + os << inl << "argv_file_scanner::" << endl + << "argv_file_scanner (int& argc," << endl + << "char** argv," << endl + << "const option_info* options," << endl + << "std::size_t options_count," << endl + << "bool erase)" << endl + << ": argv_scanner (argc, argv, erase)," << endl + << " options_ (options)," << endl + << " options_count_ (options_count)," << endl + << " i_ (1)"; + if (sep) + os << "," << endl + << " skip_ (false)"; + os << "{" + << "}"; + + os << inl << "argv_file_scanner::" << endl + << "argv_file_scanner (int start," << endl + << "int& argc," << endl + << "char** argv," << endl + << "const option_info* options," << endl + << "std::size_t options_count," << endl + << "bool erase)" << endl + << ": argv_scanner (start, argc, argv, erase)," << endl + << " options_ (options)," << endl + << " options_count_ (options_count)," << endl + << " i_ (1)"; + if (sep) + os << "," << endl + << " skip_ (false)"; + os << "{" + << "}"; + + os << inl << "argv_file_scanner::" << endl + << "argv_file_scanner (const std::string& file," << endl + << "const option_info* options," << endl + << "std::size_t options_count)" << endl + << ": argv_scanner (0, zero_argc_, 0)," << endl + << " options_ (options)," << endl + << " options_count_ (options_count)," << endl + << " i_ (1)"; + if (sep) + os << "," << endl + << " skip_ (false)"; + os << "{" + << "load (file);" + << "}"; + } + + // group_scanner + // + if (ctx.options.generate_group_scanner ()) + { + os << "// group_scanner" << endl + << "//" << endl + + << inl << "group_scanner::" << endl + << "group_scanner (scanner& s)" << endl + << ": scan_ (s), state_ (skipped), i_ (1), group_scan_ (group_)" + << "{" + << "}" + + << inl << "scanner& group_scanner::" << endl + << "group ()" + << "{" + << "assert (state_ == scanned || state_ == skipped);" + << "return group_scan_;" + << "}" + + << inl << "const char* group_scanner::" << endl + << "escape (const char* a)" + << "{" + << "switch (sense (a))" + << "{" + << "case separator::none: break;" + << "case separator::open: return \"\\\\{\";" + << "case separator::close: return \"\\\\}\";" + << "case separator::open_plus: return \"\\\\+{\";" + << "case separator::close_plus: return \"\\\\}+\";" + << "}" + << "return a;" + << "}" + + << inl << "group_scanner::separator group_scanner::" << endl + << "sense (const char* s)" + << "{" + << "switch (s[0])" + << "{" + << "case '{': return s[1] == '\\0' ? open : none;" + << "case '}':" + << "{" + << "switch (s[1])" + << "{" + << "case '+': return s[2] == '\\0' ? close_plus : none;" + << "default: return s[1] == '\\0' ? close : none;" + << "}" + << "}" + << "case '+':" + << "{" + << "switch (s[1])" + << "{" + << "case '{': return s[2] == '\\0' ? open_plus : none;" + << "default: return none;" + << "}" + << "}" + << "}" + << "return none;" + << "}"; + } + + // Option description. + // + if (ctx.options.generate_description ()) + { + // option + // + os << inl << "const std::string& option::" << endl + << "name () const" + << "{" + << "return name_;" + << "}"; + + os << inl << "const option_names& option::" << endl + << "aliases () const" + << "{" + << "return aliases_;" + << "}"; + + os << inl << "bool option::" << endl + << "flag () const" + << "{" + << "return flag_;" + << "}"; + + os << inl << "const std::string& option::" << endl + << "default_value () const" + << "{" + << "return default_value_;" + << "}"; + + os << inl << "option::" << endl + << "option ()" + << "{" + << "}"; + + os << inl << "option::" << endl + << "option (const std::string& n," << endl + << "const option_names& a," << endl + << "bool f," << endl + << "const std::string& dv)" << endl + << ": name_ (n), aliases_ (a), flag_ (f), default_value_ (dv)" + << "{" + << "}"; + + // options + // + os << inl << "options::container_type::const_iterator options::" << endl + << "find (const std::string& name) const" + << "{" + << "map_type::const_iterator i (map_.find (name));" + << "return i != map_.end () ? begin () + i->second : end ();" + << "}"; + } + + ctx.ns_close (ctx.cli); +} -- cgit v1.1