[Xfce4-commits] <squeeze:master> Replaced archive iter buffer slist with a btree

Peter de Ridder noreply at xfce.org
Thu Dec 22 23:00:01 CET 2011


Updating branch refs/heads/master
         to d3cc31e6fb872e00eaad4291746c551435eea1c2 (commit)
       from aab3b4e8d7e06ca64357cb927df63ab25d7a8bc6 (commit)

commit d3cc31e6fb872e00eaad4291746c551435eea1c2
Author: Peter de Ridder <peter at xfce.org>
Date:   Sun Oct 2 12:09:39 2011 +0200

    Replaced archive iter buffer slist with a btree
    
    The btree isn't balanced and delete isn't supported

 libsqueeze/Makefile.am          |    2 +-
 libsqueeze/archive-iter.c       |  188 +++++++++++++++++---------------------
 libsqueeze/archive.c            |    2 +-
 libsqueeze/btree.c              |  191 +++++++++++++++++++++++++++++++++++++++
 libsqueeze/{slist.h => btree.h} |   42 ++++-----
 libsqueeze/slist.c              |  109 ----------------------
 6 files changed, 295 insertions(+), 239 deletions(-)

diff --git a/libsqueeze/Makefile.am b/libsqueeze/Makefile.am
index 51cc350..b7beadb 100644
--- a/libsqueeze/Makefile.am
+++ b/libsqueeze/Makefile.am
@@ -5,6 +5,7 @@ libsqueeze_2_la_SOURCES =  \
 	archive-iter-pool.c archive-iter-pool.h \
 	archive-iter.c archive-iter.h \
 	archive-tempfs.c archive-tempfs.h \
+	btree.c btree.h \
 	command-queue.c command-queue.h \
 	command-option.c command-option.h \
 	internals.c internals.h \
@@ -13,7 +14,6 @@ libsqueeze_2_la_SOURCES =  \
 	parser-context.c parser-context.h \
 	parser.c parser.h \
 	scanf-parser.c scanf-parser.h \
-	slist.c slist.h \
 	support-reader.c support-reader.h \
 	support-template.c support-template.h \
 	support-factory.c support-factory.h
diff --git a/libsqueeze/archive-iter.c b/libsqueeze/archive-iter.c
index 6288535..8762777 100644
--- a/libsqueeze/archive-iter.c
+++ b/libsqueeze/archive-iter.c
@@ -13,7 +13,6 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
-
 #include <config.h>
 #include <string.h>
 #include <glib.h>
@@ -25,7 +24,7 @@
 #include "libsqueeze.h"
 #include "libsqueeze-view.h"
 #include "support-factory.h"
-#include "slist.h"
+#include "btree.h"
 
 #include "internals.h"
 
@@ -39,10 +38,6 @@ guint buffer_flush_size = LSQ_ENTRY_CHILD_BUFFER_SIZE;
 #define LSQ_ENTRY_CHILD_BUFFER_SIZE buffer_flush_size
 #endif
 
-#ifndef LSQ_ENTRY_BUFFER_INTERVALSIZE
-#define LSQ_ENTRY_BUFFER_INTERVALSIZE 20
-#endif
-
 #ifndef LSQ_MIME_DIRECTORY
 #define LSQ_MIME_DIRECTORY "inode/directory"
 #endif
@@ -69,8 +64,6 @@ inline static LSQArchiveEntry*
 lsq_archive_entry_nth_child(const LSQArchiveEntry *, guint);
 inline static void
 lsq_archive_entry_flush_buffer(LSQArchiveEntry *);
-inline static void
-lsq_archive_entry_build_buffer_index(LSQArchiveEntry *);
 static LSQArchiveEntry *
 lsq_archive_entry_get_child(const LSQArchiveEntry *, const gchar *);
 static LSQArchiveEntry *
@@ -102,8 +95,8 @@ struct _LSQArchiveEntry
 	gchar *content_type;
 	gpointer props;
 	LSQArchiveEntry **children;
-	LSQSList *buffer;
-	LSQSIndexList *buffer_index;
+	LSQBTree *buffer;
+        guint buffer_length;
 };
 
 
