diff options
Diffstat (limited to 'parser.cc')
-rw-r--r-- | parser.cc | 88 |
1 files changed, 40 insertions, 48 deletions
@@ -2,13 +2,6 @@ #include "journal.h" #include "config.h" -#include <fstream> -#ifdef WIN32 -#include <io.h> -#else -#include <unistd.h> -#endif - namespace ledger { typedef std::list<parser_t *> parsers_list; @@ -56,11 +49,11 @@ bool unregister_parser(parser_t * parser) return true; } -unsigned int parse_journal(std::istream& in, - config_t& config, - journal_t * journal, - account_t * master, - const std::string * original_file) +unsigned int parse_journal(std::istream& in, + config_t& config, + journal_t * journal, + account_t * master, + const path * original_file) { if (! master) master = journal->master; @@ -74,21 +67,22 @@ unsigned int parse_journal(std::istream& in, return 0; } -unsigned int parse_journal_file(const std::string& path, - config_t& config, - journal_t * journal, - account_t * master, - const std::string * original_file) +unsigned int parse_journal_file(const path& pathname, + config_t& config, + journal_t * journal, + account_t * master, + const path * original_file) { - journal->sources.push_back(path); + journal->sources.push_back(pathname); - if (access(path.c_str(), R_OK) == -1) - throw new error(std::string("Cannot read file '") + path + "'"); + if (! boost::filesystem::exists(pathname)) + throw new error(string("Cannot read file '") + + string(pathname.string()) + "'"); if (! original_file) - original_file = &path; + original_file = &pathname; - std::ifstream stream(path.c_str()); + boost::filesystem::ifstream stream(pathname); return parse_journal(stream, config, journal, master, original_file); } @@ -107,33 +101,33 @@ unsigned int parse_ledger_data(config_t& config, if (! cache_parser) cache_parser = binary_parser_ptr; if (! xml_parser) - xml_parser = xml_parser_ptr; + xml_parser = xml_parser_ptr; if (! stdin_parser) stdin_parser = textual_parser_ptr; - DEBUG_PRINT("ledger.config.cache", + DEBUG("ledger.config.cache", "3. use_cache = " << config.use_cache); if (! config.init_file.empty() && - access(config.init_file.c_str(), R_OK) != -1) { - if (parse_journal_file(config.init_file, config, journal) || + boost::filesystem::exists(config.init_file)) { + if (parse_journal_file(config.init_file.string(), config, journal) || journal->auto_entries.size() > 0 || journal->period_entries.size() > 0) - throw new error(std::string("Entries found in initialization file '") + - config.init_file + "'"); + throw new error(string("Entries found in initialization file '") + + string(config.init_file.string()) + "'"); journal->sources.pop_front(); // remove init file } if (config.use_cache && ! config.cache_file.empty() && ! config.data_file.empty()) { - DEBUG_PRINT("ledger.config.cache", + DEBUG("ledger.config.cache", "using_cache " << config.cache_file); config.cache_dirty = true; - if (access(config.cache_file.c_str(), R_OK) != -1) { - std::ifstream stream(config.cache_file.c_str()); + if (boost::filesystem::exists(config.cache_file)) { + boost::filesystem::ifstream stream(config.cache_file); if (cache_parser && cache_parser->test(stream)) { - std::string price_db_orig = journal->price_db; + optional<path> price_db_orig = journal->price_db; journal->price_db = config.price_db; entry_count += cache_parser->parse(stream, config, journal, NULL, &config.data_file); @@ -151,18 +145,18 @@ unsigned int parse_ledger_data(config_t& config, acct = journal->find_account(config.account); journal->price_db = config.price_db; - if (! journal->price_db.empty() && - access(journal->price_db.c_str(), R_OK) != -1) { - if (parse_journal_file(journal->price_db, config, journal)) { + if (journal->price_db && + boost::filesystem::exists(*journal->price_db)) { + if (parse_journal_file(*journal->price_db, config, journal)) { throw new error("Entries not allowed in price history file"); } else { - DEBUG_PRINT("ledger.config.cache", - "read price database " << journal->price_db); + DEBUG("ledger.config.cache", + "read price database " << *journal->price_db); journal->sources.pop_back(); } } - DEBUG_PRINT("ledger.config.cache", + DEBUG("ledger.config.cache", "rejected cache, parsing " << config.data_file); if (config.data_file == "-") { config.use_cache = false; @@ -170,22 +164,20 @@ unsigned int parse_ledger_data(config_t& config, #if 0 // jww (2006-03-23): Why doesn't XML work on stdin? if (xml_parser && std::cin.peek() == '<') - entry_count += xml_parser->parse(std::cin, config, journal, - acct); + entry_count += xml_parser->parse(std::cin, config, journal, acct); else if (stdin_parser) #endif - entry_count += stdin_parser->parse(std::cin, config, - journal, acct); + entry_count += stdin_parser->parse(std::cin, config, journal, acct); } - else if (access(config.data_file.c_str(), R_OK) != -1) { - entry_count += parse_journal_file(config.data_file, config, - journal, acct); - if (! journal->price_db.empty()) - journal->sources.push_back(journal->price_db); + else if (boost::filesystem::exists(config.data_file)) { + entry_count += parse_journal_file(config.data_file, config, journal, + acct); + if (journal->price_db) + journal->sources.push_back(*journal->price_db); } } - VALIDATE(journal->valid()); + VERIFY(journal->valid()); return entry_count; } |