You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
1.9 KiB
77 lines
1.9 KiB
/** |
|
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
|
|
|