X-Git-Url: http://pileus.org/git/?p=lackey;a=blobdiff_plain;f=src%2Fcal.c;h=a05dd1feefe0d69868a934a51ab30538868f09ab;hp=8d039a607fceda288f58837826b044ad944a01f9;hb=bfc415555da3be7f94738b3ac62c511a53b78674;hpb=c24658fbe686f3cca37a9e9cb07c82cfcaefb8c5 diff --git a/src/cal.c b/src/cal.c index 8d039a6..a05dd1f 100644 --- a/src/cal.c +++ b/src/cal.c @@ -33,9 +33,9 @@ CAL(dummy); CAL(ical); /* Global data */ -cal_t *CALS; -event_t *EVENTS; -todo_t *TODOS; +cal_t *CAL, *CALS; +event_t *EVENT, *EVENTS; +todo_t *TODO, *TODOS; /* Local data */ static date_t start; @@ -48,6 +48,7 @@ static void add_event(event_t **first, event_t **last, event_t **next) (*last)->next = *next; else (*first) = *next; + (*next)->prev = *last; (*last) = (*next); (*next) = (*next)->next; } @@ -58,6 +59,7 @@ static void add_todo(todo_t **first, todo_t **last, todo_t **next) (*last)->next = *next; else (*first) = *next; + (*next)->prev = *last; (*last) = (*next); (*next) = (*next)->next; } @@ -109,9 +111,10 @@ void cal_init(void) ical_cals()); /* Load data */ - cal_load(YEAR, MONTH, DAY, 1); + cal_load(SEL.year, SEL.month, SEL.day, 1); /* Debug */ +#ifdef DEBUG_CALS for (event_t *e = EVENTS; e; e = e->next) debug("event: %04d-%02d-%02d %02d:%02d: %s - %s", e->start.year, e->start.month, e->start.day, @@ -120,6 +123,7 @@ void cal_init(void) debug("todo: %04d-%02d-%02d %02d:%02d: %s - %s", e->start.year, e->start.month, e->start.day, e->start.hour, e->start.min, e->name, e->desc); +#endif } /* Load events and todos */ @@ -169,6 +173,23 @@ void cal_load(year_t year, month_t month, day_t day, int days) dummy_todos(start, end), ical_todos(start, end)); + /* Verify events and todos*/ +#ifdef DEBUG_CALS + for (event_t *cur = EVENTS; cur; cur = cur->next) { + if (!cur->cal) + error("Missing cal in event '%s'", cur->name); + if ((cur->next && cur->next->prev != cur) || + (cur->prev && cur->prev->next != cur)) + error("Broken link in event '%s'", cur->name); + } + for (todo_t *cur = TODOS; cur; cur = cur->next) { + if (!cur->cal) + error("Missing cal in todo '%s'", cur->name); + if ((cur->next && cur->next->prev != cur) || + (cur->prev && cur->prev->next != cur)) + error("Broken link in todo '%s'", cur->name); + } +#endif } /* Config parser */ @@ -179,3 +200,33 @@ void cal_config(const char *group, const char *name, const char *key, const char else if (match(group, "ical")) ical_config(group, name, key, value); } + +/* Find event for matching target date */ +event_t *find_event(date_t *target) +{ + int min = 0; + event_t *event = NULL; + + if (EVENT && compare(&EVENT->start, target) == 0) + return EVENT; + + for (event_t *cur = EVENTS; cur; cur = cur->next) { + // Skip events that are on the wrong day + if ((target->year != cur->start.year) || + (target->month != cur->start.month) || + (target->day != cur->start.day)) + continue; + + // We don't want time change or leap seconds here + int diff = (target->hour - cur->start.hour) * 60 * 24 + + (target->min - cur->start.min) * 60 + + (target->sec - cur->start.sec); + + if (event == NULL || ABS(diff) < min) { + min = ABS(diff); + event = cur; + } + } + + return event; +}