Rework scanfrom so it's computed as needed.

This commit is contained in:
Dianne Skoll
2025-08-11 16:52:41 -04:00
parent 814dd51270
commit 68a4b23b6f
5 changed files with 37 additions and 19 deletions

View File

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

View File

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

View File

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

View File

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

View File

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