bitmapper 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/ext/bitmapper/bit_mapper_wrap.c +18 -3
- data/ext/bitmapper/bit_mapper_wrap.h +4 -0
- data/ext/bitmapper/bitmapper.c +24 -3
- metadata +1 -1
@@ -29,6 +29,7 @@ void allocate_map(Bitmapper* map, int index_len){
|
|
29
29
|
map->bkt_size = pow(10, 10 - index_len);
|
30
30
|
map->bkt_count = size;
|
31
31
|
map->index_len = index_len;
|
32
|
+
map->white_list_char = NULL;
|
32
33
|
sprintf(map->fill_str, "%%llu%%0%illu\n",10-index_len);
|
33
34
|
}
|
34
35
|
|
@@ -45,8 +46,19 @@ void free_map(Bitmapper* map){
|
|
45
46
|
map->bkts[i] = NULL;
|
46
47
|
}
|
47
48
|
}
|
49
|
+
if(map->white_list_char != NULL) free(map->white_list_char);
|
48
50
|
if(map->bkts != NULL) free(map->bkts);
|
51
|
+
}
|
52
|
+
|
53
|
+
void set_white_list_char(Bitmapper* map, char c){
|
54
|
+
if(map->white_list_char !=NULL) free(map->white_list_char);
|
55
|
+
map->white_list_char = (char*)malloc(sizeof(char));
|
56
|
+
map->white_list_char[0] = c;
|
57
|
+
}
|
49
58
|
|
59
|
+
void clear_white_list_char(Bitmapper* map){
|
60
|
+
if(map->white_list_char !=NULL) free(map->white_list_char);
|
61
|
+
map->white_list_char = NULL;
|
50
62
|
}
|
51
63
|
|
52
64
|
/*
|
@@ -161,11 +173,14 @@ int status_num(Bitmapper* map,unsigned long long int full_num){
|
|
161
173
|
*/
|
162
174
|
int add_numbers_in_file(Bitmapper* map,FILE *in){
|
163
175
|
char scan_str[20];
|
164
|
-
char msisdn[15], index[map->index_len], rest_num[10-map->index_len];
|
176
|
+
char msisdn[15], index[map->index_len+1], rest_num[10-map->index_len+1];
|
165
177
|
sprintf(scan_str, "%%%is%%%is\n",map->index_len, 10-map->index_len);
|
166
178
|
while(fgets(msisdn, 15, in)!=NULL){
|
167
179
|
sscanf(msisdn,scan_str, index, rest_num);
|
168
|
-
|
180
|
+
if(map->white_list_char !=NULL && strncmp(index, map->white_list_char, 1) != 0){
|
181
|
+
}else{
|
182
|
+
add_num_in_bkt(map, atoll(rest_num), atoll(index) );
|
183
|
+
}
|
169
184
|
}
|
170
185
|
}
|
171
186
|
|
@@ -179,7 +194,7 @@ int add_numbers_in_file(Bitmapper* map,FILE *in){
|
|
179
194
|
*/
|
180
195
|
int remove_numbers_in_file(Bitmapper* map,FILE *del){
|
181
196
|
char scan_str[20];
|
182
|
-
char msisdn[15], index[map->index_len], rest_num[10-map->index_len];
|
197
|
+
char msisdn[15], index[map->index_len+1], rest_num[10-map->index_len+1];
|
183
198
|
sprintf(scan_str, "%%%is%%%is\n",map->index_len, 10-map->index_len);
|
184
199
|
while(fgets(msisdn, 15, del)!=NULL){
|
185
200
|
sscanf(msisdn,scan_str, index, rest_num);
|
@@ -12,6 +12,7 @@ typedef struct Bitmapper{
|
|
12
12
|
unsigned long long int bkt_size; /* size of each bucket in bits */
|
13
13
|
/* the format specifier used to dump number to file from buckets */
|
14
14
|
int index_len;
|
15
|
+
char *white_list_char;
|
15
16
|
char fill_str[20];
|
16
17
|
} Bitmapper;
|
17
18
|
|
@@ -19,6 +20,9 @@ Bitmapper* create_map();
|
|
19
20
|
void allocate_map(Bitmapper*, int);
|
20
21
|
void free_map(Bitmapper*);
|
21
22
|
BitBucket* create_bucket_for(BitBucket*, unsigned long long int);
|
23
|
+
void set_white_list_char(Bitmapper*, char);
|
24
|
+
void clear_white_list_char(Bitmapper*);
|
25
|
+
|
22
26
|
int add_num_in_bkt(Bitmapper* ,unsigned long long int, unsigned long long int);
|
23
27
|
int add_num(Bitmapper* ,unsigned long long int);
|
24
28
|
int remove_num_in_bkt(Bitmapper* ,unsigned long long int, unsigned long long int);
|
data/ext/bitmapper/bitmapper.c
CHANGED
@@ -155,7 +155,6 @@ VALUE bm_set(VALUE self, VALUE num){
|
|
155
155
|
return (VALUE)Qtrue;
|
156
156
|
else
|
157
157
|
rb_raise(rb_eTypeError, "not valid number");
|
158
|
-
return (VALUE)Qfalse;
|
159
158
|
}
|
160
159
|
|
161
160
|
/*
|
@@ -171,7 +170,6 @@ VALUE bm_clear(VALUE self, VALUE num){
|
|
171
170
|
return (VALUE)Qtrue;
|
172
171
|
else
|
173
172
|
rb_raise(rb_eTypeError, "not valid number");
|
174
|
-
return (VALUE)Qfalse;
|
175
173
|
}
|
176
174
|
|
177
175
|
/*
|
@@ -192,7 +190,29 @@ VALUE bm_num_status(VALUE self, VALUE num){
|
|
192
190
|
else
|
193
191
|
rb_raise(rb_eTypeError, "not valid number");
|
194
192
|
return (VALUE)Qfalse;
|
193
|
+
}
|
194
|
+
|
195
|
+
|
196
|
+
VALUE bm_set_filter(VALUE self, VALUE vCh){
|
197
|
+
int status;
|
198
|
+
char ch;
|
199
|
+
Bitmapper* map;
|
200
|
+
|
201
|
+
Data_Get_Struct(self, Bitmapper, map);
|
202
|
+
vCh = rb_funcall(vCh, rb_intern("to_s"), 0); /* hack */
|
203
|
+
ch = NUM2CHR(vCh);
|
204
|
+
set_white_list_char(map, ch);
|
205
|
+
return (VALUE)Qtrue;
|
206
|
+
}
|
207
|
+
|
208
|
+
VALUE bm_clear_filter(VALUE self){
|
209
|
+
int status;
|
210
|
+
VALUE return_val;
|
211
|
+
Bitmapper* map;
|
195
212
|
|
213
|
+
Data_Get_Struct(self, Bitmapper, map);
|
214
|
+
clear_white_list_char(map);
|
215
|
+
return (VALUE)Qtrue;
|
196
216
|
}
|
197
217
|
|
198
218
|
void Init_bitmapper(){
|
@@ -204,11 +224,12 @@ void Init_bitmapper(){
|
|
204
224
|
rb_define_method(rb_cBitmapper, "add", bm_add_from_file, 1);
|
205
225
|
rb_define_method(rb_cBitmapper, "remove", bm_remove_from_file, 1);
|
206
226
|
rb_define_method(rb_cBitmapper, "dump_to", bm_dump_to_file, 1);
|
227
|
+
rb_define_method(rb_cBitmapper, "set_filter", bm_set_filter, 1);
|
228
|
+
rb_define_method(rb_cBitmapper, "clear_filter", bm_clear_filter, 0);
|
207
229
|
rb_define_method(rb_cBitmapper, "load_from_str", bm_load_str_to_bkt, 2);
|
208
230
|
rb_define_method(rb_cBitmapper, "dump_to_str", bm_dump_bkt_str, 2);
|
209
231
|
|
210
232
|
rb_define_method(rb_cBitmapper, "status?", bm_num_status, 1);
|
211
233
|
rb_define_method(rb_cBitmapper, "set", bm_set, 1);
|
212
234
|
rb_define_method(rb_cBitmapper, "clear", bm_clear, 1);
|
213
|
-
|
214
235
|
}
|