Remove 'grp' and merge into 'nss' and 'posix'
[platform/upstream/glibc.git] / stdlib / tst-bsearch.c
1 /* Copyright (C) 2000-2023 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, see
16    <https://www.gnu.org/licenses/>.  */
17
18 #include <stdio.h>
19 #include <stdlib.h>
20 #include <tst-stack-align.h>
21
22 struct item
23 {
24   int val;
25   const char *str;
26 } arr[] =
27 {
28   { 0, "zero" },
29   { 1, "one" },
30   { 2, "two" },
31   { 3, "three" },
32   { 4, "four" },
33   { 5, "five" },
34   { 6, "six" },
35   { 7, "seven" },
36   { 8, "eight" },
37   { 9, "nine" },
38   { 10, "ten" }
39 };
40 #define narr (sizeof (arr) / sizeof (arr[0]))
41
42 static int align_check;
43
44 static int
45 comp (const void *p1, const void *p2)
46 {
47   struct item *e1 = (struct item *) p1;
48   struct item *e2 = (struct item *) p2;
49
50   if (!align_check)
51     align_check = TEST_STACK_ALIGN () ? -1 : 1;
52
53   return e1->val - e2->val;
54 }
55
56
57 static int
58 do_test (void)
59 {
60   size_t cnt;
61   int result = 0;
62   struct item key;
63   struct item *res;
64
65   for (cnt = 0; cnt < narr; ++cnt)
66     {
67
68       key.val = arr[cnt].val;
69
70       res = (struct item *) bsearch (&key, arr, narr, sizeof (arr[0]), comp);
71       if (res == NULL)
72         {
73           printf ("entry %zd not found\n", cnt);
74           result = 1;
75         }
76       else if (res != &arr[cnt])
77         {
78           puts ("wrong entry returned");
79           result = 1;
80         }
81     }
82
83   /* And some special tests that shouldn't find any entry.  */
84   key.val = -1;
85   res = (struct item *) bsearch (&key, arr, narr, sizeof (arr[0]), comp);
86   if (res != NULL)
87     {
88       puts ("found an entry that's not there");
89       result = 1;
90     }
91
92   key.val = 11;
93   res = (struct item *) bsearch (&key, arr, narr, sizeof (arr[0]), comp);
94   if (res != NULL)
95     {
96       puts ("found an entry that's not there");
97       result = 1;
98     }
99
100   key.val = 11;
101   res = (struct item *) bsearch (&key, arr, 0, sizeof (arr[0]), comp);
102   if (res != NULL)
103     {
104       puts ("found an entry that's not there");
105       result = 1;
106     }
107
108   /* Now the array contains only one element - no entry should be found.  */
109   for (cnt = 0; cnt < narr; ++cnt)
110     {
111       key.val = arr[cnt].val;
112
113       res = (struct item *) bsearch (&key, &arr[5], 1, sizeof (arr[0]), comp);
114       if (cnt == 5)
115         {
116           if (res == NULL)
117             {
118               printf ("entry %zd not found\n", cnt);
119               result = 1;
120             }
121           else if (res != &arr[cnt])
122             {
123               puts ("wrong entry returned");
124               result = 1;
125             }
126         }
127       else if (res != NULL)
128         {
129           puts ("found an entry that's not there");
130           result = 1;
131         }
132     }
133
134   if (align_check == 0)
135     {
136       puts ("alignment not checked");
137       result = 1;
138     }
139   else if (align_check == -1)
140     {
141       puts ("stack not sufficiently aligned");
142       result = 1;
143     }
144
145   if (result == 0)
146     puts ("all OK");
147
148   return result;
149 }
150
151 #define TEST_FUNCTION do_test ()
152 #include "../test-skeleton.c"