Support period expressions like "last 4 weeks"
This commit is contained in:
parent
904fff97d0
commit
c4e908915c
1 changed files with 37 additions and 12 deletions
47
src/times.cc
47
src/times.cc
|
|
@ -681,14 +681,6 @@ date_interval_t date_parser_t::parse()
|
||||||
tok.kind != lexer_t::token_t::END_REACHED;
|
tok.kind != lexer_t::token_t::END_REACHED;
|
||||||
tok = lexer.next_token()) {
|
tok = lexer.next_token()) {
|
||||||
switch (tok.kind) {
|
switch (tok.kind) {
|
||||||
#if 0
|
|
||||||
case lexer_t::token_t::TOK_INT:
|
|
||||||
// jww (2009-11-18): NYI
|
|
||||||
assert(! "Need to allow for expressions like \"4 months ago\"");
|
|
||||||
tok.unexpected();
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
case lexer_t::token_t::TOK_DATE:
|
case lexer_t::token_t::TOK_DATE:
|
||||||
if (! inclusion_specifier)
|
if (! inclusion_specifier)
|
||||||
inclusion_specifier = date_specifier_t();
|
inclusion_specifier = date_specifier_t();
|
||||||
|
|
@ -776,11 +768,44 @@ date_interval_t date_parser_t::parse()
|
||||||
|
|
||||||
tok = lexer.next_token();
|
tok = lexer.next_token();
|
||||||
switch (tok.kind) {
|
switch (tok.kind) {
|
||||||
case lexer_t::token_t::TOK_INT:
|
case lexer_t::token_t::TOK_INT: {
|
||||||
// jww (2009-11-18): Allow things like "last 5 weeks"
|
unsigned short amount = boost::get<unsigned short>(*tok.value);
|
||||||
assert(! "Need to allow for expressions like \"last 5 weeks\"");
|
|
||||||
|
date_t base(today);
|
||||||
|
date_t end(today);
|
||||||
|
|
||||||
|
tok = lexer.next_token();
|
||||||
|
switch (tok.kind) {
|
||||||
|
case lexer_t::token_t::TOK_YEARS:
|
||||||
|
base += gregorian::years(amount * adjust);
|
||||||
|
break;
|
||||||
|
case lexer_t::token_t::TOK_QUARTERS:
|
||||||
|
base += gregorian::months(amount * adjust * 3);
|
||||||
|
break;
|
||||||
|
case lexer_t::token_t::TOK_MONTHS:
|
||||||
|
base += gregorian::months(amount * adjust);
|
||||||
|
break;
|
||||||
|
case lexer_t::token_t::TOK_WEEKS:
|
||||||
|
base += gregorian::weeks(amount * adjust);
|
||||||
|
break;
|
||||||
|
case lexer_t::token_t::TOK_DAYS:
|
||||||
|
base += gregorian::days(amount * adjust);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
tok.unexpected();
|
tok.unexpected();
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (adjust >= 0) {
|
||||||
|
date_t temp = base;
|
||||||
|
base = end;
|
||||||
|
end = temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
since_specifier = date_specifier_t(base);
|
||||||
|
until_specifier = date_specifier_t(end);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case lexer_t::token_t::TOK_A_MONTH: {
|
case lexer_t::token_t::TOK_A_MONTH: {
|
||||||
inclusion_specifier = date_specifier_t();
|
inclusion_specifier = date_specifier_t();
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue