[Xfce4-commits] r23314 - xarchiver/branches/xarchiver-psybsd/src

Stephan Arts stephan at xfce.org
Sat Oct 7 23:36:18 UTC 2006


Author: stephan
Date: 2006-10-07 23:36:18 +0000 (Sat, 07 Oct 2006)
New Revision: 23314

Modified:
   xarchiver/branches/xarchiver-psybsd/src/archive_store.c
   xarchiver/branches/xarchiver-psybsd/src/archive_store.h
Log:
Applied patch from Peter de Ridder <pc.ridder at zonnet.nl>

- Speed up sorting
- Add functions for archive-navigation



Modified: xarchiver/branches/xarchiver-psybsd/src/archive_store.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/archive_store.c	2006-10-07 22:19:30 UTC (rev 23313)
+++ xarchiver/branches/xarchiver-psybsd/src/archive_store.c	2006-10-07 23:36:18 UTC (rev 23314)
@@ -91,6 +91,10 @@
 
 static gint
 xa_archive_entry_compare(XAArchiveStore *store, LXAEntry *a, LXAEntry *b);
+static void
+xa_archive_quicksort(XAArchiveStore *store, gint left, gint right);
+static void
+xa_archive_insertionsort(XAArchiveStore *store, gint left, gint right);
 
 static void
 xa_archive_store_sort(XAArchiveStore *store);
@@ -638,13 +642,13 @@
 static gint
 xa_archive_entry_compare(XAArchiveStore *store, LXAEntry *a, LXAEntry *b)
 {
-	LXAEntry *swap = a;
+	LXAEntry *swap = b;
 	if(store->sort_order == GTK_SORT_DESCENDING)
 	{
-		a = b;
-		b = swap;
+		b = a;
+		a = swap;
 	}
-	
+
 	LXAArchive *archive = store->archive;
 	gint column = store->sort_column;
 	gpointer props_a = a->props;
@@ -716,15 +720,8 @@
 		return;
 
 	LXAEntry *pentry = (LXAEntry*)store->current_entry->data;
-	LXAEntry *entry = NULL;
 	gint psize = lxa_entry_children_length(pentry);
 	gint i = 0;
-	gint j = 0;
-	gint sort_size = 0;
-	gint size = 0;
-	gint pos = 0;
-	gint begin = 0;
-	gint cmp = 1;
 
 	if(psize <= 1)
 		return;
@@ -733,33 +730,72 @@
 
 	for(i = 0; i < psize; i++)
 	{
-		size = sort_size;
-		begin = 0;
+		store->sort_list[i] = lxa_entry_children_nth_data(pentry, i);
+	}
+	xa_archive_quicksort(store, 0, psize-1);
+	xa_archive_insertionsort(store, 0, psize-1);
+}
 
-		entry = lxa_entry_children_nth_data(pentry, i);
-		while(size)
-		{
-			pos = size / 2;
-			cmp = xa_archive_entry_compare(store, entry, store->sort_list[begin+pos]);
+inline void
+swap(LXAEntry **left, LXAEntry **right)
+{
+	LXAEntry *tmp = *right;
+	*right = *left;
+	*left = tmp;
+}
 
-			if(cmp < 0)
-			{
-				size = pos;
-			}
-			else
-			{
-				size -= ++pos;
-				begin += pos;
-			}
-		}
+static void
+xa_archive_quicksort(XAArchiveStore *store, gint left, gint right)
+{
+	if(right-left < 30)	return;
 
-		for(j = sort_size; j > begin; j--)
+	gint i = (left+right)/2;
+	gint j = right-1;
+	LXAEntry *value = NULL;
+	LXAEntry **list = store->sort_list;
+
+	if(xa_archive_entry_compare(store, list[left], list[i]) > 0)
+		swap(list+left, list+i);
+	if(xa_archive_entry_compare(store, list[left], list[right]) > 0)
+		swap(list+left, list+right);
+	if(xa_archive_entry_compare(store, list[i], list[right]) > 0)
+		swap(list+i, list+right);
+	
+	swap(list+i, list+j);
+	i = left;
+	value = list[j];
+
+	for(;;)
+	{
+		while(xa_archive_entry_compare(store, list[++i], value) < 0);
+		while(xa_archive_entry_compare(store, list[--j], value) > 0);
+		if(j<i) break;
+
+		swap(list+i, list+j);
+	}
+	swap(list+i, list+right-1);
+	xa_archive_quicksort(store, left, j);
+	xa_archive_quicksort(store, i+1, right);
+}
+
+static void
+xa_archive_insertionsort(XAArchiveStore *store, gint left, gint right)
+{
+	gint i = 0;
+	gint j = 0;
+	LXAEntry *value = NULL;
+	LXAEntry **list = store->sort_list;
+
+	for(i = left+1; i <= right; i++)
+	{
+		j = i;
+		value = list[i];
+		while(j > left && xa_archive_entry_compare(store, list[j-1], value) > 0)
 		{
-			store->sort_list[j] = store->sort_list[j-1];
+			list[j] = list[j-1];
+			j--;
 		}
-		store->sort_list[begin] = entry;
-
-		sort_size++;
+		list[j] = value;
 	}
 }
 
