#!/bin/sh
set -e

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 tmp_readme="$(mktemp)"

    # Get only the lines that we need
    sed -n '/^Appendix .\. Supported NVIDIA /,/legacy/p' "$readme" > "$tmp_readme"

    # Parse the lines based on how many columns with IDs we have
    sed -nr '{
        s/.*   ([0-9a-fA-F]{4}) ([0-9a-fA-F]{4}) ([0-9a-fA-F]{4})(   .*|$)/\1 \2 \3/p
        }' "$tmp_readme" | tr A-F a-f | sort | uniq >"$readme_list"

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

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

    printf '%s\n' '# List generated by nvidia_supported. Do not edit manually.'

    # Generate a modalias for each ID
    tr -s '[:blank:]' '[\n*]' < "$readme_list" |
          while IFS= read -r id; do
          printf 'alias pci:v%08Xd%08Xsv*sd*bc03sc*i* %s %s\n' \
            "0x10de" "0x$id" "$modname" "$pkgname"
          done

    ret=0

    rm -f "$symbols" "$readme_list" "$tmp_readme"

    return "$ret"
}

device_ids "$@"

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