#!/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="0242:0245"
BLACKLIST=""
#ADDLIST="087D"
ADDLIST=""

function is_blacklisted {
    PCI_ID=`echo "$1" | sed -E 's|.*d0000([[:alnum:]]{4}).*|\1|'`
    for BLACK_ID in `echo "$BLACKLIST"| sed "s|:| |"`
    do
	[ "$PCI_ID" == "$BLACK_ID" ] && return 0
    done
    return 1
}

function make_xinf_line {
    IDS_DATA1=`echo "$1" | sed -E 's|^.*[[:space:]][[:space:]]([[:alnum:]]{4}[[:space:]].*)$|\1|'`
    [ "$IDS_DATA1" != "$1" ] || IDS_DATA1=
    IDS_DATA2=`echo "$IDS_DATA1" | sed -E 's|[[:space:]]+[[:alpha:]]$||'`
    [ "$IDS_DATA2" != "$IDS_DATA1" ] || IDS_DATA2=
    IDS_DATA=`echo "$IDS_DATA2" | tr a-z A-Z`
    if [ -n "$IDS_DATA" ] ; then
	DESC=`echo "$1" | sed -E 's|[[:space:]][[:space:]]+[[:alnum:]]{4}[[:space:]].*||'`
	VND_ID="10DE"
	PCI_ID=`echo "$IDS_DATA" | sed -E 's|^([[:alnum:]]{4})[[:space:]]+([[:alnum:]]{4})[[:space:]]+([[:alnum:]]{4})$|\1|'`
	VND_ID2=`echo "$IDS_DATA" | sed -E 's|^([[:alnum:]]{4})[[:space:]]+([[:alnum:]]{4})[[:space:]]+([[:alnum:]]{4})$|\2|'`
	PCI_ID2=`echo "$IDS_DATA" | sed -E 's|^([[:alnum:]]{4})[[:space:]]+([[:alnum:]]{4})[[:space:]]+([[:alnum:]]{4})$|\3|'`
	if [ "$PCI_ID" != "$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
		break
	    fi
	    XINF_LINE=`make_xinf_line "$LINE"`
	    if [ -n "$XINF_LINE" ]
	    then
		XINF_LINE=`make_xinf_line "$LINE"`
		if ! is_blacklisted "$XINF_LINE"; then
		    echo "$XINF_LINE" >>$OUT
		fi
	    fi
	    ;;
	appendix_a_end)
	    break
	    ;;
	default)
	    ;;
    esac
done < $IN
for ADD_ID in `echo "$ADDLIST"| sed "s|:| |"`
do
    make_xinf_line " NVIDIA misc   $ADD_ID A" >>$OUT
done

chmod 0644 $OUT
