#ifndef SP_A_H_ #define SP_A_H_ /* * sophia database * sphia.org * * Copyright (c) Dmitry Simonenko * BSD License */ typedef struct spa spa; struct spa { spallocf alloc; void *arg; }; static inline void sp_allocinit(spa *a, spallocf f, void *arg) { a->alloc = f; a->arg = arg; } static inline void* sp_allocstd(void *ptr, size_t size, void *arg spunused) { if (splikely(size > 0)) { if (ptr != NULL) return realloc(ptr, size); return malloc(size); } assert(ptr != NULL); free(ptr); return NULL; } static inline void *sp_realloc(spa *a, void *ptr, size_t size) { return a->alloc(ptr, size, a->arg); } static inline void *sp_malloc(spa *a, size_t size) { return a->alloc(NULL, size, a->arg); } static inline char *sp_strdup(spa *a, char *str) { int sz = strlen(str) + 1; char *s = a->alloc(NULL, sz, a->arg); if (spunlikely(s == NULL)) return NULL; memcpy(s, str, sz); return s; } static inline void sp_free(spa *a, void *ptr) { a->alloc(ptr, 0, a->arg); } #endif