/* * Copyright (C) Dmitry Volyntsev * Copyright (C) NGINX, Inc. */ #ifndef _NJS_UTILS_H_INCLUDED_ #define _NJS_UTILS_H_INCLUDED_ typedef union { float f; uint32_t u; } njs_conv_f32_t; typedef union { double f; uint64_t u; } njs_conv_f64_t; struct NJS_PACKED njs_packed_u16_t { uint16_t v; }; struct NJS_PACKED njs_packed_u32_t { uint32_t v; }; struct NJS_PACKED njs_packed_u64_t { uint64_t v; }; typedef int (*njs_sort_cmp_t)(const void *, const void *, void *ctx); void njs_qsort(void *base, size_t n, size_t size, njs_sort_cmp_t cmp, void *ctx); const char *njs_errno_string(int errnum); njs_inline void njs_swap_u8(void *a, void *b, size_t size) { uint8_t u, *au, *bu; au = (uint8_t *) a; bu = (uint8_t *) b; u = au[0]; au[0] = bu[0]; bu[0] = u; } njs_inline void njs_swap_u16(void *a, void *b, size_t size) { uint16_t u, *au, *bu; au = (uint16_t *) a; bu = (uint16_t *) b; u = au[0]; au[0] = bu[0]; bu[0] = u; } njs_inline void njs_swap_u32(void *a, void *b, size_t size) { uint32_t u, *au, *bu; au = (uint32_t *) a; bu = (uint32_t *) b; u = au[0]; au[0] = bu[0]; bu[0] = u; } njs_inline void njs_swap_u64(void *a, void *b, size_t size) { uint64_t u, *au, *bu; au = (uint64_t *) a; bu = (uint64_t *) b; u = au[0]; au[0] = bu[0]; bu[0] = u; } njs_inline uint16_t njs_bswap_u16(uint16_t u16) { return (u16 >> 8) | (u16 << 8); } njs_inline uint32_t njs_bswap_u32(uint32_t u32) { return ((u32 & 0xff000000) >> 24) | ((u32 & 0x00ff0000) >> 8) | ((u32 & 0x0000ff00) << 8) | ((u32 & 0x000000ff) << 24); } njs_inline uint64_t njs_bswap_u64(uint64_t u64) { return ((u64 & 0xff00000000000000ULL) >> 56) | ((u64 & 0x00ff000000000000ULL) >> 40) | ((u64 & 0x0000ff0000000000ULL) >> 24) | ((u64 & 0x000000ff00000000ULL) >> 8) | ((u64 & 0x00000000ff000000ULL) << 8) | ((u64 & 0x0000000000ff0000ULL) << 24) | ((u64 & 0x000000000000ff00ULL) << 40) | ((u64 & 0x00000000000000ffULL) << 56); } njs_inline uint16_t njs_get_u16(const uint8_t *p) { return ((const struct njs_packed_u16_t *) p)->v; } njs_inline uint32_t njs_get_u32(const uint8_t *p) { return ((const struct njs_packed_u32_t *) p)->v; } njs_inline uint64_t njs_get_u64(const uint8_t *p) { return ((const struct njs_packed_u64_t *) p)->v; } njs_inline void njs_set_u16(uint8_t *p, uint16_t val) { ((struct njs_packed_u16_t *) p)->v = val; } njs_inline void njs_set_u32(uint8_t *p, uint32_t val) { ((struct njs_packed_u32_t *) p)->v = val; } njs_inline void njs_set_u64(uint8_t *p, uint64_t val) { ((struct njs_packed_u64_t *) p)->v = val; } #endif /* _NJS_UTILS_H_INCLUDED_ */