bitmapper 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
- add_num_in_bkt(map, atoll(rest_num), atoll(index) );
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);
@@ -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
  }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bitmapper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: