wok-current diff syslinux/stuff/tools/keytab-lilo.pl @ rev 986

Up: syslinux (3.70)
author Pascal Bellard <pascal.bellard@slitaz.org>
date Thu Jul 03 10:19:31 2008 +0000 (2008-07-03)
parents
children
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/syslinux/stuff/tools/keytab-lilo.pl	Thu Jul 03 10:19:31 2008 +0000
     1.3 @@ -0,0 +1,111 @@
     1.4 +#!/usr/bin/perl
     1.5 +# --------------------------------------------------------------------------
     1.6 +# This program was taken from the LILO-20 distribution; only this header
     1.7 +# was added.
     1.8 +#
     1.9 +# LILO program code, documentation and auxiliary programs are
    1.10 +# Copyright 1992-1997 Werner Almesberger.
    1.11 +# All rights reserved.
    1.12 +#
    1.13 +# Redistribution and use in source and binary forms of parts of or the
    1.14 +# whole original or derived work are permitted provided that the
    1.15 +# original work is properly attributed to the author. The name of the
    1.16 +# author may not be used to endorse or promote products derived from
    1.17 +# this software without specific prior written permission. This work
    1.18 +# is provided "as is" and without any express or implied warranties.
    1.19 +# --------------------------------------------------------------------------
    1.20 +
    1.21 +eval { use bytes; }; eval { binmode STDOUT; };
    1.22 +
    1.23 +$DEFAULT_PATH = "/usr/lib/kbd/keytables";
    1.24 +$DEFAULT_MAP = "us";
    1.25 +$DEFAULT_EXT = ".map";
    1.26 +
    1.27 +sub usage
    1.28 +{
    1.29 +    print STDERR
    1.30 +      "usage: $0 [ -p old_code=new_code ] ...\n".
    1.31 +      (" "x(8+length $0))."[path]default_layout[.map] ] ".
    1.32 +      "[path]kbd_layout[.map]\n";
    1.33 +    exit 1;
    1.34 +}
    1.35 +
    1.36 +
    1.37 +while ($ARGV[0] eq "-p") {
    1.38 +    shift(@ARGV);
    1.39 +    &usage unless $ARGV[0] =~ /=/;
    1.40 +    $table[eval($`)] = eval($');
    1.41 +    shift(@ARGV);
    1.42 +}
    1.43 +&usage unless defined $ARGV[0];
    1.44 +load_map("def",defined $ARGV[1] ? $ARGV[0] : undef);
    1.45 +load_map("kbd",defined $ARGV[1] ? $ARGV[1] : $ARGV[0]);
    1.46 +&build_table("plain","shift","ctrl","altgr","shift_ctrl",
    1.47 +  "altgr_ctrl","alt","shift_alt","ctrl_alt");
    1.48 +for ($i = 0; $i < 256; $i++) {
    1.49 +    printf("%c",$table[$i] ? $table[$i] : $i) || die "print: $!";
    1.50 +}
    1.51 +close STDOUT || die "close: $!";
    1.52 +
    1.53 +
    1.54 +sub load_map
    1.55 +{
    1.56 +    local ($pfx,$map) = @_;
    1.57 +    local ($empty,$current);
    1.58 +
    1.59 +    $map = $DEFAULT_MAP unless defined $map;
    1.60 +    $map = $DEFAULT_PATH."/".$map unless $map =~ m|/|;
    1.61 +    $map .= $DEFAULT_EXT unless $map =~ m|/[^/]+\.[^/]+$|;
    1.62 +    if (!open(FILE,"loadkeys -m $map |")) {
    1.63 +	print STDERR "loadkeys -m $map: $!\n";
    1.64 +	exit 1;
    1.65 +    }
    1.66 +    undef $current;
    1.67 +    $empty = 1;
    1.68 +    while (<FILE>) {
    1.69 +	chop;
    1.70 +	if (/^(static\s+)?u_short\s+(\S+)_map\[\S+\]\s+=\s+{\s*$/) {
    1.71 +	    die "active at beginning of map" if defined $current;
    1.72 +	    $current = $pfx.":".$2;
    1.73 +	    next;
    1.74 +	}
    1.75 +	undef $current if /^};\s*$/;
    1.76 +	next unless defined $current;
    1.77 +	s/\s//g;
    1.78 +	$map{$current} .= $_;
    1.79 +	$empty = 0;
    1.80 +    }
    1.81 +    close FILE;
    1.82 +    return unless $empty;
    1.83 +    print STDERR "Keymap is empty\n";
    1.84 +    exit 1;
    1.85 +}
    1.86 +
    1.87 +
    1.88 +sub build_table
    1.89 +{
    1.90 +    local (@maps) = @_;
    1.91 +    local (@tmp);
    1.92 +
    1.93 +    $set = 0;
    1.94 +    for $map (@maps) {
    1.95 +	$code = $set;
    1.96 +	for (split(",",$map{"def:".$map})) {
    1.97 +	    die "bad map entry $_ (def, map $map)" unless /^0x\S\S(\S\S)$/;
    1.98 +	    $tmp[$code] = hex $1 unless $tmp[$code];
    1.99 +	    $code++;
   1.100 +	}
   1.101 +	$set += 256;
   1.102 +    }
   1.103 +    $set = 0;
   1.104 +    for $map (@maps) {
   1.105 +	$code = $set;
   1.106 +	for (split(",",$map{"kbd:".$map})) {
   1.107 +	    die "bad map entry $_ (kbd, map $map)" unless /^0x\S\S(\S\S)$/;
   1.108 +	    $table[$tmp[$code]] = hex $1 unless $table[$tmp[$code]];
   1.109 +	    $code++;
   1.110 +	}
   1.111 +	$set += 256;
   1.112 +    }
   1.113 +    $table[0] = 0;
   1.114 +}