#!/bin/bash
#
# Copyright 2005 Timo Hirvonen <tihirvon@ee.oulu.fi>
#
# This file is licensed under the GPLv2.

vars_sort_uniq()
{
	for _var in $@
	do
		echo $_var
	done | sort | uniq
}

usage()
{
	echo "Usage: sedin INFILE OUTFILE"
	echo "Replaces all @NAME@ occurences with \$NAME."
}

main()
{
	while [[ $# -gt 0 ]]
	do
		case $1 in
			--help)
				usage
				exit 0
				;;
			--)
				shift
				break
				;;
			-*)
				pdie "unrecognized option: \`$1'"
				;;
			*)
				break
				;;
		esac
		shift
	done
	if [[ $# -ne 2 ]]
	then
		usage
		exit 1
	fi

	_infile="$1"
	_outfile="$2"

	# stupid BSD sed doesn't understand \n
	#_vars=$(egrep '@[^@]+@' "$_infile" | sed 's/[^@]*@\([^@]*\)@[^@]*/\1\n/g' | sort | uniq)
	_vars=$(vars_sort_uniq $(egrep '@[^@]+@' "$_infile" | sed 's/[^@]*@\([^@]*\)@[^@]*/\1 /g'))

	_sed_argv=( "sed" )
	for _var in $_vars
	do
		eval "_val=\${$_var-_VAR_NOT_SET_}"
		if [[ $_val = _VAR_NOT_SET_ ]]
		then
			echo "sedin: WARNING: variable \`$_var' not set!" >&2
			continue
		fi
		_val=${_val//:/\\:}
		_sed_argv[${#_sed_argv[@]}]="-e"
		_sed_argv[${#_sed_argv[@]}]="s:@${_var}@:${_val}:g"
	done

	if [[ ${#_sed_argv[@]} -eq 1 ]]
	then
		# no variables!
		cp "$_infile" "$_outfile"
	else
		"${_sed_argv[@]}" < "$_infile" > "$_outfile"
	fi
}

main "$@"
