Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1 | pmbaty | 1 | /** |
2 | libsmacker - A C library for decoding .smk Smacker Video files |
||
3 | Copyright (C) 2012-2017 Greg Kennedy |
||
4 | |||
5 | See smacker.h for more information. |
||
6 | |||
7 | smk_malloc.h |
||
8 | "Safe" implementations of malloc and free. |
||
9 | Verbose implementation of assert. |
||
10 | */ |
||
11 | |||
12 | #ifndef SMK_MALLOC_H |
||
13 | #define SMK_MALLOC_H |
||
14 | |||
15 | /* calloc */ |
||
16 | #include <stdlib.h> |
||
17 | /* fprintf */ |
||
18 | #include <stdio.h> |
||
19 | |||
20 | /* Error messages from calloc */ |
||
21 | #include <errno.h> |
||
22 | #include <string.h> |
||
23 | |||
24 | /** |
||
25 | Verbose assert: |
||
26 | branches to an error block if pointer is null |
||
27 | */ |
||
28 | #define smk_assert(p) \ |
||
29 | { \ |
||
30 | if (!p) \ |
||
31 | { \ |
||
32 | fprintf(stderr, "libsmacker::smk_assert(" #p "): ERROR: NULL POINTER at line %lu, file %s\n", (unsigned long)__LINE__, __FILE__); \ |
||
33 | goto error; \ |
||
34 | } \ |
||
35 | } |
||
36 | |||
37 | /** |
||
38 | Safe free: attempts to prevent double-free by setting pointer to NULL. |
||
39 | Optionally warns on attempts to free a NULL pointer. |
||
40 | */ |
||
41 | #define smk_free(p) \ |
||
42 | { \ |
||
43 | if (p) \ |
||
44 | { \ |
||
45 | free(p); \ |
||
46 | p = NULL; \ |
||
47 | } \ |
||
48 | /* else \ |
||
49 | { \ |
||
50 | fprintf(stderr, "libsmacker::smk_free(" #p ") - Warning: attempt to free NULL pointer (file: %s, line: %lu)\n", __FILE__, (unsigned long)__LINE__); \ |
||
51 | } */ \ |
||
52 | } |
||
53 | |||
54 | /** |
||
55 | Safe malloc: exits if calloc() returns NULL. |
||
56 | Also initializes blocks to 0. |
||
57 | Optionally warns on attempts to malloc over an existing pointer. |
||
58 | Ideally, one should not exit() in a library. However, if you cannot |
||
59 | calloc(), you probably have bigger problems. |
||
60 | */ |
||
61 | #define smk_malloc(p, x) \ |
||
62 | { \ |
||
63 | /* if (p) \ |
||
64 | { \ |
||
65 | 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__); \ |
||
66 | free(p); \ |
||
67 | } */ \ |
||
68 | p = calloc(1, x); \ |
||
69 | if (!p) \ |
||
70 | { \ |
||
71 | fprintf(stderr, "libsmacker::smk_malloc(" #p ", %lu) - ERROR: calloc() returned NULL (file: %s, line: %lu)\n\tReason: [%d] %s\n", \ |
||
72 | (unsigned long) (x), __FILE__, (unsigned long)__LINE__, errno, strerror(errno)); \ |
||
73 | exit(EXIT_FAILURE); \ |
||
74 | } \ |
||
75 | } |
||
76 | |||
77 | #endif |