diff --git a/src/dorem.c b/src/dorem.c index 3fb8f811..c047f55b 100644 --- a/src/dorem.c +++ b/src/dorem.c @@ -200,6 +200,7 @@ int ParseRem(ParsePtr s, Trigger *trig, TimeTrig *tim, int save_in_globals) trig->once = NO_ONCE; trig->typ = NO_TYPE; trig->scanfrom = NO_DATE; + trig->from = NO_DATE; trig->priority = DefaultPrio; trig->sched[0] = 0; trig->warn[0] = 0; @@ -398,6 +399,9 @@ int ParseRem(ParsePtr s, Trigger *trig, TimeTrig *tim, int save_in_globals) case T_Time: case T_LongTime: tim->duration = tok.val; + if (save_in_globals) { + SaveLastTimeTrig(tim); + } break; default: return E_BAD_TIME; @@ -704,9 +708,12 @@ static int ParseScanFrom(ParsePtr s, Trigger *t, int type) } t->scanfrom = Julian(y, m, d); if (type == FROM_TYPE) { + t->from = t->scanfrom; if (t->scanfrom < JulianToday) { t->scanfrom = JulianToday; } + } else { + t->from = NO_DATE; } PushToken(DBufValue(&buf), s); diff --git a/src/funcs.c b/src/funcs.c index 9f139bb9..a54ed1cc 100644 --- a/src/funcs.c +++ b/src/funcs.c @@ -121,7 +121,17 @@ static int FTime (func_info *); static int FTrigdate (func_info *); static int FTrigdatetime (func_info *); static int FTrigtime (func_info *); +static int FTrigtimedelta (func_info *); +static int FTrigtimerep (func_info *); +static int FTrigduration (func_info *); static int FTrigvalid (func_info *); +static int FTrigback (func_info *); +static int FTrigdelta (func_info *); +static int FTrigrep (func_info *); +static int FTriguntil (func_info *); +static int FTrigscanfrom (func_info *); +static int FTrigfrom (func_info *); +static int FTrigpriority (func_info *); static int FTypeof (func_info *); static int FUpper (func_info *); static int FValue (func_info *); @@ -260,10 +270,20 @@ BuiltinFunc Func[] = { { "time", 2, 2, 1, FTime }, { "timepart", 1, 1, 1, FTimepart }, { "today", 0, 0, 0, FToday }, + { "trigback", 0, 0, 0, FTrigback }, { "trigdate", 0, 0, 0, FTrigdate }, { "trigdatetime", 0, 0, 0, FTrigdatetime }, + { "trigdelta", 0, 0, 0, FTrigdelta }, + { "trigduration", 0, 0, 0, FTrigduration }, + { "trigfrom", 0, 0, 0, FTrigfrom }, { "trigger", 1, 3, 0, FTrigger }, + { "trigpriority", 0, 0, 0, FTrigpriority }, + { "trigrep", 0, 0, 0, FTrigrep }, + { "trigscanfrom", 0, 0, 0, FTrigscanfrom }, { "trigtime", 0, 0, 0, FTrigtime }, + { "trigtimedelta",0, 0, 0, FTrigtimedelta }, + { "trigtimerep", 0, 0, 0, FTrigtimerep }, + { "triguntil", 0, 0, 0, FTriguntil }, { "trigvalid", 0, 0, 0, FTrigvalid }, { "typeof", 1, 1, 1, FTypeof }, { "tzconvert", 2, 3, 0, FTzconvert }, @@ -1137,6 +1157,96 @@ static int FTrigdate(func_info *info) return OK; } +static int FTrigback(func_info *info) +{ + RetVal.type = INT_TYPE; + RETVAL = LastTrigger.back; + return OK; +} + +static int FTrigdelta(func_info *info) +{ + RetVal.type = INT_TYPE; + RETVAL = LastTrigger.delta; + return OK; +} + +static int FTrigtimedelta(func_info *info) +{ + RetVal.type = INT_TYPE; + RETVAL = LastTimeTrig.delta; + return OK; +} + +static int FTrigtimerep(func_info *info) +{ + RetVal.type = INT_TYPE; + RETVAL = LastTimeTrig.rep; + return OK; +} + +static int FTrigduration(func_info *info) +{ + if (LastTimeTrig.duration == NO_TIME) { + RetVal.type = INT_TYPE; + RETVAL = -1; + } else { + RetVal.type = TIME_TYPE; + RETVAL = LastTimeTrig.duration; + } + return OK; +} + +static int FTrigrep(func_info *info) +{ + RetVal.type = INT_TYPE; + RETVAL = LastTrigger.rep; + return OK; +} + +static int FTrigpriority(func_info *info) +{ + RetVal.type = INT_TYPE; + RETVAL = LastTrigger.priority; + return OK; +} + +static int FTriguntil(func_info *info) +{ + if (LastTrigger.until == NO_UNTIL) { + RetVal.type = INT_TYPE; + RETVAL = -1; + } else { + RetVal.type = DATE_TYPE; + RETVAL = LastTrigger.until; + } + return OK; +} + +static int FTrigscanfrom(func_info *info) +{ + if (LastTrigger.scanfrom == NO_DATE) { + RetVal.type = INT_TYPE; + RETVAL = -1; + } else { + RetVal.type = DATE_TYPE; + RETVAL = LastTrigger.scanfrom; + } + return OK; +} + +static int FTrigfrom(func_info *info) +{ + if (LastTrigger.from == NO_DATE) { + RetVal.type = INT_TYPE; + RETVAL = -1; + } else { + RetVal.type = DATE_TYPE; + RETVAL = LastTrigger.from; + } + return OK; +} + static int FTrigvalid(func_info *info) { RetVal.type = INT_TYPE; diff --git a/src/main.c b/src/main.c index b64fe4b0..ac05308d 100644 --- a/src/main.c +++ b/src/main.c @@ -1343,6 +1343,7 @@ ClearLastTriggers(void) LastTrigger.typ = NO_TYPE; LastTrigger.once = NO_ONCE; LastTrigger.scanfrom = NO_DATE; + LastTrigger.from = NO_DATE; LastTrigger.priority = DefaultPrio; LastTrigger.sched[0] = 0; LastTrigger.warn[0] = 0; diff --git a/src/types.h b/src/types.h index 8cab6d9b..518976ea 100644 --- a/src/types.h +++ b/src/types.h @@ -68,6 +68,7 @@ typedef struct { int typ; int once; int scanfrom; + int from; int priority; char sched[VAR_NAME_LEN+1]; /* Scheduling function */ char warn[VAR_NAME_LEN+1]; /* Warning function */