File nautilus-226481-gsequence-insertion.diff of Package nautilus

https://bugzilla.novell.com/show_bug.cgi?id=226481
http://bugzilla.gnome.org/show_bug.cgi?id=350579

Fix insertion of nodes in GSequence.

2006-12-04  Alexander Larsson  <alexl@redhat.com>

	* cut-n-paste-code/gsequence/gsequence.[ch]:
	Import gsequence fix for #350579

Index: cut-n-paste-code/gsequence/gsequence.c
===================================================================
RCS file: /cvs/gnome/nautilus/cut-n-paste-code/gsequence/gsequence.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -p -r1.4 -r1.5
--- nautilus/cut-n-paste-code/gsequence/gsequence.c	25 Jul 2006 13:55:49 -0000	1.4
+++ nautilus/cut-n-paste-code/gsequence/gsequence.c	4 Dec 2006 13:14:36 -0000	1.5
@@ -51,6 +51,7 @@ static GSequenceNode *node_get_by_pos   
 					    gint               pos);
 static GSequenceNode *node_find_closest  (GSequenceNode   *haystack,
 					    GSequenceNode   *needle,
+					    GSequenceNode   *end,
 					    GSequenceIterCompareFunc cmp,
 					    gpointer           user_data);
 static gint             node_get_length    (GSequenceNode   *node);
@@ -64,6 +65,7 @@ static void             node_insert_befo
 static void             node_unlink        (GSequenceNode   *node);
 static void             node_insert_sorted (GSequenceNode   *node,
 					    GSequenceNode   *new,
+					    GSequenceNode   *end,
 					    GSequenceIterCompareFunc cmp_func,
 					    gpointer           cmp_data);
 
