Listing 1: memtrack.h

#ifndef MEMTRACK_H
#define MEMTRACK_H

#include <stdlib.h>

#define MEMTRACK_CALLOC(nelem, size) \
    memtrackCalloc((nelem), (size), __FILE__, __LINE__)
#define MEMTRACK_FREE(ptr) \
    memtrackFree(ptr, __FILE__, __LINE__)
#define MEMTRACK_MALLOC(size) \
    memtrackMalloc((size), __FILE__, __LINE__)
#define MEMTRACK_REALLOC(ptr, size) \
    memtrackRealloc((ptr), (size), __FILE__, __LINE__)
#define MEMTRACK_VALLOC(size) \
    memtrackValloc((size), __FILE__, __LINE__)
#define MEMTRACK_STRDUP(str) \
    memtrackStrdup((str), __FILE__, __LINE__)
#define MEMTRACK_STRCPY(dest, src) \
    memtrackStrcpy((dest), (src), \
      sizeof(dest), __FILE__, __LINE__)
#define MEMTRACK_STRCAT(dest, src) \
    memtrackStrcat((dest), (src), \
      sizeof(dest), __FILE__, __LINE__)

void* memtrackCalloc (size_t numElements, size_t elemSize, 
                      char* fn, unsigned short fl);
void  memtrackFree   (void* ptr, 
                      char* fn, unsigned short fl);
void* memtrackMalloc (size_t size, 
                      char* fn, unsigned short fl);
void* memtrackRealloc(void* ptr, size_t size, 
                      char* fn, unsigned short fl);
void* memtrackValloc (size_t size, 
                      char* fn, unsigned short fl);
char* memtrackStrdup (const char* s1, 
                      char* fn, unsigned short fl);
char* memtrackStrcpy (char* dest, const char* src, 
                      size_t destSize, char* fn, unsigned short fl);
char* memtrackStrcat (char* dest, const char* src, 
                      size_t destSize, char* fn, unsigned short fl);

/*memtrackCheckPeriodic checks for memory leaks if 'period' seconds 
  have elapsed since the last leak check. 
  It checks for corrupted end-of-block sentinels on each call.*/
void memtrackCheckPeriodic(int period);

#endif