#ifndef __TUNNEL_MACRO_H__ #define __TUNNEL_MACRO_H__ #include #include #define _new(t) memset(malloc(sizeof(t)), 0, sizeof(t)) #define _copy(p, ...) _copy_(p, ## __VA_ARGS__, sizeof(*p)) #define _copy_(p, n, ...) memcpy(malloc(n), p, n) #define __unused __attribute__((unused)) #define __cleanup(f) __attribute__((cleanup(f))) #define CAT(a, b) CAT_(a, b) #define CAT_(a, b) a ## b #define UNIQ(name) CAT(name, __LINE__) #define defer \ auto void UNIQ(defer_func)(int *); \ int UNIQ(defer_var) __cleanup(UNIQ(defer_func)); \ void UNIQ(defer_func)(int *p __unused) #endif