Import TRE regex library v0.8.0 to vendor branch
[dragonfly.git] / contrib / tre / lib / xmalloc.h
1 /*
2   xmalloc.h - Simple malloc debugging library API
3
4   This software is released under a BSD-style license.
5   See the file LICENSE for details and copyright.
6
7 */
8
9 #ifndef _XMALLOC_H
10 #define _XMALLOC_H 1
11
12 void *xmalloc_impl(size_t size, const char *file, int line, const char *func);
13 void *xcalloc_impl(size_t nmemb, size_t size, const char *file, int line,
14                    const char *func);
15 void xfree_impl(void *ptr, const char *file, int line, const char *func);
16 void *xrealloc_impl(void *ptr, size_t new_size, const char *file, int line,
17                     const char *func);
18 int xmalloc_dump_leaks(void);
19 void xmalloc_configure(int fail_after);
20
21
22 #ifndef XMALLOC_INTERNAL
23 #ifdef MALLOC_DEBUGGING
24
25 /* Version 2.4 and later of GCC define a magical variable `__PRETTY_FUNCTION__'
26    which contains the name of the function currently being defined.
27 #  define __XMALLOC_FUNCTION     __PRETTY_FUNCTION__
28    This is broken in G++ before version 2.6.
29    C9x has a similar variable called __func__, but prefer the GCC one since
30    it demangles C++ function names.  */
31 # ifdef __GNUC__
32 #  if __GNUC__ > 2 || (__GNUC__ == 2 \
33                        && __GNUC_MINOR__ >= (defined __cplusplus ? 6 : 4))
34 #   define __XMALLOC_FUNCTION    __PRETTY_FUNCTION__
35 #  else
36 #   define __XMALLOC_FUNCTION    ((const char *) 0)
37 #  endif
38 # else
39 #  if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
40 #   define __XMALLOC_FUNCTION    __func__
41 #  else
42 #   define __XMALLOC_FUNCTION    ((const char *) 0)
43 #  endif
44 # endif
45
46 #define xmalloc(size) xmalloc_impl(size, __FILE__, __LINE__, \
47                                    __XMALLOC_FUNCTION)
48 #define xcalloc(nmemb, size) xcalloc_impl(nmemb, size, __FILE__, __LINE__, \
49                                           __XMALLOC_FUNCTION)
50 #define xfree(ptr) xfree_impl(ptr, __FILE__, __LINE__, __XMALLOC_FUNCTION)
51 #define xrealloc(ptr, new_size) xrealloc_impl(ptr, new_size, __FILE__, \
52                                               __LINE__, __XMALLOC_FUNCTION)
53 #undef malloc
54 #undef calloc
55 #undef free
56 #undef realloc
57
58 #define malloc  USE_XMALLOC_INSTEAD_OF_MALLOC
59 #define calloc  USE_XCALLOC_INSTEAD_OF_CALLOC
60 #define free    USE_XFREE_INSTEAD_OF_FREE
61 #define realloc USE_XREALLOC_INSTEAD_OF_REALLOC
62
63 #else /* !MALLOC_DEBUGGING */
64
65 #include <stdlib.h>
66
67 #define xmalloc(size) malloc(size)
68 #define xcalloc(nmemb, size) calloc(nmemb, size)
69 #define xfree(ptr) free(ptr)
70 #define xrealloc(ptr, new_size) realloc(ptr, new_size)
71
72 #endif /* !MALLOC_DEBUGGING */
73 #endif /* !XMALLOC_INTERNAL */
74
75 #endif /* _XMALLOC_H */
76
77 /* EOF */