Whamcloud - gitweb
libext2fs: Fix ext2fs_iblk_{add,sub}_blocks() when the i_blocks_hi is non-zero
[tools/e2fsprogs.git] / lib / ext2fs / tst_bitops.c
1 /*
2  * This testing program makes sure the bitops functions work
3  *
4  * Copyright (C) 2001 by Theodore Ts'o.
5  *
6  * %Begin-Header%
7  * This file may be redistributed under the terms of the GNU Library
8  * General Public License, version 2.
9  * %End-Header%
10  */
11
12 #include <stdio.h>
13 #include <string.h>
14 #if HAVE_UNISTD_H
15 #include <unistd.h>
16 #endif
17 #include <fcntl.h>
18 #include <time.h>
19 #include <sys/stat.h>
20 #include <sys/types.h>
21 #if HAVE_ERRNO_H
22 #include <errno.h>
23 #endif
24 #include <sys/time.h>
25 #include <sys/resource.h>
26
27 #include "ext2_fs.h"
28 #include "ext2fs.h"
29
30 unsigned char bitarray[] = {
31         0x80, 0xF0, 0x40, 0x40, 0x0, 0x0, 0x0, 0x0, 0x10, 0x20, 0x00, 0x00
32         };
33
34 int bits_list[] = {
35         7, 12, 13, 14,15, 22, 30, 68, 77, -1,
36 };
37
38 #define BIG_TEST_BIT   (((unsigned) 1 << 31) + 42)
39
40
41 int main(int argc, char **argv)
42 {
43         int     i, j, size;
44         unsigned char testarray[12];
45         unsigned char *bigarray;
46
47         size = sizeof(bitarray)*8;
48 #if 0
49         i = ext2fs_find_first_bit_set(bitarray, size);
50         while (i < size) {
51                 printf("Bit set: %d\n", i);
52                 i = ext2fs_find_next_bit_set(bitarray, size, i+1);
53         }
54 #endif
55
56         /* Test test_bit */
57         for (i=0,j=0; i < size; i++) {
58                 if (ext2fs_test_bit(i, bitarray)) {
59                         if (bits_list[j] == i) {
60                                 j++;
61                         } else {
62                                 printf("Bit %d set, not expected\n", i);
63                                 exit(1);
64                         }
65                 } else {
66                         if (bits_list[j] == i) {
67                                 printf("Expected bit %d to be clear.\n", i);
68                                 exit(1);
69                         }
70                 }
71         }
72         printf("ext2fs_test_bit appears to be correct\n");
73
74         /* Test ext2fs_set_bit */
75         memset(testarray, 0, sizeof(testarray));
76         for (i=0; bits_list[i] > 0; i++) {
77                 ext2fs_set_bit(bits_list[i], testarray);
78         }
79         if (memcmp(testarray, bitarray, sizeof(testarray)) == 0) {
80                 printf("ext2fs_set_bit test succeeded.\n");
81         } else {
82                 printf("ext2fs_set_bit test failed.\n");
83                 for (i=0; i < sizeof(testarray); i++) {
84                         printf("%02x ", testarray[i]);
85                 }
86                 printf("\n");
87                 exit(1);
88         }
89         for (i=0; bits_list[i] > 0; i++) {
90                 ext2fs_clear_bit(bits_list[i], testarray);
91         }
92         for (i=0; i < sizeof(testarray); i++) {
93                 if (testarray[i]) {
94                         printf("ext2fs_clear_bit failed, "
95                                "testarray[%d] is %d\n", i, testarray[i]);
96                         exit(1);
97                 }
98         }
99         printf("ext2fs_clear_bit test succeed.\n");
100
101
102         /* Do bigarray test */
103         bigarray = malloc(1 << 29);
104         if (!bigarray) {
105                 fprintf(stderr, "Failed to allocate scratch memory!\n");
106                 exit(1);
107         }
108
109         bigarray[BIG_TEST_BIT >> 3] = 0;
110
111         ext2fs_set_bit(BIG_TEST_BIT, bigarray);
112         printf("big bit number (%u) test: %d, expected %d\n", BIG_TEST_BIT,
113                bigarray[BIG_TEST_BIT >> 3], (1 << (BIG_TEST_BIT & 7)));
114         if (bigarray[BIG_TEST_BIT >> 3] != (1 << (BIG_TEST_BIT & 7)))
115                 exit(1);
116
117         ext2fs_clear_bit(BIG_TEST_BIT, bigarray);
118
119         printf("big bit number (%u) test: %d, expected 0\n", BIG_TEST_BIT,
120                bigarray[BIG_TEST_BIT >> 3]);
121         if (bigarray[BIG_TEST_BIT >> 3] != 0)
122                 exit(1);
123
124         printf("ext2fs_set_bit big_test successful\n");
125
126
127         /* Now test ext2fs_fast_set_bit */
128         memset(testarray, 0, sizeof(testarray));
129         for (i=0; bits_list[i] > 0; i++) {
130                 ext2fs_fast_set_bit(bits_list[i], testarray);
131         }
132         if (memcmp(testarray, bitarray, sizeof(testarray)) == 0) {
133                 printf("ext2fs_fast_set_bit test succeeded.\n");
134         } else {
135                 printf("ext2fs_fast_set_bit test failed.\n");
136                 for (i=0; i < sizeof(testarray); i++) {
137                         printf("%02x ", testarray[i]);
138                 }
139                 printf("\n");
140                 exit(1);
141         }
142         for (i=0; bits_list[i] > 0; i++) {
143                 ext2fs_clear_bit(bits_list[i], testarray);
144         }
145         for (i=0; i < sizeof(testarray); i++) {
146                 if (testarray[i]) {
147                         printf("ext2fs_clear_bit failed, "
148                                "testarray[%d] is %d\n", i, testarray[i]);
149                         exit(1);
150                 }
151         }
152         printf("ext2fs_clear_bit test succeed.\n");
153
154
155         bigarray[BIG_TEST_BIT >> 3] = 0;
156
157         ext2fs_fast_set_bit(BIG_TEST_BIT, bigarray);
158         printf("big bit number (%u) test: %d, expected %d\n", BIG_TEST_BIT,
159                bigarray[BIG_TEST_BIT >> 3], (1 << (BIG_TEST_BIT & 7)));
160         if (bigarray[BIG_TEST_BIT >> 3] != (1 << (BIG_TEST_BIT & 7)))
161                 exit(1);
162
163         ext2fs_fast_clear_bit(BIG_TEST_BIT, bigarray);
164
165         printf("big bit number (%u) test: %d, expected 0\n", BIG_TEST_BIT,
166                bigarray[BIG_TEST_BIT >> 3]);
167         if (bigarray[BIG_TEST_BIT >> 3] != 0)
168                 exit(1);
169
170         printf("ext2fs_fast_set_bit big_test successful\n");
171
172         /* Repeat foregoing tests for 64-bit bitops */
173
174         /* Test test_bit */
175         for (i=0,j=0; i < size; i++) {
176                 if (ext2fs_test_bit64(i, bitarray)) {
177                         if (bits_list[j] == i) {
178                                 j++;
179                         } else {
180                                 printf("64-bit: Bit %d set, not expected\n",
181                                        i);
182                                 exit(1);
183                         }
184                 } else {
185                         if (bits_list[j] == i) {
186                                 printf("64-bit: "
187                                        "Expected bit %d to be clear.\n", i);
188                                 exit(1);
189                         }
190                 }
191         }
192         printf("64-bit: ext2fs_test_bit appears to be correct\n");
193
194         /* Test ext2fs_set_bit */
195         memset(testarray, 0, sizeof(testarray));
196         for (i=0; bits_list[i] > 0; i++) {
197                 ext2fs_set_bit64(bits_list[i], testarray);
198         }
199         if (memcmp(testarray, bitarray, sizeof(testarray)) == 0) {
200                 printf("64-bit: ext2fs_set_bit test succeeded.\n");
201         } else {
202                 printf("64-bit: ext2fs_set_bit test failed.\n");
203                 for (i=0; i < sizeof(testarray); i++) {
204                         printf("%02x ", testarray[i]);
205                 }
206                 printf("\n");
207                 exit(1);
208         }
209         for (i=0; bits_list[i] > 0; i++) {
210                 ext2fs_clear_bit64(bits_list[i], testarray);
211         }
212         for (i=0; i < sizeof(testarray); i++) {
213                 if (testarray[i]) {
214                         printf("64-bit: ext2fs_clear_bit failed, "
215                                "testarray[%d] is %d\n", i, testarray[i]);
216                         exit(1);
217                 }
218         }
219         printf("64-bit: ext2fs_clear_bit test succeed.\n");
220
221         /* Do bigarray test */
222         bigarray = malloc(1 << 29);
223         if (!bigarray) {
224                 fprintf(stderr, "Failed to allocate scratch memory!\n");
225                 exit(1);
226         }
227
228         bigarray[BIG_TEST_BIT >> 3] = 0;
229
230         ext2fs_set_bit64(BIG_TEST_BIT, bigarray);
231         printf("64-bit: big bit number (%u) test: %d, expected %d\n",
232                BIG_TEST_BIT, bigarray[BIG_TEST_BIT >> 3],
233                (1 << (BIG_TEST_BIT & 7)));
234         if (bigarray[BIG_TEST_BIT >> 3] != (1 << (BIG_TEST_BIT & 7)))
235                 exit(1);
236
237         ext2fs_clear_bit64(BIG_TEST_BIT, bigarray);
238
239         printf("64-bit: big bit number (%u) test: %d, expected 0\n",
240                BIG_TEST_BIT,
241                bigarray[BIG_TEST_BIT >> 3]);
242         if (bigarray[BIG_TEST_BIT >> 3] != 0)
243                 exit(1);
244
245         printf("64-bit: ext2fs_set_bit big_test successful\n");
246
247         /* Now test ext2fs_fast_set_bit */
248         memset(testarray, 0, sizeof(testarray));
249         for (i=0; bits_list[i] > 0; i++) {
250                 ext2fs_fast_set_bit64(bits_list[i], testarray);
251         }
252         if (memcmp(testarray, bitarray, sizeof(testarray)) == 0) {
253                 printf("64-bit: ext2fs_fast_set_bit test succeeded.\n");
254         } else {
255                 printf("64-bit: ext2fs_fast_set_bit test failed.\n");
256                 for (i=0; i < sizeof(testarray); i++) {
257                         printf("%02x ", testarray[i]);
258                 }
259                 printf("\n");
260                 exit(1);
261         }
262         for (i=0; bits_list[i] > 0; i++) {
263                 ext2fs_clear_bit64(bits_list[i], testarray);
264         }
265         for (i=0; i < sizeof(testarray); i++) {
266                 if (testarray[i]) {
267                         printf("64-bit: ext2fs_clear_bit failed, "
268                                "testarray[%d] is %d\n", i, testarray[i]);
269                         exit(1);
270                 }
271         }
272         printf("64-bit: ext2fs_clear_bit test succeed.\n");
273
274         bigarray[BIG_TEST_BIT >> 3] = 0;
275
276         ext2fs_fast_set_bit64(BIG_TEST_BIT, bigarray);
277         printf("64-bit: big bit number (%u) test: %d, expected %d\n",
278                BIG_TEST_BIT, bigarray[BIG_TEST_BIT >> 3],
279                (1 << (BIG_TEST_BIT & 7)));
280         if (bigarray[BIG_TEST_BIT >> 3] != (1 << (BIG_TEST_BIT & 7)))
281                 exit(1);
282
283         ext2fs_fast_clear_bit64(BIG_TEST_BIT, bigarray);
284
285         printf("64-bit: big bit number (%u) test: %d, expected 0\n",
286                BIG_TEST_BIT, bigarray[BIG_TEST_BIT >> 3]);
287         if (bigarray[BIG_TEST_BIT >> 3] != 0)
288                 exit(1);
289
290         printf("64-bit: ext2fs_fast_set_bit big_test successful\n");
291
292         exit(0);
293 }