diff options
author | hpa <hpa> | 1998-04-14 04:22:15 +0000 |
---|---|---|
committer | hpa <hpa> | 1998-04-14 04:22:15 +0000 |
commit | a8f911357bd9afcb5d60635c13344d48242c755c (patch) | |
tree | 264195c5bde7a45ca7ac4abdabaf3d252e276557 /keytab-lilo.pl | |
parent | 35dff40fbc28de846a2f11c7d0e86c77f06e2cae (diff) | |
download | syslinux-a8f911357bd9afcb5d60635c13344d48242c755c.tar.gz |
Updated documentation, added keytab-lilo.pl.
Diffstat (limited to 'keytab-lilo.pl')
-rwxr-xr-x | keytab-lilo.pl | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/keytab-lilo.pl b/keytab-lilo.pl new file mode 100755 index 00000000..e131b438 --- /dev/null +++ b/keytab-lilo.pl @@ -0,0 +1,109 @@ +#!/usr/bin/perl +# -------------------------------------------------------------------------- +# This program was taken from the LILO-20 distribution; only this header +# was added. +# +# LILO program code, documentation and auxiliary programs are +# Copyright 1992-1997 Werner Almesberger. +# All rights reserved. +# +# Redistribution and use in source and binary forms of parts of or the +# whole original or derived work are permitted provided that the +# original work is properly attributed to the author. The name of the +# author may not be used to endorse or promote products derived from +# this software without specific prior written permission. This work +# is provided "as is" and without any express or implied warranties. +# -------------------------------------------------------------------------- + +$DEFAULT_PATH = "/usr/lib/kbd/keytables"; +$DEFAULT_MAP = "us"; +$DEFAULT_EXT = ".map"; + +sub usage +{ + print STDERR + "usage: $0 [ -p old_code=new_code ] ...\n". + (" "x(8+length $0))."[path]default_layout[.map] ] ". + "[path]kbd_layout[.map]\n"; + exit 1; +} + + +while ($ARGV[0] eq "-p") { + shift(@ARGV); + &usage unless $ARGV[0] =~ /=/; + $table[eval($`)] = eval($'); + shift(@ARGV); +} +&usage unless defined $ARGV[0]; +load_map("def",defined $ARGV[1] ? $ARGV[0] : undef); +load_map("kbd",defined $ARGV[1] ? $ARGV[1] : $ARGV[0]); +&build_table("plain","shift","ctrl","altgr","shift_ctrl", + "altgr_ctrl","alt","shift_alt","ctrl_alt"); +for ($i = 0; $i < 256; $i++) { + printf("%c",$table[$i] ? $table[$i] : $i) || die "print: $!"; +} +close STDOUT || die "close: $!"; + + +sub load_map +{ + local ($pfx,$map) = @_; + local ($empty,$current); + + $map = $DEFAULT_MAP unless defined $map; + $map = $DEFAULT_PATH."/".$map unless $map =~ m|/|; + $map .= $DEFAULT_EXT unless $map =~ m|/[^/]+\.[^/]+$|; + if (!open(FILE,"loadkeys -m $map |")) { + print STDERR "loadkeys -m $map: $!\n"; + exit 1; + } + undef $current; + $empty = 1; + while (<FILE>) { + chop; + if (/^u_short\s+(\S+)_map\[\S+\]\s+=\s+{\s*$/) { + die "active at beginning of map" if defined $current; + $current = $pfx.":".$1; + next; + } + undef $current if /^};\s*$/; + next unless defined $current; + s/\s//g; + $map{$current} .= $_; + $empty = 0; + } + close FILE; + return unless $empty; + print STDERR "Keymap is empty\n"; + exit 1; +} + + +sub build_table +{ + local (@maps) = @_; + local (@tmp); + + $set = 0; + for $map (@maps) { + $code = $set; + for (split(",",$map{"def:".$map})) { + die "bad map entry $_ (def, map $map)" unless /^0x\S\S(\S\S)$/; + $tmp[$code] = hex $1 unless $tmp[$code]; + $code++; + } + $set += 256; + } + $set = 0; + for $map (@maps) { + $code = $set; + for (split(",",$map{"kbd:".$map})) { + die "bad map entry $_ (kbd, map $map)" unless /^0x\S\S(\S\S)$/; + $table[$tmp[$code]] = hex $1 unless $table[$tmp[$code]]; + $code++; + } + $set += 256; + } + $table[0] = 0; +} |