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;