modified time-queue system and added cmd_addtimeban
[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 }
18
19 struct timeq_entry* timeq_add(int seconds, timeq_callback_t *callback, void *data) {
20     time_t now = time(0);
21     struct timeq_entry *entry = malloc(sizeof(*entry));
22     if (!entry)
23     {
24         perror("malloc() failed");
25         return NULL;
26     }
27     entry->execute = now + seconds;
28     entry->callback = callback;
29     entry->data = data;
30     entry->name = NULL;
31     struct timeq_entry *next, *prev = NULL;
32     for(next = timeq_events; next; next = next->next) {
33         if(next->execute >= entry->execute)
34             break;
35         else
36             prev = next;
37     }
38     if(prev == NULL) {
39         entry->next = timeq_events;
40         timeq_events = entry;
41     } else {
42         entry->next = next;
43         prev->next = entry;
44     }
45     return entry;
46 }
47
48 struct timeq_entry* timeq_add_name(char *name, int seconds, timeq_callback_t *callback, void *data) {
49     struct timeq_entry *entry = timeq_add(seconds, callback, data);
50     entry->name = strdup(name);
51     return entry;
52 }
53
54 int timeq_del(struct timeq_entry* entry) {
55     struct timeq_entry *centry, *last = NULL;
56     for(centry = timeq_events; centry; centry = centry->next) {
57         if(centry == entry) {
58             if(last)
59                 last->next = centry->next;
60             else
61                 timeq_events = centry->next;
62             if(centry->name)
63                 free(centry->name);
64             free(centry);
65             return 1;
66         } else {
67             last = centry;
68         }
69     }
70     return 0;
71 }
72
73 int timeq_del_name(char *name) {
74     struct timeq_entry *centry, *last = NULL;
75     for(centry = timeq_events; centry; centry = centry->next) {
76         if(centry->name && !stricmp(centry->name, name)) {
77             if(last)
78                 last->next = centry->next;
79             else
80                 timeq_events = centry->next;
81             free(centry->name);
82             free(centry);
83             return 1;
84         } else {
85             last = centry;
86         }
87     }
88     return 0;
89 }