#!/bin/sh
#
#  shell script to generate a sendmail dom-tbl.m4 file containing all
#  the domain information for this site from a set of domain tables.
#

if [ $# -le 1 ]
then	echo	usage: $0 [-ida file] files ... -top file
	exit
fi

rm -f $$.*
outf=dom-tbl.m4
strip="sed -e /#/s/#.*// -e /^\$/d"
classes="ABCEFGHIKLM"
cp /dev/null $$.S10

ida=
top=
rest=

while [ $# -gt 0 ]
do
	case $1 in
	-o)		outf=$2
			shift
			;;
	-ida)		ida="$ida $2"
			shift
			;;
	-top)		top="$top $2"
			shift
			;;
	*)		rest="$rest $1"
			;;
	esac
	shift
done

if [ -n "$ida" ]
then
	set $ida
	dbmfile=`basename $1 .dom`

	$strip $ida | awk '
NF==1	{ $2 = $1; $1 = substr($2, 1, index($2,".")-1) }	# shorthand
	{ print $1 "	" $2 }
	' |  dbm load - $dbmfile

	echo "OKA`pwd`/$dbmfile" > $$.S10
	echo 'R$+@$+		$:$1@$(A $2 $)		lookup db' >> $$.S10
fi

$strip $top | awk '{ printf "%s %s.TOP_LEVEL_DOM\n",$1,$1 }' > $$.top

$strip $$.top $rest | awk '
NR==1	{ MINCLSIZE = 3
	  c = 1
	  S10 = prefix "S10"
	  S11 = prefix "S11"
	  S12 = prefix "S12"
	  S13 = prefix "S13"
	  cl_outd = prefix "classf"
	}
NF==1	{ $2 = $1	# shorthand
	  $1 = substr($2, 1, index($2,".")-1)
	}
	{ i = index($2,".")
	  lpart = substr($2,1,i-1)

	  if ($1 != lpart)
	  	printf "R$*%s\t\t$1%s\n", $1, $2	>> S10
	  else
	  {	rpart = substr($2,i+1)
		domain[rpart] = domain[rpart] " " lpart
		n = split(rpart, doms, ".")
		rparts[rpart] = n
	  }
	}

END	{
	    for (i in rparts)
	    {	order[rparts[i]] = order[rparts[i]] " " i
		if (rparts[i] > maxn)
			maxn = rparts[i]
	    }

	    for (i=1; i <= maxn; i++)
	    {	m = split(order[i], rpts, " ")
		for (j=1; j<=m; j++)
		{   rhs = rpts[j]
	    	    d = split(domain[rhs], subdoms, " ")

		    if (rhs == "TOP_LEVEL_DOM")
			printf "\nCT%s\n", domain[rhs]		>cl_outd
		    else if (d >= MINCLSIZE && c <= length(classes))
		    {	C = substr(classes, c, 1)
			c++
			printf "\nD%s%s\n", C, rhs		>cl_outd
			printf "C%s%s\n", C, domain[rhs]	>cl_outd
			printf "R$*$=%s\t\t\t$@$1$2.$%s\t\tu@d -> u@d.%s\n", \
					C, C, rhs >S11
			printf "R$*$=%s.$%s\t\t$@$1$2\t\tu@d.%s -> u@d\n", \
					C, C, rhs >S12
			printf "R$*$=%s\t\t\t$@$1$2\n", C	>S13
			printf "R$*@$=%s.$+\t\t$@$>9$1@$2.$3\n", C >S13
		    }
		    else
		    {	for (k=1; k<=d; k++)
			{	printf "R$*%s\t\t$@$1%s.%s\n", subdoms[k], \
					subdoms[k], rhs  >S11
				printf "R$*%s.%s\t\t$@$1%s\n", subdoms[k], \
					rhs, subdoms[k]  >S12
				printf "R$*%s\t\t\t$@$1%s\n", \
					subdoms[k], subdoms[k]  >S13
				printf "R$*@%s.$+\t\t$@$>9$1@%s.$2\n", \
					subdoms[k], subdoms[k]  >S13
			}
		    }
		}
	    }
	}
' prefix=$$. classes=$classes -

#
#  The header
#
cat > $outf <<EOF
###############################################################################
#####
#####	@(#)$outf	UK-2.1 sendmail configuration		18/11/88
#####
#####	The domain database and rules
#####
###############################################################################

# classes
EOF

#
#  generate classes
#
while read class group
do
	echo $group | tr ' ' '\012' | fmt | sed "s/^/$class/"
done  < $$.classf >> $outf


#
#  Ruleset 10
#
cat - $$.S10 >> $outf <<'EOF'

##########################################
#  Ruleset 10  --  domain name aliasing  #
##########################################

S10
EOF

#
#  Ruleset 11
#
cat - $$.S11 >> $outf <<'EOF'

########################################################
#  Ruleset 11  --  Expand address to full domain name  #
########################################################

S11
R$*$=T			$@$1$2		already fully qualified
EOF

#
#  Ruleset 12
#
cat >> $outf <<'EOF'

ifdef(`LOCALSHOWUUCP',`
############################################################
#  Ruleset 12  --  Strip full domain name to minimum part  #
############################################################

S12
EOF
( tail -r $$.S12 ; echo "')" ) >> $outf

#
#  Ruleset 13
#
cat - $$.S13 >> $outf <<'EOF'

ifdef(`NRSFORMAT',`
###############################################################
#  Ruleset 13  --  Convert domains in NRS order to 822 order  #
###############################################################

S13
R$*$=T			$@$1$2
R$*@$=T.$+		$@$>9$1@$2.$3
EOF
echo "')" >> $outf

rm -f $$.*
exit
