#!/bin/sh
#
#pragma ident	"@(#)i.configmapconf	1.1	01/09/05 SMI"
#
#
# Copyright (c) 2001 by Sun Microsystems, Inc.
# All rights reserved.
#
# Note that this script imposes restriction on the format of the new file
# that is delivered by the package.
# The format has to be:
# selection=enable idvendor=16 idproduct=32 cfgndx=1;
# Each record is a separate line, all single spaces, and all values in
# decimal
#

hex2dec()
{
	printf "ibase=16\n %s\n" $* | bc
}

CLEANUP_FILE=/tmp/CLEANUP
TMP_FILE=/tmp/configmap.$$
export TMP_FILE

while read src dst
do

# Now merge the contents of the old and the new CONF_MAP file.
# src is the new file that this package is installing, and dst is the
# file present on the system.
# The algorithm to merge them is simple. We skim and filter out those entries
# from dst file that we don't want from the src file. These entries are the
# disabled entries and the ones that have idvendor and idproduct only.
# This list of unwanted items is constructed as a grep string. Finally, we
# do a "grep -v" of these items from src file, and add the remaining entries
# to the dst file.
#

	CONF_MAP=$dst
	CONF_MAP_OLD=${dst}.old
	CONF_MAP_NEW=$src

	if [ -f ${CONF_MAP} ]
	then
		# There is an existing file on the system. Save it as .old
		# if .old exists, move it to .old.xxx
		if [ -f ${CONF_MAP_OLD} ]
		then
			# suffix is day, hr, min, sec
			# - it should be unique enough
			suffix=`date '+%d%H''%M''%S'`
			mv ${CONF_MAP_OLD} ${CONF_MAP_OLD}.$suffix
			echo "EXISTING_FILE_SAVED_TO_OLD: ${CONF_MAP_OLD} "\
			    "${CONF_MAP_OLD}.$suffix" >>  ${CLEANUP_FILE}
		fi
		cp $CONF_MAP $CONF_MAP_OLD 

		# build a string of items that we don't want from the new file.
		grepstr="^\*|^\#"
		echo $grepstr > $TMP_FILE
		# preprocess the old file
		sed -e  \
		'
		# delete comments
		/^#.*/d
		/^\*.*/d
		# change mulitple tabs to a single space
		s/[	][	]*/ /g
		# change multiple spaces to a single space
		s/[ ][ ]*/ /g
		# get rid of leading spaces
		s/^ //g
		# get rid of trailing spaces
		s/[ ][ ]*$//g
		# strip spaces around =
		s/[ ]*=[ ]*/=/g
		# put everything to lower case
		y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/' \
		$CONF_MAP | 
		# get rid of newlines
		tr -s "\n" " " |
		# make each record into a single line
		tr ";" "\n" | 
		# fish out entries that are enabled or disabled but have no 
		# pathname/srno specified
		egrep -v 'pathname|srno|^[ ]*$' |
		while read line
		do
			vendorstr=""
			productstr=""
			for arg in $line
			do
				# var=${arg%=*}
				# value=${arg#*=}
				var=`expr $arg : '\(.*\)=.*' \| $arg`
				value=`expr $arg : '.*=\(.*\)' \| $arg`
				case $var in
					idvendor)
						# val=${value#0x}
						val=`expr $value : \
							'[0][xX]\(.*\)' \
							\| $value`
						if [ "$value" != "$val" ]
						then
							# hex -> dec
							val=`hex2dec $val`
						fi
						vendorstr="idvendor=$val"
					;;
					idproduct)
						# val=${value#0x}
						val=`expr $value : \
							'[0][xX]\(.*\)' \
							\| $value`
						if [ "$value" != "$val" ]
						then
							# hex -> dec
							val=`hex2dec $val`
						fi
						productstr="idproduct=$val"
					;;
				esac
			done
			# build the grep str
			if [ -n "$vendorstr" ] || [ -n "$productstr" ]
			then
				grepstr="$grepstr|$vendorstr $productstr"
			fi
			echo $grepstr > $TMP_FILE
		done

		# grepstr now contains all the entries that we don't want
		# from new CONF_MAP
		egrep -vi -f $TMP_FILE  $CONF_MAP_NEW >> $CONF_MAP
		rm $TMP_FILE
	else
		# we are newly installing this file
		cp $CONF_MAP_NEW $CONF_MAP
	fi
done
exit 0
