Break libledger_data's dependency on session_t.

This commit is contained in:
John Wiegley 2009-02-09 18:46:01 -04:00
parent 75c7fbf23e
commit 3c3606aa0d
4 changed files with 35 additions and 32 deletions

View file

@ -54,7 +54,6 @@ namespace ledger {
typedef std::list<path> paths_list; typedef std::list<path> paths_list;
class session_t;
class account_t; class account_t;
/** /**
@ -97,7 +96,7 @@ public:
} }
std::size_t parse(std::istream& in, std::size_t parse(std::istream& in,
session_t& session, scope_t& session_scope,
account_t * master, account_t * master,
const path * original_file); const path * original_file);

View file

@ -80,6 +80,7 @@ value_t parse_command(call_scope_t& args)
{ {
std::istringstream in(str); std::istringstream in(str);
report.session.journal->parse(in, report.session, NULL, NULL); report.session.journal->parse(in, report.session, NULL, NULL);
report.session.clean_accounts();
} }
} }
entry_t * first = report.session.journal->entries.front(); entry_t * first = report.session.journal->entries.front();

View file

@ -84,7 +84,9 @@ std::size_t session_t::read_journal(std::istream& in,
{ {
if (! master) if (! master)
master = journal->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, std::size_t session_t::read_journal(const path& pathname,

View file

@ -29,8 +29,9 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "session.h"
#include "journal.h" #include "journal.h"
#include "account.h"
#include "option.h"
#if defined(TIMELOG_SUPPORT) #if defined(TIMELOG_SUPPORT)
#include "timelog.h" #include "timelog.h"
#endif #endif
@ -50,11 +51,12 @@ namespace {
instance_t * parent; instance_t * parent;
std::istream& in; std::istream& in;
session_t& session; scope_t& session_scope;
journal_t& journal; journal_t& journal;
account_t * master; account_t * master;
const path * original_file; const path * original_file;
accounts_map account_aliases; accounts_map account_aliases;
int current_year;
path pathname; path pathname;
char linebuf[MAX_LINE + 1]; char linebuf[MAX_LINE + 1];
@ -71,7 +73,7 @@ namespace {
time_log_t& _timelog, time_log_t& _timelog,
#endif #endif
std::istream& _in, std::istream& _in,
session_t& _session, scope_t& _session_scope,
journal_t& _journal, journal_t& _journal,
account_t * _master = NULL, account_t * _master = NULL,
const path * _original_file = NULL, const path * _original_file = NULL,
@ -125,7 +127,7 @@ namespace {
virtual expr_t::ptr_op_t lookup(const string& name); 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, std::istream& in,
amount_t& amount, amount_t& amount,
xact_t * xact, xact_t * xact,
@ -145,7 +147,7 @@ namespace {
#endif #endif
if (expr) { if (expr) {
bind_scope_t bound_scope(session, *xact); bind_scope_t bound_scope(session_scope, *xact);
value_t result(expr.calc(bound_scope)); value_t result(expr.calc(bound_scope));
if (! result.is_amount()) if (! result.is_amount())
@ -162,7 +164,7 @@ instance_t::instance_t(std::list<account_t *>& _account_stack,
time_log_t& _timelog, time_log_t& _timelog,
#endif #endif
std::istream& _in, std::istream& _in,
session_t& _session, scope_t& _session_scope,
journal_t& _journal, journal_t& _journal,
account_t * _master, account_t * _master,
const path * _original_file, const path * _original_file,
@ -171,8 +173,8 @@ instance_t::instance_t(std::list<account_t *>& _account_stack,
#if defined(TIMELOG_SUPPORT) #if defined(TIMELOG_SUPPORT)
timelog(_timelog), timelog(_timelog),
#endif #endif
parent(_parent), in(_in), session(_session), journal(_journal), parent(_parent), in(_in), session_scope(_session_scope),
master(_master), original_file(_original_file) journal(_journal), master(_master), original_file(_original_file)
{ {
TRACE_CTOR(instance_t, "..."); TRACE_CTOR(instance_t, "...");
@ -387,7 +389,7 @@ void instance_t::clock_in_directive(char * line,
char * p = skip_ws(line + 22); char * p = skip_ws(line + 22);
char * n = next_element(p, true); 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 : ""); 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 * p = skip_ws(line + 22);
char * n = next_element(p, true); 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); p ? account_stack.front()->find_account(p) : NULL, n);
count++; count++;
} }
@ -464,10 +466,10 @@ void instance_t::price_entry_directive(char * line)
symbol_and_price = next_element(time_field_ptr); symbol_and_price = next_element(time_field_ptr);
if (! symbol_and_price) return; if (! symbol_and_price) return;
datetime = parse_datetime(date_field + " " + time_field_ptr, datetime = parse_datetime(date_field + " " + time_field_ptr,
session.current_year); current_year);
} else { } else {
symbol_and_price = time_field_ptr; symbol_and_price = time_field_ptr;
datetime = parse_datetime(date_field, session.current_year); datetime = parse_datetime(date_field, current_year);
} }
string symbol; string symbol;
@ -493,7 +495,7 @@ void instance_t::nomarket_directive(char * line)
void instance_t::year_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) void instance_t::option_directive(char * line)
@ -504,7 +506,7 @@ void instance_t::option_directive(char * line)
if (p) if (p)
*p++ = '\0'; *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) void instance_t::automated_entry_directive(char * line)
@ -608,7 +610,7 @@ void instance_t::include_directive(char * line)
#if defined(TIMELOG_SUPPORT) #if defined(TIMELOG_SUPPORT)
timelog, timelog,
#endif #endif
stream, session, journal, master, stream, session_scope, journal, master,
&filename, this); &filename, this);
instance.parse(); instance.parse();
@ -654,7 +656,7 @@ void instance_t::alias_directive(char * line)
void instance_t::define_directive(char * line) void instance_t::define_directive(char * line)
{ {
expr_t def(skip_ws(line + 1)); 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) 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 if (*next != '(') // indicates a value expression
xact->amount.parse(stream, amount_t::PARSE_NO_REDUCE); xact->amount.parse(stream, amount_t::PARSE_NO_REDUCE);
else 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_REDUCE) |
static_cast<uint_least8_t>(expr_t::PARSE_NO_ASSIGN)); 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 if (*p != '(') // indicates a value expression
xact->cost->parse(cstream, amount_t::PARSE_NO_MIGRATE); xact->cost->parse(cstream, amount_t::PARSE_NO_MIGRATE);
else 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_MIGRATE) |
static_cast<uint_least8_t>(expr_t::PARSE_NO_ASSIGN)); 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 if (*p != '(') // indicates a value expression
xact->assigned_amount->parse(stream, amount_t::PARSE_NO_MIGRATE); xact->assigned_amount->parse(stream, amount_t::PARSE_NO_MIGRATE);
else 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)); static_cast<uint_least8_t>(expr_t::PARSE_NO_MIGRATE));
if (xact->assigned_amount->is_null()) if (xact->assigned_amount->is_null())
@ -967,7 +969,7 @@ xact_t * instance_t::parse_xact(char * line,
// Parse the optional note // Parse the optional note
if (next && *next == ';') { if (next && *next == ';') {
xact->append_note(++next, session.current_year); xact->append_note(++next, current_year);
next = line + len; next = line + len;
DEBUG("textual.parse", "line " << linenum << ": " DEBUG("textual.parse", "line " << linenum << ": "
<< "Parsed a transaction note"); << "Parsed a transaction note");
@ -1036,9 +1038,9 @@ entry_t * instance_t::parse_entry(char * line,
if (char * p = std::strchr(line, '=')) { if (char * p = std::strchr(line, '=')) {
*p++ = '\0'; *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: * // Parse the optional cleared flag: *
@ -1077,7 +1079,7 @@ entry_t * instance_t::parse_entry(char * line,
// Parse the entry note // Parse the entry note
if (next && *next == ';') if (next && *next == ';')
curr->append_note(next, session.current_year); curr->append_note(next, current_year);
TRACE_STOP(entry_text, 1); TRACE_STOP(entry_text, 1);
@ -1102,7 +1104,7 @@ entry_t * instance_t::parse_entry(char * line,
item = curr.get(); item = curr.get();
// This is a trailing note, and possibly a metadata info tag // 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_pos = curr_pos;
item->end_line++; 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) 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, std::size_t journal_t::parse(std::istream& in,
session_t& session, scope_t& session_scope,
account_t * master, account_t * master,
const path * original_file) const path * original_file)
{ {
@ -1142,11 +1144,10 @@ std::size_t journal_t::parse(std::istream& in,
#if defined(TIMELOG_SUPPORT) #if defined(TIMELOG_SUPPORT)
timelog, timelog,
#endif #endif
in, session, *this, master, original_file); in, session_scope, *this, master,
original_file);
parsing_instance.parse(); parsing_instance.parse();
session.clean_accounts(); // remove calculated totals
TRACE_STOP(parsing_total, 1); TRACE_STOP(parsing_total, 1);
// These tracers were started in textual.cc // These tracers were started in textual.cc