#ifndef ECEX_COMMON_H #define ECEX_COMMON_H #include #include #include #define ECEX_OK 0 #define ECEX_ERR (-1) #define ECEX_ARRAY_LEN(a) (sizeof(a) / sizeof((a)[0])) #define ECEX_MIN(a, b) ((a) < (b) ? (a) : (b)) #define ECEX_MAX(a, b) ((a) > (b) ? (a) : (b)) #define ECEX_CLAMP(v, lo, hi) (ECEX_MAX((lo), ECEX_MIN((v), (hi)))) #define ECEX_RETURN_ERR_IF_NULL(p) \ do { \ if (!(p)) return ECEX_ERR; \ } while (0) #define ECEX_RETURN_NULL_IF_NULL(p) \ do { \ if (!(p)) return NULL; \ } while (0) #define ECEX_FREE_AND_NULL(p) \ do { \ free(p); \ (p) = NULL; \ } while (0) #define ECEX_GROW_ARRAY(ptr, count, cap, initial_cap) \ ecex_grow_array((void **)&(ptr), sizeof(*(ptr)), (count), &(cap), (initial_cap)) static inline int ecex_grow_array(void **ptr, size_t item_size, size_t count, size_t *cap, size_t initial_cap) { if (count < *cap) return ECEX_OK; size_t new_cap = *cap ? *cap * 2 : initial_cap; while (new_cap <= count) { new_cap *= 2; } void *new_ptr = realloc(*ptr, new_cap * item_size); if (!new_ptr) return ECEX_ERR; *ptr = new_ptr; *cap = new_cap; return ECEX_OK; } #endif