diff --git a/src/dorem.c b/src/dorem.c index 60ce148f..07e48197 100644 --- a/src/dorem.c +++ b/src/dorem.c @@ -127,6 +127,8 @@ int ParseRem(ParsePtr s, Trigger *trig, TimeTrig *tim, int save_in_globals) DynamicBuffer buf; Token tok; + int y, m, d; + DBufInit(&buf); trig->y = NO_YR; @@ -164,6 +166,32 @@ int ParseRem(ParsePtr s, Trigger *trig, TimeTrig *tim, int save_in_globals) /* Figure out what we've got */ FindToken(DBufValue(&buf), &tok); switch(tok.type) { + case T_Date: + DBufFree(&buf); + if (trig->d != NO_DAY) return E_DAY_TWICE; + if (trig->m != NO_MON) return E_MON_TWICE; + if (trig->y != NO_YR) return E_YR_TWICE; + FromJulian(tok.val, &y, &m, &d); + trig->y = y; + trig->m = m; + trig->d = d; + break; + + case T_DateTime: + DBufFree(&buf); + if (trig->d != NO_DAY) return E_DAY_TWICE; + if (trig->m != NO_MON) return E_MON_TWICE; + if (trig->y != NO_YR) return E_YR_TWICE; + FromJulian(tok.val / MINUTES_PER_DAY, &y, &m, &d); + trig->y = y; + trig->m = m; + trig->d = d; + tim->ttime = (tok.val % MINUTES_PER_DAY); + if (save_in_globals) { + LastTriggerTime = tim->ttime; + } + break; + case T_WkDay: DBufFree(&buf); if (trig->wd & (1 << tok.val)) return E_WD_TWICE; diff --git a/src/omit.c b/src/omit.c index 71b000a7..57e4a065 100644 --- a/src/omit.c +++ b/src/omit.c @@ -294,6 +294,14 @@ int DoOmit(ParsePtr p) if ( (r=ParseToken(p, &buf)) ) return r; FindToken(DBufValue(&buf), &tok); switch (tok.type) { + case T_Date: + DBufFree(&buf); + if (y != NO_YR) return E_YR_TWICE; + if (m != NO_MON) return E_MON_TWICE; + if (d != NO_DAY) return E_DAY_TWICE; + FromJulian(tok.val, &y, &m, &d); + break; + case T_Year: DBufFree(&buf); if (y != NO_YR) return E_YR_TWICE; @@ -311,7 +319,7 @@ int DoOmit(ParsePtr p) if (d != NO_DAY) return E_DAY_TWICE; d = tok.val; break; - + case T_Delta: DBufFree(&buf); break; diff --git a/src/token.c b/src/token.c index ad071c6f..31312578 100644 --- a/src/token.c +++ b/src/token.c @@ -256,12 +256,30 @@ void FindToken(char const *s, Token *tok) void FindNumericToken(char const *s, Token *t) { int mult = 1, hour, min; + char const *s_orig = s; t->type = T_Illegal; t->val = 0; if (isdigit(*s)) { PARSENUM(t->val, s); + /* If we hit a '-' or a '/', we may have a date or a datetime */ + if (*s == '-' || *s == '/') { + char const *p = s_orig; + int jul, tim; + if (ParseLiteralDate(&p, &jul, &tim) == OK) { + if (*p) return; + if (tim == NO_TIME) { + t->type = T_Date; + t->val = jul; + return; + } + t->type = T_DateTime; + t->val = MINUTES_PER_DAY * jul + tim; + } + return; + } + /* If we hit a comma, swallow it. This allows stuff like Jan 6, 1998 */ if (*s == ',') { diff --git a/src/types.h b/src/types.h index 05c762bc..4db3f9da 100644 --- a/src/types.h +++ b/src/types.h @@ -133,7 +133,7 @@ enum TokTypes T_IfTrig, T_ErrMsg, T_Set, T_UnSet, T_Fset, T_Omit, T_Banner, T_Exit, T_WkDay, - T_Month, T_Time, + T_Month, T_Time, T_Date, T_DateTime, T_Skip, T_At, T_RemType, T_Until, T_Year, T_Day, T_Rep, T_Delta, T_Back, T_Once, T_Empty,