diff options
author | Michael Brown | 2015-03-02 15:10:21 +0100 |
---|---|---|
committer | Michael Brown | 2015-03-02 17:35:37 +0100 |
commit | 5d1f351278a3dd109f49bad6d17c770b184809c7 (patch) | |
tree | 441e40452c99215bab6ae75c93c3b0060e1a9131 /src/include/stddef.h | |
parent | [legal] Relicense files under GPL2_OR_LATER_OR_UBDL (diff) | |
download | ipxe-5d1f351278a3dd109f49bad6d17c770b184809c7.tar.gz ipxe-5d1f351278a3dd109f49bad6d17c770b184809c7.tar.xz ipxe-5d1f351278a3dd109f49bad6d17c770b184809c7.zip |
[libc] Rewrite unrelicensable portions of stddef.h
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/include/stddef.h')
-rw-r--r-- | src/include/stddef.h | 40 |
1 files changed, 29 insertions, 11 deletions
diff --git a/src/include/stddef.h b/src/include/stddef.h index bf792771..3c056294 100644 --- a/src/include/stddef.h +++ b/src/include/stddef.h @@ -1,25 +1,43 @@ #ifndef STDDEF_H #define STDDEF_H -FILE_LICENCE ( GPL2_ONLY ); +FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); -/* for size_t */ #include <stdint.h> +/** EFI headers also define NULL */ #undef NULL -#define NULL ((void *)0) -#undef offsetof -#if ( defined ( __GNUC__ ) && ( __GNUC__ > 3 ) ) -#define offsetof(TYPE, MEMBER) __builtin_offsetof(TYPE, MEMBER) +/** Null pointer */ +#define NULL ( ( void * ) 0 ) + +/** + * Get offset of a field within a structure + * + * @v type Structure type + * @v field Field within structure + * @ret offset Offset within structure + */ +#if defined ( __GNUC__ ) && ( __GNUC__ > 3 ) +#define offsetof( type, field ) __builtin_offsetof ( type, field ) #else -#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) +#define offsetof( type, field ) ( ( size_t ) &( ( ( type * ) NULL )->field ) ) #endif -#undef container_of -#define container_of(ptr, type, member) ({ \ - const typeof( ((type *)0)->member ) *__mptr = (ptr); \ - (type *)( (char *)__mptr - offsetof(type,member) );}) +/** + * Get containing structure + * + * @v ptr Pointer to contained field + * @v type Containing structure type + * @v field Field within containing structure + * @ret container Pointer to containing structure + */ +#define container_of( ptr, type, field ) ( { \ + type *__container; \ + const typeof ( __container->field ) *__field = (ptr); \ + __container = ( ( ( void * ) __field ) - \ + offsetof ( type, field ) ); \ + __container; } ) /* __WCHAR_TYPE__ is defined by gcc and will change if -fshort-wchar is used */ #ifndef __WCHAR_TYPE__ |