X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;ds=sidebyside;f=lib%2Futil.h;h=32a7c8cd86f4b0deeaab929a60d7c9c46457fbe0;hb=d710edc4c21d06c195ffc499e99e3d13694d2d34;hp=0db41be926389f0d48e9cb4af868e774b853f3bd;hpb=db5a101931c5393d5f9df600559882418d536878;p=sliver-openvswitch.git diff --git a/lib/util.h b/lib/util.h index 0db41be92..32a7c8cd8 100644 --- a/lib/util.h +++ b/lib/util.h @@ -87,8 +87,23 @@ void ovs_assert_failure(const char *, const char *, const char *) NO_RETURN; extern const char *program_name; +#define __ARRAY_SIZE_NOCHECK(ARRAY) (sizeof(ARRAY) / sizeof((ARRAY)[0])) +#ifdef __GNUC__ +/* return 0 for array types, 1 otherwise */ +#define __ARRAY_CHECK(ARRAY) \ + !__builtin_types_compatible_p(typeof(ARRAY), typeof(&ARRAY[0])) + +/* compile-time fail if not array */ +#define __ARRAY_FAIL(ARRAY) (sizeof(char[-2*!__ARRAY_CHECK(ARRAY)])) +#define __ARRAY_SIZE(ARRAY) \ + __builtin_choose_expr(__ARRAY_CHECK(ARRAY), \ + __ARRAY_SIZE_NOCHECK(ARRAY), __ARRAY_FAIL(ARRAY)) +#else +#define __ARRAY_SIZE(ARRAY) __ARRAY_SIZE_NOCHECK(ARRAY) +#endif + /* Returns the number of elements in ARRAY. */ -#define ARRAY_SIZE(ARRAY) (sizeof ARRAY / sizeof *ARRAY) +#define ARRAY_SIZE(ARRAY) __ARRAY_SIZE(ARRAY) /* Returns X / Y, rounding up. X must be nonnegative to round correctly. */ #define DIV_ROUND_UP(X, Y) (((X) + ((Y) - 1)) / (Y)) @@ -207,7 +222,7 @@ void set_program_name__(const char *name, const char *version, set_program_name__(name, VERSION, __DATE__, __TIME__) const char *get_subprogram_name(void); -void set_subprogram_name(const char *name); +void set_subprogram_name(const char *format, ...) PRINTF_FORMAT(1, 2); const char *get_program_version(void); void ovs_print_version(uint8_t min_ofp, uint8_t max_ofp);