Fixed the Boost facet-based time parsing code

This commit is contained in:
John Wiegley 2009-10-25 18:55:13 -04:00
parent 05529b2c68
commit a8182c32bd

View file

@ -115,14 +115,16 @@ namespace {
input_stream >> when; input_stream >> when;
#if defined(DEBUG_ON) #if defined(DEBUG_ON)
if (when.is_not_a_date_time()) if (when.is_not_a_date_time())
DEBUG("times.parse", "Failed to parse '" << str DEBUG("times.parse", "Failed to parse date/time '" << str
<< "' using pattern '" << fmt_str << "'"); << "' using pattern '" << fmt_str << "'");
#endif #endif
if (! when.is_not_a_date_time() && if (! when.is_not_a_date_time() &&
input_stream.good() && ! input_stream.eof() && input_stream.good() && ! input_stream.eof() &&
input_stream.peek() != EOF) input_stream.peek() != EOF) {
DEBUG("times.parse", "This string has leftovers: '" << str << "'");
return datetime_t(); return datetime_t();
}
return when; return when;
#else // USE_BOOST_FACETS #else // USE_BOOST_FACETS
std::tm data; std::tm data;
@ -148,14 +150,16 @@ namespace {
input_stream >> when; input_stream >> when;
#if defined(DEBUG_ON) #if defined(DEBUG_ON)
if (when.is_not_a_date()) if (when.is_not_a_date())
DEBUG("times.parse", "Failed to parse '" << str DEBUG("times.parse", "Failed to parse date '" << str
<< "' using pattern '" << fmt_str << "'"); << "' using pattern '" << fmt_str << "'");
#endif #endif
if (! when.is_not_a_date() && if (! when.is_not_a_date() &&
input_stream.good() && ! input_stream.eof() && input_stream.good() && ! input_stream.eof() &&
input_stream.peek() != EOF) input_stream.peek() != EOF) {
DEBUG("times.parse", "This string has leftovers: '" << str << "'");
return date_t(); return date_t();
}
return when; return when;
#else // USE_BOOST_FACETS #else // USE_BOOST_FACETS
std::tm data; std::tm data;
@ -173,11 +177,12 @@ namespace {
typedef temporal_io_t<date_t, gregorian::date_input_facet, typedef temporal_io_t<date_t, gregorian::date_input_facet,
gregorian::date_facet> date_io_t; gregorian::date_facet> date_io_t;
std::auto_ptr<datetime_io_t> written_datetime_io; shared_ptr<datetime_io_t> input_datetime_io;
std::auto_ptr<datetime_io_t> printed_datetime_io; shared_ptr<date_io_t> input_date_io;
std::auto_ptr<date_io_t> input_date_io; shared_ptr<datetime_io_t> written_datetime_io;
std::auto_ptr<date_io_t> written_date_io; shared_ptr<date_io_t> written_date_io;
std::auto_ptr<date_io_t> printed_date_io; shared_ptr<datetime_io_t> printed_datetime_io;
shared_ptr<date_io_t> printed_date_io;
std::vector<shared_ptr<date_io_t> > readers; std::vector<shared_ptr<date_io_t> > readers;
@ -295,7 +300,10 @@ string_to_month_of_year(const std::string& str)
datetime_t parse_datetime(const char * str, optional<date_t::year_type>) datetime_t parse_datetime(const char * str, optional<date_t::year_type>)
{ {
return written_datetime_io->parse(str); datetime_t when = input_datetime_io->parse(str);
if (when.is_not_a_date_time())
throw_(date_error, _("Invalid date/time: %1") << str);
return when;
} }
date_t parse_date(const char * str, optional<date_t::year_type> current_year) date_t parse_date(const char * str, optional<date_t::year_type> current_year)
@ -856,6 +864,8 @@ void set_input_date_format(const char * format)
void times_initialize() void times_initialize()
{ {
if (! is_initialized) { if (! is_initialized) {
input_datetime_io.reset(new datetime_io_t("%Y/%m/%d %H:%M:%S", true));
written_datetime_io.reset(new datetime_io_t("%Y/%m/%d %H:%M:%S", false)); written_datetime_io.reset(new datetime_io_t("%Y/%m/%d %H:%M:%S", false));
written_date_io.reset(new date_io_t("%Y/%m/%d", false)); written_date_io.reset(new date_io_t("%Y/%m/%d", false));
@ -874,11 +884,12 @@ void times_initialize()
void times_shutdown() void times_shutdown()
{ {
if (is_initialized) { if (is_initialized) {
printed_datetime_io.reset(); input_datetime_io.reset();
written_datetime_io.reset();
input_date_io.reset(); input_date_io.reset();
printed_date_io.reset(); written_datetime_io.reset();
written_date_io.reset(); written_date_io.reset();
printed_datetime_io.reset();
printed_date_io.reset();
readers.clear(); readers.clear();