X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fcontainer_of%2Fcontainer_of.h;h=2943b8f098d5e3eba3d7f71a439712dde01df04d;hb=44b37ee8aeb185f6837378fef17d887bda6ff89b;hp=ea8f1dd36cc191d6d3d3f690d342c0845d61d32e;hpb=578da7e7b6265153fa0519035fc52a086a711ac0;p=ccan diff --git a/ccan/container_of/container_of.h b/ccan/container_of/container_of.h index ea8f1dd3..2943b8f0 100644 --- a/ccan/container_of/container_of.h +++ b/ccan/container_of/container_of.h @@ -1,3 +1,4 @@ +/* CC0 (Public domain) - see LICENSE file for details */ #ifndef CCAN_CONTAINER_OF_H #define CCAN_CONTAINER_OF_H #include @@ -82,10 +83,27 @@ #define container_of_var(member_ptr, container_var, member) \ container_of(member_ptr, typeof(*container_var), member) #else -#define container_of_var(member_ptr, container_var, member) \ - ((void *)((char *)(member_ptr) \ - - ((char *)&(container_var)->member \ - - (char *)(container_var)))) +#define container_of_var(member_ptr, container_var, member) \ + ((void *)((char *)(member_ptr) - \ + container_off_var(container_var, member))) +#endif + +/** + * container_off_var - get offset of a field in enclosing structure + * @container_var: a pointer to a container structure + * @member: the name of a member within the structure. + * + * Given (any) pointer to a structure and a its member name, this + * macro does pointer subtraction to return offset of member in a + * structure memory layout. + * + */ +#if HAVE_TYPEOF +#define container_off_var(var, member) \ + container_off(typeof(*var), member) +#else +#define container_off_var(var, member) \ + ((char *)&(var)->member - (char *)(var)) #endif #endif /* CCAN_CONTAINER_OF_H */