diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/main.cc | 77 | ||||
-rw-r--r-- | src/output.cc | 12 | ||||
-rw-r--r-- | src/output.h | 18 | ||||
-rw-r--r-- | src/report.cc | 93 |
4 files changed, 90 insertions, 110 deletions
diff --git a/src/main.cc b/src/main.cc index 8790fb17..ed7b8f2f 100644 --- a/src/main.cc +++ b/src/main.cc @@ -398,18 +398,26 @@ namespace ledger { function_t command; - if (verb == "register" || verb == "reg" || verb == "r") + if (verb == "register" || verb == "reg" || verb == "r") { + verb = "register"; command = reporter<>(new format_xacts(report, session.register_format)); - else if (verb == "print" || verb == "p") + } + else if (verb == "print" || verb == "p") { + verb = "print"; command = reporter<>(new format_xacts(report, session.print_format)); - else if (verb == "balance" || verb == "bal" || verb == "b") + } + else if (verb == "balance" || verb == "bal" || verb == "b") { + verb = "balance"; command = reporter<account_t, acct_handler_ptr, &report_t::accounts_report> (new format_accounts(report, session.balance_format)); - else if (verb == "equity") + } + else if (verb == "equity") { + verb = "equity"; command = reporter<account_t, acct_handler_ptr, &report_t::accounts_report> (new format_equity(report, session.print_format)); + } #if 0 else if (verb == "entry") command = entry_command(); @@ -440,6 +448,67 @@ namespace ledger { throw_(std::logic_error, string("Unrecognized command '") + verb + "'"); } + // Patch up some of the reporting options based on what kind of + // command it was. + + // jww (2008-08-14): This code really needs to be rationalized away + // for 3.0. + + if (verb == "print" || verb == "entry" || verb == "dump") { + report.show_related = true; + report.show_all_related = true; + } + else if (verb == "equity") { + report.show_subtotal = true; + } + else if (report.show_related) { + if (verb == "register") { + report.show_inverted = true; + } else { + report.show_subtotal = true; + report.show_all_related = true; + } + } + + if (verb != "balance" && verb != "register") + amount_t::keep_base = true; + + // Setup the default value for the display predicate + + if (report.display_predicate.empty()) { + if (verb == "balance") { + if (! report.show_empty) + report.display_predicate = "total"; + if (! report.show_subtotal) { + if (! report.display_predicate.empty()) + report.display_predicate += "&"; + report.display_predicate += "depth<=1"; + } + } + else if (verb == "equity") { + report.display_predicate = "fmt_t"; // jww (2008-08-14): ??? + } + else if (verb == "register" && ! report.show_empty) { + report.display_predicate = "amount"; + } + } + + // Now setup the various formatting strings + + // jww (2008-08-14): I hear a song, and it's sound is "HaAaaCcK" + +#if 0 + if (! date_output_format.empty()) + date_t::output_format = date_output_format; +#endif + + amount_t::keep_price = report.keep_price; + amount_t::keep_date = report.keep_date; + amount_t::keep_tag = report.keep_tag; + + if (! report.report_period.empty() && ! report.sort_all) + report.entry_sort = true; + // Create an argument scope containing the report command's // arguments, and then invoke the command. diff --git a/src/output.cc b/src/output.cc index e3b31df4..582fb0cf 100644 --- a/src/output.cc +++ b/src/output.cc @@ -171,7 +171,7 @@ bool format_accounts::disp_subaccounts_p(account_t& account, { bool display = false; unsigned int counted = 0; - bool matches = disp_pred(account); + bool matches = should_display(account); bool computed = false; value_t acct_total; value_t result; @@ -179,7 +179,7 @@ bool format_accounts::disp_subaccounts_p(account_t& account, to_show = NULL; foreach (accounts_map::value_type pair, account.accounts) { - if (! disp_pred(*pair.second)) + if (! should_display(*pair.second)) continue; call_scope_t args(*pair.second); @@ -219,13 +219,11 @@ bool format_accounts::display_account(account_t& account) if (disp_subaccounts_p(account, account_to_show)) return true; - return ! account_to_show && disp_pred(account); + return ! account_to_show && should_display(account); } -format_equity::format_equity(report_t& _report, - const string& _format, - const string& display_predicate) - : format_accounts(_report, "", display_predicate) +format_equity::format_equity(report_t& _report, const string& _format) + : format_accounts(_report) { const char * f = _format.c_str(); diff --git a/src/output.h b/src/output.h index 3fe1ce71..df556235 100644 --- a/src/output.h +++ b/src/output.h @@ -100,21 +100,24 @@ protected: public: format_accounts(report_t& _report, - const string& _format, - const string& display_predicate = "", + const string& _format = "", const bool _print_final_total = true) - : report(_report), format(_format), disp_pred(display_predicate), + : report(_report), format(_format), disp_pred(), print_final_total(_print_final_total) { - TRACE_CTOR(format_accounts, - "report&, const string&, const string&, const bool"); + TRACE_CTOR(format_accounts, "report&, const string&, const bool"); } virtual ~format_accounts() { TRACE_DTOR(format_accounts); } - virtual void flush(); + bool should_display(account_t& account) { + if (! disp_pred.predicate) + disp_pred.predicate.parse(report.display_predicate); + return disp_pred(account); + } + virtual void flush(); virtual void operator()(account_t& account); }; @@ -127,8 +130,7 @@ class format_equity : public format_accounts public: format_equity(report_t& _report, - const string& _format, - const string& display_predicate = ""); + const string& _format); virtual ~format_equity() { TRACE_DTOR(format_equity); } diff --git a/src/report.cc b/src/report.cc index d755bade..a894e036 100644 --- a/src/report.cc +++ b/src/report.cc @@ -34,95 +34,6 @@ namespace ledger { -#if 0 -void report_t::process_options(const std::string& command, - strings_list::iterator arg, - strings_list::iterator args_end) -{ - // Configure some other options depending on report type - - if (command == "p" || command == "e" || command == "w") { - show_related = - show_all_related = true; - } - else if (command == "E") { - show_subtotal = true; - } - else if (show_related) { - if (command == "r") { - show_inverted = true; - } else { - show_subtotal = true; - show_all_related = true; - } - } - - if (command != "b" && command != "r") - amount_t::keep_base = true; - - // Process remaining command-line arguments - - if (command != "e") { - // Treat the remaining command-line arguments as regular - // expressions, used for refining report results. - - std::list<std::string>::iterator i = arg; - for (; i != args_end; i++) - if (*i == "--") - break; - - if (i != arg) - regexps_to_predicate(command, arg, i, true, - (command == "b" && ! show_subtotal && - display_predicate.empty())); - if (i != args_end && ++i != args_end) - regexps_to_predicate(command, i, args_end); - } - - // Setup the default value for the display predicate - - if (display_predicate.empty()) { - if (command == "b") { - if (! show_empty) - display_predicate = "T"; - if (! show_subtotal) { - if (! display_predicate.empty()) - display_predicate += "&"; - display_predicate += "l<=1"; - } - } - else if (command == "E") { - display_predicate = "t"; - } - else if (command == "r" && ! show_empty) { - display_predicate = "a"; - } - } - - DEBUG_PRINT("ledger.config.predicates", "Predicate: " << predicate); - DEBUG_PRINT("ledger.config.predicates", "Display P: " << display_predicate); - - // Setup the values of %t and %T, used in format strings - - if (! amount_expr.empty()) - ledger::amount_expr = amount_expr; - if (! total_expr.empty()) - ledger::total_expr = total_expr; - - // Now setup the various formatting strings - - if (! date_output_format.empty()) - date_t::output_format = date_output_format; - - amount_t::keep_price = keep_price; - amount_t::keep_date = keep_date; - amount_t::keep_tag = keep_tag; - - if (! report_period.empty() && ! sort_all) - entry_sort = true; -} -#endif - xact_handler_ptr report_t::chain_xact_handlers(xact_handler_ptr base_handler, const bool handle_individual_xacts) @@ -139,8 +50,8 @@ report_t::chain_xact_handlers(xact_handler_ptr base_handler, if (head_entries || tail_entries) handler.reset(new truncate_entries(handler, head_entries, tail_entries)); - // filter_xacts will only pass through xacts - // matching the `display_predicate'. + // filter_xacts will only pass through xacts matching the + // `display_predicate'. if (! display_predicate.empty()) handler.reset(new filter_xacts(handler, display_predicate)); |