> This will acquire its first user in an upcoming commit. > > This implementation is not optimized at all but it doesn't matter for the > purpose for which I intend to initially use it. > > Signed-off-by: Ben Pfaff <b...@nicira.com> > --- > lib/util.c | 29 +++++++++++++++++++++++++++++ > lib/util.h | 2 ++ > 2 files changed, 31 insertions(+) > > diff --git a/lib/util.c b/lib/util.c > index f3e47b1..01e8a0e 100644 > --- a/lib/util.c > +++ b/lib/util.c > @@ -1273,6 +1273,35 @@ bitwise_is_all_zeros(const void *p_, unsigned int len, > unsigned int ofs, > return true; > } > > +/* Scans the bits in 'p' that have bit offsets 'start' through 'end' > + * (inclusive) for the first bit with value 'target'. If one is found, > returns > + * its offset, otherwise 'end'. 'p' is 'len' bytes long. > + * > + * If you consider all of 'p' to be a single unsigned integer in network byte > + * order, then bit N is the bit with value 2**N. That is, bit 0 is the bit > + * with value 1 in p[len - 1], bit 1 is the bit with value 2, bit 2 is the > bit > + * with value 4, ..., bit 8 is the bit with value 1 in p[len - 2], and so on. > + * > + * Required invariant: > + * start <= end > + */ > +unsigned int > +bitwise_scan(const void *p_, unsigned int len, bool target, unsigned int > start, > + unsigned int end) > +{ > + const uint8_t *p = p_; > + unsigned int ofs; > + > + for (ofs = start; ofs < end; ofs++) { > + bool bit = (p[len - (ofs / 8 + 1)] & (1u << (ofs % 8))) != 0;
!= 0 seems redundant because converting to c99 bool has the same semantics. otherwise looks good to me. Acked-by: YAMAMOTO Takashi <yamam...@valinux.co.jp> _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev