From 3c4ac46872af5d6c59b22361898f935c39ec0be9 Mon Sep 17 00:00:00 2001 From: Felix Lu Date: Tue, 9 Aug 2016 15:36:14 -0400 Subject: [PATCH] filename based auto path tapset support Sometimes the process name may change with new versions and the tapset must be modified. Process probe points in the PATH directory may now have their arguments replaced by the full file path starting from /PATH. * parse.cxx: Pass alias_seen flag to parse_probe_points(). Add filepath argument to process component. --- parse.cxx | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/parse.cxx b/parse.cxx index a5ff20f5f..1a5ba4cc2 100644 --- a/parse.cxx +++ b/parse.cxx @@ -179,9 +179,9 @@ private: // nonterminals void do_parse_functiondecl (vector&, const token*, string const&, bool); embeddedcode* parse_embeddedcode (); - vector parse_probe_points (); - vector parse_components (); - vector parse_component (); + vector parse_probe_points (bool alias_seen); + vector parse_components (bool alias_seen); + vector parse_component (bool alias_seen); literal_string* consume_string_literals (const token*); literal_string* parse_literal_string (); literal* parse_literal (); @@ -2030,10 +2030,11 @@ parser::parse_probe (vector & probe_ret, vector locations; int epilogue_alias = 0; + bool alias_seen = false; while (1) { - vector pps = parse_probe_points(); + vector pps = parse_probe_points(alias_seen); const token* t = peek (); if (pps.size() == 1 && t @@ -2042,6 +2043,7 @@ parser::parse_probe (vector & probe_ret, if (pps[0]->optional || pps[0]->sufficient) throw PARSE_ERROR (_("probe point alias name cannot be optional nor sufficient"), pps[0]->components.front()->tok); aliases.push_back(pps[0]); + alias_seen = true; swallow (); continue; } @@ -2052,6 +2054,7 @@ parser::parse_probe (vector & probe_ret, throw PARSE_ERROR (_("probe point alias name cannot be optional nor sufficient"), pps[0]->components.front()->tok); aliases.push_back(pps[0]); epilogue_alias = 1; + alias_seen = true; swallow (); continue; } @@ -2476,12 +2479,12 @@ parser::do_parse_functiondecl (vector& functions, const token* t, } vector -parser::parse_probe_points() +parser::parse_probe_points(bool alias_seen) { vector pps; while (1) { - vector tail = parse_components(); + vector tail = parse_components(alias_seen); pps.insert(pps.end(), tail.begin(), tail.end()); const token* t = peek(); @@ -2502,12 +2505,12 @@ parser::parse_probe_points() } vector -parser::parse_components() +parser::parse_components(bool alias_seen) { vector pps; while (1) { - vector suffix = parse_component(); + vector suffix = parse_component(alias_seen); // Cartesian product of components if (pps.empty()) @@ -2593,7 +2596,7 @@ parser::parse_components() } vector -parser::parse_component() +parser::parse_component(bool alias_seen) { const token* t = next (); if (! (t->type == tok_identifier @@ -2606,7 +2609,7 @@ parser::parse_component() if (t && t->type == tok_operator && t->content == "{") { swallow(); - vector pps = parse_probe_points(); + vector pps = parse_probe_points(alias_seen); t = peek(); if (!(t && t->type == tok_operator && t->content == "}")) throw PARSE_ERROR (_("expected '}'")); @@ -2685,6 +2688,16 @@ parser::parse_component() throw PARSE_ERROR (_("expected ')'")); swallow (); } + else if (alias_seen && auto_path && c->functor == "process") + { + // PATH expansion of process component without argument. + // The filename without the .stp extension is used. + string::size_type start = input_name.find("PATH/") + 4; + string::size_type end = input_name.rfind(".stp"); + string path = input_name.substr(start, end - start); + c->arg = new literal_string(path); + } + return pps; } } -- 2.43.5