From 18a3db0f31544c3e4cbbaedac306384ed91b07ed Mon Sep 17 00:00:00 2001 From: Dianne Skoll Date: Tue, 31 Dec 2019 18:41:25 -0500 Subject: [PATCH] Fix interation between multi-day events and SATISFY. --- src/dorem.c | 40 +++++++++++++++++++++---- src/protos.h | 2 ++ src/trigger.c | 83 ++++++++++++++++++++++++++++++++++++++++----------- 3 files changed, 102 insertions(+), 23 deletions(-) diff --git a/src/dorem.c b/src/dorem.c index c5464228..53158dba 100644 --- a/src/dorem.c +++ b/src/dorem.c @@ -1044,16 +1044,16 @@ int ShouldTriggerReminder(Trigger *t, TimeTrig *tim, int jul, int *err) /***************************************************************/ int DoSatRemind(Trigger *trig, TimeTrig *tt, ParsePtr p) { - int iter, jul, r; + int iter, jul, r, start; Value v; char const *s; char const *t; t = p->pos; iter = 0; - jul = trig->scanfrom; + start = trig->scanfrom; while (iter++ < MaxSatIter) { - jul = ComputeTrigger(jul, trig, tt, &r, 1); + jul = ComputeTriggerNoAdjustDuration(start, trig, tt, &r, 1); if (r) { if (r == E_CANT_TRIG) return OK; else return r; } @@ -1065,10 +1065,38 @@ int DoSatRemind(Trigger *trig, TimeTrig *tt, ParsePtr p) t = p->pos; if (r) return r; if (v.type != INT_TYPE && v.type != STR_TYPE) return E_BAD_TYPE; - if (v.type == INT_TYPE && v.v.val) return OK; - if (v.type == STR_TYPE && *v.v.str) return OK; + if ((v.type == INT_TYPE && v.v.val) || + (v.type == STR_TYPE && *v.v.str)) { + AdjustTriggerForDuration(trig->scanfrom, jul, trig, tt, 1); + if (DebugFlag & DB_PRTTRIG) { + int y, m, d; + FromJulian(LastTriggerDate, &y, &m, &d); + fprintf(ErrFp, "%s(%d): Trig(satisfied) = %s, %d %s, %d", + FileName, LineNo, + DayName[LastTriggerDate % 7], + d, + MonthName[m], + y); + if (tt->ttime != NO_TIME) { + fprintf(ErrFp, " AT %02d:%02d", + (tt->ttime / 60), + (tt->ttime % 60)); + if (tt->duration != NO_TIME) { + fprintf(ErrFp, " DURATION %02d:%02d", + (tt->duration / 60), + (tt->duration % 60)); + } + } + fprintf(ErrFp, "\n"); + } + return OK; + } p->pos = s; - jul++; + if (jul < start) { + start++; + } else { + start = jul+1; + } } p->pos = t; LastTrigValid = 0; diff --git a/src/protos.h b/src/protos.h index e8adc35c..50a29541 100644 --- a/src/protos.h +++ b/src/protos.h @@ -89,6 +89,8 @@ char const *FindInitialToken (Token *tok, char const *s); void FindToken (char const *s, Token *tok); void FindNumericToken (char const *s, Token *t); int ComputeTrigger (int today, Trigger *trig, TimeTrig *tim, int *err, int save_in_globals); +int ComputeTriggerNoAdjustDuration (int today, Trigger *trig, TimeTrig *tim, int *err, int save_in_globals); +int AdjustTriggerForDuration(int today, int r, Trigger *trig, TimeTrig *tim, int save_in_globals); int ComputeScanStart(int today, Trigger *trig, TimeTrig *tt); char *StrnCpy (char *dest, char const *source, int n); int StrMatch (char const *s1, char const *s2, int n); diff --git a/src/trigger.c b/src/trigger.c index 3f12b543..0e79a8a0 100644 --- a/src/trigger.c +++ b/src/trigger.c @@ -408,6 +408,51 @@ static int GetNextTriggerDate(Trigger *trig, int start, int *err, int *nextstart return simple; } +int +AdjustTriggerForDuration(int today, int r, Trigger *trig, TimeTrig *tim, int save_in_globals) +{ + int y, m, d; + if (r < today && r + trig->duration_days >= today) { + /* Adjust duration down */ + tim->duration -= (today - r) * 1440; + tim->duration += tim->ttime; + + /* Start at midnight */ + tim->ttime = 0; + + /* Change trigger date to today */ + r = today; + if (DebugFlag & DB_PRTTRIG) { + FromJulian(r, &y, &m, &d); + fprintf(ErrFp, "%s(%d): Trig(adj) = %s, %d %s, %d", + FileName, LineNo, + DayName[r % 7], + d, + MonthName[m], + y); + if (tim->ttime != NO_TIME) { + fprintf(ErrFp, " AT %02d:%02d", + (tim->ttime / 60), + (tim->ttime % 60)); + if (tim->duration != NO_TIME) { + fprintf(ErrFp, " DURATION %02d:%02d", + (tim->duration / 60), + (tim->duration % 60)); + } + } + fprintf(ErrFp, "\n"); + } + + if (save_in_globals) { + LastTriggerTime = tim->ttime; + SaveLastTimeTrig(tim); + LastTriggerDate = r; + LastTrigValid = 1; + } + } + return r; +} + /***************************************************************/ /* */ /* ComputeTrigger */ @@ -418,6 +463,27 @@ static int GetNextTriggerDate(Trigger *trig, int start, int *err, int *nextstart /***************************************************************/ int ComputeTrigger(int today, Trigger *trig, TimeTrig *tim, int *err, int save_in_globals) +{ + int r = ComputeTriggerNoAdjustDuration(today, trig, tim, err, save_in_globals); + if (*err != OK) { + return r; + } + if (r < today && r + trig->duration_days >= today) { + r = AdjustTriggerForDuration(today, r, trig, tim, save_in_globals); + } + return r; +} + +/***************************************************************/ +/* */ +/* ComputeTriggerNoAdjustDuration */ +/* */ +/* Compute a trigger, but do NOT adjust the time trigger */ +/* duration. */ +/* */ +/***************************************************************/ +int ComputeTriggerNoAdjustDuration(int today, Trigger *trig, TimeTrig *tim, + int *err, int save_in_globals) { int nattempts = 0, start = today - trig->duration_days, @@ -479,23 +545,6 @@ int ComputeTrigger(int today, Trigger *trig, TimeTrig *tim, /** FIXME: Fix bad interaction with SATISFY... need to rethink!!! */ if (result+trig->duration_days >= today && (trig->skip != SKIP_SKIP || !omit)) { - /* Adust for non-zero duration */ - if (result < today) { - - /* Adjust duration down */ - tim->duration -= (today - result) * 1440; - tim->duration += tim->ttime; - - /* Start at midnight */ - tim->ttime = 0; - - if (save_in_globals) { - LastTriggerTime = tim->ttime; - SaveLastTimeTrig(tim); - } - /* Trigger time is today */ - result = today; - } if (save_in_globals) { LastTriggerDate = result; /* Save in global var */ LastTrigValid = 1;