- 论坛徽章:
- 2
|
- /* ipmask.c - Cobras */
- #include <stdio.h>
- #define MASK_BIT 8
- #define MASK_DATA ((1 << MASK_BIT) - 1)
- int get_data_mask_bit(int data)
- {
- int mask;
- if (data >= 0 && data <= MASK_DATA) {
- for (mask = 0; (data & 1) == 0 && mask < MASK_BIT; data >>= 1, ++mask) {
- }
- return mask;
- }
- return -1;
- }
- int get_data_mask(int start, int end, int (*get_func)(int start, int bit_mask, void *usrdata), void *usrdata)
- {
- int mask;
- int mask_data;
- if (start >= 0 && end <= MASK_DATA && start <= end) {
- ++end;
- while (start < end) {
- mask = get_data_mask_bit(start);
- mask_data = 1 << mask;
- while (start + mask_data > end) {
- --mask;
- mask_data >>= 1;
- }
- if (get_func != NULL) {
- (*get_func)(start, MASK_BIT - mask, usrdata);
- }
- start += mask_data;
- }
- return 0;
- }
- return -1;
- }
- #if 1 /* TESTCASE */
- int print_mask(int start, int bit_mask, void *usrdata)
- {
- printf("%d/%d\n", start, bit_mask);
- return 0;
- }
- int test_get(int start, int end)
- {
- int retval;
- printf("GET %d, %d\n", start, end);
- retval = get_data_mask(start, end, print_mask, NULL);
- printf("RETURN: %d\n", retval);
- return 0;
- }
- int main(void)
- {
- test_get(5, 3);
- test_get(-1, 2);
- test_get(2, 5);
- test_get(0, 3);
- test_get(1, 1);
- test_get(0, 255);
- test_get(0, 254);
- return 0;
- }
- #endif
复制代码 |
|