wok annotate syslinux/stuff/tools/keytab-lilo.pl @ rev 17543

Up busybox (1.23.1)
author Pascal Bellard <pascal.bellard@slitaz.org>
date Tue Jan 27 16:55:03 2015 +0100 (2015-01-27)
parents
children
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 }