On Oct 23, 2014 3:31 PM, "Austin Clements" <aclements@csail.mit.edu> wrote: > > These macros help clarify basic bit-twiddling code and are written to > be robust against C undefined behavior of shift operators. > --- > lib/message.cc | 6 +++--- > lib/notmuch-private.h | 11 +++++++++++ > 2 files changed, 14 insertions(+), 3 deletions(-) > > diff --git a/lib/message.cc b/lib/message.cc > index 38bc929..55d2ff6 100644 > --- a/lib/message.cc > +++ b/lib/message.cc > @@ -869,7 +869,7 @@ notmuch_bool_t > notmuch_message_get_flag (notmuch_message_t *message, > notmuch_message_flag_t flag) > { > - return message->flags & (1 << flag); > + return NOTMUCH_TEST_BIT (message->flags, flag); > } > > void > @@ -877,9 +877,9 @@ notmuch_message_set_flag (notmuch_message_t *message, > notmuch_message_flag_t flag, notmuch_bool_t enable) > { > if (enable) > - message->flags |= (1 << flag); > + NOTMUCH_SET_BIT (&message->flags, flag); > else > - message->flags &= ~(1 << flag); > + NOTMUCH_CLEAR_BIT (&message->flags, flag); > } > > time_t > diff --git a/lib/notmuch-private.h b/lib/notmuch-private.h > index 36cc12b..7250291 100644 > --- a/lib/notmuch-private.h > +++ b/lib/notmuch-private.h > @@ -63,6 +63,17 @@ NOTMUCH_BEGIN_DECLS > #define STRNCMP_LITERAL(var, literal) \ > strncmp ((var), (literal), sizeof (literal) - 1) > > +/* Robust bit test/set/reset macros */ > +#define NOTMUCH_TEST_BIT(val, bit) \ > + ((bit < 0 || bit >= CHAR_BIT * sizeof (unsigned long long)) ? 0 \ > + : !!((val) & (1ull << bit))) > +#define NOTMUCH_SET_BIT(valp, bit) \ > + ((bit < 0 || bit >= CHAR_BIT * sizeof (unsigned long long)) ? *(valp) \ > + : (*(valp) |= (1ull << bit))) > +#define NOTMUCH_CLEAR_BIT(valp, bit) \ > + ((bit < 0 || bit >= CHAR_BIT * sizeof (unsigned long long)) ? *(valp) \ > + : (*(valp) &= ~(1ull << bit))) bit should be in braces in the above, like valp. Jani. > + > #define unused(x) x __attribute__ ((unused)) > > #ifdef __cplusplus > -- > 2.1.0 > > _______________________________________________ > notmuch mailing list > notmuch@notmuchmail.org > http://notmuchmail.org/mailman/listinfo/notmuch