summaryrefslogtreecommitdiff
path: root/parser.cc
diff options
context:
space:
mode:
Diffstat (limited to 'parser.cc')
-rw-r--r--parser.cc88
1 files changed, 40 insertions, 48 deletions
diff --git a/parser.cc b/parser.cc
index 7cb65519..bb00df6a 100644
--- a/parser.cc
+++ b/parser.cc
@@ -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;
}