summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/journal.h3
-rw-r--r--src/precmd.cc1
-rw-r--r--src/session.cc4
-rw-r--r--src/textual.cc59
4 files changed, 35 insertions, 32 deletions
diff --git a/src/journal.h b/src/journal.h
index b84f3448..8c72becc 100644
--- a/src/journal.h
+++ b/src/journal.h
@@ -54,7 +54,6 @@ namespace ledger {
typedef std::list<path> paths_list;
-class session_t;
class account_t;
/**
@@ -97,7 +96,7 @@ public:
}
std::size_t parse(std::istream& in,
- session_t& session,
+ scope_t& session_scope,
account_t * master,
const path * original_file);
diff --git a/src/precmd.cc b/src/precmd.cc
index b4144779..16b7e5f1 100644
--- a/src/precmd.cc
+++ b/src/precmd.cc
@@ -80,6 +80,7 @@ value_t parse_command(call_scope_t& args)
{
std::istringstream in(str);
report.session.journal->parse(in, report.session, NULL, NULL);
+ report.session.clean_accounts();
}
}
entry_t * first = report.session.journal->entries.front();
diff --git a/src/session.cc b/src/session.cc
index 1dfd05cc..99b0d013 100644
--- a/src/session.cc
+++ b/src/session.cc
@@ -84,7 +84,9 @@ std::size_t session_t::read_journal(std::istream& in,
{
if (! master)
master = journal->master;
- return journal->parse(in, *this, master, &pathname);
+ std::size_t count = journal->parse(in, *this, master, &pathname);
+ clean_accounts(); // remove calculated totals
+ return count;
}
std::size_t session_t::read_journal(const path& pathname,
diff --git a/src/textual.cc b/src/textual.cc
index 3bae49cc..b6d3a372 100644
--- a/src/textual.cc
+++ b/src/textual.cc
@@ -29,8 +29,9 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include "session.h"
#include "journal.h"
+#include "account.h"
+#include "option.h"
#if defined(TIMELOG_SUPPORT)
#include "timelog.h"
#endif
@@ -50,11 +51,12 @@ namespace {
instance_t * parent;
std::istream& in;
- session_t& session;
+ scope_t& session_scope;
journal_t& journal;
account_t * master;
const path * original_file;
accounts_map account_aliases;
+ int current_year;
path pathname;
char linebuf[MAX_LINE + 1];
@@ -71,7 +73,7 @@ namespace {
time_log_t& _timelog,
#endif
std::istream& _in,
- session_t& _session,
+ scope_t& _session_scope,
journal_t& _journal,
account_t * _master = NULL,
const path * _original_file = NULL,
@@ -125,7 +127,7 @@ namespace {
virtual expr_t::ptr_op_t lookup(const string& name);
};
- void parse_amount_expr(session_t& session,
+ void parse_amount_expr(scope_t& session_scope,
std::istream& in,
amount_t& amount,
xact_t * xact,
@@ -145,7 +147,7 @@ namespace {
#endif
if (expr) {
- bind_scope_t bound_scope(session, *xact);
+ bind_scope_t bound_scope(session_scope, *xact);
value_t result(expr.calc(bound_scope));
if (! result.is_amount())
@@ -162,7 +164,7 @@ instance_t::instance_t(std::list<account_t *>& _account_stack,
time_log_t& _timelog,
#endif
std::istream& _in,
- session_t& _session,
+ scope_t& _session_scope,
journal_t& _journal,
account_t * _master,
const path * _original_file,
@@ -171,8 +173,8 @@ instance_t::instance_t(std::list<account_t *>& _account_stack,
#if defined(TIMELOG_SUPPORT)
timelog(_timelog),
#endif
- parent(_parent), in(_in), session(_session), journal(_journal),
- master(_master), original_file(_original_file)
+ parent(_parent), in(_in), session_scope(_session_scope),
+ journal(_journal), master(_master), original_file(_original_file)
{
TRACE_CTOR(instance_t, "...");
@@ -387,7 +389,7 @@ void instance_t::clock_in_directive(char * line,
char * p = skip_ws(line + 22);
char * n = next_element(p, true);
- timelog.clock_in(parse_datetime(date, session.current_year),
+ timelog.clock_in(parse_datetime(date, current_year),
account_stack.front()->find_account(p), n ? n : "");
}
@@ -399,7 +401,7 @@ void instance_t::clock_out_directive(char * line,
char * p = skip_ws(line + 22);
char * n = next_element(p, true);
- timelog.clock_out(parse_datetime(date, session.current_year),
+ timelog.clock_out(parse_datetime(date, current_year),
p ? account_stack.front()->find_account(p) : NULL, n);
count++;
}
@@ -464,10 +466,10 @@ void instance_t::price_entry_directive(char * line)
symbol_and_price = next_element(time_field_ptr);
if (! symbol_and_price) return;
datetime = parse_datetime(date_field + " " + time_field_ptr,
- session.current_year);
+ current_year);
} else {
symbol_and_price = time_field_ptr;
- datetime = parse_datetime(date_field, session.current_year);
+ datetime = parse_datetime(date_field, current_year);
}
string symbol;
@@ -493,7 +495,7 @@ void instance_t::nomarket_directive(char * line)
void instance_t::year_directive(char * line)
{
- session.current_year = std::atoi(skip_ws(line + 1));
+ current_year = std::atoi(skip_ws(line + 1));
}
void instance_t::option_directive(char * line)
@@ -504,7 +506,7 @@ void instance_t::option_directive(char * line)
if (p)
*p++ = '\0';
}
- process_option(line + 2, session, p, line);
+ process_option(line + 2, session_scope, p, line);
}
void instance_t::automated_entry_directive(char * line)
@@ -608,7 +610,7 @@ void instance_t::include_directive(char * line)
#if defined(TIMELOG_SUPPORT)
timelog,
#endif
- stream, session, journal, master,
+ stream, session_scope, journal, master,
&filename, this);
instance.parse();
@@ -654,7 +656,7 @@ void instance_t::alias_directive(char * line)
void instance_t::define_directive(char * line)
{
expr_t def(skip_ws(line + 1));
- def.compile(session); // causes definitions to be established
+ def.compile(session_scope); // causes definitions to be established
}
void instance_t::general_directive(char * line)
@@ -802,7 +804,7 @@ xact_t * instance_t::parse_xact(char * line,
if (*next != '(') // indicates a value expression
xact->amount.parse(stream, amount_t::PARSE_NO_REDUCE);
else
- parse_amount_expr(session, stream, xact->amount, xact.get(),
+ parse_amount_expr(session_scope, stream, xact->amount, xact.get(),
static_cast<uint_least8_t>(expr_t::PARSE_NO_REDUCE) |
static_cast<uint_least8_t>(expr_t::PARSE_NO_ASSIGN));
@@ -843,7 +845,7 @@ xact_t * instance_t::parse_xact(char * line,
if (*p != '(') // indicates a value expression
xact->cost->parse(cstream, amount_t::PARSE_NO_MIGRATE);
else
- parse_amount_expr(session, cstream, *xact->cost, xact.get(),
+ parse_amount_expr(session_scope, cstream, *xact->cost, xact.get(),
static_cast<uint_least8_t>(expr_t::PARSE_NO_MIGRATE) |
static_cast<uint_least8_t>(expr_t::PARSE_NO_ASSIGN));
@@ -895,7 +897,7 @@ xact_t * instance_t::parse_xact(char * line,
if (*p != '(') // indicates a value expression
xact->assigned_amount->parse(stream, amount_t::PARSE_NO_MIGRATE);
else
- parse_amount_expr(session, stream, *xact->assigned_amount, xact.get(),
+ parse_amount_expr(session_scope, stream, *xact->assigned_amount, xact.get(),
static_cast<uint_least8_t>(expr_t::PARSE_NO_MIGRATE));
if (xact->assigned_amount->is_null())
@@ -967,7 +969,7 @@ xact_t * instance_t::parse_xact(char * line,
// Parse the optional note
if (next && *next == ';') {
- xact->append_note(++next, session.current_year);
+ xact->append_note(++next, current_year);
next = line + len;
DEBUG("textual.parse", "line " << linenum << ": "
<< "Parsed a transaction note");
@@ -1036,9 +1038,9 @@ entry_t * instance_t::parse_entry(char * line,
if (char * p = std::strchr(line, '=')) {
*p++ = '\0';
- curr->_date_eff = parse_date(p, session.current_year);
+ curr->_date_eff = parse_date(p, current_year);
}
- curr->_date = parse_date(line, session.current_year);
+ curr->_date = parse_date(line, current_year);
// Parse the optional cleared flag: *
@@ -1077,7 +1079,7 @@ entry_t * instance_t::parse_entry(char * line,
// Parse the entry note
if (next && *next == ';')
- curr->append_note(next, session.current_year);
+ curr->append_note(next, current_year);
TRACE_STOP(entry_text, 1);
@@ -1102,7 +1104,7 @@ entry_t * instance_t::parse_entry(char * line,
item = curr.get();
// This is a trailing note, and possibly a metadata info tag
- item->append_note(p + 1, session.current_year);
+ item->append_note(p + 1, current_year);
item->end_pos = curr_pos;
item->end_line++;
}
@@ -1123,11 +1125,11 @@ entry_t * instance_t::parse_entry(char * line,
expr_t::ptr_op_t instance_t::lookup(const string& name)
{
- return session.lookup(name);
+ return session_scope.lookup(name);
}
std::size_t journal_t::parse(std::istream& in,
- session_t& session,
+ scope_t& session_scope,
account_t * master,
const path * original_file)
{
@@ -1142,11 +1144,10 @@ std::size_t journal_t::parse(std::istream& in,
#if defined(TIMELOG_SUPPORT)
timelog,
#endif
- in, session, *this, master, original_file);
+ in, session_scope, *this, master,
+ original_file);
parsing_instance.parse();
- session.clean_accounts(); // remove calculated totals
-
TRACE_STOP(parsing_total, 1);
// These tracers were started in textual.cc