/* package whatever; // don't place package name! */ use encoding 'utf8'; use integer; my $filename = shift || 'liu-uni.tab'; open F, '<:raw', $filename or die $!; { use bytes; local $/; @b = map ord, split //,; } close F; $i1 = getint16(0); $words = getint16(4); $i2 = $i1 + getint16(2); # or + ($words*2+7)/8 $i3 = $i2 + getint16(6); # or + ($words*1+7)/8 $i4 = $i3 + getint16(6); # or + ($words*1+7)/8 #printf "words %d 0x%x\n", $words, $words; #printf "i1=0x%x, i2=0x%x, i3=0x%x, i4=0x%x\n", $i1, $i2, $i3, $i4; my @rootkey = (split //," abcdefghijklmnopqrstuvwxyz,.'[]"); for my$i(0 .. 1023) { my @key; $key[0] = $rootkey[$i/32]; $key[1] = $rootkey[$i%32]; next if $key[0] eq ' '; for $ci(getint16($i*2) .. getint16($i*2+2)-1) { my $bit24 = getbits($i4, 24, $ci); my $hi = getbits($i1, 2, $ci); my $lo = $bit24 & 0x3fff; #printf "%x %04x\t", $hi, $lo; $key[2] = $rootkey[$bit24>>19]; $key[3] = $rootkey[$bit24>>14 & 0x1f]; my $flag_unknown = getbits($i2, 1, $ci); my $flag_sp = getbits($i3, 1, $ci); print join '', @key; $char = chr($hi<<14 | $lo); printf "\t%s", $char; printf "\t%s", $flag_sp?' ':'*'; printf "%s", $flag_unknown?' ':'+'; print "\n"; } } sub getint16 { my($addr)[email protected]_; return $b[$addr] | $b[$addr+1]<<8; } sub getbits { my($start, $nbit, $i) = @_; if($nbit==1 || $nbit==2 || $nbit==4) { my($byte)=$b[$start+$i*$nbit /8]; my $ovalue = $byte>>(8-$nbit - $i*$nbit %8); return $ovalue & ((1<<$nbit)-1); } elsif($nbit>0 && $nbit%8==0) { my $nbyte = $nbit / 8; my $value = 0; my $a = $start + $i * $nbyte; while($nbyte--) { $value = $value<<8 | $b[$a++]; } return $value; } else { die; } }