@@ -411,6 +413,7 @@ typedef struct
 {
     GCompareDataFunc    cmp_func;
     gpointer		cmp_data;
+    GSequenceNode	*end_node;
 } SortInfo;
 
 /* This function compares two iters using a normal compare
@@ -424,10 +427,10 @@ iter_compare (GSequenceIter *node1,
     const SortInfo *info = data;
     gint retval;
     
-    if (is_end (node1))
+    if (node1 == info->end_node)
 	return 1;
     
-    if (is_end (node2))
+    if (node2 == info->end_node)
 	return -1;
     
     retval = info->cmp_func (node1->data, node2->data, info->cmp_data);
@@ -452,7 +455,7 @@ g_sequence_sort (GSequence      *seq,
 		   GCompareDataFunc  cmp_func,
 		   gpointer          cmp_data)
 {
-    SortInfo info = { cmp_func, cmp_data };
+    SortInfo info = { cmp_func, cmp_data, seq->end_node };
     
     check_seq_access (seq);
     
@@ -480,11 +483,12 @@ g_sequence_insert_sorted (GSequence     
 			    GCompareDataFunc   cmp_func,
 			    gpointer           cmp_data)
 {
-    SortInfo info = { cmp_func, cmp_data };
+    SortInfo info = { cmp_func, cmp_data, NULL };
     
     g_return_val_if_fail (seq != NULL, NULL);
     g_return_val_if_fail (cmp_func != NULL, NULL);
     
+    info.end_node = seq->end_node;
     check_seq_access (seq);
     
     return g_sequence_insert_sorted_iter (seq, data, iter_compare, &info);
@@ -495,10 +499,11 @@ g_sequence_sort_changed (GSequenceIter  
 			   GCompareDataFunc  cmp_func,
 			   gpointer          cmp_data)
 {
-    SortInfo info = { cmp_func, cmp_data };
+    SortInfo info = { cmp_func, cmp_data, NULL };
     
     g_return_if_fail (!is_end (iter));
     
+    info.end_node = get_sequence (iter)->end_node;
     check_iter_access (iter);
     
     g_sequence_sort_changed_iter (iter, iter_compare, &info);
@@ -533,7 +538,7 @@ g_sequence_sort_iter (GSequence         
 	
 	node_unlink (node);
 	
-	node_insert_sorted (seq->end_node, node, cmp_func, cmp_data);
+	node_insert_sorted (seq->end_node, node, seq->end_node, cmp_func, cmp_data);
     }
     
     tmp->access_prohibited = FALSE;
@@ -558,7 +563,7 @@ g_sequence_sort_changed_iter (GSequenceI
     seq->access_prohibited = TRUE;
     
     node_unlink (iter);
-    node_insert_sorted (seq->end_node, iter, iter_cmp, cmp_data);
+    node_insert_sorted (seq->end_node, iter, seq->end_node, iter_cmp, cmp_data);
     
     seq->access_prohibited = FALSE;
 }
@@ -574,7 +579,7 @@ g_sequence_insert_sorted_iter   (GSequen
     check_seq_access (seq);
     
     new_node = node_new (data);
-    node_insert_sorted (seq->end_node, new_node, iter_cmp, cmp_data);
+    node_insert_sorted (seq->end_node, new_node, seq->end_node, iter_cmp, cmp_data);
     return new_node;
 }
 
@@ -595,7 +600,7 @@ g_sequence_search_iter (GSequence       
 
     dummy = node_new (data);
     
-    node = node_find_closest (seq->end_node, dummy, cmp_func, cmp_data);
+    node = node_find_closest (seq->end_node, dummy, seq->end_node, cmp_func, cmp_data);
 
     node_free (dummy, NULL);
     
@@ -624,10 +629,11 @@ g_sequence_search (GSequence      *seq,
 		     GCompareDataFunc  cmp_func,
 		     gpointer          cmp_data)
 {
-    SortInfo info = { cmp_func, cmp_data };
+    SortInfo info = { cmp_func, cmp_data, NULL };
     
     g_return_val_if_fail (seq != NULL, NULL);
     
+    info.end_node = seq->end_node;
     check_seq_access (seq);
     
     return g_sequence_search_iter (seq, data, iter_compare, &info);
@@ -1109,6 +1115,7 @@ node_get_pos (GSequenceNode    *node)
 static GSequenceNode *
 node_find_closest (GSequenceNode	      *haystack,
 		   GSequenceNode	      *needle,
+		   GSequenceNode            *end,
 		   GSequenceIterCompareFunc  cmp_func,
 		   gpointer		       cmp_data)
 {
@@ -1123,7 +1130,7 @@ node_find_closest (GSequenceNode	      *
     {
 	best = haystack;
 	
-	if (is_end (haystack))
+	if (haystack == end)
 	    c = 1;
 	else
 	    c = cmp_func (haystack, needle, cmp_data);
@@ -1285,12 +1292,13 @@ node_unlink (GSequenceNode *node)
 static void
 node_insert_sorted (GSequenceNode *node,
 		    GSequenceNode *new,
+		    GSequenceNode *end,
 		    GSequenceIterCompareFunc cmp_func,
 		    gpointer cmp_data)
 {
     GSequenceNode *closest;
     
-    closest = node_find_closest (node, new, cmp_func, cmp_data);
+    closest = node_find_closest (node, new, end, cmp_func, cmp_data);
     
     node_insert_before (closest, new);
 }
Index: cut-n-paste-code/gsequence/gsequence.h
===================================================================
RCS file: /cvs/gnome/nautilus/cut-n-paste-code/gsequence/gsequence.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -p -r1.2 -r1.3
--- nautilus/cut-n-paste-code/gsequence/gsequence.h	25 Jul 2006 13:55:49 -0000	1.2
+++ nautilus/cut-n-paste-code/gsequence/gsequence.h	4 Dec 2006 13:14:36 -0000	1.3
@@ -26,6 +26,7 @@ typedef struct _GSequence      GSequence
 typedef struct _GSequenceNode  GSequenceIter;
 
 
+
 typedef gint (* GSequenceIterCompareFunc) (GSequenceIter *a,
 					     GSequenceIter *b,
 					     gpointer	      data);
@@ -65,6 +66,8 @@ GSequenceIter *g_sequence_insert_before 
 						   gpointer                data);
 void		 g_sequence_move		  (GSequenceIter *	   src,
 						   GSequenceIter *	   dest);
+void		 g_sequence_swap                (GSequenceIter *       a,
+						   GSequenceIter *       b);
 GSequenceIter *g_sequence_insert_sorted        (GSequence            *seq,
 						   gpointer                data,
 						   GCompareDataFunc        cmp_func,
@@ -110,8 +113,6 @@ gint            g_sequence_iter_get_posi
 GSequenceIter *g_sequence_iter_move            (GSequenceIter *        iter,
 						   gint                    leap);
 GSequence *   g_sequence_iter_get_sequence    (GSequenceIter *        iter);
-void         g_sequence_swap                  (GSequenceIter *a,
-					       GSequenceIter *b);
 
 
 /* search */
openSUSE Build Service is sponsored by