Added a new --raw option, for use with print
This commit is contained in:
parent
dc63429785
commit
a577e8c48e
6 changed files with 67 additions and 32 deletions
|
|
@ -172,6 +172,11 @@ See \fB\-\-leeway\fR.
|
|||
.It Fl \-print-format Ar FMT
|
||||
.It Fl \-quantity Pq Fl O
|
||||
.It Fl \-quarterly
|
||||
.It Fl \-raw
|
||||
For use only with the
|
||||
.Nm print
|
||||
command, it causes Ledger to print out matching entries exactly as they
|
||||
appeared in the original journal file.
|
||||
.It Fl \-real Pq Fl R
|
||||
.It Fl \-register-format Ar FMT
|
||||
.It Fl \-related Pq Fl r
|
||||
|
|
|
|||
46
src/item.cc
46
src/item.cc
|
|
@ -359,6 +359,32 @@ bool item_t::valid() const
|
|||
return true;
|
||||
}
|
||||
|
||||
void print_item(std::ostream& out,
|
||||
const item_t& item,
|
||||
const string& prefix)
|
||||
{
|
||||
std::size_t len = item.end_pos - item.beg_pos;
|
||||
|
||||
ifstream in(item.pathname);
|
||||
in.seekg(item.beg_pos, std::ios::beg);
|
||||
|
||||
scoped_array<char> buf(new char[len + 1]);
|
||||
in.read(buf.get(), len);
|
||||
assert(static_cast<std::size_t>(in.gcount()) == len);
|
||||
buf[len] = '\0';
|
||||
|
||||
bool first = true;
|
||||
for (char * p = std::strtok(buf.get(), "\n");
|
||||
p;
|
||||
p = std::strtok(NULL, "\n")) {
|
||||
if (first)
|
||||
first = false;
|
||||
else
|
||||
out << '\n';
|
||||
out << prefix << p;
|
||||
}
|
||||
}
|
||||
|
||||
string item_context(const item_t& item, const string& desc)
|
||||
{
|
||||
std::size_t len = item.end_pos - item.beg_pos;
|
||||
|
|
@ -375,14 +401,6 @@ string item_context(const item_t& item, const string& desc)
|
|||
return out.str();
|
||||
}
|
||||
|
||||
ifstream in(item.pathname);
|
||||
in.seekg(item.beg_pos, std::ios::beg);
|
||||
|
||||
scoped_array<char> buf(new char[len + 1]);
|
||||
in.read(buf.get(), len);
|
||||
assert(static_cast<std::size_t>(in.gcount()) == len);
|
||||
buf[len] = '\0';
|
||||
|
||||
out << desc << " from \"" << item.pathname.string() << "\"";
|
||||
|
||||
if (item.beg_line != item.end_line)
|
||||
|
|
@ -391,16 +409,8 @@ string item_context(const item_t& item, const string& desc)
|
|||
else
|
||||
out << ", line " << item.beg_line << ":\n";
|
||||
|
||||
bool first = true;
|
||||
for (char * p = std::strtok(buf.get(), "\n");
|
||||
p;
|
||||
p = std::strtok(NULL, "\n")) {
|
||||
if (first)
|
||||
first = false;
|
||||
else
|
||||
out << '\n';
|
||||
out << "> " << p;
|
||||
}
|
||||
print_item(out, item, "> ");
|
||||
|
||||
return out.str();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -159,8 +159,9 @@ public:
|
|||
};
|
||||
|
||||
value_t get_comment(item_t& item);
|
||||
|
||||
string item_context(const item_t& item, const string& desc);
|
||||
void print_item(std::ostream& out, const item_t& item,
|
||||
const string& prefix = "");
|
||||
string item_context(const item_t& item, const string& desc);
|
||||
|
||||
} // namespace ledger
|
||||
|
||||
|
|
|
|||
|
|
@ -33,8 +33,11 @@
|
|||
|
||||
namespace ledger {
|
||||
|
||||
format_xacts::format_xacts(report_t& _report, const string& format)
|
||||
: report(_report), last_entry(NULL), last_xact(NULL)
|
||||
format_xacts::format_xacts(report_t& _report,
|
||||
const string& format,
|
||||
bool _print_raw)
|
||||
: report(_report), last_entry(NULL), last_xact(NULL),
|
||||
print_raw(_print_raw)
|
||||
{
|
||||
TRACE_CTOR(format_xacts, "report&, const string&");
|
||||
|
||||
|
|
@ -59,23 +62,37 @@ void format_xacts::operator()(xact_t& xact)
|
|||
{
|
||||
std::ostream& out(report.output_stream);
|
||||
|
||||
if (! xact.has_xdata() ||
|
||||
! xact.xdata().has_flags(XACT_EXT_DISPLAYED)) {
|
||||
if (print_raw) {
|
||||
if (! xact.has_xdata() ||
|
||||
! xact.xdata().has_flags(XACT_EXT_DISPLAYED)) {
|
||||
if (last_entry != xact.entry) {
|
||||
if (last_entry) {
|
||||
bind_scope_t entry_scope(report, *last_entry);
|
||||
between_format.format(out, entry_scope);
|
||||
}
|
||||
print_item(out, *xact.entry);
|
||||
out << '\n';
|
||||
last_entry = xact.entry;
|
||||
}
|
||||
xact.xdata().add_flags(XACT_EXT_DISPLAYED);
|
||||
last_xact = &xact;
|
||||
}
|
||||
}
|
||||
else if (! xact.has_xdata() ||
|
||||
! xact.xdata().has_flags(XACT_EXT_DISPLAYED)) {
|
||||
bind_scope_t bound_scope(report, xact);
|
||||
if (last_entry != xact.entry) {
|
||||
if (last_entry) {
|
||||
bind_scope_t bound_scope(report, *last_entry);
|
||||
between_format.format(out, bound_scope);
|
||||
bind_scope_t entry_scope(report, *last_entry);
|
||||
between_format.format(out, entry_scope);
|
||||
}
|
||||
bind_scope_t bound_scope(report, xact);
|
||||
first_line_format.format(out, bound_scope);
|
||||
last_entry = xact.entry;
|
||||
}
|
||||
else if (last_xact && last_xact->date() != xact.date()) {
|
||||
bind_scope_t bound_scope(report, xact);
|
||||
first_line_format.format(out, bound_scope);
|
||||
}
|
||||
else {
|
||||
bind_scope_t bound_scope(report, xact);
|
||||
next_lines_format.format(out, bound_scope);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -65,9 +65,11 @@ protected:
|
|||
format_t between_format;
|
||||
entry_t * last_entry;
|
||||
xact_t * last_xact;
|
||||
bool print_raw;
|
||||
|
||||
public:
|
||||
format_xacts(report_t& _report, const string& format);
|
||||
format_xacts(report_t& _report, const string& format,
|
||||
bool _print_raw = false);
|
||||
virtual ~format_xacts() {
|
||||
TRACE_DTOR(format_xacts);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -530,8 +530,8 @@ expr_t::ptr_op_t report_t::lookup(const string& name)
|
|||
if (*(q + 1) == '\0' || is_eq(q, "print"))
|
||||
return WRAP_FUNCTOR
|
||||
(reporter<>
|
||||
(new format_xacts(*this, report_format(HANDLER(print_format_))),
|
||||
*this));
|
||||
(new format_xacts(*this, report_format(HANDLER(print_format_)),
|
||||
HANDLED(raw)), *this));
|
||||
else if (is_eq(q, "prices"))
|
||||
return expr_t::op_t::wrap_functor
|
||||
(reporter<xact_t, xact_handler_ptr, &report_t::commodities_report>
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue