mirror of
https://salsa.debian.org/dskoll/remind.git
synced 2026-04-16 06:18:47 +02:00
Preserve relative scanfroms in t->scanfrom; compute when needed.
This commit is contained in:
@@ -2509,8 +2509,12 @@ void WriteJSONTrigger(Trigger const *t, int include_tags)
|
||||
if (t->once != NO_ONCE) {
|
||||
PrintJSONKeyPairInt("once", t->once);
|
||||
}
|
||||
if (t->scanfrom != NO_DATE) {
|
||||
PrintJSONKeyPairDate("scanfrom", t->scanfrom);
|
||||
if (t->scanfrom != NO_SCANFROM) {
|
||||
if (t->scanfrom >= 0) {
|
||||
PrintJSONKeyPairDate("scanfrom", t->scanfrom);
|
||||
} else {
|
||||
PrintJSONKeyPairInt("scanfrom", t->scanfrom);
|
||||
}
|
||||
}
|
||||
PrintJSONKeyPairDate("from", t->from);
|
||||
PrintJSONKeyPairInt("priority", t->priority);
|
||||
|
||||
53
src/dorem.c
53
src/dorem.c
@@ -51,6 +51,14 @@ static int todo_filtered(Trigger const *t)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
get_raw_scanfrom(Trigger const *t)
|
||||
{
|
||||
if (t->scanfrom == NO_SCANFROM) return NO_SCANFROM;
|
||||
if (t->scanfrom > 0) return t->scanfrom;
|
||||
return DSEToday + t->scanfrom;
|
||||
}
|
||||
|
||||
int
|
||||
get_scanfrom(Trigger const *t)
|
||||
{
|
||||
@@ -65,15 +73,15 @@ get_scanfrom(Trigger const *t)
|
||||
return t->from;
|
||||
}
|
||||
}
|
||||
if (t->scanfrom != NO_DATE) {
|
||||
if (get_raw_scanfrom(t) != NO_SCANFROM) {
|
||||
if (t->complete_through != NO_DATE) {
|
||||
if (t->complete_through+1 > t->scanfrom) {
|
||||
if (t->complete_through+1 > get_raw_scanfrom(t)) {
|
||||
return t->complete_through+1;
|
||||
} else {
|
||||
return t->scanfrom;
|
||||
return get_raw_scanfrom(t);
|
||||
}
|
||||
} else {
|
||||
return t->scanfrom;
|
||||
return get_raw_scanfrom(t);
|
||||
}
|
||||
}
|
||||
if (t->complete_through != NO_DATE) {
|
||||
@@ -570,9 +578,8 @@ static int GetFullDate(ParsePtr s, char const *prefix, int *dse)
|
||||
return E_DAY_TWICE;
|
||||
}
|
||||
*dse = tok.val;
|
||||
/* Prevent further parsing of date */
|
||||
FromDSE(*dse, &y, &m, &d);
|
||||
break;
|
||||
/* We're done here! */
|
||||
return OK;
|
||||
|
||||
default:
|
||||
if (tok.type == T_Illegal && tok.val < 0) {
|
||||
@@ -635,7 +642,7 @@ int ParseRem(ParsePtr s, Trigger *trig, TimeTrig *tim)
|
||||
trig->addomit = 0;
|
||||
trig->noqueue = 0;
|
||||
trig->typ = NO_TYPE;
|
||||
trig->scanfrom = NO_DATE;
|
||||
trig->scanfrom = NO_SCANFROM;
|
||||
trig->from = NO_DATE;
|
||||
trig->priority = DefaultPrio;
|
||||
trig->sched[0] = 0;
|
||||
@@ -1015,8 +1022,8 @@ int ParseRem(ParsePtr s, Trigger *trig, TimeTrig *tim)
|
||||
if (trig->until != NO_UNTIL && trig->until < trig->from) {
|
||||
Wprint(tr("Warning: UNTIL/THROUGH date earlier than FROM date"));
|
||||
}
|
||||
} else if (trig->scanfrom != NO_DATE) {
|
||||
if (trig->until != NO_UNTIL && trig->until < trig->scanfrom) {
|
||||
} else if (get_raw_scanfrom(trig) != NO_SCANFROM) {
|
||||
if (trig->until != NO_UNTIL && trig->until < get_raw_scanfrom(trig)) {
|
||||
Wprint(tr("Warning: UNTIL/THROUGH date earlier than SCANFROM date"));
|
||||
}
|
||||
}
|
||||
@@ -1026,11 +1033,6 @@ int ParseRem(ParsePtr s, Trigger *trig, TimeTrig *tim)
|
||||
Wprint(tr("Warning: Useless use of UNTIL with fully-specified date and no *rep"));
|
||||
}
|
||||
|
||||
/* Set scanfrom to default if not set explicitly */
|
||||
/* if (trig->scanfrom == NO_DATE) {
|
||||
trig->scanfrom = DSEToday;
|
||||
} */
|
||||
|
||||
/* Check that any SCHED / WARN / OMITFUNC functions refer to
|
||||
their arguments */
|
||||
check_trigger_function(trig->sched, "SCHED");
|
||||
@@ -1173,7 +1175,7 @@ static int ParseScanFrom(ParsePtr s, Trigger *t, int type)
|
||||
word = "FROM";
|
||||
}
|
||||
|
||||
if (t->scanfrom != NO_DATE) return E_SCAN_TWICE;
|
||||
if (t->scanfrom != NO_SCANFROM) return E_SCAN_TWICE;
|
||||
|
||||
while(1) {
|
||||
r = ParseToken(s, &buf);
|
||||
@@ -1221,8 +1223,16 @@ static int ParseScanFrom(ParsePtr s, Trigger *t, int type)
|
||||
Eprint("%s: %s", word, GetErr(E_DAY_TWICE));
|
||||
return E_DAY_TWICE;
|
||||
}
|
||||
FromDSE(tok.val, &y, &m, &d);
|
||||
break;
|
||||
t->scanfrom = tok.val;
|
||||
if (type == FROM_TYPE) {
|
||||
t->from = t->scanfrom;
|
||||
if (t->scanfrom < DSEToday) {
|
||||
t->scanfrom = DSEToday;
|
||||
}
|
||||
} else {
|
||||
t->from = NO_DATE;
|
||||
}
|
||||
return OK;
|
||||
|
||||
case T_Back:
|
||||
DBufFree(&buf);
|
||||
@@ -1242,15 +1252,14 @@ static int ParseScanFrom(ParsePtr s, Trigger *t, int type)
|
||||
Eprint("%s: %s", word, GetErr(E_DAY_TWICE));
|
||||
return E_DAY_TWICE;
|
||||
}
|
||||
if (tok.val < 0) {
|
||||
if (tok.val > 0) {
|
||||
tok.val = -tok.val;
|
||||
}
|
||||
FromDSE(DSEToday - tok.val, &y, &m, &d);
|
||||
/* Don't purge reminders with a relative scanfrom */
|
||||
t->scanfrom = tok.val;
|
||||
s->expr_happened = 1;
|
||||
nonconst_debug(s->nonconst_expr, tr("Relative SCANFROM counts as a non-constant expression"));
|
||||
s->nonconst_expr = 1;
|
||||
break;
|
||||
return OK;
|
||||
|
||||
default:
|
||||
if (tok.type == T_Illegal && tok.val < 0) {
|
||||
|
||||
@@ -291,4 +291,5 @@ void pop_excess_ifs(char const *fname);
|
||||
void SetCurrentFilename(char const *fname);
|
||||
char const *GetCurrentFilename(void);
|
||||
int get_scanfrom(Trigger const *t);
|
||||
int get_raw_scanfrom(Trigger const *t);
|
||||
void remove_trailing_newlines(DynamicBuffer *buf);
|
||||
|
||||
@@ -196,6 +196,7 @@ typedef Parser *ParsePtr; /* Pointer to parser structure */
|
||||
#define AFTER_SKIP 3
|
||||
|
||||
#define NO_TIME INT_MAX
|
||||
#define NO_SCANFROM INT_MIN
|
||||
|
||||
#define NO_PRIORITY 5000 /* Default priority is midway between 0 and 9999 */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user