Mercurial > pidgin.yaz
comparison libpurple/protocols/qq/group_opt.c @ 21939:5bf38e411fda
Yes, we really can use qsort(3) rather than reimplementing it. I've tested
this code against some invented 0xffffffff-terminated guint32 arrays and it
sorts them identically to the old code. I'm a little unconvinced by said
0xffffffff-terminated arrays in the first place: someone might like to go
through replacing them with GArrays!
author | Will Thompson <will.thompson@collabora.co.uk> |
---|---|
date | Tue, 25 Dec 2007 22:59:15 +0000 |
parents | dccfd999ffe7 |
children | 8515997d66e9 |
comparison
equal
deleted
inserted
replaced
21920:76d025660d9e | 21939:5bf38e411fda |
---|---|
37 #include "group_network.h" | 37 #include "group_network.h" |
38 #include "group_opt.h" | 38 #include "group_opt.h" |
39 #include "packet_parse.h" | 39 #include "packet_parse.h" |
40 #include "utils.h" | 40 #include "utils.h" |
41 | 41 |
42 /* TODO: can't we use qsort here? */ | 42 static int _compare_guint32(const void *a, |
43 /* This implement quick sort algorithm (low->high) */ | 43 const void *b) |
44 static void _quick_sort(gint *numbers, gint left, gint right) | 44 { |
45 { | 45 const guint32 *x = a; |
46 gint pivot, l_hold, r_hold; | 46 const guint32 *y = b; |
47 | 47 return (*x - *y); |
48 l_hold = left; | |
49 r_hold = right; | |
50 pivot = numbers[left]; | |
51 while (left < right) { | |
52 while ((numbers[right] >= pivot) && (left < right)) | |
53 right--; | |
54 if (left != right) { | |
55 numbers[left] = numbers[right]; | |
56 left++; | |
57 } | |
58 while ((numbers[left] <= pivot) && (left < right)) | |
59 left++; | |
60 if (left != right) { | |
61 numbers[right] = numbers[left]; | |
62 right--; | |
63 } | |
64 } | |
65 numbers[left] = pivot; | |
66 pivot = left; | |
67 left = l_hold; | |
68 right = r_hold; | |
69 if (left < pivot) | |
70 _quick_sort(numbers, left, pivot - 1); | |
71 if (right > pivot) | |
72 _quick_sort(numbers, pivot + 1, right); | |
73 } | 48 } |
74 | 49 |
75 static void _sort(guint32 *list) | 50 static void _sort(guint32 *list) |
76 { | 51 { |
77 gint i; | 52 gint i; |
78 for (i = 0; list[i] < 0xffffffff; i++) {; | 53 for (i = 0; list[i] < 0xffffffff; i++) {; |
79 } | 54 } |
80 _quick_sort((gint *) list, 0, i - 1); | 55 qsort (list, i, sizeof (guint32), _compare_guint32); |
81 } | 56 } |
82 | 57 |
83 static void _qq_group_member_opt(PurpleConnection *gc, qq_group *group, gint operation, guint32 *members) | 58 static void _qq_group_member_opt(PurpleConnection *gc, qq_group *group, gint operation, guint32 *members) |
84 { | 59 { |
85 guint8 *data, *cursor; | 60 guint8 *data, *cursor; |