41# define DEBUG_MAGIC 0xdeadbeefL
52static struct debug *allocated;
60 for (debug = allocated; debug; debug = debug->next) {
61 if (debug->magic != DEBUG_MAGIC) {
62 fprintf(stderr,
"memory corruption\n");
66 fprintf(stderr,
"%s:%u: leaked %lu bytes\n",
67 debug->file, debug->line, debug->size);
71void *id3_debug_malloc(
size_t size,
char const *file,
unsigned int line)
81 fprintf(stderr,
"%s:%u: malloc(0)\n", file, line);
83 debug = malloc(
sizeof(*debug) + size);
85 fprintf(stderr,
"%s:%u: malloc(%lu) failed\n", file, line, size);
89 debug->magic = DEBUG_MAGIC;
95 debug->next = allocated;
99 allocated->prev = debug;
106void *id3_debug_calloc(
size_t nmemb,
size_t size,
107 char const *file,
unsigned int line)
111 ptr = id3_debug_malloc(nmemb * size, file, line);
113 memset(ptr, 0, nmemb * size);
118void *id3_debug_realloc(
void *ptr,
size_t size,
119 char const *file,
unsigned int line)
121 struct debug *debug, *
new;
124 id3_debug_free(ptr, file, line);
129 return id3_debug_malloc(size, file, line);
134 if (debug->magic != DEBUG_MAGIC) {
135 fprintf(stderr,
"%s:%u: realloc(%p, %lu) memory not allocated\n",
136 file, line, ptr, size);
140 new = realloc(debug,
sizeof(*debug) + size);
142 fprintf(stderr,
"%s:%u: realloc(%p, %lu) failed\n", file, line, ptr, size);
146 if (allocated == debug)
156 debug->next->prev = debug;
158 debug->prev->next = debug;
163void id3_debug_free(
void *ptr,
char const *file,
unsigned int line)
168 fprintf(stderr,
"%s:%u: free(0)\n", file, line);
175 if (debug->magic != DEBUG_MAGIC) {
176 fprintf(stderr,
"%s:%u: free(%p) memory not allocated\n", file, line, ptr);
183 debug->next->prev = debug->prev;
185 debug->prev->next = debug->next;
187 if (allocated == debug)
188 allocated = debug->next;
193void *id3_debug_release(
void *ptr,
char const *file,
unsigned int line)
203 if (debug->magic != DEBUG_MAGIC) {
204 fprintf(stderr,
"%s:%u: release(%p) memory not allocated\n",
210 debug->next->prev = debug->prev;
212 debug->prev->next = debug->next;
214 if (allocated == debug)
215 allocated = debug->next;
217 memmove(debug, debug + 1, debug->size);