1 /* 2 * Copyright (c) 2007, Novell Inc. 3 * 4 * This program is licensed under the BSD license, read LICENSE.BSD 5 * for further information 6 */ 7 8 /* 9 * bitmap.c 10 * 11 */ 12 13 #include <stdlib.h> 14 #include <string.h> 15 16 #include "bitmap.h" 17 #include "util.h" 18 19 /* constructor */ 20 void 21 map_init(Map *m, int n) 22 { 23 m->size = (n + 7) >> 3; 24 m->map = m->size ? solv_calloc(m->size, 1) : 0; 25 } 26 27 /* destructor */ 28 void 29 map_free(Map *m) 30 { 31 m->map = solv_free(m->map); 32 m->size = 0; 33 } 34 35 /* copy constructor t <- s */ 36 void 37 map_init_clone(Map *t, Map *s) 38 { 39 t->size = s->size; 40 if (s->size) 41 { 42 t->map = solv_malloc(s->size); 43 memcpy(t->map, s->map, s->size); 44 } 45 else 46 t->map = 0; 47 } 48 49 /* grow a map */ 50 void 51 map_grow(Map *m, int n) 52 { 53 n = (n + 7) >> 3; 54 if (m->size < n) 55 { 56 m->map = solv_realloc(m->map, n); 57 memset(m->map + m->size, 0, n - m->size); 58 m->size = n; 59 } 60 } 61 62 /* bitwise-ands maps t and s, stores the result in t. */ 63 void 64 map_and(Map *t, Map *s) 65 { 66 unsigned char *ti, *si, *end; 67 ti = t->map; 68 si = s->map; 69 end = ti + (t->size < s->size ? t->size : s->size); 70 while (ti < end) 71 *ti++ &= *si++; 72 } 73 74 /* bitwise-ors maps t and s, stores the result in t. */ 75 void 76 map_or(Map *t, Map *s) 77 { 78 unsigned char *ti, *si, *end; 79 if (t->size < s->size) 80 map_grow(t, s->size << 3); 81 ti = t->map; 82 si = s->map; 83 end = ti + (t->size < s->size ? t->size : s->size); 84 while (ti < end) 85 *ti++ |= *si++; 86 } 87 88 /* remove all set bits in s from t. */ 89 void 90 map_subtract(Map *t, Map *s) 91 { 92 unsigned char *ti, *si, *end; 93 ti = t->map; 94 si = s->map; 95 end = ti + (t->size < s->size ? t->size : s->size); 96 while (ti < end) 97 *ti++ &= ~*si++; 98 } 99 100 /* EOF */ 101