rev |
line source |
pascal@986
|
1 #!/usr/bin/perl
|
pascal@986
|
2 # --------------------------------------------------------------------------
|
pascal@986
|
3 # This program was taken from the LILO-20 distribution; only this header
|
pascal@986
|
4 # was added.
|
pascal@986
|
5 #
|
pascal@986
|
6 # LILO program code, documentation and auxiliary programs are
|
pascal@986
|
7 # Copyright 1992-1997 Werner Almesberger.
|
pascal@986
|
8 # All rights reserved.
|
pascal@986
|
9 #
|
pascal@986
|
10 # Redistribution and use in source and binary forms of parts of or the
|
pascal@986
|
11 # whole original or derived work are permitted provided that the
|
pascal@986
|
12 # original work is properly attributed to the author. The name of the
|
pascal@986
|
13 # author may not be used to endorse or promote products derived from
|
pascal@986
|
14 # this software without specific prior written permission. This work
|
pascal@986
|
15 # is provided "as is" and without any express or implied warranties.
|
pascal@986
|
16 # --------------------------------------------------------------------------
|
pascal@986
|
17
|
pascal@986
|
18 eval { use bytes; }; eval { binmode STDOUT; };
|
pascal@986
|
19
|
pascal@986
|
20 $DEFAULT_PATH = "/usr/lib/kbd/keytables";
|
pascal@986
|
21 $DEFAULT_MAP = "us";
|
pascal@986
|
22 $DEFAULT_EXT = ".map";
|
pascal@986
|
23
|
pascal@986
|
24 sub usage
|
pascal@986
|
25 {
|
pascal@986
|
26 print STDERR
|
pascal@986
|
27 "usage: $0 [ -p old_code=new_code ] ...\n".
|
pascal@986
|
28 (" "x(8+length $0))."[path]default_layout[.map] ] ".
|
pascal@986
|
29 "[path]kbd_layout[.map]\n";
|
pascal@986
|
30 exit 1;
|
pascal@986
|
31 }
|
pascal@986
|
32
|
pascal@986
|
33
|
pascal@986
|
34 while ($ARGV[0] eq "-p") {
|
pascal@986
|
35 shift(@ARGV);
|
pascal@986
|
36 &usage unless $ARGV[0] =~ /=/;
|
pascal@986
|
37 $table[eval($`)] = eval($');
|
pascal@986
|
38 shift(@ARGV);
|
pascal@986
|
39 }
|
pascal@986
|
40 &usage unless defined $ARGV[0];
|
pascal@986
|
41 load_map("def",defined $ARGV[1] ? $ARGV[0] : undef);
|
pascal@986
|
42 load_map("kbd",defined $ARGV[1] ? $ARGV[1] : $ARGV[0]);
|
pascal@986
|
43 &build_table("plain","shift","ctrl","altgr","shift_ctrl",
|
pascal@986
|
44 "altgr_ctrl","alt","shift_alt","ctrl_alt");
|
pascal@986
|
45 for ($i = 0; $i < 256; $i++) {
|
pascal@986
|
46 printf("%c",$table[$i] ? $table[$i] : $i) || die "print: $!";
|
pascal@986
|
47 }
|
pascal@986
|
48 close STDOUT || die "close: $!";
|
pascal@986
|
49
|
pascal@986
|
50
|
pascal@986
|
51 sub load_map
|
pascal@986
|
52 {
|
pascal@986
|
53 local ($pfx,$map) = @_;
|
pascal@986
|
54 local ($empty,$current);
|
pascal@986
|
55
|
pascal@986
|
56 $map = $DEFAULT_MAP unless defined $map;
|
pascal@986
|
57 $map = $DEFAULT_PATH."/".$map unless $map =~ m|/|;
|
pascal@986
|
58 $map .= $DEFAULT_EXT unless $map =~ m|/[^/]+\.[^/]+$|;
|
pascal@986
|
59 if (!open(FILE,"loadkeys -m $map |")) {
|
pascal@986
|
60 print STDERR "loadkeys -m $map: $!\n";
|
pascal@986
|
61 exit 1;
|
pascal@986
|
62 }
|
pascal@986
|
63 undef $current;
|
pascal@986
|
64 $empty = 1;
|
pascal@986
|
65 while (<FILE>) {
|
pascal@986
|
66 chop;
|
pascal@986
|
67 if (/^(static\s+)?u_short\s+(\S+)_map\[\S+\]\s+=\s+{\s*$/) {
|
pascal@986
|
68 die "active at beginning of map" if defined $current;
|
pascal@986
|
69 $current = $pfx.":".$2;
|
pascal@986
|
70 next;
|
pascal@986
|
71 }
|
pascal@986
|
72 undef $current if /^};\s*$/;
|
pascal@986
|
73 next unless defined $current;
|
pascal@986
|
74 s/\s//g;
|
pascal@986
|
75 $map{$current} .= $_;
|
pascal@986
|
76 $empty = 0;
|
pascal@986
|
77 }
|
pascal@986
|
78 close FILE;
|
pascal@986
|
79 return unless $empty;
|
pascal@986
|
80 print STDERR "Keymap is empty\n";
|
pascal@986
|
81 exit 1;
|
pascal@986
|
82 }
|
pascal@986
|
83
|
pascal@986
|
84
|
pascal@986
|
85 sub build_table
|
pascal@986
|
86 {
|
pascal@986
|
87 local (@maps) = @_;
|
pascal@986
|
88 local (@tmp);
|
pascal@986
|
89
|
pascal@986
|
90 $set = 0;
|
pascal@986
|
91 for $map (@maps) {
|
pascal@986
|
92 $code = $set;
|
pascal@986
|
93 for (split(",",$map{"def:".$map})) {
|
pascal@986
|
94 die "bad map entry $_ (def, map $map)" unless /^0x\S\S(\S\S)$/;
|
pascal@986
|
95 $tmp[$code] = hex $1 unless $tmp[$code];
|
pascal@986
|
96 $code++;
|
pascal@986
|
97 }
|
pascal@986
|
98 $set += 256;
|
pascal@986
|
99 }
|
pascal@986
|
100 $set = 0;
|
pascal@986
|
101 for $map (@maps) {
|
pascal@986
|
102 $code = $set;
|
pascal@986
|
103 for (split(",",$map{"kbd:".$map})) {
|
pascal@986
|
104 die "bad map entry $_ (kbd, map $map)" unless /^0x\S\S(\S\S)$/;
|
pascal@986
|
105 $table[$tmp[$code]] = hex $1 unless $table[$tmp[$code]];
|
pascal@986
|
106 $code++;
|
pascal@986
|
107 }
|
pascal@986
|
108 $set += 256;
|
pascal@986
|
109 }
|
pascal@986
|
110 $table[0] = 0;
|
pascal@986
|
111 }
|