#!/bin/bash
# Arnaldo Carvalho de Melo, Manfred Spraul

TMPDIR=/var/tmp
declare colors
colors=(black blue red green magenta yellow black black black black black black)

getheaders() {
	local file=$1
	cat $file | gawk '/^#include/{print $2}' |
		sed -e 's/<//' -e 's/>//' -e 's/"//g' | grep -v -f $done
}

gviz() {
	test $reclevel -ge $maxreclevel && return
	reclevel=$((reclevel + 1))
	local file=$1
	test -f $file || file=include/$file
	echo
	echo $1 >> $done
	local tmp=`mktemp $TMPDIR/XXXXXX`
	getheaders $file > $tmp
	cat $tmp | sed -e "s,^,\"${1}\" -> \"," -e "s/$/\" \[color=${colors[${reclevel}]}\];/"
	for i in $(cat $tmp) ; do
		gviz $i
	done
	rm -f $tmp
	reclevel=$((reclevel - 1))
}

if [ $# -lt 2 ] ; then
	echo 'usage: $0 file maxreclevel <exclfile|filename>'
	exit
fi
file=$1
maxreclevel=$2
reclevel=0
done=`mktemp $TMPDIR/done.XXXXXX`

if [ $# -gt 2 ] ; then
	if [ -f $file ] ; then
		cat $3 >> $done
	else
		echo $3 >> $done
	fi
fi

# I suggest that you prune linux/config.h and autoconf.h from all graphs.
# The dependency system does not depend directly on those files, instead
# it depends on individual config options. Keith Owens <kaos@ocs.com.au>
echo 'linux/autoconf.h' >> $done
echo 'linux/config.h' >> $done

echo 'digraph bla {'
echo 'rankdir=LR;'
gviz $file
echo '};'
rm -f $done