diff options
Diffstat (limited to 'src/report.cc')
-rw-r--r-- | src/report.cc | 60 |
1 files changed, 45 insertions, 15 deletions
diff --git a/src/report.cc b/src/report.cc index 9e480ea5..13e6a61f 100644 --- a/src/report.cc +++ b/src/report.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003-2016, John Wiegley. All rights reserved. + * Copyright (c) 2003-2018, John Wiegley. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -57,13 +57,16 @@ void report_t::normalize_options(const string& verb) // Patch up some of the reporting options based on what kind of // command it was. -#if HAVE_ISATTY +#ifdef HAVE_ISATTY if (! HANDLED(force_color)) { if (! HANDLED(no_color) && isatty(STDOUT_FILENO)) HANDLER(color).on("?normalize"); if (HANDLED(color) && ! isatty(STDOUT_FILENO)) HANDLER(color).off(); } + else { + HANDLER(color).on("?normalize"); + } if (! HANDLED(force_pager)) { if (HANDLED(pager_) && ! isatty(STDOUT_FILENO)) HANDLER(pager_).off(); @@ -181,14 +184,14 @@ void report_t::normalize_options(const string& verb) } long cols = 0; -#if HAVE_IOCTL +#ifdef HAVE_IOCTL struct winsize ws; #endif if (HANDLED(columns_)) cols = lexical_cast<long>(HANDLER(columns_).value); else if (const char * columns = std::getenv("COLUMNS")) cols = lexical_cast<long>(columns); -#if HAVE_IOCTL +#ifdef HAVE_IOCTL else if (ioctl(STDIN_FILENO, TIOCGWINSZ, &ws) != -1) cols = ws.ws_col; #endif @@ -428,8 +431,9 @@ namespace { } else { expr_t sort_expr(report.HANDLER(sort_).str()); sort_expr.set_context(&report); - sorted_accounts_iterator iter(*report.session.journal->master, - sort_expr, report.HANDLED(flat)); + sorted_accounts_iterator iter( + *report.session.journal->master, sort_expr, report, + report.HANDLED(flat)); pass_down_accounts<sorted_accounts_iterator> (handler, iter, predicate_t(report.HANDLER(display_).str(), report.what_to_keep()), report); @@ -441,8 +445,9 @@ namespace { } else { expr_t sort_expr(report.HANDLER(sort_).str()); sort_expr.set_context(&report); - sorted_accounts_iterator iter(*report.session.journal->master, - sort_expr, report.HANDLED(flat)); + sorted_accounts_iterator iter( + *report.session.journal->master, sort_expr, report, + report.HANDLED(flat)); pass_down_accounts<sorted_accounts_iterator>(handler, iter); } } @@ -628,18 +633,15 @@ value_t report_t::fn_trim(call_scope_t& args) std::strcpy(buf.get(), temp.c_str()); const char * p = buf.get(); - while (*p && std::isspace(*p)) + const char * e = buf.get() + temp.length() - 1; + + while (p <= e && std::isspace(*p)) p++; - const char * e = buf.get() + temp.length() - 1; while (e > p && std::isspace(*e)) e--; - if (e == p) { - return string_value(empty_string); - } - else if (e < p) { - assert(false); + if (p > e) { return string_value(empty_string); } else { @@ -756,6 +758,23 @@ value_t report_t::fn_quoted(call_scope_t& args) return string_value(out.str()); } +value_t report_t::fn_quoted_rfc4180(call_scope_t& args) +{ + std::ostringstream out; + + out << '"'; + string arg(args.get<string>(0)); + foreach (const char ch, arg) { + if (ch == '"') + out << '"' << '"'; + else + out << ch; + } + out << '"'; + + return string_value(out.str()); +} + value_t report_t::fn_join(call_scope_t& args) { std::ostringstream out; @@ -822,6 +841,13 @@ value_t report_t::fn_commodity(call_scope_t& args) return string_value(args.get<amount_t>(0).commodity().symbol()); } +value_t report_t::fn_clear_commodity(call_scope_t& args) +{ + amount_t amt(args.get<amount_t>(0)); + amt.clear_commodity(); + return amt; +} + value_t report_t::fn_nail_down(call_scope_t& args) { value_t arg0(args[0]); @@ -1365,6 +1391,8 @@ expr_t::ptr_op_t report_t::lookup(const symbol_t::kind_t kind, return MAKE_FUNCTOR(report_t::fn_commodity); else if (is_eq(p, "ceiling")) return MAKE_FUNCTOR(report_t::fn_ceiling); + else if (is_eq(p, "clear_commodity")) + return MAKE_FUNCTOR(report_t::fn_clear_commodity); break; case 'd': @@ -1439,6 +1467,8 @@ expr_t::ptr_op_t report_t::lookup(const symbol_t::kind_t kind, case 'q': if (is_eq(p, "quoted")) return MAKE_FUNCTOR(report_t::fn_quoted); + else if (is_eq(p, "quoted_rfc4180")) + return MAKE_FUNCTOR(report_t::fn_quoted_rfc4180); else if (is_eq(p, "quantity")) return MAKE_FUNCTOR(report_t::fn_quantity); break; |