diff --git a/src/calendar.c b/src/calendar.c index 51a2e004..0ed8f3ec 100644 --- a/src/calendar.c +++ b/src/calendar.c @@ -2019,7 +2019,7 @@ static int DoCalRem(ParsePtr p, int col) } } else { /* Calculate the trigger date */ - dse = ComputeTrigger(trig.scanfrom, &trig, &tim, &r, 1); + dse = ComputeTrigger(get_scanfrom(&trig), &trig, &tim, &r, 1); if (r) { if (r == E_CANT_TRIG && trig.maybe_uncomputable) { r = OK; @@ -2500,7 +2500,7 @@ void WriteJSONTrigger(Trigger const *t, int include_tags, int today) if (t->once != NO_ONCE) { PrintJSONKeyPairInt("once", t->once); } - if (t->scanfrom != today) { + if (t->scanfrom != today && t->scanfrom != NO_DATE) { PrintJSONKeyPairDate("scanfrom", t->scanfrom); } PrintJSONKeyPairDate("from", t->from); diff --git a/src/dorem.c b/src/dorem.c index 4944e7f6..0e7f9c33 100644 --- a/src/dorem.c +++ b/src/dorem.c @@ -32,6 +32,26 @@ static int ParseUntil (ParsePtr s, Trigger *t, int type); static int ShouldTriggerBasedOnWarn (Trigger const *t, int dse, int *err); static int ComputeTrigDuration(TimeTrig const *t); +int +get_scanfrom(Trigger *t) +{ + if (t->scanfrom != NO_DATE) { + if (t->complete_through != NO_DATE) { + if (t->complete_through+1 > t->scanfrom) { + return t->complete_through + 1; + } else { + return t->scanfrom; + } + } else { + return t->scanfrom; + } + } + if (t->complete_through != NO_DATE) { + return t->complete_through+1; + } + return DSEToday; +} + static int ensure_expr_references_first_local_arg(expr_node *node) { @@ -292,7 +312,7 @@ int DoRem(ParsePtr p) } } else { /* Calculate the trigger date */ - dse = ComputeTrigger(trig.scanfrom, &trig, &tim, &r, 1); + dse = ComputeTrigger(get_scanfrom(&trig), &trig, &tim, &r, 1); if (r) { if (PurgeMode) { if (!Hush) { @@ -901,9 +921,9 @@ int ParseRem(ParsePtr s, Trigger *trig, TimeTrig *tim) } /* Set scanfrom to default if not set explicitly */ - if (trig->scanfrom == NO_DATE) { + /* if (trig->scanfrom == NO_DATE) { trig->scanfrom = DSEToday; - } + } */ /* Check that any SCHED / WARN / OMITFUNC functions refer to their arguments */ @@ -1034,12 +1054,9 @@ static int ParseUntil(ParsePtr s, Trigger *t, int type) /***************************************************************/ static int ParseScanFrom(ParsePtr s, Trigger *t, int type) { - int y = NO_YR, - m = NO_MON, - d = NO_DAY; - - Token tok; int r; + int y = NO_YR, m = NO_MON, d = NO_DAY; + Token tok; DynamicBuffer buf; char const *word; @@ -1584,7 +1601,7 @@ int DoSatRemind(Trigger *trig, TimeTrig *tt, ParsePtr p) ensure_satnode_mentions_trigdate(sat_node); iter = 0; - start = trig->scanfrom; + start = get_scanfrom(trig); while (iter++ < MaxSatIter) { dse = ComputeTriggerNoAdjustDuration(start, trig, tt, &r, 1, 0); if (r) { @@ -1623,7 +1640,7 @@ int DoSatRemind(Trigger *trig, TimeTrig *tt, ParsePtr p) } if ((v.type == INT_TYPE && v.v.val) || (v.type == STR_TYPE && *v.v.str)) { - AdjustTriggerForDuration(trig->scanfrom, dse, trig, tt, 1); + AdjustTriggerForDuration(get_scanfrom(trig), dse, trig, tt, 1); if (DebugFlag & DB_PRTTRIG) { int y, m, d; FromDSE(LastTriggerDate, &y, &m, &d); diff --git a/src/funcs.c b/src/funcs.c index a2f3d746..80c7a370 100644 --- a/src/funcs.c +++ b/src/funcs.c @@ -1967,12 +1967,12 @@ static int FTriguntil(func_info *info) static int FTrigscanfrom(func_info *info) { - if (LastTrigger.scanfrom == NO_DATE) { + if (get_scanfrom(&LastTrigger) == NO_DATE) { RetVal.type = INT_TYPE; RETVAL = -1; } else { RetVal.type = DATE_TYPE; - RETVAL = LastTrigger.scanfrom; + RETVAL = get_scanfrom(&LastTrigger); } return OK; } @@ -4147,10 +4147,10 @@ FEvalTrig(func_info *info) return E_PARSE_ERR; } if (scanfrom == NO_DATE) { - dse = ComputeTrigger(trig.scanfrom, &trig, &tim, &r, 0); + dse = ComputeTrigger(get_scanfrom(&trig), &trig, &tim, &r, 0); } else { /* Hokey... */ - if (trig.scanfrom != DSEToday) { + if (get_scanfrom(&trig) != DSEToday) { Wprint(tr("Warning: SCANFROM is ignored in two-argument form of evaltrig()")); } dse = ComputeTrigger(scanfrom, &trig, &tim, &r, 0); @@ -4209,7 +4209,7 @@ FMultiTrig(func_info *info) Eprint(tr("Cannot use AT clause in multitrig() function")); return E_PARSE_ERR; } - dse = ComputeTrigger(trig.scanfrom, &trig, &tim, &r, 0); + dse = ComputeTrigger(get_scanfrom(&trig), &trig, &tim, &r, 0); DestroyParser(&p); if (r != E_CANT_TRIG) { @@ -4262,7 +4262,7 @@ FTrig(func_info *info) FreeTrig(&trig); return E_PARSE_ERR; } - dse = ComputeTrigger(trig.scanfrom, &trig, &tim, &r, 0); + dse = ComputeTrigger(get_scanfrom(&trig), &trig, &tim, &r, 0); DestroyParser(&p); if (r == E_CANT_TRIG) { diff --git a/src/main.c b/src/main.c index ec2b32fc..49d91d2f 100644 --- a/src/main.c +++ b/src/main.c @@ -1252,7 +1252,7 @@ int DoIfTrig(ParsePtr p) } else { if ( (r=ParseRem(p, &trig, &tim)) ) return r; if (trig.typ != NO_TYPE) return E_PARSE_ERR; - dse = ComputeTrigger(trig.scanfrom, &trig, &tim, &r, 1); + dse = ComputeTrigger(get_scanfrom(&trig), &trig, &tim, &r, 1); if (r) { if (r != E_CANT_TRIG || !trig.maybe_uncomputable) { if (!Hush || r != E_RUN_DISABLED) { diff --git a/src/protos.h b/src/protos.h index aab98f15..e65ed89b 100644 --- a/src/protos.h +++ b/src/protos.h @@ -290,3 +290,4 @@ void pop_excess_ifs(char const *fname); void SetCurrentFilename(char const *fname); char const *GetCurrentFilename(void); +int get_scanfrom(Trigger *t);