#!/bin/sh
set -e

# This is a nasty kluge, but it seems to work. Better check the output when
# upgrading to a new release of the nvidia driver, though.

if [ "$#" -ne 3 ]; then
    >&2 printf 'USAGE: %s modulename packagename README.txt\n' "$0"
    exit 1
fi

device_ids() {
    local modname="$1"; shift
    local pkgname="$1"; shift
    local readme="$1"; shift

    local ret=1

    local symbols="$(mktemp)"
    local readme_list="$(mktemp)"
    local object_list="$(mktemp)"
    local diff="$(mktemp)"

    sed -nr '/^Appendix .\. Supported NVIDIA /,/legacy/ {
        s/.*   ([0-9a-fA-F]{4}) ([0-9a-fA-F]{4}) ([0-9a-fA-F]{4})(   .*|$)/\1 \2 \3/p
        }' "$readme" | tr A-F a-f | sort | uniq >"$readme_list"

    sed -nr '/^Appendix .\. Supported NVIDIA /,/legacy/ {
        s/.*   ([0-9a-fA-F]{4}) ([0-9a-fA-F]{4})(   .*|$)/\1 \2/p
        }' "$readme" | tr A-F a-f | sort | uniq >"$readme_list"

    sed -nr '/^Appendix .\. Supported NVIDIA /,/legacy/ {
        s/.*   ([0-9a-fA-F]{4})(   .*|$)/\1/p
        }' "$readme" | tr A-F a-f | sort | uniq >>"$readme_list"

    local readme_length="$(grep -Ec . "$readme_list")"

    # We failed to extract the ids from the blob. Use the ones in README.txt
    # as a fallback
    printf '%s\n' '# List generated by nvidia_supported. Do not edit manually.'
    while read id sid; do
        if [ -z "$sid" ]; then
            printf 'alias pci:v%08Xd%08Xsv*sd*bc03sc*i* %s %s\n' \
            0x10de "0x$id" "$modname" "$pkgname"
        else
            printf 'alias pci:v%08Xd%08Xsv*sd%08Xbc03sc*i* %s %s\n' \
            0x10de "0x$id" "0x$sid" "$modname" "$pkgname"
        fi
    done <"$readme_list"

    ret=0


    rm -f "$symbols" "$readme_list" "$object_list" "$diff"

    return "$ret"
}

device_ids "$@"

# vim:set et sw=4 sts=4:
