From 153c638d1d08484b96c1fbd3372aa13d75a3de63 Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Thu, 14 Apr 2011 13:47:45 +0200 Subject: Use generic lists for generic day items. Use the new generic list implementation instead of "next" pointers in day_item type variables. Includes some cleanups and fixes. Signed-off-by: Lukas Fleischer --- src/calcurse.h | 1 - src/day.c | 188 +++++++++++++++++++++++++++------------------------------ 2 files changed, 88 insertions(+), 101 deletions(-) diff --git a/src/calcurse.h b/src/calcurse.h index 7bcdb31..d97dc6b 100644 --- a/src/calcurse.h +++ b/src/calcurse.h @@ -291,7 +291,6 @@ struct day_items_nb { /* Generic item description (to hold appointments, events...). */ struct day_item { - struct day_item *next; long start; /* seconds since 1 jan 1970 */ long appt_dur; /* appointment duration in seconds */ int type; /* (recursive or normal) event or appointment */ diff --git a/src/day.c b/src/day.c index aee71fb..f806b06 100644 --- a/src/day.c +++ b/src/day.c @@ -50,9 +50,21 @@ struct day_saved_item { char *mesg; }; -static struct day_item *day_items_ptr; +static llist_t day_items; static struct day_saved_item day_saved_item; +static void +day_free (struct day_item *day) +{ + mem_free (day); +} + +static void +day_init_list (void) +{ + LLIST_INIT (&day_items); +} + /* * Free the current day linked list containing the events and appointments. * Must not free associated message and note, because their are not dynamically @@ -61,44 +73,44 @@ static struct day_saved_item day_saved_item; void day_free_list (void) { - struct day_item *o, **i; - - i = &day_items_ptr; - while (*i) - { - o = *i; - *i = o->next; - mem_free (o); - } - day_items_ptr = 0; + LLIST_FREE_INNER (&day_items, day_free); + LLIST_FREE (&day_items); } /* Add an event in the current day list */ static struct day_item * -day_add_event (int type, char *mesg, char *note, long day, int id) +day_add_event (int type, char *mesg, char *note, long nday, int id) { - struct day_item *o, **i; - - o = mem_malloc (sizeof (struct day_item)); - o->mesg = mesg; - o->note = note; - o->type = type; - o->appt_dur = 0; - o->appt_pos = 0; - o->start = day; - o->evnt_id = id; - i = &day_items_ptr; - for (;;) + struct day_item *day; + + day = mem_malloc (sizeof (struct day_item)); + day->mesg = mesg; + day->note = note; + day->type = type; + day->appt_dur = 0; + day->appt_pos = 0; + day->start = nday; + day->evnt_id = id; + + LLIST_ADD (&day_items, day); + + return day; +} + +static int +day_cmp_start (struct day_item *a, struct day_item *b) +{ + if (a->type <= EVNT) { - if (*i == NULL) - { - o->next = *i; - *i = o; - break; - } - i = &(*i)->next; + if (b->type <= EVNT) + return 0; + else + return -1; } - return (o); + else if (b->type <= EVNT) + return 1; + else + return (a->start < b->start ? -1 : (a->start == b->start ? 0 : 1)); } /* Add an appointment in the current day list. */ @@ -106,43 +118,26 @@ static struct day_item * day_add_apoint (int type, char *mesg, char *note, long start, long dur, char state, int real_pos) { - struct day_item *o, **i; - int insert_item = 0; - - o = mem_malloc (sizeof (struct day_item)); - o->mesg = mesg; - o->note = note; - o->start = start; - o->appt_dur = dur; - o->appt_pos = real_pos; - o->state = state; - o->type = type; - o->evnt_id = 0; - i = &day_items_ptr; - for (;;) - { - if (*i == NULL) - { - insert_item = 1; - } - else if (((*i)->start > start) && ((*i)->type > EVNT)) - { - insert_item = 1; - } - if (insert_item) - { - o->next = *i; - *i = o; - break; - } - i = &(*i)->next; - } - return o; + struct day_item *day; + + day = mem_malloc (sizeof (struct day_item)); + day->mesg = mesg; + day->note = note; + day->start = start; + day->appt_dur = dur; + day->appt_pos = real_pos; + day->state = state; + day->type = type; + day->evnt_id = 0; + + LLIST_ADD_SORTED (&day_items, day, day_cmp_start); + + return day; } /* * Store the events for the selected day in structure pointed - * by day_items_ptr. This is done by copying the events + * by day_items. This is done by copying the events * from the general structure pointed by eventlist to the structure * dedicated to the selected day. * Returns the number of events for the selected day. @@ -165,7 +160,7 @@ day_store_events (long date) /* * Store the recurrent events for the selected day in structure pointed - * by day_items_ptr. This is done by copying the recurrent events + * by day_items. This is done by copying the recurrent events * from the general structure pointed by recur_elist to the structure * dedicated to the selected day. * Returns the number of recurrent events for the selected day. @@ -191,7 +186,7 @@ day_store_recur_events (long date) /* * Store the apoints for the selected day in structure pointed - * by day_items_ptr. This is done by copying the appointments + * by day_items. This is done by copying the appointments * from the general structure pointed by alist_p to the * structure dedicated to the selected day. * Returns the number of appointments for the selected day. @@ -217,7 +212,7 @@ day_store_apoints (long date) /* * Store the recurrent apoints for the selected day in structure pointed - * by day_items_ptr. This is done by copying the appointments + * by day_items. This is done by copying the appointments * from the general structure pointed by recur_alist_p->root to the * structure dedicated to the selected day. * Returns the number of recurrent appointments for the selected day. @@ -251,7 +246,7 @@ day_store_recur_apoints (long date) * Store all of the items to be displayed for the selected day. * Items are of four types: recursive events, normal events, * recursive appointments and normal appointments. - * The items are stored in the linked list pointed by *day_items_ptr + * The items are stored in the linked list pointed by day_items * and the length of the new pad to write is returned. * The number of events and appointments in the current day are also updated. */ @@ -262,8 +257,8 @@ day_store_items (long date, unsigned *pnb_events, unsigned *pnb_apoints) int nb_events, nb_recur_events; int nb_apoints, nb_recur_apoints; - if (day_items_ptr != NULL) - day_free_list (); + day_free_list (); + day_init_list (); nb_recur_events = day_store_recur_events (date); nb_events = day_store_events (date); *pnb_events = nb_events; @@ -393,7 +388,7 @@ display_item (int incolor, char *msg, int recur, int note, int len, int y, void day_write_pad (long date, int width, int length, int incolor) { - struct day_item *p; + llist_item_t *i; struct apoint a; int line, item_number, recur; const int x_pos = 0; @@ -401,23 +396,24 @@ day_write_pad (long date, int width, int length, int incolor) line = item_number = 0; - for (p = day_items_ptr; p != NULL; p = p->next) + LLIST_FOREACH (&day_items, i) { - if (p->type == RECUR_EVNT || p->type == RECUR_APPT) + struct day_item *day = LLIST_TS_GET_DATA (i); + if (day->type == RECUR_EVNT || day->type == RECUR_APPT) recur = 1; else recur = 0; /* First print the events for current day. */ - if (p->type < RECUR_APPT) + if (day->type < RECUR_APPT) { item_number++; if (item_number - incolor == 0) { - day_saved_item.type = p->type; - day_saved_item.mesg = p->mesg; + day_saved_item.type = day->type; + day_saved_item.mesg = day->mesg; } - display_item (item_number - incolor, p->mesg, recur, - (p->note != NULL) ? 1 : 0, width - 7, line, x_pos); + display_item (item_number - incolor, day->mesg, recur, + (day->note != NULL) ? 1 : 0, width - 7, line, x_pos); line++; draw_line = 1; } @@ -432,18 +428,18 @@ day_write_pad (long date, int width, int length, int incolor) } /* Last print the appointments for current day. */ item_number++; - day_item_s2apoint_s (&a, p); + day_item_s2apoint_s (&a, day); if (item_number - incolor == 0) { - day_saved_item.type = p->type; - day_saved_item.mesg = p->mesg; - apoint_sec2str (&a, p->type, date, + day_saved_item.type = day->type; + day_saved_item.mesg = day->mesg; + apoint_sec2str (&a, day->type, date, day_saved_item.start, day_saved_item.end); } - display_item_date (item_number - incolor, &a, p->type, + display_item_date (item_number - incolor, &a, day->type, date, line + 1, x_pos); - display_item (item_number - incolor, p->mesg, 0, - (p->note != NULL) ? 1 : 0, width - 7, line + 2, + display_item (item_number - incolor, day->mesg, 0, + (day->note != NULL) ? 1 : 0, width - 7, line + 2, x_pos); line += 3; } @@ -1018,15 +1014,7 @@ day_paste_item (long date, int cut_item_type) struct day_item * day_get_item (int item_number) { - struct day_item *o; - int i; - - o = day_items_ptr; - for (i = 1; i < item_number; i++) - { - o = o->next; - } - return (o); + return LLIST_GET_DATA (LLIST_NTH (&day_items, item_number - 1)); } /* Returns the real item number, given its type. */ @@ -1034,17 +1022,17 @@ int day_item_nb (long date, int day_num, int type) { int i, nb_item[MAX_TYPES]; - struct day_item *p; + llist_item_t *j; for (i = 0; i < MAX_TYPES; i++) nb_item[i] = 0; - p = day_items_ptr; - + j = LLIST_FIRST (&day_items); for (i = 1; i < day_num; i++) { - nb_item[p->type - 1]++; - p = p->next; + struct day_item *day = LLIST_TS_GET_DATA (j); + nb_item[day->type - 1]++; + j = LLIST_TS_NEXT (j); } return (nb_item[type - 1]); -- cgit v1.2.3-54-g00ecf