util: use offsetof in container_of
authorGabriel Laskar <gabriel@lse.epita.fr>
Sun, 14 May 2017 14:33:16 +0000 (16:33 +0200)
committerPeter Hutterer <peter.hutterer@who-t.net>
Mon, 15 May 2017 00:21:51 +0000 (10:21 +1000)
gcc and clang supports offsetof (defined in stddef.h) as defined by C99
and POSIX.1-2001, use it in container_of.

Signed-off-by: Gabriel Laskar <gabriel@lse.epita.fr>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
src/libinput-util.h

index 9ecded7e17d47d62f82eb20dcd6d1d4042fb4450..6d9bbe23bec79eb4a0d133ed2abdaf6ef6c53b6b 100644 (file)
@@ -34,6 +34,7 @@
 #include <math.h>
 #include <stdarg.h>
 #include <stdbool.h>
+#include <stddef.h>
 #include <stdio.h>
 #include <string.h>
 #include <time.h>
@@ -86,8 +87,8 @@ void list_remove(struct list *elm);
 bool list_empty(const struct list *list);
 
 #define container_of(ptr, sample, member)                              \
-       (__typeof__(sample))((char *)(ptr)      -                       \
-                ((char *)&((typeof(sample))0)->member))
+       (__typeof__(sample))((char *)(ptr) -                            \
+                offsetof(__typeof__(*sample), member))
 
 #define list_for_each(pos, head, member)                               \
        for (pos = 0, pos = container_of((head)->next, pos, member);    \