2009-08-28 08:47:26 +02:00

107 lines
2.2 KiB
C

#include <stdlib.h>
#include "data.h";
#include "event.h";
event *events;
void initEvents(void)
{
events = NULL;
}
event *createEvent(char (*callback) (word counter))
{
event *myEvent;
myEvent = (event *) malloc(sizeof(event));
myEvent->VBlankCount = 0;
myEvent->callback = callback;
myEvent->nextEvent = NULL;
myEvent->previousEvent = NULL;
return myEvent;
}
event *addEvent(char (*callback) (word counter), int noDuplicateCallback)
{
event *lastEvent;
event *myEvent;
if (events == NULL) {
events = createEvent(callback);
return events;
} else {
lastEvent = events;
// TODO optimise this with noduplicate
while (lastEvent->nextEvent != NULL) {
if (noDuplicateCallback == 1 && lastEvent->callback == *callback) {
return NULL;
}
lastEvent = lastEvent->nextEvent;
}
if (noDuplicateCallback == 1 && lastEvent->callback == *callback) {
return NULL;
}
myEvent = createEvent(callback);
myEvent->previousEvent = lastEvent;
lastEvent->nextEvent = myEvent;
return myEvent;
}
}
void removeEvent(event * eventElement)
{
byte alone = 0;
event *next, *previous;
next = eventElement->nextEvent;
previous = eventElement->previousEvent;
if (eventElement->nextEvent != NULL && eventElement->previousEvent != NULL) {
alone++;
next->previousEvent = previous;
previous->nextEvent = next;
} else if (eventElement->nextEvent != NULL) {
alone++;
next->previousEvent = NULL;
events = next;
} else if (eventElement->previousEvent != NULL) {
alone++;
previous->nextEvent = NULL;
}
free(eventElement);
if (alone == 0) {
events = NULL;
}
}
void processEvents(void)
{
event *currentEvent;
char returnValue;
currentEvent = events;
while (currentEvent != NULL) {
returnValue = currentEvent->callback(currentEvent->VBlankCount);
if (returnValue == EVENT_CONTINUE) {
currentEvent->VBlankCount++;
} else {
removeEvent(currentEvent);
}
currentEvent = currentEvent->nextEvent;
}
}