From 74b4684d404a4fc7f09cf1ce9279ba186c8be48a Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Fri, 27 Jun 2014 19:08:29 -0400 Subject: [PATCH] Duration - Now distinguishes between duration that require prefix quantities ('days') and those that do not ('annual'). --- src/Duration.cpp | 81 +++++++++++++++++++++++++----------------------- 1 file changed, 43 insertions(+), 38 deletions(-) diff --git a/src/Duration.cpp b/src/Duration.cpp index 77696532b..02828b549 100644 --- a/src/Duration.cpp +++ b/src/Duration.cpp @@ -44,48 +44,49 @@ static struct { std::string unit; int seconds; + bool standalone; } durations[] = { // These are sorted by first character, then length, so that Nibbler::getOneOf // returns a maximal match. - {"annual", 365 * DAY}, - {"biannual", 730 * DAY}, - {"bimonthly", 61 * DAY}, - {"biweekly", 14 * DAY}, - {"biyearly", 730 * DAY}, - {"daily", 1 * DAY}, - {"days", 1 * DAY}, - {"day", 1 * DAY}, - {"d", 1 * DAY}, - {"fortnight", 14 * DAY}, - {"hours", 1 * HOUR}, - {"hour", 1 * HOUR}, - {"h", 1 * HOUR}, - {"minutes", 1 * MINUTE}, - {"minute", 1 * MINUTE}, - {"min", 1 * MINUTE}, - {"monthly", 30 * DAY}, - {"months", 30 * DAY}, - {"month", 30 * DAY}, - {"mo", 30 * DAY}, - {"quarterly", 91 * DAY}, - {"quarters", 91 * DAY}, - {"quarter", 91 * DAY}, - {"q", 91 * DAY}, - {"semiannual", 183 * DAY}, - {"sennight", 14 * DAY}, - {"seconds", 1 * SECOND}, - {"second", 1 * SECOND}, - {"s", 1 * SECOND}, - {"weekdays", DAY}, - {"weekly", 7 * DAY}, - {"weeks", 7 * DAY}, - {"week", 7 * DAY}, - {"w", 7 * DAY}, - {"yearly", 365 * DAY}, - {"years", 365 * DAY}, - {"year", 365 * DAY}, - {"y", 365 * DAY}, + {"annual", 365 * DAY, true}, + {"biannual", 730 * DAY, true}, + {"bimonthly", 61 * DAY, true}, + {"biweekly", 14 * DAY, true}, + {"biyearly", 730 * DAY, true}, + {"daily", 1 * DAY, true}, + {"days", 1 * DAY, false}, + {"day", 1 * DAY, false}, + {"d", 1 * DAY, false}, + {"fortnight", 14 * DAY, true}, + {"hours", 1 * HOUR, false}, + {"hour", 1 * HOUR, false}, + {"h", 1 * HOUR, false}, + {"minutes", 1 * MINUTE, false}, + {"minute", 1 * MINUTE, false}, + {"min", 1 * MINUTE, false}, + {"monthly", 30 * DAY, true}, + {"months", 30 * DAY, false}, + {"month", 30 * DAY, false}, + {"mo", 30 * DAY, false}, + {"quarterly", 91 * DAY, true}, + {"quarters", 91 * DAY, false}, + {"quarter", 91 * DAY, false}, + {"q", 91 * DAY, false}, + {"semiannual", 183 * DAY, true}, + {"sennight", 14 * DAY, false}, + {"seconds", 1 * SECOND, false}, + {"second", 1 * SECOND, false}, + {"s", 1 * SECOND, false}, + {"weekdays", 1 * DAY, true}, + {"weekly", 7 * DAY, true}, + {"weeks", 7 * DAY, false}, + {"week", 7 * DAY, false}, + {"w", 7 * DAY, false}, + {"yearly", 365 * DAY, true}, + {"years", 365 * DAY, false}, + {"year", 365 * DAY, false}, + {"y", 365 * DAY, false}, }; #define NUM_DURATIONS (sizeof (durations) / sizeof (durations[0])) @@ -295,6 +296,10 @@ bool Duration::parse (const std::string& input, std::string::size_type& start) if (n.depleted () || Lexer::is_ws (n.next ())) { + // TODO Determine which unit matched, and therefore whether the unit can + // exist as a standalone unit (with assumed quantity of 1), or + // whether the quantity is required. + start = original_start + n.cursor (); double quantity = (number == "") ? 1.0