diff options
author | Johan Hedberg <johan.hedberg@nokia.com> | 2007-01-13 12:27:09 +0000 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@nokia.com> | 2007-01-13 12:27:09 +0000 |
commit | f711e58f8f635d0afcf3f02da83780bef83c4347 (patch) | |
tree | 456ccce2c738b8a9359ec7488eb74707fce339ff /common/glib-ectomy.c | |
parent | 6561ed8ccf7e8dd56fbaaaa16a7bc9635523e059 (diff) |
Rename struct slist to GSList and slist_* to g_slist_*
Diffstat (limited to 'common/glib-ectomy.c')
-rw-r--r-- | common/glib-ectomy.c | 256 |
1 files changed, 228 insertions, 28 deletions
diff --git a/common/glib-ectomy.c b/common/glib-ectomy.c index 46d92154..b45d26f4 100644 --- a/common/glib-ectomy.c +++ b/common/glib-ectomy.c @@ -13,7 +13,6 @@ #include <sys/time.h> #include <time.h> -#include "list.h" #include "glib-ectomy.h" struct timeout { @@ -34,12 +33,12 @@ struct _GMainContext { guint next_id; glong next_timeout; - struct slist *timeouts; - struct slist *proc_timeouts; + GSList *timeouts; + GSList *proc_timeouts; gboolean timeout_lock; - struct slist *watches; - struct slist *proc_watches; + GSList *watches; + GSList *proc_watches; gboolean watch_lock; }; @@ -174,7 +173,7 @@ static GMainContext *g_main_context_default() void g_io_remove_watch(guint id) { GMainContext *context = g_main_context_default(); - struct slist *l; + GSList *l; struct watch *w; if (!context) @@ -186,7 +185,7 @@ void g_io_remove_watch(guint id) if (w->id != id) continue; - context->watches = slist_remove(context->watches, w); + context->watches = g_slist_remove(context->watches, w); watch_free(w); return; @@ -198,7 +197,7 @@ void g_io_remove_watch(guint id) if (w->id != id) continue; - context->proc_watches = slist_remove(context->proc_watches, w); + context->proc_watches = g_slist_remove(context->proc_watches, w); watch_free(w); return; @@ -210,7 +209,7 @@ int watch_prio_cmp(struct watch *w1, struct watch *w2) return w1->priority - w2->priority; } -#define watch_list_add(l, w) slist_insert_sorted((l), (w), (cmp_func_t) watch_prio_cmp) +#define watch_list_add(l, w) g_slist_insert_sorted((l), (w), (GCompareFunc) watch_prio_cmp) guint g_io_add_watch_full(GIOChannel *channel, gint priority, GIOCondition condition, GIOFunc func, @@ -273,7 +272,7 @@ GMainLoop *g_main_loop_new(GMainContext *context, gboolean is_running) static void timeout_handlers_prepare(GMainContext *context) { - struct slist *l; + GSList *l; struct timeval tv; glong msec, timeout = LONG_MAX; @@ -314,8 +313,8 @@ static void timeout_handlers_check(GMainContext *context) gboolean ret; if (timercmp(&tv, &t->expiration, <)) { - context->timeouts = slist_remove(context->timeouts, t); - context->proc_timeouts = slist_append(context->proc_timeouts, t); + context->timeouts = g_slist_remove(context->timeouts, t); + context->proc_timeouts = g_slist_append(context->proc_timeouts, t); continue; } @@ -323,10 +322,10 @@ static void timeout_handlers_check(GMainContext *context) /* Check if the handler was removed/freed by the callback * function */ - if (!slist_find(context->timeouts, t, ptr_cmp)) + if (!g_slist_find_custom(context->timeouts, t, ptr_cmp)) continue; - context->timeouts = slist_remove(context->timeouts, t); + context->timeouts = g_slist_remove(context->timeouts, t); if (!ret) { free(t); @@ -344,7 +343,7 @@ static void timeout_handlers_check(GMainContext *context) t->expiration.tv_sec++; } - context->proc_timeouts = slist_append(context->proc_timeouts, t); + context->proc_timeouts = g_slist_append(context->proc_timeouts, t); } context->timeouts = context->proc_timeouts; @@ -366,7 +365,7 @@ void g_main_loop_run(GMainLoop *loop) while (loop->is_running) { int nfds; - struct slist *l; + GSList *l; struct watch *w; for (nfds = 0, l = context->watches; l != NULL; l = l->next, nfds++) { @@ -391,7 +390,7 @@ void g_main_loop_run(GMainLoop *loop) w = context->watches->data; if (!*w->revents) { - context->watches = slist_remove(context->watches, w); + context->watches = g_slist_remove(context->watches, w); context->proc_watches = watch_list_add(context->proc_watches, w); continue; } @@ -400,10 +399,10 @@ void g_main_loop_run(GMainLoop *loop) /* Check if the watch was removed/freed by the callback * function */ - if (!slist_find(context->watches, w, ptr_cmp)) + if (!g_slist_find_custom(context->watches, w, ptr_cmp)) continue; - context->watches = slist_remove(context->watches, w); + context->watches = g_slist_remove(context->watches, w); if (!ret) { watch_free(w); @@ -434,11 +433,11 @@ void g_main_loop_unref(GMainLoop *loop) if (!loop->context) return; - slist_foreach(loop->context->watches, (slist_func_t)watch_free, NULL); - slist_free(loop->context->watches); + g_slist_foreach(loop->context->watches, (GFunc)watch_free, NULL); + g_slist_free(loop->context->watches); - slist_foreach(loop->context->timeouts, (slist_func_t)free, NULL); - slist_free(loop->context->timeouts); + g_slist_foreach(loop->context->timeouts, (GFunc)free, NULL); + g_slist_free(loop->context->timeouts); free(loop->context); loop->context = NULL; @@ -482,9 +481,9 @@ guint g_timeout_add(guint interval, GSourceFunc function, gpointer data) t->id = context->next_id++; if (context->timeout_lock) - context->proc_timeouts = slist_prepend(context->proc_timeouts, t); + context->proc_timeouts = g_slist_prepend(context->proc_timeouts, t); else - context->timeouts = slist_prepend(context->timeouts, t); + context->timeouts = g_slist_prepend(context->timeouts, t); return t->id; } @@ -492,7 +491,7 @@ guint g_timeout_add(guint interval, GSourceFunc function, gpointer data) gint g_timeout_remove(const guint id) { GMainContext *context = g_main_context_default(); - struct slist *l; + GSList *l; struct timeout *t; if (!context) @@ -507,7 +506,7 @@ gint g_timeout_remove(const guint id) if (t->id != id) continue; - context->timeouts = slist_remove(context->timeouts, t); + context->timeouts = g_slist_remove(context->timeouts, t); free(t); return 0; @@ -522,7 +521,7 @@ gint g_timeout_remove(const guint id) if (t->id != id) continue; - context->proc_timeouts = slist_remove(context->proc_timeouts, t); + context->proc_timeouts = g_slist_remove(context->proc_timeouts, t); free(t); return 0; @@ -616,4 +615,205 @@ failed: return FALSE; } +/* GSList functions */ +GSList *g_slist_append(GSList *list, void *data) +{ + GSList *entry, *tail; + + entry = malloc(sizeof(GSList)); + /* FIXME: this currently just silently fails */ + if (!entry) + return list; + + entry->data = data; + entry->next = NULL; + + if (!list) + return entry; + + /* Find the end of the list */ + for (tail = list; tail->next; tail = tail->next); + + tail->next = entry; + + return list; +} + +GSList *g_slist_prepend(GSList *list, void *data) +{ + GSList *entry; + + entry = malloc(sizeof(GSList)); + /* FIXME: this currently just silently fails */ + if (!entry) + return list; + + entry->data = data; + entry->next = list; + + return entry; +} + +GSList *g_slist_insert_sorted(GSList *list, void *data, GCompareFunc cmp_func) +{ + GSList *tmp, *prev, *entry; + int cmp; + + entry = malloc(sizeof(GSList)); + if (!entry) + return list; + + entry->data = data; + entry->next = NULL; + + if (!list) + return entry; + + prev = NULL; + tmp = list; + + cmp = cmp_func(data, tmp->data); + + while (tmp->next && cmp > 0) { + prev = tmp; + tmp = tmp->next; + + cmp = cmp_func(data, tmp->data); + } + + if (!tmp->next && cmp > 0) { + tmp->next = entry; + return list; + } + + if (prev) { + prev->next = entry; + entry->next = tmp; + return list; + } else { + entry->next = list; + return entry; + } +} + +GSList *g_slist_remove(GSList *list, void *data) +{ + GSList *l, *next, *prev = NULL, *match = NULL; + + if (!list) + return NULL; + + for (l = list; l != NULL; l = l->next) { + if (l->data == data) { + match = l; + break; + } + prev = l; + } + + if (!match) + return list; + + next = match->next; + + free(match); + + /* If the head was removed, return the next element */ + if (!prev) + return next; + + prev->next = next; + + return list; +} + +GSList *g_slist_find_custom(GSList *list, const void *data, + GCompareFunc cmp_func) +{ + GSList *l; + + for (l = list; l != NULL; l = l->next) { + if (!cmp_func(l->data, data)) + return l; + } + + return NULL; +} + +static GSList *g_slist_sort_merge(GSList *l1, GSList *l2, + GCompareFunc cmp_func) +{ + GSList list, *l; + int cmp; + + l = &list; + + while (l1 && l2) { + cmp = cmp_func(l1->data, l2->data); + + if (cmp <= 0) { + l = l->next = l1; + l1 = l1->next; + } else { + l = l->next = l2; + l2 = l2->next; + } + } + + l->next = l1 ? l1 : l2; + + return list.next; +} + +GSList *g_slist_sort(GSList *list, GCompareFunc cmp_func) +{ + GSList *l1, *l2; + + if (!list || !list->next) + return list; + + l1 = list; + l2 = list->next; + + while ((l2 = l2->next) != NULL) { + if ((l2 = l2->next) == NULL) + break; + l1 = l1->next; + } + + l2 = l1->next; + l1->next = NULL; + + return g_slist_sort_merge(g_slist_sort(list, cmp_func), + g_slist_sort(l2, cmp_func), cmp_func); +} + +int g_slist_length(GSList *list) +{ + int len; + + for (len = 0; list != NULL; list = list->next) + len++; + + return len; +} + +void g_slist_foreach(GSList *list, GFunc func, void *user_data) +{ + while (list) { + GSList *next = list->next; + func(list->data, user_data); + list = next; + } +} + +void g_slist_free(GSList *list) +{ + GSList *l, *next; + + for (l = list; l != NULL; l = next) { + next = l->next; + free(l); + } +} |