[PATCH evdev] Don't crop long value from EvdevBitIsSet.

walter harms wharms at bfs.de
Wed Nov 2 06:31:33 PDT 2011



Am 02.11.2011 14:15, schrieb Chase Douglas:
> On 11/02/2011 07:29 AM, walter harms wrote:
>>
>>
>> Am 02.11.2011 00:52, schrieb Peter Hutterer:
>>> Introduced in xf86-input-evdev-2.6.0-26-g4969389
>>>
>>> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
>>> ---
>>> Cutting long to int for the return value loses us some values, notably in
>>> the ABS_MT ranges.
>>>
>>>  src/evdev.c |    2 +-
>>>  1 files changed, 1 insertions(+), 1 deletions(-)
>>>
>>> diff --git a/src/evdev.c b/src/evdev.c
>>> index f593df0..6ab1a18 100644
>>> --- a/src/evdev.c
>>> +++ b/src/evdev.c
>>> @@ -190,7 +190,7 @@ static size_t EvdevCountBits(unsigned long *array, size_t nlongs)
>>>  
>>>  static inline int EvdevBitIsSet(const unsigned long *array, int bit)
>>>  {
>>> -    return array[bit / LONG_BITS] & (1LL << (bit % LONG_BITS));
>>> +    return !!(array[bit / LONG_BITS] & (1LL << (bit % LONG_BITS)));
>>>  }
>>>  
>>>  static inline void EvdevSetBit(unsigned long *array, int bit)
>>
>> hi,
>> i have never seen that !! notation. perhaps (array == 0) would be more readable and
>> not suprise to much people ?
> 
> I would like to echo this. I actually don't know what the '!!' does
> here. Since this is a one-off issue, can you add a comment to explain
> what it is doing?
> 

IMHO the following happens:

The first ! translates 0  (type long) into !0 (type int)
and translates !0 (type long) into 0 (type int)

Now you have int but the logic is reversed, so you need a second !

re,
 wh


More information about the xorg-devel mailing list