summaryrefslogtreecommitdiff
path: root/cut-n-paste-code
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2006-12-04 13:14:36 +0000
committerAlexander Larsson <alexl@src.gnome.org>2006-12-04 13:14:36 +0000
commit9afc81b817441776a6c46f1272019430a845d978 (patch)
treee277c2703adcdcb5899edbe1430ee52f1261ec04 /cut-n-paste-code
parentc0642f66cea9fe1d0e8d8dd8df06a798e12de173 (diff)
downloadnautilus-9afc81b817441776a6c46f1272019430a845d978.tar.gz
Import gsequence fix for #350579
2006-12-04 Alexander Larsson <alexl@redhat.com> * cut-n-paste-code/gsequence/gsequence.[ch]: Import gsequence fix for #350579
Diffstat (limited to 'cut-n-paste-code')
-rw-r--r--cut-n-paste-code/gsequence/gsequence.c32
-rw-r--r--cut-n-paste-code/gsequence/gsequence.h5
2 files changed, 23 insertions, 14 deletions
diff --git a/cut-n-paste-code/gsequence/gsequence.c b/cut-n-paste-code/gsequence/gsequence.c
index 563d4174e..2670d320f 100644
--- a/cut-n-paste-code/gsequence/gsequence.c
+++ b/cut-n-paste-code/gsequence/gsequence.c
@@ -51,6 +51,7 @@ static GSequenceNode *node_get_by_pos (GSequenceNode *node,
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_before (GSequenceNode *node,
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 *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);
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 *iter,
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 *seq,
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 (GSequenceIter *iter,
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 (GSequence *seq,
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 *seq,
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 *haystack,
{
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);
}
diff --git a/cut-n-paste-code/gsequence/gsequence.h b/cut-n-paste-code/gsequence/gsequence.h
index 5f6066400..eeac4346e 100644
--- a/cut-n-paste-code/gsequence/gsequence.h
+++ b/cut-n-paste-code/gsequence/gsequence.h
@@ -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 (GSequenceIter * iter,
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_position (GSequenceIter * iter);
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 */