@@ -993,3 +1029,130 @@
 		gtk_tree_path_free(path_);
 	}
 }
+/*
+gchar *
+xa_archive_store_get_pwd(XAArchiveStore *store)
+{
+	g_return_val_if_fail(store, NULL);
+
+	gint size = 0;
+	gint csize = 0;
+	gchar *path = NULL;
+	gchar *buf = NULL;
+	GSList *iter = store->current_entry;
+
+	while(iter)
+	{
+		size += strlen(((LXAEntry*)iter->data)->filename) + 1;
+		iter = iter->next;
+	}
+
+	if(size)
+	{
+		path = g_new(gchar, size + 1);
+		buf = g_new(gchar, size + 1);
+		path[0] = '\0';
+
+		iter = store->current_entry;
+
+		while(iter)
+		{
+			g_strlcpy(buf, path, size);
+			g_strlcpy(path, ((LXAEntry*)iter->data)->filename, size);
+			csize = g_strlcat(path, buf, size);
+			path[csize] = '/';
+			path[csize+1] = '\0';
+			iter = iter->next;
+		}
+	}
+	g_free(buf);
+	return path;
+}
+*/
+gchar *
+xa_archive_store_get_pwd(XAArchiveStore *store)
+{
+	g_return_val_if_fail(store, NULL);
+
+	gchar *path = NULL;
+	gchar **buf = NULL;
+	GSList *iter = store->current_entry;
+	gint i = g_slist_length(iter);
+
+	if(!i)
+		return NULL;
+
+	buf = g_new(gchar*, i+1);
+	buf[i] = NULL;
+
+	while(iter)
+	{
+		--i;
+		buf[i] = ((LXAEntry*)iter->data)->filename;
+		iter = iter->next;
+	}
+
+	path = g_strjoinv("/", buf);
+
+	g_free(buf);
+
+	return path;
+}
+
+GSList *
+xa_archive_store_get_pwd_list(XAArchiveStore *store)
+{
+	g_return_val_if_fail(store, NULL);
+
+	/* made a copy, don't want someone play with the internals */
+	return g_slist_copy(store->current_entry);
+}
+
+gchar *
+xa_archive_store_get_basename(XAArchiveStore *store)
+{
+	g_return_val_if_fail(store, NULL);
+
+	if(!store->current_entry)
+		return NULL;
+
+	return g_strdup(((LXAEntry*)store->current_entry->data)->filename);
+}
+
+gint
+xa_archive_store_set_pwd(XAArchiveStore *store, gchar *path)
+{
+	g_return_val_if_fail(store, -1);
+
+	if(!store->archive)
+		return -1;
+
+	gchar **buf = g_strsplit(path, "/", 0);
+	gchar **iter = buf;
+	LXAEntry *entry = &store->archive->root_entry;
+	GSList *stack = NULL;
+
+	while(iter)
+	{
+		if(*iter && iter[0])
+		{
+			entry = lxa_entry_get_child(entry, *iter);
+			if(!entry)
+			{
+				g_strfreev(buf);
+				g_slist_free(stack);
+				return -1;
+			}
+			stack = g_slist_prepend(stack, entry);
+		}
+		iter++;
+	}
+
+	g_strfreev(buf);
+
+	g_slist_free(store->current_entry);
+	store->current_entry = stack;
+	
+	return 0;
+}
+

Modified: xarchiver/branches/xarchiver-psybsd/src/archive_store.h
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/archive_store.h	2006-10-07 22:19:30 UTC (rev 23313)
+++ xarchiver/branches/xarchiver-psybsd/src/archive_store.h	2006-10-07 23:36:18 UTC (rev 23314)
@@ -75,5 +75,13 @@
 xa_archive_store_connect_treeview(XAArchiveStore *store, GtkTreeView *treeview);
 void
 xa_archive_store_go_up(XAArchiveStore *store);
+gchar *
+xa_archive_store_get_pwd(XAArchiveStore *store);
+GSList *
+xa_archive_store_get_pwd_list(XAArchiveStore *store);
+gchar *
+xa_archive_store_get_basename(XAArchiveStore *store);
+gint
+xa_archive_store_set_pwd(XAArchiveStore *store, gchar *path);
 
 #endif /* __XARCHIVER_ARCHIVE_STORE_H__ */



More information about the Xfce4-commits mailing list