Added SILC Bit Operations API.
[crypto.git] / lib / silcutil / tests / test_silcbitops.c
1 /* Bit operation tests */
2
3 #include "silc.h"
4
5 int main(int argc, char **argv)
6 {
7   SilcBool success = FALSE;
8   SILC_BITMAP_DECLARE(bitmap, 500);
9   int size = SILC_BITMAP_SIZE(500), bit;
10
11   if (argc > 1 && !strcmp(argv[1], "-d")) {
12     silc_log_debug(TRUE);
13     silc_log_quick(TRUE);
14     silc_log_debug_hexdump(TRUE);
15     silc_log_set_debug_string("*bit*");
16   }
17
18   silc_bit_clear_bitmap(bitmap, size);
19
20   SILC_LOG_DEBUG(("Setting bit 0"));
21   if (!silc_bit_set(bitmap, size, 0))
22     goto err;
23   bit = silc_bit_get(bitmap, size, 0);
24   SILC_LOG_DEBUG(("Get bit 0: %d", bit));
25   if (bit < 0)
26     goto err;
27   if (bit != 1)
28     goto err;
29
30   SILC_LOG_DEBUG(("Setting bit 100"));
31   if (!silc_bit_set(bitmap, size, 100))
32     goto err;
33   bit = silc_bit_get(bitmap, size, 100);
34   SILC_LOG_DEBUG(("Get bit 100: %d", bit));
35   if (bit < 0)
36     goto err;
37   if (bit != 1)
38     goto err;
39
40   SILC_LOG_DEBUG(("Clear bit 100"));
41   if (!silc_bit_clear(bitmap, size, 100))
42     goto err;
43   bit = silc_bit_get(bitmap, size, 100);
44   SILC_LOG_DEBUG(("Get bit 100: %d", bit));
45   if (bit < 0)
46     goto err;
47   if (bit != 0)
48     goto err;
49
50   SILC_LOG_DEBUG(("Toggle bit 99"));
51   if (!silc_bit_toggle(bitmap, size, 99))
52     goto err;
53   bit = silc_bit_get(bitmap, size, 99);
54   SILC_LOG_DEBUG(("Get bit 99: %d", bit));
55   if (bit < 0)
56     goto err;
57   if (bit != 1)
58     goto err;
59
60   SILC_LOG_DEBUG(("Test and toggle bit 499"));
61   bit = silc_bit_test_and_toggle(bitmap, size, 499);
62   if (bit != 0)
63     goto err;
64   bit = silc_bit_get(bitmap, size, 499);
65   SILC_LOG_DEBUG(("Get bit 499: %d", bit));
66   if (bit < 0)
67     goto err;
68   if (bit != 1)
69     goto err;
70
71   SILC_LOG_DEBUG(("Test and set bit 10"));
72   bit = silc_bit_test_and_set(bitmap, size, 10);
73   if (bit != 0)
74     goto err;
75   bit = silc_bit_get(bitmap, size, 10);
76   SILC_LOG_DEBUG(("Get bit 10: %d", bit));
77   if (bit < 0)
78     goto err;
79   if (bit != 1)
80     goto err;
81
82   SILC_LOG_DEBUG(("Test overflow"));
83   if (silc_bit_set(bitmap, size, 1500))
84     goto err;
85   SILC_LOG_DEBUG(("Overflow detected"));
86
87   SILC_LOG_DEBUG(("Find first set bit"));
88   bit = silc_bit_ffs(bitmap, size);
89   SILC_LOG_DEBUG(("First set bit: %d", bit));
90   if (bit != 0)
91     goto err;
92
93   SILC_LOG_DEBUG(("Find next set bit"));
94   bit = silc_bit_fns(bitmap, size, bit + 1);
95   SILC_LOG_DEBUG(("Next set bit: %d", bit));
96   if (bit != 10)
97     goto err;
98
99   SILC_LOG_DEBUG(("Find all set bits"));
100   bit = 0;
101   do {
102     bit = silc_bit_fns(bitmap, size, bit);
103     if (bit != -1) {
104       SILC_LOG_DEBUG(("Set bit: %d", bit));
105       bit++;
106     }
107   } while (bit != -1);
108
109   SILC_LOG_DEBUG(("Find first zero bit"));
110   bit = silc_bit_ffz(bitmap, size);
111   SILC_LOG_DEBUG(("First zero bit: %d", bit));
112   if (bit != 1)
113     goto err;
114
115   SILC_LOG_DEBUG(("Find next zero bit"));
116   bit = silc_bit_fnz(bitmap, size, bit + 1);
117   SILC_LOG_DEBUG(("Next zero bit: %d", bit));
118   if (bit != 2)
119     goto err;
120
121   SILC_LOG_DEBUG(("Clear bitmap"));
122   silc_bit_clear_bitmap(bitmap, size);
123
124   SILC_LOG_DEBUG(("Check for set bits"));
125   bit = silc_bit_ffs(bitmap, size);
126   if (bit > 0)
127     goto err;
128   SILC_LOG_DEBUG(("No set bits"));
129
130   success = TRUE;
131
132  err:
133   SILC_LOG_DEBUG(("Testing was %s", success ? "SUCCESS" : "FAILURE"));
134   fprintf(stderr, "Testing was %s\n", success ? "SUCCESS" : "FAILURE");
135
136   return success;
137 }