From: Ben Pfaff Date: Thu, 10 Nov 2011 00:17:19 +0000 (-0800) Subject: vlan-bitmap: New function vlan_bitmap_from_array__(). X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a5ac7299f8042c01fcdb60c5508047146baf3a16;p=openvswitch vlan-bitmap: New function vlan_bitmap_from_array__(). --- diff --git a/lib/vlan-bitmap.c b/lib/vlan-bitmap.c index 94059c75..4c5c1eb6 100644 --- a/lib/vlan-bitmap.c +++ b/lib/vlan-bitmap.c @@ -24,29 +24,39 @@ unsigned long * vlan_bitmap_from_array(const int64_t *vlans, size_t n_vlans) { unsigned long *b; - size_t i, n; if (!n_vlans) { return NULL; } b = bitmap_allocate(4096); + if (!vlan_bitmap_from_array__(vlans, n_vlans, b)) { + free(b); + return NULL; + } + return b; +} + +/* Adds to 4096-bit VLAN bitmap 'b' a 1-bit in each position in the 'n_vlans' + * bits indicated in 'vlans'. Returns the number of 1-bits added to 'b'. */ +int +vlan_bitmap_from_array__(const int64_t *vlans, size_t n_vlans, + unsigned long int *b) +{ + size_t i; + int n; + n = 0; for (i = 0; i < n_vlans; i++) { int64_t vlan = vlans[i]; - if (vlan >= 0 && vlan < 4096) { + if (vlan >= 0 && vlan < 4096 && !bitmap_is_set(b, vlan)) { bitmap_set1(b, vlan); n++; } } - if (!n) { - free(b); - return NULL; - } - - return b; + return n; } /* Returns true if 'a' and 'b' are the same: either both null or both the same diff --git a/lib/vlan-bitmap.h b/lib/vlan-bitmap.h index 092c2ca8..fed0ba19 100644 --- a/lib/vlan-bitmap.h +++ b/lib/vlan-bitmap.h @@ -28,6 +28,9 @@ * This is empirically a useful data structure. */ unsigned long *vlan_bitmap_from_array(const int64_t *vlans, size_t n_vlans); +int vlan_bitmap_from_array__(const int64_t *vlans, size_t n_vlans, + unsigned long int *b); + bool vlan_bitmap_equal(const unsigned long *a, const unsigned long *b); /* Returns a new copy of 'vlans'. */