78 lines
1.9 KiB
C
78 lines
1.9 KiB
C
/**
|
|
libsmacker - A C library for decoding .smk Smacker Video files
|
|
Copyright (C) 2012-2017 Greg Kennedy
|
|
|
|
See smacker.h for more information.
|
|
|
|
smk_malloc.h
|
|
"Safe" implementations of malloc and free.
|
|
Verbose implementation of assert.
|
|
*/
|
|
|
|
#ifndef SMK_MALLOC_H
|
|
#define SMK_MALLOC_H
|
|
|
|
/* calloc */
|
|
#include <stdlib.h>
|
|
/* fprintf */
|
|
#include <stdio.h>
|
|
|
|
/* Error messages from calloc */
|
|
#include <errno.h>
|
|
#include <string.h>
|
|
|
|
/**
|
|
Verbose assert:
|
|
branches to an error block if pointer is null
|
|
*/
|
|
#define smk_assert(p) \
|
|
{ \
|
|
if (!p) \
|
|
{ \
|
|
fprintf(stderr, "libsmacker::smk_assert(" #p "): ERROR: NULL POINTER at line %lu, file %s\n", (unsigned long)__LINE__, __FILE__); \
|
|
goto error; \
|
|
} \
|
|
}
|
|
|
|
/**
|
|
Safe free: attempts to prevent double-free by setting pointer to NULL.
|
|
Optionally warns on attempts to free a NULL pointer.
|
|
*/
|
|
#define smk_free(p) \
|
|
{ \
|
|
if (p) \
|
|
{ \
|
|
free(p); \
|
|
p = NULL; \
|
|
} \
|
|
/* else \
|
|
{ \
|
|
fprintf(stderr, "libsmacker::smk_free(" #p ") - Warning: attempt to free NULL pointer (file: %s, line: %lu)\n", __FILE__, (unsigned long)__LINE__); \
|
|
} */ \
|
|
}
|
|
|
|
/**
|
|
Safe malloc: exits if calloc() returns NULL.
|
|
Also initializes blocks to 0.
|
|
Optionally warns on attempts to malloc over an existing pointer.
|
|
Ideally, one should not exit() in a library. However, if you cannot
|
|
calloc(), you probably have bigger problems.
|
|
*/
|
|
#define smk_malloc(p, x) \
|
|
{ \
|
|
/* if (p) \
|
|
{ \
|
|
fprintf(stderr, "libsmacker::smk_malloc(" #p ", %lu) - Warning: freeing non-NULL pointer before calloc (file: %s, line: %lu)\n", (unsigned long) (x), __FILE__, (unsigned long)__LINE__); \
|
|
free(p); \
|
|
} */ \
|
|
p = calloc(1, x); \
|
|
if (!p) \
|
|
{ \
|
|
fprintf(stderr, "libsmacker::smk_malloc(" #p ", %lu) - ERROR: calloc() returned NULL (file: %s, line: %lu)\n\tReason: [%d] %s\n", \
|
|
(unsigned long) (x), __FILE__, (unsigned long)__LINE__, errno, strerror(errno)); \
|
|
exit(EXIT_FAILURE); \
|
|
} \
|
|
}
|
|
|
|
#endif
|