// Start of event_list.h typedef int (*event_report_fn)(struct str_builder*, void*); struct event { void* data; event_report_fn f; const char* name; char *description; }; struct event_list { struct event *events; int num_events; int capacity; }; static void event_list_init(struct event_list *l) { l->capacity = 100; l->num_events = 0; l->events = calloc(l->capacity, sizeof(struct event)); } static void event_list_free(struct event_list *l) { free(l->events); } static void add_event_to_list(struct event_list *l, const char* name, char* description, void* data, event_report_fn f) { if (l->num_events == l->capacity) { l->capacity *= 2; l->events = realloc(l->events, l->capacity * sizeof(struct event)); } l->events[l->num_events].name = name; l->events[l->num_events].description = description; l->events[l->num_events].data = data; l->events[l->num_events].f = f; l->num_events++; } static void report_events_in_list(struct event_list *l, struct str_builder* sb) { for (int i = 0; i < l->num_events; i++) { if (i != 0) { str_builder_str(sb, ","); } str_builder_str(sb, "{\"name\":"); str_builder_json_str(sb, l->events[i].name); str_builder_str(sb, ",\"description\":"); str_builder_json_str(sb, l->events[i].description); free(l->events[i].description); l->events[i].f(sb, l->events[i].data); str_builder(sb, "}"); } event_list_free(l); event_list_init(l); } // End of event_list.h