#! /bin/sh

# $Id: malloctrace,v 1.1 90/10/13 03:24:44 lee Exp $

# process the output of -DMALLOCTRACE

nawk '
/^malloc/ {
    if ($4 in Sizes) {
	Oops("Malloc Address " $4 " in use (" File[$4] ", " Line[$4] "): " $0)
    }
    Sizes[$4] = $2
    if (!($5 in FilesSeen)) {
	++NFiles
	FilesSeen[$5] = NFiles;
	FileNames[NFiles] = $5
    }
    File[$4] = FilesSeen[$5]
    Line[$4] = $6
}

/^free/ {
    if (!($2 in Sizes)) {
	Oops("free " $2 " not previously in use")
    }
    delete Sizes[$2]
    delete File[$2]
    delete Line[$2]
}

/^realloc/ {
    if (!($2 in Sizes)) {
	Oops("Realloc address not in use: " $0)
    }
    delete Sizes[$2]
    delete File[$2]
    delete Line[$2]
    Sizes[$5] = $3
    if (!($6 in FilesSeen)) {
	++NFiles
	FilesSeen[$6] = NFiles;
	FileNames[NFiles] = $6
    }
    File[$5] = FilesSeen[$6]
    Line[$5] = $7
}

END {
    for (i in Sizes) {
	printf "%s %d\t%s %d bytes\n", FileNames[File[i]], Line[i], i, Sizes[i]
    }
}

function Oops(s)
{
    print s | "cat 1>&2"
    exit 1
}

# $Log:	malloctrace,v $
# Revision 1.1  90/10/13  03:24:44  lee
# Initial revision
# 
#
