Subversion Repositories Games.Carmageddon

Rev

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