From d2791b046a28c232573f4d55fbeca5a6912dd635 Mon Sep 17 00:00:00 2001 From: Lars Henriksen Date: Wed, 27 May 2020 21:49:36 +0200 Subject: Update import of basic recurrence rules Conversion of COUNT to UNTIL was a simple calculation which assumed one repetiton per period (day, week, month or year); it does not take exception days and invalid dates into account. Solved by a new function which returns the n'th occurrence of a recurrence rule. In calcurse UNTIL is interpreted as a day (DATE), in RFC 5545 as a time of day (DATE-TIME). This has implications when a recurrence rule has an occurrence on the UNTIL day, see comment in ical.c An "Import:" note is added when a multi-day event is imported and turned into a calcurse all-day event. Icalendar quotes in comments have been updated to RFC 5545. Signed-off-by: Lars Henriksen Signed-off-by: Lukas Fleischer --- src/recur.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'src/recur.c') diff --git a/src/recur.c b/src/recur.c index d028d09..29e3dd8 100644 --- a/src/recur.c +++ b/src/recur.c @@ -1826,3 +1826,23 @@ int recur_next_occurrence(time_t s, long d, struct rpt *r, llist_t *e, } return ret; } + +/* + * Finds the nth occurrence of a recurrence rule (s, d, r, e) (incl. the start) + * and returns it in the provided buffer. + */ +int recur_nth_occurrence(time_t s, long d, struct rpt *r, llist_t *e, int n, + time_t *nth) +{ + time_t day; + + if (n <= 0) + return 0; + + for (n--, *nth = s; n > 0; n--) { + day = update_time_in_date(*nth, 0, 0); + if (!recur_next_occurrence(s, d, r, e, day, nth)) + break; + } + return !n; +} -- cgit v1.2.3-54-g00ecf