diff options
author | John Wiegley <johnw@newartisans.com> | 2004-07-30 21:57:02 -0400 |
---|---|---|
committer | John Wiegley <johnw@newartisans.com> | 2004-07-30 21:57:02 -0400 |
commit | 94e76ae87e883291d13320738fe165c7a2a2415b (patch) | |
tree | b90eff2ee3737ecdfea96dbee52ecd239fcb2578 /textual.cc | |
parent | 5087a60deef7c618a07562511e9a1fbf2414776c (diff) | |
download | fork-ledger-94e76ae87e883291d13320738fe165c7a2a2415b.tar.gz fork-ledger-94e76ae87e883291d13320738fe165c7a2a2415b.tar.bz2 fork-ledger-94e76ae87e883291d13320738fe165c7a2a2415b.zip |
two major changes
Complete changed the way format strings are handled. They are now
compiled first, which is far more efficient than what was being done
before.
Also, there is now a global ledger::commodity_t::commodities map,
which saves me from having to pass the current journal around to a
zillion different functions, for the sole purpose of making sure that
all commodity symbols that are parsed refer to the same commodity
object.
Diffstat (limited to 'textual.cc')
-rw-r--r-- | textual.cc | 73 |
1 files changed, 35 insertions, 38 deletions
@@ -186,8 +186,8 @@ inline char peek_next_nonws(std::istream& in) return c; } -transaction_t * parse_transaction_text(char * line, ledger_t * ledger, - account_t * account, entry_t * entry) +transaction_t * parse_transaction_text(char * line, account_t * account, + entry_t * entry) { // The account will be determined later... @@ -208,10 +208,10 @@ transaction_t * parse_transaction_text(char * line, ledger_t * ledger, char * price_str = std::strchr(cost_str, '@'); if (price_str) { *price_str++ = '\0'; - xact->cost.parse(price_str, ledger); + xact->cost.parse(price_str); } - xact->amount.parse(cost_str, ledger); + xact->amount.parse(cost_str); if (price_str) xact->cost *= xact->amount; @@ -233,21 +233,21 @@ transaction_t * parse_transaction_text(char * line, ledger_t * ledger, xact->account = account->find_account(p); if (! xact->amount.commodity) - xact->amount.commodity = ledger->find_commodity("", true); + xact->amount.commodity = commodity_t::find_commodity("", true); if (! xact->cost.commodity) - xact->cost.commodity = ledger->find_commodity("", true); + xact->cost.commodity = commodity_t::find_commodity("", true); return xact; } -transaction_t * parse_transaction(std::istream& in, ledger_t * ledger, - account_t * account, entry_t * entry) +transaction_t * parse_transaction(std::istream& in, account_t * account, + entry_t * entry) { static char line[MAX_LINE + 1]; in.getline(line, MAX_LINE); linenum++; - return parse_transaction_text(line, ledger, account, entry); + return parse_transaction_text(line, account, entry); } class automated_transaction_t @@ -338,8 +338,7 @@ public: } }; -void parse_automated_transactions(std::istream& in, ledger_t * ledger, - account_t * account, +void parse_automated_transactions(std::istream& in, account_t * account, automated_transactions_t& auto_xacts) { static char line[MAX_LINE + 1]; @@ -359,7 +358,7 @@ void parse_automated_transactions(std::istream& in, ledger_t * ledger, transactions_list xacts; while (! in.eof() && (in.peek() == ' ' || in.peek() == '\t')) { - if (transaction_t * xact = parse_transaction(in, ledger, account, NULL)) { + if (transaction_t * xact = parse_transaction(in, account, NULL)) { if (! xact->amount) throw parse_error(path, linenum, "All automated transactions must have a value"); @@ -446,8 +445,7 @@ bool finalize_entry(entry_t * entry) return ! balance; } -entry_t * parse_entry(std::istream& in, ledger_t * ledger, - account_t * master) +entry_t * parse_entry(std::istream& in, account_t * master) { entry_t * curr = new entry_t; @@ -486,7 +484,7 @@ entry_t * parse_entry(std::istream& in, ledger_t * ledger, // Parse all of the transactions associated with this entry while (! in.eof() && (in.peek() == ' ' || in.peek() == '\t')) - if (transaction_t * xact = parse_transaction(in, ledger, master, curr)) + if (transaction_t * xact = parse_transaction(in, master, curr)) curr->add_transaction(xact); // If there were no transactions, throw away the entry @@ -504,7 +502,7 @@ entry_t * parse_entry(std::istream& in, ledger_t * ledger, // Textual ledger parser // -unsigned int parse_textual_ledger(std::istream& in, ledger_t * ledger, +unsigned int parse_textual_ledger(std::istream& in, ledger_t * journal, account_t * master) { static char line[MAX_LINE + 1]; @@ -517,11 +515,11 @@ unsigned int parse_textual_ledger(std::istream& in, ledger_t * ledger, automated_transactions_t auto_xacts; if (! master) - master = ledger->master; + master = journal->master; account_stack.push_front(master); - path = ledger->sources.back(); + path = journal->sources.back(); linenum = 1; while (! in.eof()) { @@ -602,14 +600,14 @@ unsigned int parse_textual_ledger(std::istream& in, ledger_t * ledger, char buf[32]; std::sprintf(buf, "%fh", diff); amount_t amt; - amt.parse(buf, ledger); + amt.parse(buf); time_commodity = amt.commodity; transaction_t * xact = new transaction_t(curr, last_account, amt, amt, TRANSACTION_VIRTUAL); curr->add_transaction(xact); - if (! finalize_entry(curr) || ! ledger->add_entry(curr)) + if (! finalize_entry(curr) || ! journal->add_entry(curr)) assert(0); count++; @@ -650,9 +648,9 @@ unsigned int parse_textual_ledger(std::istream& in, ledger_t * ledger, parse_commodity(in, symbol); in >> line; // the price - price.parse(line, ledger); + price.parse(line); - commodity_t * commodity = ledger->find_commodity(symbol, true); + commodity_t * commodity = commodity_t::find_commodity(symbol, true); commodity->add_price(date, price); break; } @@ -663,7 +661,7 @@ unsigned int parse_textual_ledger(std::istream& in, ledger_t * ledger, in >> c; parse_commodity(in, symbol); - commodity_t * commodity = ledger->find_commodity(line, true); + commodity_t * commodity = commodity_t::find_commodity(line, true); commodity->flags |= (COMMODITY_STYLE_CONSULTED | COMMODITY_STYLE_NOMARKET); break; @@ -677,9 +675,9 @@ unsigned int parse_textual_ledger(std::istream& in, ledger_t * ledger, parse_commodity(in, symbol); in >> line; // the price - price.parse(line, ledger); + price.parse(line); - commodity_t * commodity = ledger->find_commodity(symbol, true); + commodity_t * commodity = commodity_t::find_commodity(symbol, true); commodity->set_conversion(price); break; } @@ -700,8 +698,7 @@ unsigned int parse_textual_ledger(std::istream& in, ledger_t * ledger, break; case '=': // automated transactions - parse_automated_transactions(in, ledger, account_stack.front(), - auto_xacts); + parse_automated_transactions(in, account_stack.front(), auto_xacts); break; case '@': { // account specific @@ -729,12 +726,12 @@ unsigned int parse_textual_ledger(std::istream& in, ledger_t * ledger, char * p = skip_ws(line); std::ifstream stream(p); - ledger->sources.push_back(p); + journal->sources.push_back(p); unsigned int curr_linenum = linenum; std::string curr_path = path; - count += parse_textual_ledger(stream, ledger, account_stack.front()); + count += parse_textual_ledger(stream, journal, account_stack.front()); linenum = curr_linenum; path = curr_path; @@ -743,11 +740,11 @@ unsigned int parse_textual_ledger(std::istream& in, ledger_t * ledger, default: { unsigned int first_line = linenum; - if (entry_t * entry = parse_entry(in, ledger, account_stack.front())) { + if (entry_t * entry = parse_entry(in, account_stack.front())) { if (! auto_xacts.automated_transactions.empty()) auto_xacts.extend_entry(entry); - if (ledger->add_entry(entry)) + if (journal->add_entry(entry)) count++; else throw parse_error(path, first_line, "Entry does not balance"); @@ -876,11 +873,11 @@ void print_textual_entry(std::ostream& out, entry_t * entry, bool shortcut) out << std::endl; } -void print_textual_ledger(std::ostream& out, ledger_t * ledger, +void print_textual_ledger(std::ostream& out, ledger_t * journal, bool shortcut) { - for (entries_list::const_iterator i = ledger->entries.begin(); - i != ledger->entries.end(); + for (entries_list::const_iterator i = journal->entries.begin(); + i != journal->entries.end(); i++) print_textual_entry(out, *i, shortcut); } @@ -891,12 +888,12 @@ void print_textual_ledger(std::ostream& out, ledger_t * ledger, int main(int argc, char *argv[]) { - book.sources.push_back(argv[1]); + journal.sources.push_back(argv[1]); std::ifstream stream(argv[1]); - ledger::ledger_t book; - int count = parse_textual_ledger(stream, &book, book.master); + ledger::ledger_t journal; + int count = parse_textual_ledger(stream, &journal, journal.master); std::cout << "Read " << count << " entries." << std::endl; - print_textual_ledger(std::cout, &book, true); + print_textual_ledger(std::cout, &journal, true); } #endif // PARSE_TEST |