From 8565e093588ec2a665a430c7be4f4b440537df84 Mon Sep 17 00:00:00 2001 From: Andy Spencer Date: Mon, 10 Jun 2013 03:50:39 +0000 Subject: [PATCH] Free unused cal memory memory This makes all the string in events and todos dynamically allocated. The memory for the event and any underlying data is now owned by cal.c, and will be freed when no longer needed. Maybe someday we'll go back to making these constants, since that would require less duplicated strings, but for now it's easiest to just make everything freeable --- cals/dummy.c | 41 ++++++++++++++++++++++++++--------------- src/cal.c | 16 +++++++++++++++- src/cal.h | 14 +++++++------- 3 files changed, 48 insertions(+), 23 deletions(-) diff --git a/cals/dummy.c b/cals/dummy.c index 8b0279c..1926bdb 100644 --- a/cals/dummy.c +++ b/cals/dummy.c @@ -45,32 +45,43 @@ static todo_t todo = { }; static int enable; -static event_t events[8]; -static todo_t todos[6]; /* Event functions */ event_t *dummy_events(date_t start, date_t end) { - for (int i = 0; i < N_ELEMENTS(events); i++) { - date_t *s = &events[i].start; - date_t *e = &events[i].end; - events[i] = event; + event_t *last = &event; + for (int i = 0; i < 8; i++) { + last->next = new0(event_t); + last->next->cal = event.cal; + last->next->start = event.start; + last->next->end = event.end; + last->next->name = strcopy(event.name); + last->next->desc = strcopy(event.desc); + + date_t *s = &last->next->start; + date_t *e = &last->next->end; add_days(&s->year, &s->month, &s->day, 7*i); add_days(&e->year, &e->month, &e->day, 7*i); - if (i+1 < N_ELEMENTS(events)) - events[i].next = &events[i+1]; + + last = last->next; + last->next = NULL; } - return enable ? &events[0] : 0; + return enable ? event.next : 0; } /* Todo functions */ todo_t *dummy_todos(date_t start, date_t end) { - for (int i = 0; i < N_ELEMENTS(todos); i++) { - todos[i] = todo; - todos[i].status = i*20; - if (i+1 < N_ELEMENTS(todos)) - todos[i].next = &todos[i+1]; + todo_t *last = &todo; + for (int i = 0; i < 6; i++) { + last->next = new0(event_t); + last->next->cal = todo.cal; + last->next->name = strcopy(todo.name); + last->next->desc = strcopy(todo.desc); + last->next->due = todo.due; + last->next->status = todo.status; + last = last->next; + last->next = NULL; } - return enable ? &todos[0] : 0; + return enable ? todo.next : 0; } diff --git a/src/cal.c b/src/cal.c index 2fda7a1..435bd33 100644 --- a/src/cal.c +++ b/src/cal.c @@ -116,7 +116,21 @@ void cal_load(year_t year, month_t month, day_t day, int days) 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 */ diff --git a/src/cal.h b/src/cal.h index 2fb05cb..ae41f3b 100644 --- a/src/cal.h +++ b/src/cal.h @@ -30,10 +30,10 @@ typedef struct { /* Calendar item types */ typedef struct event_t { - const char *name; - const char *desc; - const char *loc; - const char *cat; + char *name; + char *desc; + char *loc; + char *cat; date_t start; date_t end; const cal_t *cal; @@ -41,9 +41,9 @@ typedef struct event_t { } event_t; typedef struct todo_t { - const char *name; - const char *desc; - const char *cat; + char *name; + char *desc; + char *cat; status_t status; date_t start; date_t due; -- 2.43.2