Improve performance of recur_prev_occurrence()

And fix item start day for prev command

Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk>
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
This commit is contained in:
Lars Henriksen 2020-11-15 10:25:46 +01:00 committed by Lukas Fleischer
parent 3599766cee
commit 1efe24105e
3 changed files with 19 additions and 13 deletions

View File

@ -623,8 +623,12 @@ static inline void key_generic_cmd(void)
warnbox(error_msg); warnbox(error_msg);
goto cleanup; goto cleanup;
} }
day = date2sec(*ui_calendar_get_slctd_day(), 0, 0);
item = ui_day_get_sel(); item = ui_day_get_sel();
/*
* The selected day need not be the (item) start day
* for multi-day occurrences.
*/
day = DAY(item->start);
if (item->type == RECUR_EVNT) { if (item->type == RECUR_EVNT) {
rev = item->item.rev; rev = item->item.rev;
more = recur_next_occurrence(rev->day, -1, rev->rpt, &rev->exc, more = recur_next_occurrence(rev->day, -1, rev->rpt, &rev->exc,

View File

@ -142,6 +142,7 @@
*/ */
#define DAYINSEC (DAYINMIN * MININSEC) #define DAYINSEC (DAYINMIN * MININSEC)
#define NEXTDAY(date) date_sec_change((date), 0, 1) #define NEXTDAY(date) date_sec_change((date), 0, 1)
#define PREVDAY(date) date_sec_change((date), 0, -1)
#define DAYLEN(date) (NEXTDAY(date) - (date)) #define DAYLEN(date) (NEXTDAY(date) - (date))
#define ENDOFDAY(date) (NEXTDAY(date) - 1) #define ENDOFDAY(date) (NEXTDAY(date) - 1)
#define HOURINSEC (HOURINMIN * MININSEC) #define HOURINSEC (HOURINMIN * MININSEC)

View File

@ -1852,19 +1852,20 @@ int recur_nth_occurrence(time_t s, long d, struct rpt *r, llist_t *e, int n,
int recur_prev_occurrence(time_t s, long d, struct rpt *r, llist_t *e, int recur_prev_occurrence(time_t s, long d, struct rpt *r, llist_t *e,
time_t day, time_t *prev) time_t day, time_t *prev)
{ {
time_t prev_day, next; int ret = 0;
if (day <= DAY(s)) if (day <= DAY(s))
return 0; return ret;
next = *prev = s;
while (DAY(next) < day) { while (DAY(s) < day) {
/* Set new previous and next. */ day = PREVDAY(day);
*prev = next; if (recur_item_find_occurrence(s, d, r, e, day, prev)) {
prev_day = DAY(*prev); /* Multi-day appointment. */
recur_next_occurrence(s, d, r, e, prev_day, &next); if (d != -1 && *prev < day && day < *prev + d)
/* Multi-day appointment */ continue;
if (next == *prev) ret = 1;
next = NEXTDAY(*prev); break;
}
} }
return 1; return ret;
} }