From ebae0257fbb3cc420cdde80236ae63f6a1ab612e Mon Sep 17 00:00:00 2001 From: John Wiegley Date: Wed, 21 Jan 2009 18:29:20 -0400 Subject: Resolve outstanding stdin parsing issues by buffering the data. --- parser.cc | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) (limited to 'parser.cc') diff --git a/parser.cc b/parser.cc index 9c660f8f..5c54d6f2 100644 --- a/parser.cc +++ b/parser.cc @@ -166,16 +166,21 @@ unsigned int parse_ledger_data(config_t& config, "rejected cache, parsing " << config.data_file); if (config.data_file == "-") { config.use_cache = false; - journal->sources.push_back(""); -#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); - else if (stdin_parser) -#endif - entry_count += stdin_parser->parse(std::cin, config, - journal, acct); + journal->sources.push_back("/dev/stdin"); + + std::ostringstream buffer; + + while (std::cin.good() && ! std::cin.eof()) { + static char line[8192]; + std::cin.read(line, 8192); + std::streamsize count = std::cin.gcount(); + buffer.write(line, count); + } + buffer.flush(); + + std::istringstream buf_in(buffer.str()); + + entry_count += parse_journal(buf_in, config, journal, acct); } else if (access(config.data_file.c_str(), R_OK) != -1) { entry_count += parse_journal_file(config.data_file, config, -- cgit v1.2.3