summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Wiegley <johnw@newartisans.com>2009-10-30 17:54:54 -0400
committerJohn Wiegley <johnw@newartisans.com>2009-10-30 17:54:54 -0400
commitcb6f7cd54e24aa31b0ba163dfb5680e4a7795228 (patch)
treead7379258c0fc63935be3844f3f8ef34e37ad9f0 /src
parent00886a32e7edc85b30919519cd2ff3a54bbbd0fc (diff)
downloadfork-ledger-cb6f7cd54e24aa31b0ba163dfb5680e4a7795228.tar.gz
fork-ledger-cb6f7cd54e24aa31b0ba163dfb5680e4a7795228.tar.bz2
fork-ledger-cb6f7cd54e24aa31b0ba163dfb5680e4a7795228.zip
Add a position_t object for tracking item positions
It is also optional, which is useful for generated items.
Diffstat (limited to 'src')
-rw-r--r--src/account.cc2
-rw-r--r--src/derive.cc4
-rw-r--r--src/emacs.cc6
-rw-r--r--src/item.cc30
-rw-r--r--src/item.h59
-rw-r--r--src/textual.cc54
-rw-r--r--src/xact.cc4
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, "> ");
diff --git a/src/item.h b/src/item.h
index 4dcb3dd0..e8acb0e2 100644
--- a/src/item.h
+++ b/src/item.h
@@ -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() << ")");