summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/libusbhid/data.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/lib/libusbhid/data.c b/lib/libusbhid/data.c
index 049c88b..afc5a21 100644
--- a/lib/libusbhid/data.c
+++ b/lib/libusbhid/data.c
@@ -63,13 +63,17 @@ hid_get_data(const void *p, const hid_item_t *h)
data = 0;
for (i = 0; i <= end; i++)
data |= buf[offs + i] << (i*8);
+
+ /* Correctly shift down data */
data >>= hpos % 8;
- data &= (1 << hsize) - 1;
- if (h->logical_minimum < 0) {
- /* Need to sign extend */
- hsize = sizeof data * 8 - hsize;
- data = (data << hsize) >> hsize;
- }
+ hsize = 32 - hsize;
+
+ /* Mask and sign extend in one */
+ if ((h->logical_minimum < 0) || (h->logical_maximum < 0))
+ data = (int32_t)((int32_t)data << hsize) >> hsize;
+ else
+ data = (uint32_t)((uint32_t)data << hsize) >> hsize;
+
return (data);
}
OpenPOWER on IntegriCloud