@@ -989,7 +982,10 @@ static void
 lsq_archive_entry_save_free(const LSQArchive *archive, LSQArchiveEntry *entry)
 {
 	guint i = 0; 
-	LSQSList *buffer_iter = entry->buffer;
+	LSQBTree *buffer_iter;
+
+	entry->buffer = lsq_btree_flatten(entry->buffer);
+	buffer_iter = entry->buffer;
 
 	/* free the buffer */
 	for ( ; NULL != buffer_iter ; buffer_iter = buffer_iter->next )
@@ -999,8 +995,9 @@ lsq_archive_entry_save_free(const LSQArchive *archive, LSQArchiveEntry *entry)
 		else
 			lsq_archive_entry_save_free(archive, buffer_iter->entry);
 	}
-	lsq_slist_free(entry->buffer);
+	lsq_btree_free(entry->buffer);
 	entry->buffer = NULL;
+        entry->buffer_length = 0;
 
 	/* free the sorted list */
 	if ( NULL != entry->children )
@@ -1026,15 +1023,19 @@ static void
 lsq_archive_entry_free(const LSQArchive *archive, LSQArchiveEntry *entry)
 {
 	guint i = 0; 
-	LSQSList *buffer_iter = entry->buffer;
+	LSQBTree *buffer_iter;
+
+	entry->buffer = lsq_btree_flatten(entry->buffer);
+	buffer_iter = entry->buffer;
 
 	/* free the buffer */
 	for ( ; NULL != buffer_iter; buffer_iter = buffer_iter->next )
 	{
 		lsq_archive_entry_free(archive, buffer_iter->entry);
 	}
-	lsq_slist_free(entry->buffer);
+	lsq_btree_free(entry->buffer);
 	entry->buffer = NULL;
+        entry->buffer_length = 0;
 
 	/* free the sorted list */
 	if ( NULL != entry->children )
@@ -1078,7 +1079,7 @@ inline static guint
 lsq_archive_entry_n_children(const LSQArchiveEntry *entry)
 {
 	/* the first element of the array (*entry->children) contains the size of the array */
-	return ((entry->children?GPOINTER_TO_UINT(*entry->children):0) + lsq_slist_length(entry->buffer));
+	return ((entry->children?GPOINTER_TO_UINT(*entry->children):0) + lsq_btree_length(entry->buffer));
 }
 
 inline static LSQArchiveEntry*
@@ -1099,7 +1100,7 @@ lsq_archive_entry_flush_buffer(LSQArchiveEntry *entry)
 	guint new_i = 1;
 	guint size;
 	guint n_children;
-	LSQSList *buffer_iter = NULL;
+	LSQBTree *buffer_iter = NULL;
 	LSQArchiveEntry **children_old;
 
 	if ( NULL == entry->buffer )
@@ -1107,12 +1108,17 @@ lsq_archive_entry_flush_buffer(LSQArchiveEntry *entry)
 		return;
 	}
 
+	//lsq_btree_print(entry->buffer);
+
+	/* Flatten the btree so we can iterate */
+	entry->buffer = lsq_btree_flatten(entry->buffer);
+
 	/* the first element of the array (*entry->children) contains the size of the array */
 	size = entry->children?GPOINTER_TO_UINT(*entry->children):0;
 	n_children = size;
 	children_old = (LSQArchiveEntry **)entry->children;
 
-	max_children = (n_children + lsq_slist_length(entry->buffer));
+	max_children = (n_children + lsq_btree_length(entry->buffer));
 	
 	/* do all elements of the buffer */
 	entry->children = g_new(LSQArchiveEntry *, max_children+1);
@@ -1164,44 +1170,17 @@ lsq_archive_entry_flush_buffer(LSQArchiveEntry *entry)
 	*entry->children = GUINT_TO_POINTER(n_children);
 	
 	/* free the buffer */
-	lsq_slist_free(entry->buffer);
+	lsq_btree_free(entry->buffer);
 	entry->buffer = NULL;
-	lsq_slist_index_free(entry->buffer_index);
-	entry->buffer_index = NULL;
+        entry->buffer_length = 0;
 
 	g_free(children_old);
 }
 
