diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/document.cc | 8 | ||||
-rw-r--r-- | src/main.cc | 10 | ||||
-rw-r--r-- | src/xpath.cc | 103 | ||||
-rw-r--r-- | src/xpath.h | 15 |
4 files changed, 71 insertions, 65 deletions
diff --git a/src/document.cc b/src/document.cc index e48462da..3c04ed57 100644 --- a/src/document.cc +++ b/src/document.cc @@ -144,13 +144,13 @@ optional<const char *> document_t::lookup_name(nameid_t id) const if (id < 1000) { switch (id) { case CURRENT: - return "CURRENT"; + return "."; case PARENT: - return "PARENT"; + return ".."; case ROOT: - return "ROOT"; + return ""; case ALL: - return "ALL"; + return "*"; default: assert(id >= 10); diff --git a/src/main.cc b/src/main.cc index 195b30c4..3db75442 100644 --- a/src/main.cc +++ b/src/main.cc @@ -142,19 +142,19 @@ static int read_and_report(ledger::report_t * report, int argc, char * argv[], else if (verb == "xpath") ; else if (verb == "parse") { - xml::xpath_t expr(*arg); + xml::xpath_t expr(*arg); + xml::document_t temp(xml::LEDGER_NODE); IF_INFO() { std::cout << "Value expression tree:" << std::endl; expr.dump(std::cout); std::cout << std::endl; std::cout << "Value expression parsed was:" << std::endl; - expr.print(std::cout); + expr.print(std::cout, temp); std::cout << std::endl << std::endl; std::cout << "Result of calculation: "; } - xml::document_t temp(xml::LEDGER_NODE); std::cout << expr.calc(temp, report).strip_annotations() << std::endl; return 0; @@ -254,7 +254,7 @@ static int read_and_report(ledger::report_t * report, int argc, char * argv[], expr.dump(*out); *out << std::endl; *out << "Value expression parsed was:" << std::endl; - expr.print(*out); + expr.print(*out, xml_document); *out << std::endl << std::endl; *out << "Result of calculation: "; } @@ -266,7 +266,7 @@ static int read_and_report(ledger::report_t * report, int argc, char * argv[], else if (verb == "xpath") { std::cout << "XPath parsed:" << std::endl; xml::xpath_t xpath(*arg); - xpath.print(*out); + xpath.print(*out, xml_document); *out << std::endl; #if 0 diff --git a/src/xpath.cc b/src/xpath.cc index 492159e5..932fb84a 100644 --- a/src/xpath.cc +++ b/src/xpath.cc @@ -575,7 +575,7 @@ xpath_t::parse_value_term(std::istream& in, flags_t tflags) const // An identifier followed by ( represents a function call tok = next_token(in, tflags); if (tok.kind == token_t::LPAREN) { - node->kind = op_t::FUNC_NAME; + node = new op_t(op_t::FUNC_NAME); node->set_string(ident); ptr_op_t call_node(new op_t(op_t::O_EVAL)); @@ -1779,6 +1779,7 @@ void xpath_t::context::describe(std::ostream& out) const throw() #endif bool xpath_t::op_t::print(std::ostream& out, + document_t& document, const bool relaxed, const ptr_op_t& op_to_find, unsigned long * start_pos, @@ -1836,9 +1837,17 @@ bool xpath_t::op_t::print(std::ostream& out, break; } - case NODE_ID: - out << '%' << as_name(); + case ATTR_ID: + out << '@'; + // fall through... + case NODE_ID: { + optional<const char *> name = document.lookup_name(as_name()); + if (name) + out << *name; + else + out << '#' << as_name(); break; + } case NODE_NAME: case FUNC_NAME: @@ -1863,194 +1872,194 @@ bool xpath_t::op_t::print(std::ostream& out, case O_NOT: out << "!"; - if (left() && left()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (left() && left()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; break; case O_NEG: out << "-"; - if (left() && left()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (left() && left()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; break; case O_UNION: - if (left() && left()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (left() && left()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; out << " | "; - if (right() && right()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (right() && right()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; break; case O_ADD: out << "("; - if (left() && left()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (left() && left()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; out << " + "; - if (right() && right()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (right() && right()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; out << ")"; break; case O_SUB: out << "("; - if (left() && left()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (left() && left()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; out << " - "; - if (right() && right()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (right() && right()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; out << ")"; break; case O_MUL: out << "("; - if (left() && left()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (left() && left()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; out << " * "; - if (right() && right()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (right() && right()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; out << ")"; break; case O_DIV: out << "("; - if (left() && left()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (left() && left()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; out << " / "; - if (right() && right()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (right() && right()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; out << ")"; break; case O_NEQ: out << "("; - if (left() && left()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (left() && left()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; out << " != "; - if (right() && right()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (right() && right()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; out << ")"; break; case O_EQ: out << "("; - if (left() && left()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (left() && left()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; out << " == "; - if (right() && right()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (right() && right()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; out << ")"; break; case O_LT: out << "("; - if (left() && left()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (left() && left()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; out << " < "; - if (right() && right()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (right() && right()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; out << ")"; break; case O_LTE: out << "("; - if (left() && left()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (left() && left()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; out << " <= "; - if (right() && right()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (right() && right()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; out << ")"; break; case O_GT: out << "("; - if (left() && left()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (left() && left()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; out << " > "; - if (right() && right()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (right() && right()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; out << ")"; break; case O_GTE: out << "("; - if (left() && left()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (left() && left()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; out << " >= "; - if (right() && right()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (right() && right()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; out << ")"; break; case O_AND: out << "("; - if (left() && left()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (left() && left()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; out << " & "; - if (right() && right()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (right() && right()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; out << ")"; break; case O_OR: out << "("; - if (left() && left()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (left() && left()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; out << " | "; - if (right() && right()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (right() && right()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; out << ")"; break; case O_QUES: out << "("; - if (left() && left()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (left() && left()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; out << " ? "; - if (right() && right()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (right() && right()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; out << ")"; break; case O_COLON: - if (left() && left()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (left() && left()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; out << " : "; - if (right() && right()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (right() && right()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; break; case O_COMMA: - if (left() && left()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (left() && left()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; out << ", "; - if (right() && right()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (right() && right()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; break; case O_DEFINE: - if (left() && left()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (left() && left()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; out << '='; - if (right() && right()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (right() && right()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; break; case O_EVAL: - if (left() && left()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (left() && left()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; out << "("; - if (right() && right()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (right() && right()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; out << ")"; break; case O_FIND: - if (left() && left()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (left() && left()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; out << "/"; - if (right() && right()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (right() && right()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; break; case O_RFIND: - if (left() && left()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (left() && left()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; out << "//"; - if (right() && right()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (right() && right()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; break; case O_PRED: - if (left() && left()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (left() && left()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; out << "["; - if (right() && right()->print(out, relaxed, op_to_find, start_pos, end_pos)) + if (right() && right()->print(out, document, relaxed, op_to_find, start_pos, end_pos)) found = true; out << "]"; break; diff --git a/src/xpath.h b/src/xpath.h index 41dc36e4..9b0129ed 100644 --- a/src/xpath.h +++ b/src/xpath.h @@ -311,7 +311,7 @@ public: value_t& as_value() { assert(kind == VALUE); - value_t * val = boost::get<scoped_ptr<value_t> >(data).get(); + value_t * val = boost::get<shared_ptr<value_t> >(data).get(); assert(val); return *val; } @@ -418,6 +418,7 @@ public: static ptr_op_t defer_sequence(value_t::sequence_t& result_seq); bool print(std::ostream& out, + document_t& document, const bool relaxed = true, const ptr_op_t& op_to_find = NULL, unsigned long * start_pos = NULL, @@ -510,12 +511,13 @@ public: } bool print(std::ostream& out, + document_t& document, const bool relaxed, const ptr_op_t op_to_find, unsigned long * start_pos, unsigned long * end_pos) const { if (ptr) - ptr->print(out, relaxed, op_to_find, start_pos, end_pos); + ptr->print(out, document, relaxed, op_to_find, start_pos, end_pos); return true; } @@ -613,8 +615,8 @@ public: return temp.calc(top, scope); } - void print(std::ostream& out) const { - print(out, true, NULL, NULL, NULL); + void print(std::ostream& out, xml::document_t& document) const { + print(out, document, true, NULL, NULL, NULL); } void dump(std::ostream& out) const { if (ptr) @@ -624,11 +626,6 @@ public: friend class scope_t; }; -inline std::ostream& operator<<(std::ostream& out, const xpath_t::op_t& op) { - op.print(out); - return out; -} - inline void intrusive_ptr_add_ref(xpath_t::op_t * op) { op->acquire(); } |