#!/bin/mksh

# Kernel constant definitions.
EV_KEY=1
EV_REL=2
EV_ABS=3
EV_FF=21
BTN_MOUSE=272
ASCII_KEYS="30 48 46 32 18 33 34 35 23 36 37 38 50 49 24 25 16 19 31 20 22 47 17 45 21 44"
INPUT_PROP_POINTER=0
INPUT_PROP_DIRECT=1

# Helper functions
bitmap_contains() {
    hexstr="$1"
    bitnum="$2"

    char_from_right=$(( bitnum / 4 ))
    bit_in_char=$(( bitnum % 4 ))

    chars_per_group=16
    group_index=$(( char_from_right / chars_per_group ))
    char_in_group=$(( char_from_right % chars_per_group ))

    set -A groups $hexstr
    n=${#groups[@]}

    idx=$(( n - 1 - group_index ))
    if [ "$idx" -lt 0 ] || [ "$idx" -ge "$n" ]; then
        return 1
    fi

    group=${groups[idx]}

    while [ ${#group} -lt $chars_per_group ]; do
        group="0$group"
    done

    pos=$(( chars_per_group - 1 - char_in_group ))
    ch=${group:$pos:1}

    case "$ch" in
        0) v=0 ;; 1) v=1 ;; 2) v=2 ;; 3) v=3 ;;
        4) v=4 ;; 5) v=5 ;; 6) v=6 ;; 7) v=7 ;;
        8) v=8 ;; 9) v=9 ;;
        a|A) v=10 ;; b|B) v=11 ;; c|C) v=12 ;; d|D) v=13 ;;
        e|E) v=14 ;; f|F) v=15 ;;
        *) return 1 ;;
    esac

    if [ $(( (v >> bit_in_char) & 1 )) -eq 1 ]; then
        return 0
    else
        return 1
    fi
}

ev_contains() {
    evstr="$1"
    evbit="$2"

    evstr=$(print "$evstr" | tr -d ' \t\r\n')

    val=$(( 16#${evstr} ))

    if [ $(( (val >> evbit) & 1 )) -eq 1 ]; then
        return 0
    else
        return 1
    fi
}

export "$@"

SYSPATH="/sys/${DEVPATH}"
if [[ "$SYSPATH" = */event* ]]; then
    SYSPATH="$SYSPATH/device"
fi

EV=$(cat "$SYSPATH/capabilities/ev")
KEY=$(cat "$SYSPATH/capabilities/key")
ABS=$(cat "$SYSPATH/capabilities/abs")
REL=$(cat "$SYSPATH/capabilities/rel")
PROPS=$(cat "$SYSPATH/properties")

case "$MODE" in
    ID_INPUT)
        echo 1
        ;;
    ID_INPUT_MOUSE)
        if bitmap_contains "$KEY" "$BTN_MOUSE" && ev_contains "$EV" "$EV_REL" ; then
            echo 1
        else
            exit 1
        fi
        ;;
    ID_INPUT_KEYBOARD)
        for i in $ASCII_KEYS; do
            if ! bitmap_contains "$KEY" "$i"; then
                exit 1
            fi
        done
        echo 1
        ;;
    ID_INPUT_TOUCHPAD)
        if ev_contains "$EV" "$EV_REL" && bitmap_contains "$PROPS" "$INPUT_PROP_POINTER"; then
            echo 1
        else
            exit 1
        fi
        ;;
    ID_INPUT_TOUCHSCREEN)
        if ev_contains "$EV" "$EV_ABS" && bitmap_contains "$PROPS" "$INPUT_PROP_DIRECT"; then
            echo 1
        else
            exit 1
        fi
        ;;
    ID_INPUT_JOYSTICK)
        exit 1
        ;;
    *)
        exit 1
        ;;
esac