-inline static void
-lsq_archive_entry_build_buffer_index(LSQArchiveEntry *entry)
-{
-	guint i = 0;
-	LSQSList *buffer_iter = NULL;
-	LSQSIndexList **index_iter = &entry->buffer_index;
-	for ( buffer_iter = entry->buffer ; NULL != buffer_iter ; buffer_iter = buffer_iter->next )
-	{
-		++i;
-		if ( 0 == ( i % LSQ_ENTRY_BUFFER_INTERVALSIZE ) )
-		{
-			if ( NULL == *index_iter )
-			{
-				*index_iter = lsq_slist_index_new();
-			}
-
-			(*index_iter)->index = buffer_iter;
-
-			index_iter = &((*index_iter)->next);
-		}
-	}
-	lsq_slist_index_free(*index_iter);
-	*index_iter = NULL;
-}
-
 static LSQArchiveEntry *
 lsq_archive_entry_get_child(const LSQArchiveEntry *entry, const gchar *filename)
 {
-	LSQSList *entry_buffer, *buffer_iter = NULL;
-	LSQSIndexList *index_iter = NULL;
+	LSQBTree *buffer_iter = NULL;
 	/* the first element of the array (*entry->children) contains the size of the array */
 	guint size = entry->children?GPOINTER_TO_UINT(*entry->children):0;
 	guint pos = 0;
@@ -1240,37 +1219,25 @@ lsq_archive_entry_get_child(const LSQArchiveEntry *entry, const gchar *filename)
 		}
 	}
 
-	/* find a start index into the buffer */
-	entry_buffer = entry->buffer;
-	for ( index_iter = entry->buffer_index; NULL != index_iter; index_iter = index_iter->next )
-	{
-		cmp = strcmp(filename, index_iter->index->entry->filename);
-
-		if ( 0 == cmp )
-		{
-			g_free(_filename);
-			return index_iter->index->entry;
-		}
-		if ( 0 > cmp )
-		{
-			break;
-		}
-		entry_buffer = index_iter->index;
-	}
-
 	/* search the buffer */
-	for ( buffer_iter = entry_buffer; NULL != buffer_iter; buffer_iter = buffer_iter->next )
+	buffer_iter = entry->buffer;
+	while ( NULL != buffer_iter )
 	{
+		/* archive can be NULL */
 		cmp = strcmp(filename, buffer_iter->entry->filename);
 
-		if ( 0 == cmp )
+		if ( cmp < 0 )
 		{
-			g_free(_filename);
-			return buffer_iter->entry;
+		    buffer_iter = buffer_iter->left;
 		}
-		if ( 0 > cmp )
+		else if ( cmp > 0 )
 		{
-			break;
+		    buffer_iter = buffer_iter->right;
+		}
+		else
+		{
+		    g_free(_filename);
+		    return buffer_iter->entry;
 		}
 	}
 
@@ -1289,7 +1256,6 @@ lsq_archive_entry_add_child(LSQArchiveEntry *parent, const gchar *filename)
 {
 	LSQArchiveEntry *child = lsq_archive_entry_new(filename);
 	const gchar *contenttype = lsq_archive_entry_get_contenttype(parent);
-	guint length;
 
 	if ( ( NULL == contenttype ) || ( 0 != strcmp ( contenttype, LSQ_MIME_DIRECTORY ) ) )
 	{
@@ -1300,19 +1266,16 @@ lsq_archive_entry_add_child(LSQArchiveEntry *parent, const gchar *filename)
 		*/
 	}
 
-	parent->buffer = lsq_slist_insert_sorted_single(parent->buffer, child, (GCompareFunc)lsq_archive_entry_filename_compare);
+	//g_debug("i: %s", filename);
+	parent->buffer = lsq_btree_insert_sorted_single(parent->buffer, child, (GCompareFunc)lsq_archive_entry_filename_compare);
 
-	/* TODO: cache the length so we doen't have to check every time? */
-	length = lsq_slist_length(parent->buffer);
+	/* Cache the length so we doen't have to check every time */
+	parent->buffer_length++;
 
-	if ( LSQ_ENTRY_CHILD_BUFFER_SIZE == length )
+	if ( LSQ_ENTRY_CHILD_BUFFER_SIZE == parent->buffer_length )
 	{
 		lsq_archive_entry_flush_buffer(parent);
 	}
-	else if ( 0 == ( length % LSQ_ENTRY_BUFFER_INTERVALSIZE ) )
-	{
-		lsq_archive_entry_build_buffer_index(parent);
-	}
 	
 	return child;
 }
