diff options
Diffstat (limited to 'cli/cli/runtime-header.cxx')
-rw-r--r-- | cli/cli/runtime-header.cxx | 173 |
1 files changed, 111 insertions, 62 deletions
diff --git a/cli/cli/runtime-header.cxx b/cli/cli/runtime-header.cxx index adf70dd..1003e91 100644 --- a/cli/cli/runtime-header.cxx +++ b/cli/cli/runtime-header.cxx @@ -43,10 +43,13 @@ generate_runtime_header (context& ctx) ctx.ns_open (ctx.cli); + string const& exp (ctx.exp); + string const& exp_inl (ctx.exp_inl); + // usage_para // if (!ctx.options.suppress_usage ()) - os << "class usage_para" + os << "class " << exp_inl << "usage_para" << "{" << "public:" << endl << "enum value" @@ -64,7 +67,7 @@ generate_runtime_header (context& ctx) // unknown_mode // - os << "class unknown_mode" + os << "class " << exp_inl << "unknown_mode" << "{" << "public:" << endl << "enum value" @@ -85,26 +88,30 @@ generate_runtime_header (context& ctx) string const& os_type (ctx.options.ostream_type ()); + const char* nothrow (ctx.options.std () < cxx_version::cxx11 + ? "throw ()" + : "noexcept"); + os << "// Exceptions." << endl << "//" << endl << endl; - os << "class exception: public std::exception" + os << "class " << exp << "exception: public std::exception" << "{" << "public:" << endl << "virtual void" << endl << "print (" << os_type << "&) const = 0;" << "};"; - os << os_type << "&" << endl + os << exp_inl << os_type << "&" << endl << "operator<< (" << os_type << "&, const exception&);" << endl; - os << "class unknown_option: public exception" + os << "class " << exp << "unknown_option: public exception" << "{" << "public:" << endl << "virtual" << endl - << "~unknown_option () throw ();" + << "~unknown_option () " << nothrow << ';' << endl << "unknown_option (const std::string& option);" << endl @@ -115,17 +122,17 @@ generate_runtime_header (context& ctx) << "print (" << os_type << "&) const;" << endl << "virtual const char*" << endl - << "what () const throw ();" + << "what () const " << nothrow << ';' << endl << "private:" << endl << "std::string option_;" << "};"; - os << "class unknown_argument: public exception" + os << "class " << exp << "unknown_argument: public exception" << "{" << "public:" << endl << "virtual" << endl - << "~unknown_argument () throw ();" + << "~unknown_argument () " << nothrow << ';' << endl << "unknown_argument (const std::string& argument);" << endl @@ -136,17 +143,17 @@ generate_runtime_header (context& ctx) << "print (" << os_type << "&) const;" << endl << "virtual const char*" << endl - << "what () const throw ();" + << "what () const " << nothrow << ';' << endl << "private:" << endl << "std::string argument_;" << "};"; - os << "class missing_value: public exception" + os << "class " << exp << "missing_value: public exception" << "{" << "public:" << endl << "virtual" << endl - << "~missing_value () throw ();" + << "~missing_value () " << nothrow << ';' << endl << "missing_value (const std::string& option);" << endl @@ -157,17 +164,17 @@ generate_runtime_header (context& ctx) << "print (" << os_type << "&) const;" << endl << "virtual const char*" << endl - << "what () const throw ();" + << "what () const " << nothrow << ';' << endl << "private:" << endl << "std::string option_;" << "};"; - os << "class invalid_value: public exception" + os << "class " << exp << "invalid_value: public exception" << "{" << "public:" << endl << "virtual" << endl - << "~invalid_value () throw ();" + << "~invalid_value () " << nothrow << ';' << endl << "invalid_value (const std::string& option," << endl << "const std::string& value," << endl @@ -186,7 +193,7 @@ generate_runtime_header (context& ctx) << "print (" << os_type << "&) const;" << endl << "virtual const char*" << endl - << "what () const throw ();" + << "what () const " << nothrow << ';' << endl << "private:" << endl << "std::string option_;" @@ -194,23 +201,23 @@ generate_runtime_header (context& ctx) << "std::string message_;" << "};"; - os << "class eos_reached: public exception" + os << "class " << exp << "eos_reached: public exception" << "{" << "public:" << endl << "virtual void" << endl << "print (" << os_type << "&) const;" << endl << "virtual const char*" << endl - << "what () const throw ();" + << "what () const " << nothrow << ';' << "};"; if (ctx.options.generate_file_scanner ()) { - os << "class file_io_failure: public exception" + os << "class " << exp << "file_io_failure: public exception" << "{" << "public:" << endl << "virtual" << endl - << "~file_io_failure () throw ();" + << "~file_io_failure () " << nothrow << ';' << endl << "file_io_failure (const std::string& file);" << endl @@ -221,17 +228,17 @@ generate_runtime_header (context& ctx) << "print (" << os_type << "&) const;" << endl << "virtual const char*" << endl - << "what () const throw ();" + << "what () const " << nothrow << ';' << endl << "private:" << endl << "std::string file_;" << "};"; - os << "class unmatched_quote: public exception" + os << "class " << exp << "unmatched_quote: public exception" << "{" << "public:" << endl << "virtual" << endl - << "~unmatched_quote () throw ();" + << "~unmatched_quote () " << nothrow << ';' << endl << "unmatched_quote (const std::string& argument);" << endl @@ -242,7 +249,7 @@ generate_runtime_header (context& ctx) << "print (" << os_type << "&) const;" << endl << "virtual const char*" << endl - << "what () const throw ();" + << "what () const " << nothrow << ';' << endl << "private:" << endl << "std::string argument_;" @@ -251,11 +258,11 @@ generate_runtime_header (context& ctx) if (ctx.options.generate_group_scanner ()) { - os << "class unexpected_group: public exception" + os << "class " << exp << "unexpected_group: public exception" << "{" << "public:" << endl << "virtual" << endl - << "~unexpected_group () throw ();" + << "~unexpected_group () " << nothrow << ';' << endl << "unexpected_group (const std::string& argument," << endl << "const std::string& group);" @@ -270,18 +277,18 @@ generate_runtime_header (context& ctx) << "print (std::ostream&) const;" << endl << "virtual const char*" << endl - << "what () const throw ();" + << "what () const " << nothrow << ';' << endl << "private:" << endl << "std::string argument_;" << "std::string group_;" << "};"; - os << "class group_separator: public exception" << endl + os << "class " << exp << "group_separator: public exception" << endl << "{" << "public:" << endl << "virtual" << endl - << "~group_separator () throw ();" + << "~group_separator () " << nothrow << ';' << endl << "// Note: either (but not both) can be empty." << endl << "//" << endl @@ -298,7 +305,7 @@ generate_runtime_header (context& ctx) << "print (std::ostream&) const;" << endl << "virtual const char*" << endl - << "what () const throw ();" + << "what () const " << nothrow << ';' << endl << "private:" << endl << "std::string encountered_;" @@ -308,13 +315,21 @@ generate_runtime_header (context& ctx) // scanner // - os << "// Command line argument scanner interface." << endl - << "//" << endl - << "// The values returned by next() are guaranteed to be valid" << endl - << "// for the two previous arguments up until a call to a third" << endl - << "// peek() or next()." << endl - << "//" << endl - << "class scanner" + os << "// Command line argument scanner interface." << endl + << "//" << endl + << "// The values returned by next() are guaranteed to be valid" << endl + << "// for the two previous arguments up until a call to a third" << endl + << "// peek() or next()." << endl + << "//" << endl + << "// The position() function returns a monotonically-increasing" << endl + << "// number which, if stored, can later be used to determine the"<< endl + << "// relative position of the argument returned by the following"<< endl + << "// call to next(). Note that if multiple scanners are used to" << endl + << "// extract arguments from multiple sources, then the end" << endl + << "// position of the previous scanner should be used as the" << endl + << "// start position of the next." << endl + << "//" << endl + << "class " << exp << "scanner" << "{" << "public:" << endl << "virtual" << endl @@ -331,15 +346,26 @@ generate_runtime_header (context& ctx) << endl << "virtual void" << endl << "skip () = 0;" + << endl + << "virtual std::size_t" << endl + << "position () = 0;" << "};"; // argv_scanner // - os << "class argv_scanner: public scanner" + os << "class " << exp << "argv_scanner: public scanner" << "{" << "public:" << endl - << "argv_scanner (int& argc, char** argv, bool erase = false);" - << "argv_scanner (int start, int& argc, char** argv, bool erase = false);" + << "argv_scanner (int& argc," << endl + << "char** argv," << endl + << "bool erase = false," << endl + << "std::size_t start_position = 0);" + << endl + << "argv_scanner (int start," << endl + << "int& argc," << endl + << "char** argv," << endl + << "bool erase = false," << endl + << "std::size_t start_position = 0);" << endl << "int" << endl << "end () const;" @@ -356,7 +382,11 @@ generate_runtime_header (context& ctx) << "virtual void" << endl << "skip ();" << endl - << "private:" << endl + << "virtual std::size_t" << endl + << "position ();" + << endl + << "protected:" << endl + << "std::size_t start_position_;" << "int i_;" << "int& argc_;" << "char** argv_;" @@ -367,17 +397,18 @@ generate_runtime_header (context& ctx) // if (ctx.options.generate_vector_scanner ()) { - os << "class vector_scanner: public scanner" + os << "class " << exp << "vector_scanner: public scanner" << "{" << "public:" << endl - << "vector_scanner (const std::vector<std::string>&, " << - "std::size_t start = 0);" + << "vector_scanner (const std::vector<std::string>&," << endl + << "std::size_t start = 0," << endl + << "std::size_t start_position = 0);" << endl << "std::size_t" << endl << "end () const;" << endl << "void" << endl - << "reset (std::size_t start = 0);" + << "reset (std::size_t start = 0, std::size_t start_position = 0);" << endl << "virtual bool" << endl << "more ();" @@ -391,7 +422,11 @@ generate_runtime_header (context& ctx) << "virtual void" << endl << "skip ();" << endl + << "virtual std::size_t" << endl + << "position ();" + << endl << "private:" << endl + << "std::size_t start_position_;" << "const std::vector<std::string>& v_;" << "std::size_t i_;" << "};"; @@ -401,22 +436,25 @@ generate_runtime_header (context& ctx) // if (ctx.options.generate_file_scanner ()) { - os << "class argv_file_scanner: public argv_scanner" + os << "class " << exp << "argv_file_scanner: public argv_scanner" << "{" << "public:" << endl << "argv_file_scanner (int& argc," << endl << "char** argv," << endl << "const std::string& option," << endl - << "bool erase = false);" + << "bool erase = false," << endl + << "std::size_t start_position = 0);" << endl << "argv_file_scanner (int start," << endl << "int& argc," << endl << "char** argv," << endl << "const std::string& option," << endl - << "bool erase = false);" + << "bool erase = false," << endl + << "std::size_t start_position = 0);" << endl << "argv_file_scanner (const std::string& file," << endl - << "const std::string& option);" + << "const std::string& option," << endl + << "std::size_t start_position = 0);" << endl << "struct option_info" << "{" @@ -432,18 +470,21 @@ generate_runtime_header (context& ctx) << "char** argv," << endl << "const option_info* options," << endl << "std::size_t options_count," << endl - << "bool erase = false);" + << "bool erase = false," << endl + << "std::size_t start_position = 0);" << 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 = false);" + << "bool erase = false," << endl + << "std::size_t start_position = 0);" << endl << "argv_file_scanner (const std::string& file," << endl << "const option_info* options = 0," << endl - << "std::size_t options_count = 0);" + << "std::size_t options_count = 0," << endl + << "std::size_t start_position = 0);" << endl << "virtual bool" << endl << "more ();" @@ -457,6 +498,9 @@ generate_runtime_header (context& ctx) << "virtual void" << endl << "skip ();" << endl + << "virtual std::size_t" << endl + << "position ();" + << endl << "// Return the file path if the peeked at argument came from a file and" << endl << "// the empty string otherwise. The reference is guaranteed to be valid" << endl << "// till the end of the scanner lifetime." << endl @@ -512,7 +556,7 @@ generate_runtime_header (context& ctx) // if (ctx.options.generate_group_scanner ()) { - os << "class group_scanner: public scanner" + os << "class " << exp << "group_scanner: public scanner" << "{" << "public:" << endl << "group_scanner (scanner&);" @@ -529,12 +573,18 @@ generate_runtime_header (context& ctx) << "virtual void" << endl << "skip ();" << endl + << "virtual std::size_t" << endl + << "position ();" + << endl << "// The group is only available after the call to next()" << endl << "// (and skip() -- in case one needs to make sure the group" << endl << "// was empty, or some such) and is only valid (and must be" << endl << "// handled) until the next call to any of the scanner" << endl << "// functions (including more())." << endl << "//" << endl + << "// Note also that argument positions within each group start"<< endl + << "// from 0." << endl + << "//" << endl << "scanner&" << endl << "group ();" << endl @@ -562,21 +612,20 @@ generate_runtime_header (context& ctx) << "static separator" << endl << "sense (const char*);" << endl - << "// If the state is scanned or skipped, then scan the" << endl - << "// leading groups and save the next (unescaped) argument in" << endl - << "// arg_. If the state is peeked, then scan the trailing" << endl - << "// groups. In both cases set the new state." << endl + + << "// Scan the leading groups, the next argument/argument pack,"<< endl + << "// and the trailing groups." << endl << "//" << endl << "void" << endl - << "scan_group (state);" + << "scan_group ();" << endl << "scanner& scan_;" << "state state_;" << endl << "// Circular buffer of two arguments." << endl << "//" << endl - << "std::string arg_[2];" - << "std::size_t i_;" + << "std::vector<std::string> arg_[2];" + << "std::size_t i_, j_, pos_;" << endl << "std::vector<std::string> group_;" << "vector_scanner group_scan_;" @@ -590,7 +639,7 @@ generate_runtime_header (context& ctx) os << "typedef std::vector<std::string> option_names;" << endl; - os << "class option" + os << "class " << exp_inl << "option" << "{" << "public:" << endl << endl @@ -620,7 +669,7 @@ generate_runtime_header (context& ctx) << "std::string default_value_;" << "};"; - os << "class options: public std::vector<option>" + os << "class " << exp << "options: public std::vector<option>" << "{" << "public:" << endl << "typedef std::vector<option> container_type;" |