Message ID | 20220616131409.23271-2-cgzones@googlemail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [RFC,1/4] libsepol: refactor ebitmap conversion in link.c | expand |
On Thu, Jun 16, 2022 at 3:14 PM Christian Göttsche <cgzones@googlemail.com> wrote: > > Similar like ebitmap_for_each_bit() iterates over all bits of an ebitmap > add ebitmap_for_each_bit_starting() iterating over all bits starting > from a specific node and bit, which can be from an outer iteration. > > Signed-off-by: Christian Göttsche <cgzones@googlemail.com> > --- > libsepol/include/sepol/policydb/ebitmap.h | 7 +++++++ > 1 file changed, 7 insertions(+) > > diff --git a/libsepol/include/sepol/policydb/ebitmap.h b/libsepol/include/sepol/policydb/ebitmap.h > index 81d0c7a6..83ff54c2 100644 > --- a/libsepol/include/sepol/policydb/ebitmap.h > +++ b/libsepol/include/sepol/policydb/ebitmap.h > @@ -80,6 +80,13 @@ static inline int ebitmap_node_get_bit(const ebitmap_node_t * n, unsigned int bi > #define ebitmap_for_each_positive_bit(e, n, bit) \ > ebitmap_for_each_bit(e, n, bit) if (ebitmap_node_get_bit(n, bit)) \ > > +#define ebitmap_for_each_bit_starting(e, startnode, startbit, n, bit) \ > + n = startnode; \ > + for (bit = ebitmap_next(&n, startbit); bit < ebitmap_length(e); bit = ebitmap_next(&n, bit)) \ > + > +#define ebitmap_for_each_positive_bit_starting(e, startnode, startbit, n, bit) \ > + ebitmap_for_each_bit_starting(e, startnode, startbit, n, bit) if (ebitmap_node_get_bit(n, bit)) \ > + > extern int ebitmap_cmp(const ebitmap_t * e1, const ebitmap_t * e2); > extern int ebitmap_or(ebitmap_t * dst, const ebitmap_t * e1, const ebitmap_t * e2); > extern int ebitmap_union(ebitmap_t * dst, const ebitmap_t * e1); > -- > 2.36.1 > I find the names "..._starting" confusing: the first bit which is iterated is the next one after "startnode/startbit". Moreover, startnode really needs to be not NULL for this to work, and in practice it works because this macro is used inside a ebitmap_for_each_bit() loop which ensures that startnode != NULL. To avoid possible semantic issues, I suggest naming these macros "..._after" instead: they are about iterating the bits of an ebitmap after some known bit. (Of course this is my humble opinion and please feel free to disagree and to keep the name you chose if you do) Thanks, Nicolas
diff --git a/libsepol/include/sepol/policydb/ebitmap.h b/libsepol/include/sepol/policydb/ebitmap.h index 81d0c7a6..83ff54c2 100644 --- a/libsepol/include/sepol/policydb/ebitmap.h +++ b/libsepol/include/sepol/policydb/ebitmap.h @@ -80,6 +80,13 @@ static inline int ebitmap_node_get_bit(const ebitmap_node_t * n, unsigned int bi #define ebitmap_for_each_positive_bit(e, n, bit) \ ebitmap_for_each_bit(e, n, bit) if (ebitmap_node_get_bit(n, bit)) \ +#define ebitmap_for_each_bit_starting(e, startnode, startbit, n, bit) \ + n = startnode; \ + for (bit = ebitmap_next(&n, startbit); bit < ebitmap_length(e); bit = ebitmap_next(&n, bit)) \ + +#define ebitmap_for_each_positive_bit_starting(e, startnode, startbit, n, bit) \ + ebitmap_for_each_bit_starting(e, startnode, startbit, n, bit) if (ebitmap_node_get_bit(n, bit)) \ + extern int ebitmap_cmp(const ebitmap_t * e1, const ebitmap_t * e2); extern int ebitmap_or(ebitmap_t * dst, const ebitmap_t * e1, const ebitmap_t * e2); extern int ebitmap_union(ebitmap_t * dst, const ebitmap_t * e1);
Similar like ebitmap_for_each_bit() iterates over all bits of an ebitmap add ebitmap_for_each_bit_starting() iterating over all bits starting from a specific node and bit, which can be from an outer iteration. Signed-off-by: Christian Göttsche <cgzones@googlemail.com> --- libsepol/include/sepol/policydb/ebitmap.h | 7 +++++++ 1 file changed, 7 insertions(+)