1 #include <inttypes.h>
2 #include <stdlib.h>
3 #include <stdio.h>
4 #include <string.h>
5 
6 #include <utest.h>
7 
scmp(const void * a,const void * b)8 static int scmp(const void *a, const void *b)
9 {
10     return strcmp(*(char **)a, *(char **)b);
11 }
12 
icmp(const void * a,const void * b)13 static int icmp(const void *a, const void *b)
14 {
15     return *(int *)a - *(int *)b;
16 }
17 
ccmp(const void * a,const void * b)18 static int ccmp(const void *a, const void *b)
19 {
20     return *(char *)a - *(char *)b;
21 }
22 
23 /**
24  * static int cmp64(const void *a, const void *b)
25  * {
26  *     const uint64_t *ua = a, *ub = b;
27  *     return *ua < *ub ? -1 : *ua != *ub;
28  * }
29  */
30 
31 /* 26 items -- even */
32 static const char *s[] =
33 {
34     "Bob", "Alice", "John", "Ceres",
35     "Helga", "Drepper", "Emeralda", "Zoran",
36     "Momo", "Frank", "Pema", "Xavier",
37     "Yeva", "Gedun", "Irina", "Nono",
38     "Wiener", "Vincent", "Tsering", "Karnica",
39     "Lulu", "Quincy", "Osama", "Riley",
40     "Ursula", "Sam"
41 };
42 static const char *s_sorted[] =
43 {
44     "Alice", "Bob", "Ceres", "Drepper",
45     "Emeralda", "Frank", "Gedun", "Helga",
46     "Irina", "John", "Karnica", "Lulu",
47     "Momo", "Nono", "Osama", "Pema",
48     "Quincy", "Riley", "Sam", "Tsering",
49     "Ursula", "Vincent", "Wiener", "Xavier",
50     "Yeva", "Zoran"
51 };
52 
53 /* 23 items -- odd, prime */
54 static int n[] =
55 {
56     879045, 394, 99405644, 33434, 232323, 4334, 5454,
57     343, 45545, 454, 324, 22, 34344, 233, 45345, 343,
58     848405, 3434, 3434344, 3535, 93994, 2230404, 4334
59 };
60 static int n_sorted[] =
61 {
62     22, 233, 324, 343, 343, 394, 454, 3434,
63     3535, 4334, 4334, 5454, 33434, 34344, 45345, 45545,
64     93994, 232323, 848405, 879045, 2230404, 3434344, 99405644
65 };
66 
str_test(const char ** a,const char ** a_sorted,int len)67 static void str_test(const char **a, const char **a_sorted, int len)
68 {
69     int i;
70     qsort(a, len, sizeof * a, scmp);
71     for (i = 0; i < len; i++)
72     {
73         uassert_true(strcmp(a[i], a_sorted[i]) == 0);
74     }
75 }
76 
int_test(int * a,int * a_sorted,int len)77 static void int_test(int *a, int *a_sorted, int len)
78 {
79     int i;
80     qsort(a, len, sizeof * a, icmp);
81     for (i = 0; i < len; i++)
82     {
83         uassert_true(a[i] == a_sorted[i]);
84     }
85 }
86 
87 #define T(a, a_sorted) do { \
88     char p[] = a; \
89     qsort(p, sizeof p - 1, 1, ccmp); \
90     uassert_true(memcmp(p, a_sorted, sizeof p) == 0);\
91 } while(0)
92 
char_test(void)93 static void char_test(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 
posix_testcase(void)124 void posix_testcase(void)
125 {
126     str_test(s, s_sorted, sizeof s / sizeof * s);
127     int_test(n, n_sorted, sizeof n / sizeof * n);
128     char_test();
129     /* todo uint64 test */
130 }
testcase(void)131 static void testcase(void)
132 {
133     UTEST_UNIT_RUN(posix_testcase);
134 }
135 UTEST_TC_EXPORT(testcase, "posix.stdlib_h.qsort_tc.c", RT_NULL, RT_NULL, 10);
136 
137