X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcal.c;h=b519d588fb4601d6a33470c2b60997e9bee51591;hb=296fd1bb5f87b1961e98c7ea4c224219012f7161;hp=2fda7a1fb895603cb04790dbf14d7e45cfb11702;hpb=bbfc6036a8553c1c10093247c705795f243daf1e;p=lackey diff --git a/src/cal.c b/src/cal.c index 2fda7a1..b519d58 100644 --- a/src/cal.c +++ b/src/cal.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012 Andy Spencer + * Copyright (C) 2012-2013 Andy Spencer * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,6 +23,8 @@ /* Macros */ #define CAL(name) \ + void name##_config(const char *group, const char *name, const char *key, const char *value); \ + cal_t *name##_cals(void); \ event_t *name##_events(date_t start, date_t end); \ todo_t *name##_todos(date_t start, date_t end) @@ -31,6 +33,7 @@ CAL(dummy); CAL(ical); /* Global data */ +cal_t *CALS; event_t *EVENTS; todo_t *TODOS; @@ -45,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; } @@ -55,10 +59,23 @@ 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; } +static cal_t *merge_cals(cal_t *a, cal_t *b) +{ + // TODO - we should sort these + if (!a) return b; + if (!b) return a; + cal_t *last = a; + while (last->next) + last = last->next; + last->next = b; + return a; +} + static event_t *merge_events(event_t *a, event_t *b) { event_t *first = NULL, *last = NULL; @@ -88,10 +105,16 @@ static todo_t *merge_todos(todo_t *a, todo_t *b) /* Initialize */ void cal_init(void) { - /* Load a year's worth of data */ - cal_load(YEAR-1, DEC, 31-7, 366+7+7); + /* Load calendars */ + CALS = merge_cals( + dummy_cals(), + ical_cals()); + + /* Load data */ + 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, @@ -100,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 */ @@ -111,12 +135,26 @@ void cal_load(year_t year, month_t month, day_t day, int days) add_days(&eyear, &emonth, &eday, days); /* Skip if we already loaded enough info */ - if (!before(&start, year, month, day, 0, 0) && - before(&end, eyear, emonth, eday, 24, 0)) + if (before(&start, year, month, day, 0, 0) && + !before(&end, eyear, emonth, eday, 24, 0)) return; /* Free uneeded data */ - // TODO + for (event_t *next, *cur = EVENTS; cur; cur = next) { + next = cur->next; + if (cur->name) free(cur->name); + if (cur->desc) free(cur->desc); + if (cur->loc) free(cur->loc); + if (cur->cat) free(cur->cat); + free(cur); + } + for (todo_t *next, *cur = TODOS; cur; cur = next) { + next = cur->next; + if (cur->name) free(cur->name); + if (cur->desc) free(cur->desc); + if (cur->cat) free(cur->cat); + free(cur); + } /* Push dates out a bit to avoid reloading, * enough to at least cover the current year */ @@ -135,4 +173,30 @@ 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 */ +void cal_config(const char *group, const char *name, const char *key, const char *value) +{ + if (match(group, "dummy")) + dummy_config(group, name, key, value); + else if (match(group, "ical")) + ical_config(group, name, key, value); }