Provide offsetof when there is no builtin Add container_of
authorNathael Pajani <nathael.pajani@ed3l.fr>
Wed, 2 Sep 2015 09:08:07 +0000 (11:08 +0200)
committerNathael Pajani <nathael.pajani@ed3l.fr>
Tue, 8 Nov 2022 16:03:04 +0000 (17:03 +0100)
include/lib/stddef.h

index b410eb6..0ba2685 100644 (file)
 #ifndef LIB_STDDEF_H
 #define LIB_STDDEF_H
 
-#define offsetof(type, member)  __builtin_offsetof (type, member)
+/**
+ * offsetof - return the offset of a member in the containing structure.
+ */
+#ifdef __builtin_offsetof
+ #define offsetof(type, member)  __builtin_offsetof (type, member)
+#else
+ #define offsetof(type, member) ((size_t) &((type *)0)->member)
+#endif
+
+/**
+ * container_of - cast a member of a structure out to the containing structure
+ * @ptr:        the pointer to the member.
+ * @type:       the type of the container struct this is embedded in.
+ * @member:     the name of the member within the struct.
+ */
+#define container_of(ptr, type, member) ({                      \
+        const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
+        (type *)( (char *)__mptr - offsetof(type,member) );})
+
 
 #endif /* LIB_STDDEF_H */