From ed60746355044dd39acd82b8f42c4d9886914567 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 2 Jun 2010 17:22:12 +0200 Subject: Implement generation of specifier functions (--generate-specifier) These functions determine whether the option was specified on the command line. New test: specifier. --- cli/runtime-source.cxx | 69 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 52 insertions(+), 17 deletions(-) (limited to 'cli/runtime-source.cxx') diff --git a/cli/runtime-source.cxx b/cli/runtime-source.cxx index e605c73..fea0347 100644 --- a/cli/runtime-source.cxx +++ b/cli/runtime-source.cxx @@ -380,13 +380,15 @@ generate_runtime_source (context& ctx) << "}"; } + bool sp (ctx.specifier); + // parser class template & its specializations // os << "template " << endl << "struct parser" << "{" << "static void" << endl - << "parse (X& x, scanner& s)" + << "parse (X& x, " << (sp ? "bool& xs, " : "") << "scanner& s)" << "{" << "const char* o (s.next ());" << endl @@ -398,8 +400,13 @@ generate_runtime_source (context& ctx) << "throw invalid_value (o, v);" << "}" << "else" << endl - << "throw missing_value (o);" - << "}" + << "throw missing_value (o);"; + + if (sp) + os << endl + << "xs = true;"; + + os << "}" << "};"; // parser @@ -421,15 +428,20 @@ generate_runtime_source (context& ctx) << "struct parser" << "{" << "static void" << endl - << "parse (std::string& x, scanner& s)" + << "parse (std::string& x, " << (sp ? "bool& xs, " : "") << "scanner& s)" << "{" << "const char* o (s.next ());" << endl << "if (s.more ())" << endl << "x = s.next ();" << "else" << endl - << "throw missing_value (o);" - << "}" + << "throw missing_value (o);"; + + if (sp) + os << endl + << "xs = true;"; + + os << "}" << "};"; // parser> @@ -438,12 +450,17 @@ generate_runtime_source (context& ctx) << "struct parser >" << "{" << "static void" << endl - << "parse (std::vector& c, scanner& s)" + << "parse (std::vector& c, " << (sp ? "bool& xs, " : "") << + "scanner& s)" << "{" << "X x;" << "parser::parse (x, s);" - << "c.push_back (x);" - << "}" + << "c.push_back (x);"; + + if (sp) + os << "xs = true;"; + + os << "}" << "};"; // parser> @@ -452,12 +469,16 @@ generate_runtime_source (context& ctx) << "struct parser >" << "{" << "static void" << endl - << "parse (std::set& c, scanner& s)" + << "parse (std::set& c, " << (sp ? "bool& xs, " : "") << "scanner& s)" << "{" << "X x;" << "parser::parse (x, s);" - << "c.insert (x);" - << "}" + << "c.insert (x);"; + + if (sp) + os << "xs = true;"; + + os << "}" << "};"; // parser> @@ -466,7 +487,8 @@ generate_runtime_source (context& ctx) << "struct parser >" << "{" << "static void" << endl - << "parse (std::map& m, scanner& s)" + << "parse (std::map& m, " << (sp ? "bool& xs, " : "") << + "scanner& s)" << "{" << "const char* o (s.next ());" << endl @@ -513,18 +535,31 @@ generate_runtime_source (context& ctx) << "}" << "}" << "else" << endl - << "throw missing_value (o);" - << "}" + << "throw missing_value (o);"; + + if (sp) + os << endl + << "xs = true;"; + + os << "}" << "};"; // Parser thunk. // - os << "template " << endl + os << "template " << endl << "void" << endl << "thunk (X& x, scanner& s)" << "{" - << "parser::parse (x.*P, s);" + << "parser::parse (x.*M, s);" << "}"; + if (ctx.specifier) + os << "template " << endl + << "void" << endl + << "thunk (X& x, scanner& s)" + << "{" + << "parser::parse (x.*M, x.*S, s);" + << "}"; + os << "}"; // namespace cli } -- cgit v1.1