X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;ds=sidebyside;f=eglib%2Fsrc%2Fgslist.c;h=5baa297f7386923e50f0b5788c67ec8bda7dd399;hb=bcefc710782c9e95d3e9bcad58d4bcf1a944150d;hp=01c3f99cedb93e0b2c57a4d11f17a29b0c718941;hpb=6110fc90713ce59ff0996fcd3520e09a96575820;p=mono.git diff --git a/eglib/src/gslist.c b/eglib/src/gslist.c index 01c3f99cedb..5baa297f738 100644 --- a/eglib/src/gslist.c +++ b/eglib/src/gslist.c @@ -181,6 +181,22 @@ g_slist_find (GSList *list, gconstpointer data) return list; } +GSList * +g_slist_find_custom (GSList *list, gconstpointer data, GCompareFunc func) +{ + if (!func) + return NULL; + + while (list) { + if (func (list->data, data) == 0) + return list; + + list = list->next; + } + + return NULL; +} + guint g_slist_length (GSList *list) { @@ -300,6 +316,40 @@ g_slist_insert_sorted (GSList *list, gpointer data, GCompareFunc func) return list; } +gint +g_slist_index (GSList *list, gconstpointer data) +{ + gint index = 0; + + while (list) { + if (list->data == data) + return index; + + index++; + list = list->next; + } + + return -1; +} + +GSList* +g_slist_nth (GSList *list, guint n) +{ + for (; list; list = list->next) { + if (n == 0) + break; + n--; + } + return list; +} + +gpointer +g_slist_nth_data (GSList *list, guint n) +{ + GSList *node = g_slist_nth (list, n); + return node ? node->data : NULL; +} + typedef GSList list_node; #include "sort.frag.h"