fe919c8332691e92bf2dee4f5ff8181d8b767c33
[NeonServV5.git] / timeq.c
1
2 #include "timeq.h"
3
4 static struct timeq_entry *timeq_events;
5
6 void timeq_tick() {
7     struct timeq_entry *entry, *next;
8     time_t now = time(0);
9     for(entry = timeq_events; entry; entry = next) {
10         if(entry->execute <= now) {
11             entry->callback(entry->data);
12             next = entry->next;
13             free(entry);
14         } else
15             break;
16     }
17     timeq_events = entry;
18 }
19
20 struct timeq_entry* timeq_add(int seconds, timeq_callback_t *callback, void *data) {
21     time_t now = time(0);
22     struct timeq_entry *entry = malloc(sizeof(*entry));
23     if (!entry)
24     {
25         perror("malloc() failed");
26         return NULL;
27     }
28     entry->execute = now + seconds;
29     entry->callback = callback;
30     entry->data = data;
31     entry->name = NULL;
32     struct timeq_entry *next, *prev = NULL;
33     for(next = timeq_events; next; next = next->next) {
34         if(next->execute >= entry->execute)
35             break;
36         else
37             prev = next;
38     }
39     if(prev == NULL) {
40         entry->next = timeq_events;
41         timeq_events = entry;
42     } else {
43         entry->next = next;
44         prev->next = entry;
45     }
46     return entry;
47 }
48
49 struct timeq_entry* timeq_add_name(char *name, int seconds, timeq_callback_t *callback, void *data) {
50     struct timeq_entry *entry = timeq_add(seconds, callback, data);
51     entry->name = strdup(name);
52     return entry;
53 }
54
55 int timeq_del(struct timeq_entry* entry) {
56     struct timeq_entry *centry, *last = NULL;
57     for(centry = timeq_events; centry; centry = centry->next) {
58         if(centry == entry) {
59             if(last)
60                 last->next = centry->next;
61             else
62                 timeq_events = centry->next;
63             if(centry->name)
64                 free(centry->name);
65             free(centry);
66             return 1;
67         } else {
68             last = centry;
69         }
70     }
71     return 0;
72 }
73
74 int timeq_del_name(char *name) {
75     struct timeq_entry *centry, *last = NULL;
76     for(centry = timeq_events; centry; centry = centry->next) {
77         if(centry->name && !stricmp(centry->name, name)) {
78             if(last)
79                 last->next = centry->next;
80             else
81                 timeq_events = centry->next;
82             free(centry->name);
83             free(centry);
84             return 1;
85         } else {
86             last = centry;
87         }
88     }
89     return 0;
90 }
91
92 int timeq_name_exists(char *name) {
93     struct timeq_entry *centry;
94     for(centry = timeq_events; centry; centry = centry->next) {
95         if(centry->name && !stricmp(centry->name, name)) {
96             return 1;
97         }
98     }
99     return 0;
100 }