154 lines
6 KiB
C
154 lines
6 KiB
C
#ifndef VESSEL_DEF_H_
|
|
#define VESSEL_DEF_H_
|
|
|
|
#include "conf.h"
|
|
|
|
#include <wchar.h>
|
|
#include <string.h>
|
|
#include <stdint.h>
|
|
#include <stddef.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include <stdbool.h>
|
|
|
|
#define VS_UNUSED(x) (void)(x)
|
|
|
|
#define VS_ARRLEN(x) (sizeof((x)) / sizeof((x)[0]))
|
|
|
|
#if !defined(VS_LITTLE_ENDIAN) && !defined(VS_BIG_ENDIAN)
|
|
# if defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
|
|
# define VS_BIG_ENDIAN
|
|
# elif defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
|
|
# define VS_LITTLE_ENDIAN
|
|
# elif defined(_WIN32) || defined(_WIN64)
|
|
/* Windows platforms are typically little-endian */
|
|
# define VS_LITTLE_ENDIAN
|
|
# else
|
|
/* clang-format off */
|
|
#error "Unable to detect the endianness of this machine. Please set VS_LITTLE_ENDIAN (little endian) or VS_BIG_ENDIAN (big endian) macros."
|
|
/* clang-format on */
|
|
# endif
|
|
#endif
|
|
|
|
#if defined(VS_LITTLE_ENDIAN) && defined(VS_BIG_ENDIAN)
|
|
/* clang-format off */
|
|
#error "Both VS_LITTLE_ENDIAN and VS_BIG_ENDIAN are defined (meaning both little endian and big endian are selected). Please either choose little endian (VS_LITTLE_ENDIAN) or big endian (VS_BIG_ENDIAN) byte order."
|
|
/* clang-format on */
|
|
#endif
|
|
|
|
#define VS_FNULL ((float)1e-6)
|
|
#define VS_DNULL ((double)1e-15)
|
|
|
|
#ifdef VS_BIG_ENDIAN
|
|
# define VS_TO_ULE16(value) ((uint16_t)((((value) & 0x00FF) << 8) | (((value) & 0xFF00) >> 8)))
|
|
# define VS_TO_ULE32(value) \
|
|
((uint32_t)((((value) & 0x000000FF) << 24) | (((value) & 0x0000FF00) << 8) | \
|
|
(((value) & 0x00FF0000) >> 8) | (((value) & 0xFF000000) >> 24)))
|
|
# define VS_TO_ULE64(value) ((uint64_t)((((value) & 0x00000000000000FFULL) << 56) | \
|
|
(((value) & 0x00000000FF000000ULL) << 40) | \
|
|
(((value) & 0x0000FF0000000000ULL) << 24) | \
|
|
(((value) & 0x00FF000000000000ULL) << 8) | \
|
|
(((value) & 0xFF00000000000000ULL) >> 56) | \
|
|
(((value) & 0x00FF00000000FF00ULL) >> 40) | \
|
|
(((value) & 0x0000FF0000FF00ULL) >> 24) | \
|
|
(((value) & 0xFFFF0000FFFFULL)))
|
|
|
|
# define VS_TO_ILE16(value) ((int16_t)((((value) & 0x00FF) << 8) | (((value) & 0xFF00) >> 8)))
|
|
# define VS_TO_ILE32(value) \
|
|
((int32_t)((((value) & 0x000000FF) << 24) | (((value) & 0x0000FF00) << 8) | \
|
|
(((value) & 0x00FF0000) >> 8) | (((value) & 0xFF000000) >> 24)))
|
|
# define VS_TO_ILE64(value) ((int64_t)((((value) & 0x00000000000000FFULL) << 56) | \
|
|
(((value) & 0x00000000FF000000ULL) << 40) | \
|
|
(((value) & 0x0000FF0000000000ULL) << 24) | \
|
|
(((value) & 0x00FF000000000000ULL) << 8) | \
|
|
(((value) & 0xFF00000000000000ULL) >> 56) | \
|
|
(((value) & 0x00FF00000000FF00ULL) >> 40) | \
|
|
(((value) & 0x0000FF0000FF00ULL) >> 24) | \
|
|
(((value) & 0xFFFF0000FFFFULL)))
|
|
#else
|
|
# define VS_TO_ULE16(value) ((uint16_t)(value))
|
|
# define VS_TO_ULE32(value) ((uint32_t)(value))
|
|
# define VS_TO_ULE64(value) ((uint64_t)(value))
|
|
|
|
# define VS_TO_ILE16(value) ((int16_t)(value))
|
|
# define VS_TO_ILE32(value) ((int32_t)(value))
|
|
# define VS_TO_ILE64(value) ((int64_t)(value))
|
|
#endif
|
|
|
|
#ifndef NULL
|
|
# define NULL ((void *)0)
|
|
#endif /* NULL */
|
|
|
|
/* Either `a` or `b` has to be set, but not both. */
|
|
bool vs_bool_xor(bool first, bool second);
|
|
|
|
char *vs_dupnstr(const char *src, size_t len);
|
|
char *vs_dupstr(const char *src);
|
|
|
|
void *vs_dupmem(const void *src, size_t len);
|
|
|
|
wchar_t *vs_wdupnstr(const wchar_t *src, size_t len);
|
|
wchar_t *vs_wdupstr(const wchar_t *src);
|
|
|
|
#define VS_MIN(a, b) (((a) > (b)) ? (b) : (a))
|
|
#define VS_MAX(a, b) (((a) < (b)) ? (b) : (a))
|
|
|
|
char *vs_lowstr(char *src);
|
|
char *vs_lownstr(char *src, size_t len);
|
|
|
|
char *vs_uppstr(char *src);
|
|
char *vs_uppnstr(char *src, size_t len);
|
|
|
|
bool vs_startstr(const char *src, const char *prefix, bool sensitive);
|
|
|
|
size_t vs_get_rand_bytes(void *buf, size_t buflen);
|
|
uint64_t vs_get_rand(void);
|
|
|
|
void vs_secsleep(double sleep_s);
|
|
|
|
uint64_t vs_hex2u64(const char *src);
|
|
uint64_t vs_hexn2u64(const char *src, size_t len);
|
|
|
|
size_t vs_hex2usize(const char *src);
|
|
size_t vs_hexn2usize(const char *src, size_t len);
|
|
|
|
uint64_t vs_str2u64(const char *src);
|
|
uint64_t vs_strn2u64(const char *src, size_t len);
|
|
|
|
size_t vs_str2usize(const char *src);
|
|
size_t vs_strn2usize(const char *src, size_t len);
|
|
|
|
uint16_t vs_str2u16(const char *src);
|
|
uint16_t vs_strn2u16(const char *src, size_t len);
|
|
|
|
intmax_t vs_str2max(const char *src);
|
|
intmax_t vs_strn2max(const char *src, size_t len);
|
|
|
|
char *vs_escstrncpy(char *dest, const char *src, size_t len);
|
|
char *vs_escstrcpy(char *dest, const char *src);
|
|
|
|
char *vs_strsafe(char *str, const char *allowlist, size_t allowlist_size, bool allow_uppercase);
|
|
char *vs_strnsafe(char *str, size_t len, const char *allowlist, size_t allowlist_size);
|
|
|
|
bool vs_strissafe(const char *str,
|
|
const char *allowlist,
|
|
size_t allowlist_size,
|
|
bool allow_uppercase);
|
|
bool vs_strnissafe(const char *str, size_t len, const char *allowlist, size_t allowlist_size);
|
|
|
|
bool vs_strnintonly(const char *str, size_t len);
|
|
bool vs_strintonly(const char *str);
|
|
|
|
double vs_strn2double(const char *str, size_t len, bool frac_required);
|
|
double vs_str2double(const char *str, bool frac_required);
|
|
|
|
unsigned long vs_double_mod(double dividend, double divisor);
|
|
|
|
bool vs_strip_spaces(const char **start, const char **end);
|
|
|
|
#define VS_MALLOC(size) malloc((size))
|
|
#define VS_CALLOC(nmemb, size) calloc((nmemb), (size))
|
|
#define VS_FREE(ptr) free((ptr))
|
|
#define VS_REALLOC(ptr, size) realloc((ptr), (size))
|
|
|
|
#endif /* VESSEL_DEF_H_ */
|