5927340d8291196f66463fa6526067373459cc64
[libc-test] / src / functional / qsort.c
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include "test.h"
5
6 static int scmp(const void *a, const void *b)
7 {
8         return strcmp(*(char **)a, *(char **)b);
9 }
10
11 static int icmp(const void *a, const void *b)
12 {
13         return *(int*)a - *(int*)b;
14 }
15
16 static int ccmp(const void *a, const void *b)
17 {
18         return *(char*)a - *(char*)b;
19 }
20
21 /* 26 items -- even */
22 static const char *s[] = {
23         "Bob", "Alice", "John", "Ceres",
24         "Helga", "Drepper", "Emeralda", "Zoran",
25         "Momo", "Frank", "Pema", "Xavier",
26         "Yeva", "Gedun", "Irina", "Nono",
27         "Wiener", "Vincent", "Tsering", "Karnica",
28         "Lulu", "Quincy", "Osama", "Riley",
29         "Ursula", "Sam"
30 };
31 static const char *s_sorted[] = {
32         "Alice", "Bob", "Ceres", "Drepper",
33         "Emeralda", "Frank", "Gedun", "Helga",
34         "Irina", "John", "Karnica", "Lulu",
35         "Momo", "Nono", "Osama", "Pema",
36         "Quincy", "Riley", "Sam", "Tsering",
37         "Ursula", "Vincent", "Wiener", "Xavier",
38         "Yeva", "Zoran"
39 };
40
41 /* 23 items -- odd, prime */
42 static int n[] = {
43         879045, 394, 99405644, 33434, 232323, 4334, 5454,
44         343, 45545, 454, 324, 22, 34344, 233, 45345, 343,
45         848405, 3434, 3434344, 3535, 93994, 2230404, 4334
46 };
47 static int n_sorted[] = {
48         22, 233, 324, 343, 343, 394, 454, 3434,
49         3535, 4334, 4334, 5454, 33434, 34344, 45345, 45545,
50         93994, 232323, 848405, 879045, 2230404, 3434344, 99405644
51 };
52
53 static void string_sort(const char **a, const char **a_sorted, int len)
54 {
55         int i;
56         qsort(a, len, sizeof *a, scmp);
57         for (i=0; i<len; i++) {
58                 if (strcmp(a[i], a_sorted[i]) != 0) {
59                         error("string sort failed at index %d\n", i);
60                         test_printf("\ti\tgot\twant\n");
61                         for (i=0; i<len; i++)
62                                 test_printf("\t%d\t%s\t%s\n", i, a[i], a_sorted[i]);
63                         break;
64                 }
65         }
66 }
67
68 static void integer_sort(int *a, int *a_sorted, int len)
69 {
70         int i;
71         qsort(a, len, sizeof *a, icmp);
72         for (i=0; i<len; i++) {
73                 if (a[i] != a_sorted[i]) {
74                         error("integer sort failed at index %d\n", i);
75                         test_printf("\ti\tgot\twant\n");
76                         for (i=0; i<len; i++)
77                                 test_printf("\t%d\t%d\t%d\n", i, a[i], a_sorted[i]);
78                         break;
79                 }
80         }
81 }
82
83 #define T(a, a_sorted) do { \
84         char p[] = a; \
85         qsort(p, sizeof p - 1, 1, ccmp); \
86         if (memcmp(p, a_sorted, sizeof p) != 0) { \
87                 error("character sort failed\n"); \
88                 test_printf("\tgot:  \"%s\"\n", p); \
89                 test_printf("\twant: \"%s\"\n", a_sorted); \
90         } \
91 } while(0)
92
93 static void character_sort(void)
94 {
95         T("", "");
96         T("1", "1");
97         T("11", "11");
98         T("12", "12");
99         T("21", "12");
100         T("111", "111");
101         T("211", "112");
102         T("121", "112");
103         T("112", "112");
104         T("221", "122");
105         T("212", "122");
106         T("122", "122");
107         T("123", "123");
108         T("132", "123");
109         T("213", "123");
110         T("231", "123");
111         T("321", "123");
112         T("312", "123");
113         T("1423", "1234");
114         T("51342", "12345");
115         T("261435", "123456");
116         T("4517263", "1234567");
117         T("37245618", "12345678");
118         T("812436597", "123456789");
119         T("987654321", "123456789");
120         T("321321321", "111222333");
121         T("49735862185236174", "11223344556677889");
122 }
123
124 int main(void)
125 {
126         string_sort(s, s_sorted, sizeof s/sizeof*s);
127         integer_sort(n, n_sorted, sizeof n/sizeof*n);
128         character_sort();
129         return test_status;
130 }