fuel-virtualbox/functions/translate.sh

85 lines
2.4 KiB
Bash
Executable File

#!/bin/bash -eu
# AT translated set 2 encoder
type xxd > /dev/null || exit 1
if ! test -f dumpkeys.cache; then
sudo dumpkeys --keys-only > dumpkeys.cache
fi
# XXX: hardcoded values are generated by:
#make_break_shift="$(eval echo \$at_table_$(echo -n Shift | xxd -ps))"
#make_shift="${make_break_shift% *}"
#break_shift="${make_break_shift#* }"
make_shift=36
break_shift=b6
map_set() {
# $1 - keycode
# $2 - normal value
# $3 - shifted value
[ "${2}${3}" = "nulnul" ] && return 1
make=$(printf %02x "$1")
break=$(printf %02x "$(($1 | 128))")
eval "at_table_$(echo -n "${3#+}" | xxd -ps)='$make_shift $make $break $break_shift'"
eval "at_table_$(echo -n "${2#+}" | xxd -ps)='$make $break'"
}
map_alias() {
# $1,$3,$5,... - names
# $2,$4,$6,... - aliases
while [ -n "$1" -a -n "$2" ]; do
eval "at_table_$(echo -n "${2#+}" | xxd -ps)=\${at_table_$(echo -n "${1#+}" | xxd -ps)}"
shift
shift
done
}
# at_table_$normal = n
# at_table_$shifted = n
while read keycode n _ normal shifted rest; do
[ "$keycode" = "keycode" ] || continue
map_set "${n}" "${normal}" "${shifted}"
done < dumpkeys.cache
# Extra mapping
map_alias \
one 1 exclam '!' \
two 2 at '@' \
three 3 numbersign '#' \
four 4 dollar '$' \
five 5 percent '%' \
six 6 asciicircum '^' \
seven 7 ampersand '&' \
eight 8 asterisk '*' \
nine 9 parenleft '(' \
zero 0 parenright ')' \
minus '-' underscore '_' \
equal '=' plus '+'
map_alias \
bracketleft '[' braceleft '{' \
bracketright ']' braceright '}' \
semicolon ';' colon ':' \
apostrophe "'" quotedbl '"' \
grave '`' asciitilde '~' \
backslash "\\" bar '|' \
comma ',' less '<' \
period '.' greater '>' \
slash '/' question '?' \
space ' ' Return $'\n'
translate() {
for t in $(echo -n "$*" | xxd -ps | sed -e 's/../& /g'); do
n="at_table_$t"
v="${!n}"
[ -z "$v" ] && echo "$0: unknown char: '$t'." >&2
echo -n " ${v}"
done
echo
}
[ "$(basename "$0")" = "translate.sh" ] && translate " vmlinuz initrd=initrd.img biosdevname=0 ks=cdrom:/ks.cfg ip=10.20.0.2 gw=10.20.0.1 dns1=10.20.0.1 netmask=255.255.255.0 hostname=fuel.domain.tld showmenu=no
"