Blame include/utils.h

Packit c5a612
#ifndef NFTABLES_UTILS_H
Packit c5a612
#define NFTABLES_UTILS_H
Packit c5a612
Packit c5a612
#include <asm/byteorder.h>
Packit c5a612
#include <stdint.h>
Packit c5a612
#include <stdbool.h>
Packit c5a612
#include <stdarg.h>
Packit c5a612
#include <stdio.h>
Packit c5a612
#include <unistd.h>
Packit c5a612
#include <assert.h>
Packit c5a612
#include <list.h>
Packit c5a612
#include <gmputil.h>
Packit c5a612
Packit c5a612
#include "config.h"
Packit c5a612
#ifdef HAVE_VISIBILITY_HIDDEN
Packit c5a612
#       define __visible        __attribute__((visibility("default")))
Packit c5a612
#       define EXPORT_SYMBOL(x) typeof(x) (x) __visible;
Packit c5a612
#else
Packit c5a612
#       define EXPORT_SYMBOL
Packit c5a612
#endif
Packit c5a612
Packit c5a612
#define BITS_PER_BYTE	8
Packit c5a612
Packit c5a612
#define pr_debug(fmt, arg...) printf(fmt, ##arg)
Packit c5a612
Packit c5a612
#if defined(HAVE_LIBGMP)
Packit c5a612
#define pr_gmp_debug(fmt, arg...) gmp_printf(fmt, ##arg)
Packit c5a612
#else
Packit c5a612
#define pr_gmp_debug(fmt, arg...) ({ if (false) {}; 0; })
Packit c5a612
#endif
Packit c5a612
Packit c5a612
#define __fmtstring(x, y)	__attribute__((format(printf, x, y)))
Packit c5a612
#if 0
Packit c5a612
#define __gmp_fmtstring(x, y)	__fmtstring(x, y)
Packit c5a612
#else
Packit c5a612
#define __gmp_fmtstring(x, y)
Packit c5a612
#endif
Packit c5a612
Packit c5a612
#define __must_check		__attribute__((warn_unused_result))
Packit c5a612
#define __noreturn		__attribute__((__noreturn__))
Packit c5a612
Packit c5a612
#define BUG(fmt, arg...)	({ fprintf(stderr, "BUG: " fmt, ##arg); assert(0); })
Packit c5a612
Packit c5a612
#define BUILD_BUG_ON(condition)	((void)sizeof(char[1 - 2*!!(condition)]))
Packit c5a612
#define BUILD_BUG_ON_ZERO(e)	(sizeof(char[1 - 2 * !!(e)]) - 1)
Packit c5a612
Packit c5a612
#define __must_be_array(a) \
Packit c5a612
	BUILD_BUG_ON_ZERO(__builtin_types_compatible_p(typeof(a), typeof(&a[0])))
Packit c5a612
Packit c5a612
#define container_of(ptr, type, member) ({			\
Packit c5a612
	typeof( ((type *)0)->member ) *__mptr = (ptr);		\
Packit c5a612
	(type *)( (void *)__mptr - offsetof(type,member) );})
Packit c5a612
Packit c5a612
/**
Packit c5a612
 * Return a pointer to a constant variable of a size smaller than the variable.
Packit c5a612
 */
Packit c5a612
#ifdef __LITTLE_ENDIAN_BITFIELD
Packit c5a612
#define constant_data_ptr(val, len) \
Packit c5a612
	((void *)&(val))
Packit c5a612
#elif defined(__BIG_ENDIAN_BITFIELD)
Packit c5a612
#define constant_data_ptr(val, len) \
Packit c5a612
	((void *)&(val) + sizeof(val) - div_round_up(len, BITS_PER_BYTE))
Packit c5a612
#else
Packit c5a612
#error "byteorder undefined"
Packit c5a612
#endif
Packit c5a612
Packit c5a612
#define field_sizeof(t, f)	(sizeof(((t *)NULL)->f))
Packit c5a612
#define array_size(arr)		(sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))
Packit c5a612
#define div_round_up(n, d)	(((n) + (d) - 1) / (d))
Packit c5a612
#define round_up(n, b)		(div_round_up(n, b) * b)
Packit c5a612
Packit c5a612
#define min(_x, _y) ({				\
Packit c5a612
	_x < _y ? _x : _y; })
Packit c5a612
Packit c5a612
#define max(_x, _y) ({				\
Packit c5a612
	_x > _y ? _x : _y; })
Packit c5a612
Packit c5a612
#define SNPRINTF_BUFFER_SIZE(ret, size, len, offset)	\
Packit c5a612
	if (ret < 0)					\
Packit c5a612
		abort();				\
Packit c5a612
	offset += ret;					\
Packit c5a612
	assert(ret < len);				\
Packit c5a612
	if (ret > len)					\
Packit c5a612
		ret = len;				\
Packit c5a612
	size += ret;					\
Packit c5a612
	len -= ret;
Packit c5a612
Packit c5a612
#define MSEC_PER_SEC	1000L
Packit c5a612
Packit c5a612
/**
Packit c5a612
 * fls - find last (most-significant) bit set
Packit c5a612
 * @x: the word to search
Packit c5a612
 *
Packit c5a612
 * This is defined the same way as ffs.
Packit c5a612
 * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
Packit c5a612
 */
Packit c5a612
static inline int fls(int x)
Packit c5a612
{
Packit c5a612
	int r = 32;
Packit c5a612
Packit c5a612
	if (!x)
Packit c5a612
		return 0;
Packit c5a612
	if (!(x & 0xffff0000u)) {
Packit c5a612
		x <<= 16;
Packit c5a612
		r -= 16;
Packit c5a612
	}
Packit c5a612
	if (!(x & 0xff000000u)) {
Packit c5a612
		x <<= 8;
Packit c5a612
		r -= 8;
Packit c5a612
	}
Packit c5a612
	if (!(x & 0xf0000000u)) {
Packit c5a612
		x <<= 4;
Packit c5a612
		r -= 4;
Packit c5a612
	}
Packit c5a612
	if (!(x & 0xc0000000u)) {
Packit c5a612
		x <<= 2;
Packit c5a612
		r -= 2;
Packit c5a612
	}
Packit c5a612
	if (!(x & 0x80000000u)) {
Packit c5a612
		x <<= 1;
Packit c5a612
		r -= 1;
Packit c5a612
	}
Packit c5a612
	return r;
Packit c5a612
}
Packit c5a612
Packit c5a612
extern void __memory_allocation_error(const char *filename, uint32_t line) __noreturn;
Packit c5a612
Packit c5a612
#define memory_allocation_error()		\
Packit c5a612
	__memory_allocation_error(__FILE__, __LINE__);
Packit c5a612
Packit c5a612
extern void xfree(const void *ptr);
Packit c5a612
extern void *xmalloc(size_t size);
Packit c5a612
extern void *xmalloc_array(size_t nmemb, size_t size);
Packit c5a612
extern void *xrealloc(void *ptr, size_t size);
Packit c5a612
extern void *xzalloc(size_t size);
Packit c5a612
extern char *xstrdup(const char *s);
Packit c5a612
extern void xstrunescape(const char *in, char *out);
Packit c5a612
Packit c5a612
#endif /* NFTABLES_UTILS_H */