summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Wiegley <johnw@newartisans.com>2009-11-11 02:01:34 -0500
committerJohn Wiegley <johnw@newartisans.com>2009-11-11 02:01:34 -0500
commited9209cc2794eeef2a363947ab9b89be83aefe6b (patch)
tree7a2834e89138a16e792400c20da1d11e1603cab1
parenta4b1e7c5ab70fc846b0ec4762f2e9f8ee242ca11 (diff)
downloadfork-ledger-ed9209cc2794eeef2a363947ab9b89be83aefe6b.tar.gz
fork-ledger-ed9209cc2794eeef2a363947ab9b89be83aefe6b.tar.bz2
fork-ledger-ed9209cc2794eeef2a363947ab9b89be83aefe6b.zip
Timeclock events now record their file position
-rw-r--r--src/textual.cc30
-rw-r--r--src/timelog.cc60
-rw-r--r--src/timelog.h30
3 files changed, 64 insertions, 56 deletions
diff --git a/src/textual.cc b/src/textual.cc
index 844edad3..f5d0635c 100644
--- a/src/textual.cc
+++ b/src/textual.cc
@@ -422,9 +422,19 @@ void instance_t::clock_in_directive(char * line,
else
end = NULL;
- timelog.clock_in(parse_datetime(datetime, current_year),
- account_stack.front()->find_account(p),
- n ? n : "", end ? end : "");
+ position_t position;
+ position.pathname = pathname;
+ position.beg_pos = line_beg_pos;
+ position.beg_line = linenum;
+ position.end_pos = curr_pos;
+ position.end_line = linenum;
+
+ time_xact_t event(position, parse_datetime(datetime, current_year),
+ p ? account_stack.front()->find_account(p) : NULL,
+ n ? n : "",
+ end ? end : "");
+
+ timelog.clock_in(event);
}
void instance_t::clock_out_directive(char * line,
@@ -441,9 +451,19 @@ void instance_t::clock_out_directive(char * line,
else
end = NULL;
- timelog.clock_out(parse_datetime(datetime, current_year),
+ position_t position;
+ position.pathname = pathname;
+ position.beg_pos = line_beg_pos;
+ position.beg_line = linenum;
+ position.end_pos = curr_pos;
+ position.end_line = linenum;
+
+ time_xact_t event(position, parse_datetime(datetime, current_year),
p ? account_stack.front()->find_account(p) : NULL,
- n ? n : "", end ? end : "");
+ n ? n : "",
+ end ? end : "");
+
+ timelog.clock_out(event);
count++;
}
diff --git a/src/timelog.cc b/src/timelog.cc
index dc3d3496..b18c436b 100644
--- a/src/timelog.cc
+++ b/src/timelog.cc
@@ -41,11 +41,8 @@ namespace ledger {
namespace {
void clock_out_from_timelog(std::list<time_xact_t>& time_xacts,
- const datetime_t& when,
- account_t * account,
- const char * desc,
- const char * note,
- journal_t& journal)
+ time_xact_t out_event,
+ journal_t& journal)
{
time_xact_t event;
@@ -56,7 +53,7 @@ namespace {
else if (time_xacts.empty()) {
throw parse_error(_("Timelog check-out event without a check-in"));
}
- else if (! account) {
+ else if (! out_event.account) {
throw parse_error
(_("When multiple check-ins are active, checking out requires an account"));
}
@@ -66,7 +63,7 @@ namespace {
for (std::list<time_xact_t>::iterator i = time_xacts.begin();
i != time_xacts.end();
i++)
- if (account == (*i).account) {
+ if (out_event.account == (*i).account) {
event = *i;
found = true;
time_xacts.erase(i);
@@ -78,36 +75,37 @@ namespace {
(_("Timelog check-out event does not match any current check-ins"));
}
- if (desc && event.desc.empty()) {
- event.desc = desc;
- desc = NULL;
- }
+ if (out_event.checkin < event.checkin)
+ throw parse_error
+ (_("Timelog check-out date less than corresponding check-in"));
- if (note && event.note.empty()) {
- event.note = note;
- note = NULL;
+ if (! out_event.desc.empty() && event.desc.empty()) {
+ event.desc = out_event.desc;
+ out_event.desc = empty_string;
}
+ if (! out_event.note.empty() && event.note.empty())
+ event.note = out_event.note;
+
std::auto_ptr<xact_t> curr(new xact_t);
- curr->_date = when.date();
- curr->code = desc ? desc : "";
+ curr->_date = out_event.checkin.date();
+ curr->code = out_event.desc; // if it wasn't used above
curr->payee = event.desc;
+ curr->pos = event.position;
if (! event.note.empty())
curr->append_note(event.note.c_str());
- if (when < event.checkin)
- throw parse_error
- (_("Timelog check-out date less than corresponding check-in"));
-
char buf[32];
- std::sprintf(buf, "%lds", long((when - event.checkin).total_seconds()));
+ std::sprintf(buf, "%lds", long((out_event.checkin - event.checkin)
+ .total_seconds()));
amount_t amt;
amt.parse(buf);
VERIFY(amt.valid());
post_t * post = new post_t(event.account, amt, POST_VIRTUAL);
post->set_state(item_t::CLEARED);
+ post->pos = event.position;
curr->add_post(post);
if (! journal.add_xact(curr.get()))
@@ -128,20 +126,16 @@ time_log_t::~time_log_t()
accounts.push_back(time_xact.account);
foreach (account_t * account, accounts)
- clock_out_from_timelog(time_xacts, CURRENT_TIME(), account,
- NULL, NULL, journal);
+ clock_out_from_timelog(time_xacts,
+ time_xact_t(none, CURRENT_TIME(), account),
+ journal);
assert(time_xacts.empty());
}
}
-void time_log_t::clock_in(const datetime_t& checkin,
- account_t * account,
- const string& desc,
- const string& note)
+void time_log_t::clock_in(time_xact_t event)
{
- time_xact_t event(checkin, account, desc, note);
-
if (! time_xacts.empty()) {
foreach (time_xact_t& time_xact, time_xacts) {
if (event.account == time_xact.account)
@@ -152,16 +146,12 @@ void time_log_t::clock_in(const datetime_t& checkin,
time_xacts.push_back(event);
}
-void time_log_t::clock_out(const datetime_t& checkin,
- account_t * account,
- const string& desc,
- const string& note)
+void time_log_t::clock_out(time_xact_t event)
{
if (time_xacts.empty())
throw std::logic_error(_("Timelog check-out event without a check-in"));
- clock_out_from_timelog(time_xacts, checkin, account, desc.c_str(),
- note.c_str(), journal);
+ clock_out_from_timelog(time_xacts, event, journal);
}
} // namespace ledger
diff --git a/src/timelog.h b/src/timelog.h
index d0519ce4..83256dfa 100644
--- a/src/timelog.h
+++ b/src/timelog.h
@@ -44,6 +44,7 @@
#include "utils.h"
#include "times.h"
+#include "item.h"
namespace ledger {
@@ -57,20 +58,24 @@ public:
account_t * account;
string desc;
string note;
+ position_t position;
time_xact_t() : account(NULL) {
TRACE_CTOR(time_xact_t, "");
}
- time_xact_t(const datetime_t& _checkin,
- account_t * _account = NULL,
- const string& _desc = "",
- const string& _note = "")
- : checkin(_checkin), account(_account), desc(_desc), note(_note) {
- TRACE_CTOR(time_xact_t, "const datetime_t&, account_t *, string, string");
+ time_xact_t(const optional<position_t>& _position,
+ const datetime_t& _checkin,
+ account_t * _account = NULL,
+ const string& _desc = "",
+ const string& _note = "")
+ : checkin(_checkin), account(_account), desc(_desc), note(_note),
+ position(_position ? *_position : position_t()) {
+ TRACE_CTOR(time_xact_t,
+ "position_t, datetime_t, account_t *, string, string");
}
time_xact_t(const time_xact_t& xact)
: checkin(xact.checkin), account(xact.account),
- desc(xact.desc), note(xact.note) {
+ desc(xact.desc), note(xact.note), position(xact.position) {
TRACE_CTOR(time_xact_t, "copy");
}
~time_xact_t() throw() {
@@ -89,15 +94,8 @@ public:
}
~time_log_t();
- void clock_in(const datetime_t& checkin,
- account_t * account = NULL,
- const string& desc = "",
- const string& note = "");
-
- void clock_out(const datetime_t& checkin,
- account_t * account = NULL,
- const string& desc = "",
- const string& note = "");
+ void clock_in(time_xact_t event);
+ void clock_out(time_xact_t event);
};
} // namespace ledger