#!/bin/sh

IN_FILE=
OUT_FILE=
DRIVER=

add_match()
{
	if echo $p_id | grep -q "\;"; then
		key="int_outof"
	else
		key="int"
	fi
	cat >> "$OUT_FILE" << EOF
    <match key="pci.vendor_id" int="$v_id">
      <match key="pci.product_id" $key="$p_id">
        <append key="video.x11_driver" type="strlist">$DRIVER</append>
      </match>
    </match>

EOF

}

add_ids() {
	for ids in $IDS; do
		if [ -z "$v_id" ]; then
			v_id=${ids/-0x????/}
			p_id=${ids/0x????-/}
		else
			if [ "${ids/-0x????/}" = "$v_id" ]; then
				if [ -z "$p_id" ]; then
					p_id=${ids/0x????-/}
				else
					p_id="$p_id;${ids/0x????-/}"
				fi
			else
				add_match
				v_id=${ids/-0x????/}
				p_id=${ids/0x????-/}
			fi
		fi
	done
	add_match
}

add_device() {
	if [ -n "$IDS" ]; then
		cat > "$OUT_FILE" << EOF
<?xml version="1.0" encoding="UTF-8"?>
<deviceinfo version="0.2">
  <device>

EOF
		add_ids
		cat >> "$OUT_FILE" << EOF
  </device>
</deviceinfo>
EOF
	fi
}

PROG="${0##*/}"

TEMP=`getopt -n "$PROG" -o x:f:d: -l xinf:,fdi:,driver: -- "$@"` || exit 1
eval set -- "$TEMP"

while :; do
	case "$1" in
		-x|--xinf)
			shift
			IN_FILE="$1"
			shift
		;;
		-f|--fdi)
			shift
			OUT_FILE="$1"
			shift
		;;
		-d|--driver)
			shift
			DRIVER="$1"
			shift
		;;
		--)
			shift
			break
		;;
	esac
done

[ -n "$IN_FILE" ] || exit 1
[ -n "$OUT_FILE" ] || exit 1
[ -n "$DRIVER" ] || exit 1

IDS=`sed -ne 's|.*v....\(....\)d....\(....\)sv.*|0x\1-0x\2|p' "$IN_FILE" | sort -u`
add_device
