[Ocfs2-tools-commits] zab commits r321 - trunk/libocfs2
svn-commits at oss.oracle.com
svn-commits at oss.oracle.com
Thu Oct 7 16:26:20 CDT 2004
Author: zab
Date: 2004-10-07 16:26:18 -0500 (Thu, 07 Oct 2004)
New Revision: 321
Modified:
trunk/libocfs2/bitops.c
Log:
o ocfs2_find_first_* is ocfs2_find_next_(, , 0)
o add some tests to make sure behaviour was stable across this change
Modified: trunk/libocfs2/bitops.c
===================================================================
--- trunk/libocfs2/bitops.c 2004-10-07 02:15:51 UTC (rev 320)
+++ trunk/libocfs2/bitops.c 2004-10-07 21:26:18 UTC (rev 321)
@@ -86,54 +86,12 @@
int ocfs2_find_first_bit_set(void *addr, int size)
{
- unsigned char *cp = (unsigned char *) addr;
- unsigned int res = 0;
- int d0;
- unsigned char tilde = ~0;
- unsigned int mask = 0U | tilde;
-
- if (!size)
- return 0;
-
- while ((size > res) && (*cp == 0)) {
- cp++;
- res += 8;
- }
- if (res >= size)
- return size;
- if ((res + 8) > size)
- mask >>= 8 - (size - res);
- d0 = ffs(*cp & mask);
- if (d0 == 0)
- return size;
-
- return res + d0 - 1;
+ return ocfs2_find_next_bit_set(addr, size, 0);
}
int ocfs2_find_first_bit_clear(void *addr, int size)
{
- unsigned char *cp = (unsigned char *) addr;
- unsigned int res = 0;
- int d0;
- unsigned char tilde = ~0;
- unsigned int mask = 0U | tilde;
-
- if (!size)
- return 0;
-
- while ((size > res) && (*cp == tilde)) {
- cp++;
- res += 8;
- }
- if (res >= size)
- return size;
- if ((res + 8) > size)
- mask >>= 8 - (size - res);
- d0 = ffs(~(*cp & mask));
- if (d0 == 0)
- return size;
-
- return res + d0 - 1;
+ return ocfs2_find_next_bit_clear(addr, size, 0);
}
int ocfs2_find_next_bit_set(void *addr, int size, int offset)
@@ -143,6 +101,10 @@
unsigned int bit = offset & 7, res = 0;
unsigned char tilde = ~0;
unsigned int mask = 0U | tilde;
+
+ /* XXX care to check for null ADDR and <= 0 for int args? */
+ if (size == 0)
+ return 0;
res = offset >> 3;
p = ((unsigned char *) addr) + res;
@@ -177,6 +139,9 @@
unsigned int bit = offset & 7, res = 0;
unsigned char tilde = ~0;
unsigned int mask = 0U | tilde;
+
+ if (size == 0)
+ return 0;
res = offset >> 3;
p = ((unsigned char *) addr) + res;
@@ -211,25 +176,35 @@
#include <stdlib.h>
#include <string.h>
+#define bit_expect(expect, which, args...) do { \
+ int _ret = ocfs2_find_##which(bitmap, args); \
+ fprintf(stdout, #which "(" #args ") = %d (expected %d: %s)\n", \
+ _ret, expect, \
+ _ret == expect ? "correct" : "_incorrect_"); \
+} while (0)
+
int main(int argc, char *argv[])
{
char bitmap[8 * sizeof(unsigned long)];
- int ret;
int size = sizeof(bitmap) * 8;
/* Test an arbitrary size (not byte bounded) */
memset(bitmap, 0, sizeof(bitmap));
ocfs2_set_bit(size - 1, bitmap);
- ret = ocfs2_find_first_bit_set(bitmap, size - 3);
- fprintf(stdout, "Pass1: first set %d (%s)\n", ret,
- (ret == (size - 3)) ? "correct" : "incorrect");
+ bit_expect(size - 3, first_bit_set, size - 3);
+ bit_expect(size - 1, first_bit_set, size);
+ bit_expect(size - 1, next_bit_set, size, size - 1);
+ bit_expect(size, next_bit_clear, size, size - 1);
+
memset(bitmap, 0xFF, sizeof(bitmap));
ocfs2_clear_bit(size - 1, bitmap);
- ret = ocfs2_find_first_bit_clear(bitmap, size - 3);
- fprintf(stdout, "Pass1: first clear %d (%s)\n", ret,
- (ret == (size - 3)) ? "correct" : "incorrect");
+ bit_expect(size - 3, first_bit_clear, size - 3);
+ bit_expect(size - 1, first_bit_clear, size);
+ bit_expect(size - 1, next_bit_clear, size, size - 1);
+ bit_expect(size, next_bit_set, size, size - 1);
+
/* XXX add more tests */
return 0;
}
More information about the Ocfs2-tools-commits
mailing list