@@ -1320,7 +1283,7 @@ lsq_archive_entry_add_child(LSQArchiveEntry *parent, const gchar *filename)
 static gboolean
 lsq_archive_entry_remove_child(LSQArchiveEntry *entry, const gchar *filename)
 {
-	LSQSList *buffer_iter = NULL, *prev_iter = NULL;
+	LSQBTree *buffer_iter = NULL, **prev_iter = NULL;
 
 	/* the first element of the array (*entry->children) contains the size of the array */
 	guint total_size, size = total_size = entry->children?GPOINTER_TO_UINT(*entry->children):0;
@@ -1370,28 +1333,47 @@ lsq_archive_entry_remove_child(LSQArchiveEntry *entry, const gchar *filename)
 	}
 
 	/* search the buffer */
-	for(buffer_iter = entry->buffer; buffer_iter; buffer_iter = buffer_iter->next)
-	{
-		cmp = strcmp(_filename, buffer_iter->entry->filename);
-
-		if ( 0 == cmp )
-		{
-			g_free(_filename);
-			if ( NULL != prev_iter )
-			{
-				prev_iter->next = buffer_iter->next;
-			}
-			else
-			{
-				entry->buffer = buffer_iter->next;
-			}
-			g_free(buffer_iter);
-			return TRUE;
-		}
-		if(cmp < 0)
-			break;
-		prev_iter = buffer_iter;
-	}
+        prev_iter = &entry->buffer;
+        if ( NULL == entry->buffer || NULL != entry->buffer->next )
+        {
+            for(buffer_iter = entry->buffer; buffer_iter; buffer_iter = buffer_iter->next)
+            {
+                cmp = strcmp(_filename, buffer_iter->entry->filename);
+
+                if ( 0 == cmp )
+                {
+                    g_free(_filename);
+                    *prev_iter = buffer_iter->next;
+                    g_free(buffer_iter);
+                    return TRUE;
+                }
+                if(cmp < 0)
+                    break;
+                prev_iter = &buffer_iter->next;
+            }
+        }
+        else
+        {
+            for ( buffer_iter = entry->buffer; NULL != buffer_iter; buffer_iter = *prev_iter )
+            {
+                /* archive can be NULL */
+                cmp = strcmp(filename, buffer_iter->entry->filename);
+
+                if ( cmp < 0 )
+                {
+                    prev_iter = &buffer_iter->left;
+                }
+                else if ( cmp > 0 )
+                {
+                    prev_iter = &buffer_iter->right;
+                }
+                else
+                {
+                    g_critical("todo");
+                    return TRUE;
+                }
+            }
+        }
 
 	g_free(_filename);
 	return FALSE;
diff --git a/libsqueeze/archive.c b/libsqueeze/archive.c
index a2dcd7e..262391b 100644
--- a/libsqueeze/archive.c
+++ b/libsqueeze/archive.c
@@ -31,7 +31,7 @@
 #include "support-template.h"
 #include "support-factory.h"
 
-#include "slist.h"
+#include "btree.h"
 #include "archive-tempfs.h"
 #include "command-queue.h"
 
