Skip to content

Instantly share code, notes, and snippets.

@kaneel
Last active May 3, 2023 08:45
Show Gist options
  • Save kaneel/3ef0cc28ad3e82e89dba7572ff814109 to your computer and use it in GitHub Desktop.
Save kaneel/3ef0cc28ad3e82e89dba7572ff814109 to your computer and use it in GitHub Desktop.
#include <stdlib.h>
#include <stdio.h>
typedef char EventName[255];
typedef union HandlerData {
int i;
float f;
char str[255];
} HandlerData;
typedef void (*EventHandler)(EventName event, HandlerData *data);
typedef struct EventItem {
EventName *name;
EventHandler handler;
HandlerData *data;
} EventItem;
typedef struct EventBus {
EventItem *events;
unsigned int maxEvents;
unsigned int cursorEvents;
} EventBus;
void handler(EventName event, HandlerData *data) {
printf("yes $%s %f\n", event, data->f);
}
void handler2(EventName event, HandlerData *data) {
printf("no $%s %d\n", event, data->i);
}
EventBus EventBus_init() {
EventItem *events = malloc(1 * sizeof(EventItem));
EventBus bus = { events, 0, 0 };
return bus;
}
void EventBus_addEvent(EventBus *bus, EventName *name, EventHandler handler, HandlerData *data) {
if (bus->cursorEvents == bus->maxEvents) {
EventItem *events = bus->events;
bus->events = realloc(events, sizeof(EventItem) * (bus->maxEvents++ + 1));
}
bus->events[bus->cursorEvents++] = (EventItem) {
.name = name,
.handler = handler,
.data = data
};
}
void moveEvents(EventItem *events, unsigned int start, unsigned int max) {
if ( start < max)
for (unsigned int i = start; i < max; i++) {
events[i] = events[i + 1];
}
}
void EventBus_removeEvent(EventBus *bus, EventName *name, EventHandler handler) {
EventItem *events = bus->events;
unsigned int counter = 0;
for (unsigned int i = 0; i < bus->maxEvents; i++) {
EventItem event = events[i];
if (event.name == name && event.handler == handler) {
counter += 1;
moveEvents(events, i, bus->maxEvents - 1);
}
}
if (counter > 0) {
bus->maxEvents = bus->maxEvents - counter;
bus->cursorEvents = bus->maxEvents;
bus->events = realloc(events, sizeof(EventItem) * (bus->maxEvents));
}
}
void EventBus_triggerEvent(EventBus *bus, EventName *name) {
for (unsigned int i = 0; i < bus->maxEvents; i++) {
EventItem event = bus->events[i];
if (event.name == name) {
event.handler(*event.name, event.data);
}
}
}
int main() {
EventBus bus = EventBus_init();
EventName name = "test/1";
EventName name2 = "test/2";
HandlerData data = { .f = 2.0 };
HandlerData data2 = { .i = 0 };
EventBus_addEvent(&bus, &name, &handler, &data);
EventBus_addEvent(&bus, &name2, &handler2, &data2);
EventBus_triggerEvent(&bus, &name);
EventBus_removeEvent(&bus, &name, &handler);
EventBus_triggerEvent(&bus, &name);
data2.i = 2;
EventBus_triggerEvent(&bus, &name2);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment