Add sys_chdir system call
[thunix.git] / lib / bitopts.c
blob2f2e6a625877c82a9ed0257baab74185cbf9b2e3
1 #include <stdio.h>
2 #include <stdint.h>
3 #include <bitopts.h>
5 /*
6 * The bit opts function from Extprogs lib
7 */
11 * Set the bit and return it's original value
13 int set_bit(void * addr, unsigned int nr)
15 int mask, retval;
16 unsigned char *ADDR = (unsigned char *) addr;
18 ADDR += nr >> 3;
19 mask = 1 << (nr & 0x07);
20 retval = mask & *ADDR;
21 *ADDR |= mask;
22 return retval;
25 /*
26 * Clear the bit and return it's original value
28 int clear_bit(void * addr, unsigned int nr)
30 int mask, retval;
31 unsigned char *ADDR = (unsigned char *) addr;
33 ADDR += nr >> 3;
34 mask = 1 << (nr & 0x07);
35 retval = mask & *ADDR;
36 *ADDR &= ~mask;
37 return retval;
40 int test_bit(const void * addr, unsigned int nr)
42 int mask;
43 const unsigned char *ADDR = (const unsigned char *) addr;
45 ADDR += nr >> 3;
46 mask = 1 << (nr & 0x07);
47 return (mask & *ADDR);
50 unsigned long find_first_zero(void *buf, void *end)
52 unsigned long *p = (unsigned long *)buf;
53 unsigned long block = 0;
54 int i;
56 while (*p == 0xffffffff && (void *)p < end) {
57 p++;
58 block += 32;
60 if ((void *)p >= end)
61 return -1;
63 for (i = 0; i < 32; i++)
64 if (test_bit(p, i) == 0)
65 return block + i;
67 /* Just to avoid the compile warning message */
68 return -1;