diff --git a/libsqueeze/btree.c b/libsqueeze/btree.c
new file mode 100644
index 0000000..869bd80
--- /dev/null
+++ b/libsqueeze/btree.c
@@ -0,0 +1,191 @@
+/*
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+#include <config.h>
+#include <string.h>
+#include <glib.h>
+#include <glib-object.h>
+#include <gio/gio.h>
+
+#include <libxfce4util/libxfce4util.h>
+
+#include "libsqueeze.h"
+#include "support-factory.h"
+#include "internals.h"
+#include "btree.h"
+
+#ifndef LSQ_BTREE_MAX_DEPTH
+#define LSQ_BTREE_MAX_DEPTH 500
+#endif
+
+LSQBTree *
+lsq_btree_insert_sorted_single (
+        LSQBTree *list,
+        LSQArchiveEntry *entry,
+        GCompareFunc cmp_func )
+{
+    gint cmp;
+    LSQBTree *iter;
+    LSQBTree **next = NULL;
+    LSQBTree *new_entry = NULL;
+    LSQBTree *stack[LSQ_BTREE_MAX_DEPTH];
+    guint stack_i = 0;
+
+    if ( NULL != list && NULL != list->next )
+    {
+        g_critical("Cannot insert into a flattened tree");
+        return NULL;
+    }
+
+    for ( iter = list; NULL != iter; iter = *next )
+    {
+        /* archive can be NULL */
+        cmp = cmp_func( entry, iter->entry );
+
+        if ( 0 > cmp )
+        {
+            next = &iter->left;
+        }
+        else if ( 0 < cmp )
+        {
+            next = &iter->right;
+        }
+        else
+        {
+            g_critical("THIS SHOULD NOT HAPPEN!!! (the universe has just collapsed)");
+            return NULL;
+        }
+
+        stack[stack_i++] = iter;
+	g_return_val_if_fail(stack_i < LSQ_BTREE_MAX_DEPTH, NULL);
+    }
+
+    new_entry = g_new0(LSQBTree, 1);
+    new_entry->entry = entry;
+
+    if ( NULL == next )
+    {
+        return new_entry;
+    }
+
+    *next = new_entry;
+
+    return list;
+}
+
+guint
+lsq_btree_length ( LSQBTree *list )
+{
+    guint size = 0;
+    LSQBTree *iter;
+    LSQBTree *stack[LSQ_BTREE_MAX_DEPTH];
+    guint stack_i = 0;
+
+    /* The tree is flattened */
+    if ( NULL == list || NULL != list->next )
+    {
+        for ( iter = list; NULL != iter; iter = iter->next)
+        {
+            size++;
+        }
+    }
+    else
+    {
+        do
+        {
+            for ( iter = list; NULL != iter; iter = iter->left )
+            {
+                stack[stack_i++] = iter;
+		g_return_val_if_fail(stack_i < LSQ_BTREE_MAX_DEPTH, 0);
+
+                size++;
+            }
+
+            list = stack[--stack_i]->right;
+        }
+        while ( 0 != stack_i || NULL != list );
+    }
+
+    return size;
+}
+
+void
+lsq_btree_free ( LSQBTree *list )
+{
+    LSQBTree *iter, *next;
+    LSQBTree *stack[LSQ_BTREE_MAX_DEPTH];
+    guint stack_i = 0;
+
+    /* The tree is flattened */
+    if ( NULL == list || NULL != list->next )
+    {
+        for ( iter = list; NULL != iter; iter = next)
+        {
+            next = iter->next;
+            g_free( iter );
+        }
+    }
+    else
+    {
+        do
+        {
+            for ( iter = list; NULL != iter; iter = iter->left )
+            {
+                stack[stack_i++] = iter;
+		g_return_if_fail(stack_i < LSQ_BTREE_MAX_DEPTH);
+            }
+
+            list = stack[--stack_i]->right;
+
+            g_free( stack[stack_i] );
+        }
+        while ( 0 != stack_i || NULL != list );
+    }
+}
+
+LSQBTree *
+lsq_btree_flatten ( LSQBTree *list )
+{
+    LSQBTree *iter, *next = list;
+    LSQBTree **prev = &list;
+    LSQBTree *stack[LSQ_BTREE_MAX_DEPTH];
+    guint stack_i = 0;
+
+    /* The tree is flattened */
+    if ( NULL == list || NULL != list->next )
+    {
+        return list;
+    }
+
+    do
+    {
+        for ( iter = next; NULL != iter; iter = iter->left )
+        {
+            stack[stack_i++] = iter;
+	    g_return_val_if_fail(stack_i < LSQ_BTREE_MAX_DEPTH, NULL);
+        }
+
+        next = stack[--stack_i];
+
+        *prev = next;
+        prev = &next->next;
+
+        next = next->right;
+    }
+    while ( 0 != stack_i || NULL != next );
+
+    return list;
+}
+
diff --git a/libsqueeze/slist.h b/libsqueeze/btree.h
similarity index 57%
rename from libsqueeze/slist.h
rename to libsqueeze/btree.h
index 4772afc..67a067b 100644
--- a/libsqueeze/slist.h
+++ b/libsqueeze/btree.h
@@ -14,39 +14,31 @@
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
-#ifndef __LSQ_SLIST_H__
-#define __LSQ_SLIST_H__
+#ifndef __LSQ_BTREE_H__
+#define __LSQ_BTREE_H__
 
