1 /* 2 * kmod - interface to kernel module operations 3 * 4 * Copyright (C) 2011-2013 ProFUSION embedded systems 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with this library; if not, see <http://www.gnu.org/licenses/>. 18 */ 19 #pragma once 20 21 #include <stddef.h> 22 23 #if defined(HAVE_STATIC_ASSERT) 24 #define assert_cc(expr) \ 25 _Static_assert((expr), #expr) 26 #else 27 #define assert_cc(expr) \ 28 do { (void) sizeof(char [1 - 2*!(expr)]); } while(0) 29 #endif 30 31 #define check_types_match(expr1, expr2) \ 32 ((typeof(expr1) *)0 != (typeof(expr2) *)0) 33 34 #define container_of(member_ptr, containing_type, member) \ 35 ((containing_type *) \ 36 ((char *)(member_ptr) - offsetof(containing_type, member)) \ 37 - check_types_match(*(member_ptr), ((containing_type *)0)->member)) 38 39 40 /* Two gcc extensions. 41 * &a[0] degrades to a pointer: a different type from an array */ 42 #define _array_size_chk(arr) ({ \ 43 assert_cc(!__builtin_types_compatible_p(typeof(arr), typeof(&(arr)[0]))); \ 44 0; \ 45 }) 46 47 #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + _array_size_chk(arr)) 48 #define XSTRINGIFY(x) #x 49 #define STRINGIFY(x) XSTRINGIFY(x) 50 51 /* Temporaries for importing index handling */ 52 #define NOFAIL(x) (x) 53 #define fatal(x...) do { } while (0) 54 55 /* Attributes */ 56 57 #define _must_check_ __attribute__((warn_unused_result)) 58 #define _printf_format_(a,b) __attribute__((format (printf, a, b))) 59 #define _unused_ __attribute__((unused)) 60 #define _always_inline_ __inline__ __attribute__((always_inline)) 61 #define _cleanup_(x) __attribute__((cleanup(x))) 62 63 /* Define C11 noreturn without <stdnoreturn.h> and even on older gcc 64 * compiler versions */ 65 #ifndef noreturn 66 #if defined(HAVE_NORETURN) 67 #define noreturn _Noreturn 68 #else 69 #define noreturn __attribute__((noreturn)) 70 #endif 71 #endif 72 73 #define UNIQ __COUNTER__ 74