summaryrefslogtreecommitdiff
path: root/keytab-lilo.pl
diff options
context:
space:
mode:
authorhpa <hpa>1998-04-14 04:22:15 +0000
committerhpa <hpa>1998-04-14 04:22:15 +0000
commita8f911357bd9afcb5d60635c13344d48242c755c (patch)
tree264195c5bde7a45ca7ac4abdabaf3d252e276557 /keytab-lilo.pl
parent35dff40fbc28de846a2f11c7d0e86c77f06e2cae (diff)
downloadsyslinux-a8f911357bd9afcb5d60635c13344d48242c755c.tar.gz
Updated documentation, added keytab-lilo.pl.
Diffstat (limited to 'keytab-lilo.pl')
-rwxr-xr-xkeytab-lilo.pl109
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;
+}