-typedef struct _LSQSList LSQSList;
+typedef struct _LSQBTree LSQBTree;
 
-struct _LSQSList {
-	LSQArchiveEntry *entry;
-	LSQSList *next;
+struct _LSQBTree {
+    LSQArchiveEntry *entry;
+    LSQBTree *next;
+    LSQBTree *left;
+    LSQBTree *right;
 };
 
-LSQSList *
-lsq_slist_insert_sorted_single (
-        LSQSList *list,
+LSQBTree *
+lsq_btree_insert_sorted_single (
+        LSQBTree *list,
         LSQArchiveEntry *entry,
-        GCompareFunc) G_GNUC_INTERNAL;
+        GCompareFunc ) G_GNUC_INTERNAL;
 
 guint
-lsq_slist_length(LSQSList *list) G_GNUC_INTERNAL;
+lsq_btree_length ( LSQBTree *list ) G_GNUC_INTERNAL;
 
 void
-lsq_slist_free(LSQSList *list) G_GNUC_INTERNAL;
+lsq_btree_free ( LSQBTree *list ) G_GNUC_INTERNAL;
 
-typedef struct _LSQSIndexList LSQSIndexList;
+LSQBTree *
+lsq_btree_flatten ( LSQBTree *list ) G_GNUC_INTERNAL;
 
-struct _LSQSIndexList {
-    LSQSList *index;
-    LSQSIndexList *next;
-};
-
-LSQSIndexList *
-lsq_slist_index_new(void);
-
-void
-lsq_slist_index_free(LSQSIndexList *list);
-
-#endif /* __LSQ_SLIST_H__ */
+#endif /* __LSQ_BTREE_H__ */
diff --git a/libsqueeze/slist.c b/libsqueeze/slist.c
deleted file mode 100644
index b15cd8a..0000000
--- a/libsqueeze/slist.c
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU Library General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-#include <config.h>
-#include <string.h>
-#include <glib.h>
-#include <glib-object.h>
-#include <gio/gio.h>
-
-#include <libxfce4util/libxfce4util.h>
-
-#include "libsqueeze.h"
-#include "support-factory.h"
-#include "internals.h"
-#include "slist.h"
-
-LSQSList *
-lsq_slist_insert_sorted_single ( 
-        LSQSList *list,
-        LSQArchiveEntry *entry,
-        GCompareFunc cmp_func)
-{
-    gint cmp = 1;
-    LSQSList *iter = list;
-    LSQSList *prev_entry = NULL;
-    LSQSList *new_entry = NULL;
-
-    for(; iter; iter = iter->next)
-    {
-        /* archive can be NULL */
-        cmp = cmp_func(entry, (LSQArchiveEntry*)iter->entry);
-
-        if ( 0 == cmp )
-        {
-            g_critical("THIS SHOULD NOT HAPPEN!!! (the universe has just collapsed)");
-            return NULL;
-        }
-        if ( 0 > cmp )
-        {
-            break;
-        }
-
-        prev_entry = iter;
-    }
-
-    new_entry = g_new0(LSQSList, 1);
-    new_entry->next = iter;
-    new_entry->entry = entry;
-
-    if ( NULL == prev_entry )
-    {
-        return new_entry;
-    }
-    
-    prev_entry->next = new_entry;
-    return list;
-}
-
-guint
-lsq_slist_length ( LSQSList *list )
-{
-    guint size = 0;
-    for(; list; list = list->next)
-    {
-        size++;
-    }
-    return size;
-}
-
-void
-lsq_slist_free ( LSQSList *list )
-{
-    LSQSList *next;
-    for(; list; list = next)
-    {
-        next = list->next;
-        g_free(list);
-    }
-}
-
-LSQSIndexList *
-lsq_slist_index_new(void)
-{
-    return g_new0(LSQSIndexList, 1);
-}
-
-void
-lsq_slist_index_free ( LSQSIndexList *list )
-{
-    LSQSIndexList *next;
-    for(; list; list = next)
-    {
-        next = list->next;
-        g_free(list);
-    }
-}
-


More information about the Xfce4-commits mailing list