diff options
-rw-r--r-- | src/account.cc | 2 | ||||
-rw-r--r-- | src/derive.cc | 4 | ||||
-rw-r--r-- | src/emacs.cc | 6 | ||||
-rw-r--r-- | src/item.cc | 30 | ||||
-rw-r--r-- | src/item.h | 59 | ||||
-rw-r--r-- | src/textual.cc | 54 | ||||
-rw-r--r-- | src/xact.cc | 4 |
7 files changed, 93 insertions, 66 deletions
diff --git a/src/account.cc b/src/account.cc index 57b66d86..52a6b436 100644 --- a/src/account.cc +++ b/src/account.cc @@ -458,7 +458,7 @@ void account_t::xdata_t::details_t::update(post_t& post, posts_virtuals_count++; if (gather_all) - filenames.insert(post.pathname); + filenames.insert(post.pos->pathname); date_t date = post.date(); diff --git a/src/derive.cc b/src/derive.cc index 2fe5754f..ef2d1e51 100644 --- a/src/derive.cc +++ b/src/derive.cc @@ -252,7 +252,7 @@ namespace { if (tmpl.payee_mask.match((*j)->payee)) { matching = *j; DEBUG("derive.xact", - "Found payee match: transaction on line " << (*j)->beg_line); + "Found payee match: transaction on line " << (*j)->pos->beg_line); break; } } @@ -332,7 +332,7 @@ namespace { if (post.account_mask->match(x->account->fullname())) { new_post.reset(new post_t(*x)); DEBUG("derive.xact", - "Founding posting from line " << x->beg_line); + "Founding posting from line " << x->pos->beg_line); break; } } diff --git a/src/emacs.cc b/src/emacs.cc index 57054690..24d3f1c1 100644 --- a/src/emacs.cc +++ b/src/emacs.cc @@ -40,8 +40,8 @@ namespace ledger { void format_emacs_posts::write_xact(xact_t& xact) { - out << "\"" << xact.pathname << "\" " - << (xact.beg_line + 1) << " "; + out << "\"" << xact.pos->pathname << "\" " + << (xact.pos->beg_line + 1) << " "; tm when = gregorian::to_tm(xact.date()); std::time_t date = std::mktime(&when); // jww (2008-04-20): Is this GMT or local? @@ -77,7 +77,7 @@ void format_emacs_posts::operator()(post_t& post) out << "\n"; } - out << " (" << (post.beg_line + 1) << " "; + out << " (" << (post.pos->beg_line + 1) << " "; out << "\"" << post.reported_account()->fullname() << "\" \"" << post.amount << "\""; diff --git a/src/item.cc b/src/item.cc index e8ecec15..631423a9 100644 --- a/src/item.cc +++ b/src/item.cc @@ -224,23 +224,26 @@ namespace { } value_t get_pathname(item_t& item) { - return string_value(item.pathname.string()); + if (item.pos) + return string_value(item.pos->pathname.string()); + else + return string_value(empty_string); } value_t get_beg_pos(item_t& item) { - return long(item.beg_pos); + return item.pos ? long(item.pos->beg_pos) : 0L; } value_t get_beg_line(item_t& item) { - return long(item.beg_line); + return item.pos ? long(item.pos->beg_line) : 0L; } value_t get_end_pos(item_t& item) { - return long(item.end_pos); + return item.pos ? long(item.pos->end_pos) : 0L; } value_t get_end_line(item_t& item) { - return long(item.end_line); + return item.pos ? long(item.pos->end_line) : 0L; } value_t get_depth(item_t&) { @@ -397,12 +400,13 @@ bool item_t::valid() const void print_item(std::ostream& out, const item_t& item, const string& prefix) { - out << source_context(item.pathname, item.beg_pos, item.end_pos, prefix); + out << source_context(item.pos->pathname, item.pos->beg_pos, + item.pos->end_pos, prefix); } string item_context(const item_t& item, const string& desc) { - std::streamoff len = item.end_pos - item.beg_pos; + std::streamoff len = item.pos->end_pos - item.pos->beg_pos; if (! len) return _("<no item context>"); @@ -411,18 +415,18 @@ string item_context(const item_t& item, const string& desc) std::ostringstream out; - if (item.pathname == path("/dev/stdin")) { + if (item.pos->pathname == path("/dev/stdin")) { out << desc << _(" from standard input:"); return out.str(); } - out << desc << _(" from \"") << item.pathname.string() << "\""; + out << desc << _(" from \"") << item.pos->pathname.string() << "\""; - if (item.beg_line != item.end_line) - out << _(", lines ") << item.beg_line << "-" - << item.end_line << ":\n"; + if (item.pos->beg_line != item.pos->end_line) + out << _(", lines ") << item.pos->beg_line << "-" + << item.pos->end_line << ":\n"; else - out << _(", line ") << item.beg_line << ":\n"; + out << _(", line ") << item.pos->beg_line << ":\n"; print_item(out, item, "> "); @@ -50,6 +50,37 @@ namespace ledger { +struct position_t +{ + path pathname; + istream_pos_type beg_pos; + std::size_t beg_line; + istream_pos_type end_pos; + std::size_t end_line; + + position_t() : beg_pos(0), beg_line(0), end_pos(0), end_line(0) { + TRACE_CTOR(position_t, ""); + } + position_t(const position_t& pos) { + TRACE_CTOR(position_t, "copy"); + *this = pos; + } + ~position_t() throw() { + TRACE_DTOR(position_t); + } + + position_t& operator=(const position_t& pos) { + if (this != &pos) { + pathname = pos.pathname; + beg_pos = pos.beg_pos; + beg_line = pos.beg_line; + end_pos = pos.end_pos; + end_line = pos.end_line; + } + return *this; + } +}; + /** * @brief Brief * @@ -65,24 +96,17 @@ public: enum state_t { UNCLEARED = 0, CLEARED, PENDING }; - state_t _state; - - optional<date_t> _date; - optional<date_t> _date_eff; - optional<string> note; - typedef std::map<string, optional<string> > string_map; - optional<string_map> metadata; - path pathname; - istream_pos_type beg_pos; - std::size_t beg_line; - istream_pos_type end_pos; - std::size_t end_line; + state_t _state; + optional<date_t> _date; + optional<date_t> _date_eff; + optional<string> note; + optional<position_t> pos; + optional<string_map> metadata; item_t(flags_t _flags = ITEM_NORMAL, const optional<string>& _note = none) - : supports_flags<>(_flags), _state(UNCLEARED), note(_note), - beg_pos(0), beg_line(0), end_pos(0), end_line(0) + : supports_flags<>(_flags), _state(UNCLEARED), note(_note) { TRACE_CTOR(item_t, "flags_t, const string&"); } @@ -103,12 +127,7 @@ public: _date = item._date; _date_eff = item._date_eff; note = item.note; - - pathname = item.pathname; - beg_pos = item.beg_pos; - beg_line = item.beg_line; - end_pos = item.end_pos; - end_line = item.end_line; + pos = item.pos; } virtual bool operator==(const item_t& xact) { diff --git a/src/textual.cc b/src/textual.cc index f05499df..9375ea4f 100644 --- a/src/textual.cc +++ b/src/textual.cc @@ -525,11 +525,12 @@ void instance_t::automated_xact_directive(char * line) journal.auto_xacts.push_back(ae.get()); - ae->pathname = pathname; - ae->beg_pos = pos; - ae->beg_line = lnum; - ae->end_pos = curr_pos; - ae->end_line = linenum; + ae->pos = position_t(); + ae->pos->pathname = pathname; + ae->pos->beg_pos = pos; + ae->pos->beg_line = lnum; + ae->pos->end_pos = curr_pos; + ae->pos->end_line = linenum; ae.release(); } @@ -565,11 +566,12 @@ void instance_t::period_xact_directive(char * line) journal.period_xacts.push_back(pe.get()); - pe->pathname = pathname; - pe->beg_pos = pos; - pe->beg_line = lnum; - pe->end_pos = curr_pos; - pe->end_line = linenum; + pe->pos = position_t(); + pe->pos->pathname = pathname; + pe->pos->beg_pos = pos; + pe->pos->beg_line = lnum; + pe->pos->end_pos = curr_pos; + pe->pos->end_line = linenum; pe.release(); } else { @@ -778,10 +780,11 @@ post_t * instance_t::parse_post(char * line, std::auto_ptr<post_t> post(new post_t); - post->xact = xact; // this could be NULL - post->pathname = pathname; - post->beg_pos = line_beg_pos; - post->beg_line = linenum; + post->xact = xact; // this could be NULL + post->pos = position_t(); + post->pos->pathname = pathname; + post->pos->beg_pos = line_beg_pos; + post->pos->beg_line = linenum; char buf[MAX_LINE + 1]; std::strcpy(buf, line); @@ -1056,8 +1059,8 @@ post_t * instance_t::parse_post(char * line, _("Unexpected char '%1' (Note: inline math requires parentheses)") << *next); - post->end_pos = curr_pos; - post->end_line = linenum; + post->pos->end_pos = curr_pos; + post->pos->end_line = linenum; if (! tag_stack.empty()) { foreach (const string& tag, tag_stack) @@ -1107,9 +1110,10 @@ xact_t * instance_t::parse_xact(char * line, std::auto_ptr<xact_t> xact(new xact_t); - xact->pathname = pathname; - xact->beg_pos = line_beg_pos; - xact->beg_line = linenum; + xact->pos = position_t(); + xact->pos->pathname = pathname; + xact->pos->beg_pos = line_beg_pos; + xact->pos->beg_line = linenum; bool reveal_context = true; @@ -1189,8 +1193,8 @@ xact_t * instance_t::parse_xact(char * line, // This is a trailing note, and possibly a metadata info tag item->append_note(p + 1, current_year); - item->end_pos = curr_pos; - item->end_line++; + item->pos->end_pos = curr_pos; + item->pos->end_line++; } else { reveal_context = false; @@ -1216,8 +1220,8 @@ xact_t * instance_t::parse_xact(char * line, } } - xact->end_pos = curr_pos; - xact->end_line = linenum; + xact->pos->end_pos = curr_pos; + xact->pos->end_line = linenum; if (! tag_stack.empty()) { foreach (const string& tag, tag_stack) @@ -1232,8 +1236,8 @@ xact_t * instance_t::parse_xact(char * line, catch (const std::exception& err) { if (reveal_context) { add_error_context(_("While parsing transaction:")); - add_error_context(source_context(xact->pathname, - xact->beg_pos, curr_pos, "> ")); + add_error_context(source_context(xact->pos->pathname, + xact->pos->beg_pos, curr_pos, "> ")); } throw; } diff --git a/src/xact.cc b/src/xact.cc index 9f118ec2..be8c0214 100644 --- a/src/xact.cc +++ b/src/xact.cc @@ -499,7 +499,7 @@ void auto_xact_t::extend_xact(xact_base_t& xact, bool post_handler) IF_DEBUG("xact.extend") { DEBUG("xact.extend", - "Initial post on line " << initial_post->beg_line << ": " + "Initial post on line " << initial_post->pos->beg_line << ": " << "amount " << initial_post->amount << " (precision " << initial_post->amount.precision() << ")"); @@ -509,7 +509,7 @@ void auto_xact_t::extend_xact(xact_base_t& xact, bool post_handler) #endif DEBUG("xact.extend", - "Posting on line " << post->beg_line << ": " + "Posting on line " << post->pos->beg_line << ": " << "amount " << post->amount << ", amt " << amt << " (precision " << post->amount.precision() << " != " << amt.precision() << ")"); |