diff --git a/src/dorem.c b/src/dorem.c index d34650c7..86f6dee1 100644 --- a/src/dorem.c +++ b/src/dorem.c @@ -277,6 +277,14 @@ int ParseRem(ParsePtr s, Trigger *trig, TimeTrig *tim, int save_in_globals) } return OK; + case T_Through: + DBufFree(&buf); + if (trig->rep != NO_REP) return E_REP_TWICE; + trig->rep = 1; + r = ParseUntil(s, trig); + if (r) return r; + break; + case T_Until: DBufFree(&buf); r=ParseUntil(s, trig); diff --git a/src/omit.c b/src/omit.c index f564325d..08570460 100644 --- a/src/omit.c +++ b/src/omit.c @@ -272,6 +272,9 @@ static void InsertIntoSortedArray(int *array, int num, int key) *cur = key; } +static int DoThroughOmit(ParsePtr p, int y, int m, int d); +static void DumpOmits(void); + /***************************************************************/ /* */ /* DoOmit */ @@ -294,6 +297,11 @@ int DoOmit(ParsePtr p) if ( (r=ParseToken(p, &buf)) ) return r; FindToken(DBufValue(&buf), &tok); switch (tok.type) { + case T_Debug: + DBufFree(&buf); + DumpOmits(); + return OK; + case T_Date: DBufFree(&buf); if (y != NO_YR) return E_YR_TWICE; @@ -324,6 +332,11 @@ int DoOmit(ParsePtr p) DBufFree(&buf); break; + case T_Through: + DBufFree(&buf); + if (y == NO_YR || m == NO_MON || d == NO_DAY) return E_INCOMPLETE; + return DoThroughOmit(p, y, m, d); + case T_Empty: case T_Comment: case T_RemType: @@ -366,3 +379,111 @@ int DoOmit(ParsePtr p) return OK; } + +static int +DoThroughOmit(ParsePtr p, int ystart, int mstart, int dstart) +{ + int yend = NO_YR, mend = NO_MON, dend = NO_DAY, r; + int start, end, tmp; + + Token tok; + + DynamicBuffer buf; + DBufInit(&buf); + int parsing = 1; + + while(parsing) { + if ( (r=ParseToken(p, &buf)) ) return r; + FindToken(DBufValue(&buf), &tok); + + switch(tok.type) { + case T_Date: + DBufFree(&buf); + if (yend != NO_YR) return E_YR_TWICE; + if (mend != NO_MON) return E_MON_TWICE; + if (dend != NO_DAY) return E_DAY_TWICE; + FromJulian(tok.val, ¥d, &mend, &dend); + break; + + case T_Year: + DBufFree(&buf); + if (yend != NO_YR) return E_YR_TWICE; + yend = tok.val; + break; + + case T_Month: + DBufFree(&buf); + if (mend != NO_MON) return E_MON_TWICE; + mend = tok.val; + break; + + case T_Day: + DBufFree(&buf); + if (dend != NO_DAY) return E_DAY_TWICE; + dend = tok.val; + break; + + case T_Empty: + case T_Comment: + DBufFree(&buf); + parsing = 0; + break; + + default: + Eprint("%s: `%s' (OMIT)", ErrMsg[E_UNKNOWN_TOKEN], + DBufValue(&buf)); + DBufFree(&buf); + return E_UNKNOWN_TOKEN; + + } + } + if (yend == NO_YR || mend == NO_MON || dend == NO_DAY) return E_INCOMPLETE; + if (dend > DaysInMonth(mend, yend)) return E_BAD_DATE; + if (dstart > DaysInMonth(mstart, ystart)) return E_BAD_DATE; + + start = Julian(ystart, mstart, dstart); + end = Julian(yend, mend, dend); + + if (end < start) { + tmp = start; + start = end; + end = tmp; + } + + for (tmp = start; tmp <= end; tmp++) { + if (NumFullOmits == MAX_FULL_OMITS) return E_2MANY_FULL; + if (!BexistsIntArray(FullOmitArray, NumFullOmits, tmp)) { + InsertIntoSortedArray(FullOmitArray, NumFullOmits, tmp); + NumFullOmits++; + } + } + return OK; +} + +void +DumpOmits(void) +{ + int i; + int y, m, d; + fprintf(stderr, "Global Full OMITs:\n"); + if (!NumFullOmits) { + fprintf(stderr, "\tNone.\n"); + } else { + for (i=0; i> 5 & 0xf; + d = PartialOmitArray[i] & 0x1f; + fprintf(stderr, "\t%02d%c%02d\n", m+1, DateSep, d); + } + } +} + diff --git a/src/token.c b/src/token.c index d038c91d..d8f1e378 100644 --- a/src/token.c +++ b/src/token.c @@ -94,6 +94,7 @@ Token TokArray[] = { { "special", 7, T_RemType, PASSTHRU_TYPE }, { "sunday", 3, T_WkDay, 6 }, { "tag", 3, T_Tag, 0 }, + { "through", 7, T_Through, 0 }, { "thursday", 3, T_WkDay, 3 }, { "tuesday", 3, T_WkDay, 1 }, { "unset", 5, T_UnSet, 0 }, diff --git a/src/types.h b/src/types.h index f13c2d39..5eda3983 100644 --- a/src/types.h +++ b/src/types.h @@ -167,7 +167,8 @@ enum TokTypes T_Tag, T_Duration, T_LongTime, - T_OmitFunc + T_OmitFunc, + T_Through }; /* The structure of a token */