-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbitmap.c
More file actions
86 lines (73 loc) · 1.94 KB
/
bitmap.c
File metadata and controls
86 lines (73 loc) · 1.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <stdio.h>
//#include <stdlib.h>
#include <assert.h>
#include <errno.h>
#include "bitmap.h"
int largest_bit(size_t num) {
assert(num > 0);
int ans = 0;
while (num != 1) {
num >>= 1;
ans++;
}
return ans;
}
void bitmap_free(void* bm, int ii) {
assert(ii >= 0);
size_t* bitmap = (size_t*) bm;
int sizet_id = ii / (sizeof(size_t) * 8);
size_t bit = ii % (sizeof(size_t) * 8);
bitmap[sizet_id] &= ~((size_t) 1 << bit);
}
int bitmap_set(void* bm, int size) {
assert(size > 0);
size_t* bitmap = (size_t*) bm;
int num_sizet = size / (sizeof(size_t) * 8);
if (size % (sizeof(size_t) * 8) != 0) {
num_sizet++;
}
int sizet_id = 0;
for (int i = 0; ~bitmap[i] == 0; i++) {
sizet_id++;
if (sizet_id >= num_sizet) {
return -ENOSPC;
}
}
size_t bit_bin = (bitmap[sizet_id] + 1) & ~bitmap[sizet_id];
int bit_dec = largest_bit(bit_bin);
int bit_num = (sizeof(size_t) * 8) * sizet_id + bit_dec;
if (bit_num >= size) {
return -ENOSPC;
}
bitmap[sizet_id] += bit_bin;
assert(bit_num < size);
return bit_num;
}
void bitmap_set_spec(void* bm, int ii) {
int sizet_id = ii / (sizeof(size_t) * 8);
size_t bit_num = ii % (sizeof(size_t) * 8);
size_t bit_bin = (size_t) 1 << bit_num;
((size_t*) bm)[sizet_id] |= bit_bin;
}
/*int main(int argc, char* argv[]) {
void* bm = malloc(256);
for (int i = 0; i < atoi(argv[1]); i++) {
//printf("%d ", i);
bitmap_set(bm, 256);
}
int b = bitmap_set(bm, 256);
printf("%d\n", b);
bitmap_free(bm, atoi(argv[2]));
bitmap_free(bm, atoi(argv[2]));
b = bitmap_set(bm, 256);
printf("%d\n", b);
for (int i = 2; i < atoi(argv[1]) + 2; i++) {
bitmap_set_spec(bm, atoi(argv[i]));
}
for (int i = 0; i < 4; i++) {
printf("0x%016lX ", ((size_t*) bm)[i]);
}
puts("");
return 0;
}
*/