Fix interation between multi-day events and SATISFY.

This commit is contained in:
Dianne Skoll
2019-12-31 18:41:25 -05:00
parent d2c115127d
commit 18a3db0f31
3 changed files with 102 additions and 23 deletions

View File

@@ -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;

View File

@@ -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);

View File

@@ -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;