#!/bin/sh

IN=$1
[ -n "$IN" ] || IN="$PWD/README.txt"
[ -f "$IN" ] || IN="$PWD/README"
if ! [ -f "$IN" ]
then
    echo "source file not found"
    exit 1
fi

OUT=nvidia.xinf

#BLACKLIST="10DE:0242::10DE:0245"
BLACKLIST=""
#ADDLIST="10DE:087D::10DE:087D"
ADDLIST=""

function is_blacklisted {
    VND_ID=`echo "$1" | sed -E 's|.*v0000([[:alnum:]]{4}).*|\1|'`
    DEV_ID=`echo "$1" | sed -E 's|.*d0000([[:alnum:]]{4}).*|\1|'`
    for BLACK_DEV in `echo "$BLACKLIST"| sed "s|::| |g"`
    do
	BLACK_VENDOR_ID=`echo "$BLACK_DEV"| sed 's|:.*$||'`
	BLACK_DEVICE_ID=`echo "$BLACK_DEV"| sed 's|^.*:||'`
	if [ "$BLACK_VENDOR_ID" == "$VND_ID" -a "$BLACK_DEVICE_ID" == "$DEV_ID" ] ; then
	    echo "Blacklisted $VND_ID:$DEV_ID"
	    return 0
	fi
    done
    return 1
}

function make_xinf_line {
    if echo $1 | grep -qE '[[:space:]]0x[[:alnum:]]{4}[[:space:]]' ; then
	DESC=`echo "$1" | sed -e 's|0x[[:alnum:]].*||' -e 's|[[:space:]][[:space:]]*$||'`
	VND_ID="10DE"
	PCI_ID=`echo "$1" | sed -E 's|^.*[[:space:]]0x([[:alnum:]]{4})[[:space:]]+.*$|\1|'`
	VND_ID2=`echo "$1" | sed -E 's|^.*[[:space:]]0x([[:alnum:]]{4})[[:space:]]+0x([[:alnum:]]{4})[[:space:]]+.*$|\1|'`
	PCI_ID2=`echo "$1" | sed -E 's|^.*[[:space:]]0x([[:alnum:]]{4})[[:space:]]+0x([[:alnum:]]{4})[[:space:]]+.*$|\2|'`
	if [ "$VND_ID2" != "$PCI_ID2" ] ; then
	    VND_ID=$VND_ID2
	    PCI_ID=$PCI_ID2
	fi
	echo "alias pcivideo:v0000${VND_ID}d0000${PCI_ID}sv*sd*bc*sc*i* nvidia # ${DESC}"
    else
	echo
    fi
}

>$OUT
STEP="start"
while read LINE
do
    case "$STEP" in
	start)
	    if echo "$LINE" | grep  -iqE "^Appendix[[:space:]]A\.[[:space:]]Supported[[:space:]]NVIDIA[[:space:]]GPU[[:space:]]Products$"
	    then
		STEP=appendix_a_0
		echo "STEP=appendix_a_0"
	    fi
	    ;;
	appendix_a_0)
	    if echo "$LINE" | grep  -iqE "^Appendix[[:space:]]A\.[[:space:]]Supported[[:space:]]NVIDIA[[:space:]]GPU[[:space:]]Products$"
	    then
		STEP=appendix_a_1
		echo "STEP=appendix_a_1"
	    fi
	    ;;
	appendix_a_1)
	    if echo "$LINE" | grep  -iqe '---------------------------------'
	    then
		STEP=appendix_a
		echo "STEP=appendix_a"
	    fi
	    ;;
	appendix_a)
	    if echo "$LINE" | grep -q "legacy" ; then
		STEP=appendix_end
		echo "STEP=appendix_end"
		continue
	    fi
	    XINF_LINE=`make_xinf_line "$LINE"`
	    if [ -n "$XINF_LINE" ]
	    then
		if ! is_blacklisted "$XINF_LINE"; then
		    echo "$XINF_LINE" >>$OUT
		fi
	    fi
	    ;;
	appendix_a_end)
	    break
	    ;;
	default)
	    ;;
    esac
done < $IN
for ADD_DEV in `echo "$ADDLIST"| sed "s|::| |g"`
do
    ADD_VENDOR_ID=`echo "$ADD_DEV"| sed 's|:.*$||'`
    ADD_DEVICE_ID=`echo "$ADD_DEV"| sed 's|^.*:||'`
    make_xinf_line " NVIDIA misc                          $ADD_VENDOR_ID $ADD_VENDOR_ID $ADD_DEVICE_ID     C" >>$OUT
done

chmod 0644 $OUT
