diff options
Diffstat (limited to 'src/dt/common.h')
-rw-r--r-- | src/dt/common.h | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/src/dt/common.h b/src/dt/common.h new file mode 100644 index 0000000..9668c4e --- /dev/null +++ b/src/dt/common.h @@ -0,0 +1,125 @@ +#ifndef __DT_COMMON_H +#define __DT_COMMON_H + +#include <stdlib.h> +#include <string.h> +#include <stdint.h> + +/** + * container_of - cast a member of a structure out to the containing structure + * @ptr: the pointer to the member. + * @type: the type of the container struct this is embedded in. + * @member: the name of the member within the struct. + * + */ +#define container_of(ptr, type, member) ({ \ + const typeof( ((type *)0)->member ) *__mptr = (ptr); \ + (type *)( (char *)__mptr - offsetof(type,member) );}) + +#undef offsetof +#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) + +#ifdef DEBUG +#define pr_debug(fmt, arg...) printf(fmt, ##arg) +#else +#define pr_debug(fmt, arg...) +#endif + +#define pr_err(fmt, arg...) printf(fmt, ##arg) + +static inline void *xzalloc(size_t size) +{ + return calloc(1, size); +} + +typedef _Bool bool; + +enum { + false = 0, + true = 1 +}; + +/* + * Kernel pointers have redundant information, so we can use a + * scheme where we can return either an error code or a dentry + * pointer with the same return value. + * + * This should be a per-architecture thing, to allow different + * error and pointer decisions. + */ +#define MAX_ERRNO 4095 + +#ifndef __ASSEMBLY__ + +#define IS_ERR_VALUE(x) ((x) >= (unsigned long)-MAX_ERRNO) + +static inline void *ERR_PTR(long error) +{ + return (void *) error; +} + +static inline long PTR_ERR(const void *ptr) +{ + return (long) ptr; +} + +static inline long IS_ERR(const void *ptr) +{ + return IS_ERR_VALUE((unsigned long)ptr); +} + +static inline long IS_ERR_OR_NULL(const void *ptr) +{ + return !ptr || IS_ERR_VALUE((unsigned long)ptr); +} + +/** + * ERR_CAST - Explicitly cast an error-valued pointer to another pointer type + * @ptr: The pointer to cast. + * + * Explicitly cast an error-valued pointer to another pointer type in such a + * way as to make it clear that's what's going on. + */ +static inline void *ERR_CAST(const void *ptr) +{ + /* cast away the const */ + return (void *) ptr; +} + +/** + * strlcpy - Copy a %NUL terminated string into a sized buffer + * @dest: Where to copy the string to + * @src: Where to copy the string from + * @size: size of destination buffer + * + * Compatible with *BSD: the result is always a valid + * NUL-terminated string that fits in the buffer (unless, + * of course, the buffer size is zero). It does not pad + * out the result like strncpy() does. + */ +static inline size_t strlcpy(char *dest, const char *src, size_t size) +{ + size_t ret = strlen(src); + + if (size) { + size_t len = (ret >= size) ? size - 1 : ret; + memcpy(dest, src, len); + dest[len] = '\0'; + } + return ret; +} + +#define cpu_to_be32 __cpu_to_be32 +#define be32_to_cpu __be32_to_cpu + +#define ALIGN(x, a) __ALIGN_MASK(x, (typeof(x))(a) - 1) +#define __ALIGN_MASK(x, mask) (((x) + (mask)) & ~(mask)) + +#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) + +#endif + +uint32_t crc32(uint32_t crc, const void *_buf, unsigned int len); +uint32_t crc32_no_comp(uint32_t crc, const void *_buf, unsigned int len); + +#endif /* __DT_COMMON_H */ |