Mercurial > gnulib
annotate tests/test-ffs.c @ 40057:b06060465f09
maint: Run 'make update-copyright'
author | Paul Eggert <eggert@cs.ucla.edu> |
---|---|
date | Tue, 01 Jan 2019 00:25:11 +0100 |
parents | 10eb9086bea0 |
children |
rev | line source |
---|---|
15390 | 1 /* |
40057
b06060465f09
maint: Run 'make update-copyright'
Paul Eggert <eggert@cs.ucla.edu>
parents:
19484
diff
changeset
|
2 * Copyright (C) 2011-2019 Free Software Foundation, Inc. |
15390 | 3 * |
4 * This program is free software: you can redistribute it and/or modify | |
5 * it under the terms of the GNU General Public License as published by | |
6 * the Free Software Foundation; either version 3 of the License, or | |
7 * (at your option) any later version. | |
8 * | |
9 * This program 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 | |
12 * GNU General Public License for more details. | |
13 * | |
14 * You should have received a copy of the GNU General Public License | |
19190 | 15 * along with this program. If not, see <https://www.gnu.org/licenses/>. */ |
15390 | 16 |
17 /* Written by Eric Blake. */ | |
18 #include <config.h> | |
19 | |
20 #include <strings.h> | |
21 | |
22 #include "signature.h" | |
23 SIGNATURE_CHECK (ffs, int, (int)); | |
24 | |
25 #include <limits.h> | |
26 | |
27 #include "macros.h" | |
28 | |
15429 | 29 #define NBITS (sizeof (int) * CHAR_BIT) |
30 | |
15390 | 31 static int |
32 naive (int i) | |
33 { | |
15426
60c6b6da0198
ffs: avoid undefined behavior
Eric Blake <eblake@redhat.com>
parents:
15390
diff
changeset
|
34 unsigned int j; |
15429 | 35 for (j = 0; j < NBITS; j++) |
15426
60c6b6da0198
ffs: avoid undefined behavior
Eric Blake <eblake@redhat.com>
parents:
15390
diff
changeset
|
36 if (i & (1U << j)) |
15390 | 37 return j + 1; |
38 return 0; | |
39 } | |
40 | |
41 int | |
42 main (int argc, char *argv[]) | |
43 { | |
15429 | 44 int x; |
15390 | 45 int i; |
46 | |
15429 | 47 for (x = -128; x <= 128; x++) |
48 ASSERT (ffs (x) == naive (x)); | |
49 for (i = 0; i < NBITS; i++) | |
15390 | 50 { |
15426
60c6b6da0198
ffs: avoid undefined behavior
Eric Blake <eblake@redhat.com>
parents:
15390
diff
changeset
|
51 ASSERT (ffs (1U << i) == naive (1U << i)); |
60c6b6da0198
ffs: avoid undefined behavior
Eric Blake <eblake@redhat.com>
parents:
15390
diff
changeset
|
52 ASSERT (ffs (1U << i) == i + 1); |
15429 | 53 ASSERT (ffs (-1U << i) == i + 1); |
54 } | |
55 for (i = 0; i < NBITS - 1; i++) | |
56 { | |
57 ASSERT (ffs (3U << i) == i + 1); | |
58 ASSERT (ffs (-3U << i) == i + 1); | |
59 } | |
60 for (i = 0; i < NBITS - 2; i++) | |
61 { | |
62 ASSERT (ffs (5U << i) == i + 1); | |
63 ASSERT (ffs (-5U << i) == i + 1); | |
64 ASSERT (ffs (7U << i) == i + 1); | |
65 ASSERT (ffs (-7U << i) == i + 1); | |
15390 | 66 } |
67 return 0; | |
68 } |