#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 */