Use generic lists for events.

Use the new generic list implementation instead of those insane "next"
pointers in events. Includes some cleanups.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
This commit is contained in:
Lukas Fleischer
2011-04-14 11:28:22 +02:00
parent 1de34587ab
commit 6f883c0f3f
7 changed files with 105 additions and 121 deletions

View File

@@ -41,7 +41,7 @@
#include "calcurse.h"
struct event *eventlist;
llist_t eventlist;
static struct event bkp_cut_event;
void
@@ -55,6 +55,14 @@ event_free_bkp (enum eraseflg flag)
erase_note (&bkp_cut_event.note, flag);
}
static void
event_free (struct event *ev)
{
mem_free (ev->mesg);
erase_note (&ev->note, ERASE_FORCE_KEEP_NOTE);
mem_free (ev);
}
static void
event_dup (struct event *in, struct event *bkp)
{
@@ -67,44 +75,40 @@ event_dup (struct event *in, struct event *bkp)
bkp->note = mem_strdup (in->note);
}
void
event_llist_init (void)
{
LLIST_INIT (&eventlist);
}
void
event_llist_free (void)
{
struct event *o, **i;
LLIST_FREE_INNER (&eventlist, event_free);
LLIST_FREE (&eventlist);
}
i = &eventlist;
while (*i)
{
o = *i;
*i = o->next;
mem_free (o->mesg);
erase_note (&o->note, ERASE_FORCE_KEEP_NOTE);
mem_free (o);
}
static int
event_cmp_day (struct event *a, struct event *b)
{
return (a->day < b->day ? -1 : (a->day == b->day ? 0 : 1));
}
/* Create a new event */
struct event *
event_new (char *mesg, char *note, long day, int id)
{
struct event *o, **i;
o = mem_malloc (sizeof (struct event));
o->mesg = mem_strdup (mesg);
o->day = day;
o->id = id;
o->note = (note != NULL) ? mem_strdup (note) : NULL;
i = &eventlist;
for (;;)
{
if (*i == NULL || (*i)->day > day)
{
o->next = *i;
*i = o;
break;
}
i = &(*i)->next;
}
return (o);
struct event *ev;
ev = mem_malloc (sizeof (struct event));
ev->mesg = mem_strdup (mesg);
ev->day = day;
ev->id = id;
ev->note = (note != NULL) ? mem_strdup (note) : NULL;
LLIST_ADD_SORTED (&eventlist, ev, event_cmp_day);
return ev;
}
/* Check if the event belongs to the selected day */
@@ -168,21 +172,12 @@ event_scan (FILE *f, struct tm start, int id, char *note)
struct event *
event_get (long day, int pos)
{
struct event *o;
int n;
llist_item_t *i = LLIST_FIND_NTH (&eventlist, pos, day, event_inday);
if (i)
return LLIST_TS_GET_DATA (i);
n = 0;
for (o = eventlist; o; o = o->next)
{
if (event_inday (o, day))
{
if (n == pos)
return o;
n++;
}
}
EXIT (_("event not found"));
return 0;
/* NOTREACHED */
}
@@ -190,43 +185,30 @@ event_get (long day, int pos)
void
event_delete_bynum (long start, unsigned num, enum eraseflg flag)
{
unsigned n;
struct event *i, **iptr;
llist_item_t *i = LLIST_FIND_NTH (&eventlist, num, start, event_inday);
n = 0;
iptr = &eventlist;
for (i = eventlist; i != NULL; i = i->next)
if (!i)
EXIT (_("no such appointment"));
struct event *ev = LLIST_TS_GET_DATA (i);
switch (flag)
{
if (event_inday (i, start))
{
if (n == num)
{
switch (flag)
{
case ERASE_FORCE_ONLY_NOTE:
erase_note (&i->note, flag);
break;
case ERASE_CUT:
event_free_bkp (ERASE_FORCE);
event_dup (i, &bkp_cut_event);
erase_note (&i->note, ERASE_FORCE_KEEP_NOTE);
/* FALLTHROUGH */
default:
*iptr = i->next;
mem_free (i->mesg);
if (flag != ERASE_FORCE_KEEP_NOTE && flag != ERASE_CUT)
erase_note (&i->note, flag);
mem_free (i);
break;
}
return;
}
n++;
}
iptr = &i->next;
case ERASE_FORCE_ONLY_NOTE:
erase_note (&ev->note, flag);
break;
case ERASE_CUT:
event_free_bkp (ERASE_FORCE);
event_dup (ev, &bkp_cut_event);
erase_note (&ev->note, ERASE_FORCE_KEEP_NOTE);
/* FALLTHROUGH */
default:
LLIST_REMOVE (&eventlist, i);
mem_free (ev->mesg);
if (flag != ERASE_FORCE_KEEP_NOTE && flag != ERASE_CUT)
erase_note (&ev->note, flag);
mem_free (ev);
break;
}
EXIT (_("event not found"));
/* NOTREACHED */
}
void