From 9361c7c2e4ad180055020f2f68fe546cf504edc1 Mon Sep 17 00:00:00 2001 From: John Wiegley Date: Wed, 9 Feb 2005 05:00:50 +0000 Subject: [PATCH] Added support for each entry to remember: the file it came from, and the beginning and ending character positions of that entry within the file. This makes it possible to reproduce the input exactly, with only the changed entries updated. (read_binary_journal, write_binary_journal): All accounts and entries now know which journal they are a member of, and have a `journal' member pointing to it. --- binary.cc | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/binary.cc b/binary.cc index 112ad43c..a9425fa7 100644 --- a/binary.cc +++ b/binary.cc @@ -11,7 +11,7 @@ namespace ledger { static unsigned long binary_magic_number = 0xFFEED765; -static unsigned long format_version = 0x00020031; +static unsigned long format_version = 0x00020032; static account_t ** accounts; static account_t ** accounts_next; @@ -198,6 +198,10 @@ inline void read_binary_transaction(char *& data, transaction_t * xact) inline void read_binary_entry_base(char *& data, entry_base_t * entry, transaction_t *& xact_pool) { + read_binary_number(data, entry->src_idx); + read_binary_number(data, entry->beg_pos); + read_binary_number(data, entry->end_pos); + for (unsigned long i = 0, count = read_binary_number(data); i < count; i++) { @@ -210,28 +214,28 @@ inline void read_binary_entry_base(char *& data, entry_base_t * entry, inline void read_binary_entry(char *& data, entry_t * entry, transaction_t *& xact_pool) { + read_binary_entry_base(data, entry, xact_pool); read_binary_number(data, entry->date); read_binary_number(data, entry->state); read_binary_string(data, &entry->code); read_binary_string(data, &entry->payee); - read_binary_entry_base(data, entry, xact_pool); } inline void read_binary_auto_entry(char *& data, auto_entry_t * entry, transaction_t *& xact_pool) { + read_binary_entry_base(data, entry, xact_pool); read_binary_string(data, &entry->predicate_string); entry->predicate = new item_predicate(entry->predicate_string); - read_binary_entry_base(data, entry, xact_pool); } inline void read_binary_period_entry(char *& data, period_entry_t * entry, transaction_t *& xact_pool) { + read_binary_entry_base(data, entry, xact_pool); read_binary_string(data, &entry->period_string); std::istringstream stream(entry->period_string); entry->period.parse(stream); - read_binary_entry_base(data, entry, xact_pool); } inline commodity_t * read_binary_commodity(char *& data) @@ -291,12 +295,14 @@ inline void read_binary_commodity_extra(char *& data, } inline -account_t * read_binary_account(char *& data, account_t * master = NULL) +account_t * read_binary_account(char *& data, journal_t * journal, + account_t * master = NULL) { account_t * acct = new account_t(NULL); *accounts_next++ = acct; - acct->ident = read_binary_number(data); + acct->ident = read_binary_number(data); + acct->journal = journal; account_t::ident_t id; read_binary_number(data, id); // parent id @@ -322,7 +328,7 @@ account_t * read_binary_account(char *& data, account_t * master = NULL) count = read_binary_number(data); i < count; i++) { - account_t * child = read_binary_account(data); + account_t * child = read_binary_account(data, journal); child->parent = acct; acct->add_account(child); } @@ -380,7 +386,7 @@ unsigned int read_binary_journal(std::istream& in, account_t::ident_t a_count = read_binary_number(data); accounts = accounts_next = new account_t *[a_count]; - journal->master = read_binary_account(data, master); + journal->master = read_binary_account(data, journal, master); // Allocate the memory needed for the entries and transactions in // one large block, which is then chopped up and custom constructed @@ -432,18 +438,21 @@ unsigned int read_binary_journal(std::istream& in, for (unsigned long i = 0; i < count; i++) { new(entry_pool) entry_t; read_binary_entry(data, entry_pool, xact_pool); + entry_pool->journal = journal; journal->entries.push_back(entry_pool++); } for (unsigned long i = 0; i < auto_count; i++) { auto_entry_t * auto_entry = new auto_entry_t; read_binary_auto_entry(data, auto_entry, xact_pool); + auto_entry->journal = journal; journal->auto_entries.push_back(auto_entry); } for (unsigned long i = 0; i < period_count; i++) { period_entry_t * period_entry = new period_entry_t; read_binary_period_entry(data, period_entry, xact_pool); + period_entry->journal = journal; journal->period_entries.push_back(period_entry); } @@ -537,6 +546,10 @@ void write_binary_transaction(std::ostream& out, transaction_t * xact) void write_binary_entry_base(std::ostream& out, entry_base_t * entry) { + write_binary_number(out, entry->src_idx); + write_binary_number(out, entry->beg_pos); + write_binary_number(out, entry->end_pos); + write_binary_number(out, entry->transactions.size()); for (transactions_list::const_iterator i = entry->transactions.begin(); i != entry->transactions.end(); @@ -546,23 +559,23 @@ void write_binary_entry_base(std::ostream& out, entry_base_t * entry) void write_binary_entry(std::ostream& out, entry_t * entry) { + write_binary_entry_base(out, entry); write_binary_number(out, entry->date); write_binary_number(out, entry->state); write_binary_string(out, entry->code); write_binary_string(out, entry->payee); - write_binary_entry_base(out, entry); } void write_binary_auto_entry(std::ostream& out, auto_entry_t * entry) { - write_binary_string(out, entry->predicate_string); write_binary_entry_base(out, entry); + write_binary_string(out, entry->predicate_string); } void write_binary_period_entry(std::ostream& out, period_entry_t * entry) { - write_binary_string(out, entry->period_string); write_binary_entry_base(out, entry); + write_binary_string(out, entry->period_string); } void write_binary_commodity(std::ostream& out, commodity_t * commodity)