#include "config.h"
#ifdef MEM_CHECK
#include "os.h"
#include "externs.h"
#include "mem_check.h"
MEM *my_check = NULL;
void add_check (char *ref)
{
MEM *loop;
for (loop = my_check; loop; loop = loop->next) {
if (!string_compare (ref, loop->ref_name)) {
loop->ref_count++;
return;
}
}
loop = (MEM *) malloc (sizeof (MEM));
loop->ref_name = ref;
loop->ref_count = 1;
loop->next = my_check;
my_check = loop;
add_check ("mem_check");
return;
}
void del_check (char *ref)
{
MEM *loop;
for (loop = my_check; loop; loop = loop->next) {
if (!string_compare (loop->ref_name, ref)) {
loop->ref_count--;
if (!loop->ref_count) {
rebuild_check ();
del_check ("mem_check");
}
return;
}
}
fprintf (stderr,
"ERROR: Tried deleteing a check that was never added! :%s\n", ref);
}
void rebuild_check (void)
{
MEM *point, *next, *new = NULL;
point = my_check;
while (point) {
next = point->next;
if (point->ref_count) {
point->next = new;
new = point;
} else {
free ((char *) point);
}
point = next;
}
my_check = new;
}
void list_mem_check (dbref player)
{
MEM *loop;
for (loop = my_check; loop; loop = loop->next) {
notify (player, tprintf ("%s : %d", loop->ref_name, loop->ref_count));
}
}
#endif /* MEM_CHECK */