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:
parent
3599766cee
commit
1efe24105e
@ -623,8 +623,12 @@ static inline void key_generic_cmd(void)
|
||||
warnbox(error_msg);
|
||||
goto cleanup;
|
||||
}
|
||||
day = date2sec(*ui_calendar_get_slctd_day(), 0, 0);
|
||||
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) {
|
||||
rev = item->item.rev;
|
||||
more = recur_next_occurrence(rev->day, -1, rev->rpt, &rev->exc,
|
||||
|
@ -142,6 +142,7 @@
|
||||
*/
|
||||
#define DAYINSEC (DAYINMIN * MININSEC)
|
||||
#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 ENDOFDAY(date) (NEXTDAY(date) - 1)
|
||||
#define HOURINSEC (HOURINMIN * MININSEC)
|
||||
|
25
src/recur.c
25
src/recur.c
@ -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,
|
||||
time_t day, time_t *prev)
|
||||
{
|
||||
time_t prev_day, next;
|
||||
int ret = 0;
|
||||
|
||||
if (day <= DAY(s))
|
||||
return 0;
|
||||
next = *prev = s;
|
||||
while (DAY(next) < day) {
|
||||
/* Set new previous and next. */
|
||||
*prev = next;
|
||||
prev_day = DAY(*prev);
|
||||
recur_next_occurrence(s, d, r, e, prev_day, &next);
|
||||
/* Multi-day appointment */
|
||||
if (next == *prev)
|
||||
next = NEXTDAY(*prev);
|
||||
return ret;
|
||||
|
||||
while (DAY(s) < day) {
|
||||
day = PREVDAY(day);
|
||||
if (recur_item_find_occurrence(s, d, r, e, day, prev)) {
|
||||
/* Multi-day appointment. */
|
||||
if (d != -1 && *prev < day && day < *prev + d)
|
||||
continue;
|
||||
ret = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
return ret;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user