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
-static event_t events[8];
-static todo_t todos[6];
/* Event functions */
event_t *dummy_events(date_t start, date_t end)
{
/* 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);
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)
{
}
/* 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;
return;
/* Free uneeded data */
return;
/* Free uneeded data */
+ 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 */
/* Push dates out a bit to avoid reloading,
* enough to at least cover the current year */
/* Calendar item types */
typedef struct event_t {
/* 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;
date_t start;
date_t end;
const cal_t *cal;
} event_t;
typedef struct todo_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;
status_t status;
date_t start;
date_t due;