########################################################################
#                                                                      #
#               This software is part of the ast package               #
#           Copyright (c) 1989-2006 AT&T Knowledge Ventures            #
#                      and is licensed under the                       #
#                  Common Public License, Version 1.0                  #
#                      by AT&T Knowledge Ventures                      #
#                                                                      #
#                A copy of the License is available at                 #
#            http://www.opensource.org/licenses/cpl1.0.txt             #
#         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         #
#                                                                      #
#              Information and Software Systems Research               #
#                            AT&T Research                             #
#                           Florham Park NJ                            #
#                                                                      #
#                 Glenn Fowler <gsf@research.att.com>                  #
#                                                                      #
########################################################################
: convert MAM dependency info to dot input
COMMAND=mamdot
case `(getopts '[-][123:xyz]' opt --xyz; echo 0$opt) 2>/dev/null` in
0123)	ARGV0="-a $COMMAND"
	USAGE=$'
[-?
@(#)$Id: mamdot (AT&T Labs Research) 1997-02-16 $
]
'$USAGE_LICENSE$'
[+NAME?mamdot - make abstract machine to dot dependency graph conversion filter]
[+DESCRIPTION?\bmamdot\b reads MAM (Make Abstract Machine) target and
	prerequisite file descriptions from the standard input and writes a
	\bdot\b(1) description of the dependency graph on the standard output.
	Mamfiles are generated by the \b--mam\b option of \bnmake\b(1) and
	\bgmake\b(1).]
[i:ignore?Dependency names matching the shell \apattern\a are
	ignored.]:[pattern]
[+SEE ALSO?\bdot\b(1), \bgmake\b(1), \bnmake\b(1)]
'
	;;
*)	ARGV0=""
	USAGE="i:[pattern]"
	;;
esac

usage()
{
	OPTIND=0
	getopts $ARGV0 "$USAGE" OPT '-?'
	exit 2
}

integer level=0
typeset -A pwd top
typeset ignore= tree="@(make|done|prev)"

while	getopts $ARGV0 "$USAGE" OPT
do	case $OPT in
	i)	[[ $ignore ]] && ignore="$ignore|"
		ignore=$ignore$OPTARG
		;;
	*)	usage
		;;
	esac
done
[[ $ignore ]] && ignore="@($ignore)"

list[0]=all
top[0]=1
print "digraph mam {"
print "rankdir = LR"
print "node [ shape = box ]"
while read -r label op arg arg2 arg3 args
do	[[ $label == [[:digit:]]* ]] || {
		arg3=$args
		arg2=$arg
		arg=$op
		op=$label
		label=0
	}
	rule=$arg
	[[ ${top[$label]} || $arg == */* || $op != $tree ]] || {
		arg=$label::$arg
		[[ $op == make ]] && print "\"$arg\" [ label = \"$rule\" ]"
	}
	case $op in
	make)	[[ $rule == $ignore ]] || list[level]=${list[level]}$'\n'\"$arg\"
		level=level+1
		list[level]=
		;;
	prev)	[[ $rule == $ignore ]] || list[level]=${list[level]}$'\n'\"$arg\"
		;;
	done)	[[ $rule == $ignore || ! ${list[level]} ]] ||
			print "\"$arg\" -> {${list[level]} }"
		level=level-1
		;;
	info)	case $arg in
		pwd)	[[ $arg3 == "." ]] && top[$label]=1 ;;
		esac
		;;
	esac
done
print "}"
