#
#  Awk program to analyze mtrace.c output.
#
{
 if ($1 == "@") {
   where = " (" $2 ")"
   n = 3
 } else {
   where = ""
   n = 1
 }
 if ($n == "+") {
   if (allocated[$(n+1)] != "")
     print "+", $(n+1), "Alloc", NR, "duplicate:", allocated[$(n+1)], wherewas[$(n+1)], where;
   else {
     wherewas[$(n+1)] = where;
     allocated[$(n+1)] = $(n+2);
   }
 } else if ($n == "-") {
   if (allocated[$(n+1)] != "") {
     wherewas[$(n+1)] = "";
     allocated[$(n+1)] = "";
     if (allocated[$(n+1)] != "")
       print "DELETE FAILED", $(n+1), allocated[$(n+1)];
   } else
     print "-", $(n+1), "Free", NR, "was never alloc'd", where;
 } else if ($n == "<") {
   if (allocated[$(n+1)] != "") {
     wherewas[$(n+1)] = "";
     allocated[$(n+1)] = "";
   } else
     print "-", $(n+1), "Realloc", NR, "was never alloc'd", where;
 } else if ($n == ">") {
   if (allocated[$(n+1)] != "")
     print "+", $(n+1), "Realloc", NR, "duplicate:", allocated[$(n+1)], where;
   else {
     wherewas[$(n+1)] = $(n+2);
     allocated[$(n+1)] = $(n+2);
   }
 } else if ($n == "=") {
   # Ignore "= Start"
 } else if ($n == "!") {
   # Ignore failed realloc attempts for now
 }
}
END {
 for (x in allocated)
   if (allocated[x] != "")
     print "+", x, allocated[x], wherewas[x];
}