From 43ae9ac8386c1220c4a58d4c5786276a144d4d37 Mon Sep 17 00:00:00 2001 From: edwin Date: Sun, 14 Jun 2009 13:46:32 +0000 Subject: Instead of only being able to compare two terminal definitions, now also be able to print information about... - length of the terminal capabilties - dump of one terminal definition - relationship overview for a terminal definition --- tools/tools/termcap/termcap.pl | 109 +++++++++++++++++++++++++++++++++-------- 1 file changed, 88 insertions(+), 21 deletions(-) diff --git a/tools/tools/termcap/termcap.pl b/tools/tools/termcap/termcap.pl index f2c1f76..f6d4dc6 100755 --- a/tools/tools/termcap/termcap.pl +++ b/tools/tools/termcap/termcap.pl @@ -30,16 +30,29 @@ use strict; use Data::Dumper; -if ($#ARGV != 1) { +if ($#ARGV < 0) { print < +Usage: $0 -c Compares the entries in the termcap.src for and and print the keys and definitions on the screen. This can be used to reduce the size of two similar termcap entries with the "tc" option. + +Usage: $0 -l [term] +Show all lengths or the ones for terminals matching [term] + +Usage: $0 -p +Print all information about + +Usage: $0 -r +Print all relations from and to EOF exit(0); } +my $command = $ARGV[0]; +my $tca = $ARGV[1]; +my $tcb = $ARGV[2]; + open(FIN, "termcap.src"); my @lines = ; chomp(@lines); @@ -55,6 +68,8 @@ foreach my $l (@lines) { $tc .= $l; next if ($l =~ /\\$/); + $tc =~ s/:\\\s+:/:/g; + my @a = split(/:/, $tc); next if ($#a < 0); my @b = split(/\|/, $a[0]); @@ -63,36 +78,88 @@ foreach my $l (@lines) { } else { $tcs{$a[0]} = $tc; } + if (length($tc) - length($a[0]) > 1023) { + print "$a[0] has a length of ", length($tc) - length($a[0]), "\n"; + exit(0); + } $tc = ""; } -die "Cannot find definitions for $ARGV[0]" if (!defined $tcs{$ARGV[0]}); -die "Cannot find definitions for $ARGV[1]" if (!defined $tcs{$ARGV[1]}); - my %tc = (); my %keys = (); +my %len = (); +my %refs = (); -for (my $i = 0; $i < 2; $i++) { - foreach my $tc (split(/:/, $tcs{$ARGV[$i]})) { +for my $tcs (keys(%tcs)) { + $len{$tcs} = 0; + my $first = 0; + foreach my $tc (split(/:/, $tcs{$tcs})) { + if ($first++ == 0) { + foreach my $ref (split(/\|/, $tc)) { + $refs{$ref} = $tcs; + } + next; + } next if ($tc =~ /^\\/); - $tc{$i}{$tc} = 0 if (!defined $tc{$i}{$tc}); - $tc{$i}{$tc}++; + $tc{$tcs}{$tc} = 0 if (!defined $tc{$tcs}{$tc}); + $tc{$tcs}{$tc}++; + $len{$tcs} += length($tc) + 1; $keys{$tc} = 0; } } -foreach my $key (sort(keys(%keys))) { - if (length($key) > 15) { - print "$key\n"; - printf("%-15s %-3s %-3s\n", "", - defined $tc{0}{$key} ? "+" : "", - defined $tc{1}{$key} ? "+" : "" - ); - } else { - printf("%-15s %-3s %-3s\n", $key, - defined $tc{0}{$key} ? "+" : "", - defined $tc{1}{$key} ? "+" : "" - ); +$tca = $refs{$tca} if (defined $tca && defined $refs{$tca}); +$tcb = $refs{$tcb} if (defined $tcb && defined $refs{$tca}); + +die "Cannot find definitions for $tca" if (defined $tca && !defined $tcs{$tca}); +die "Cannot find definitions for $tcb" if (defined $tcb && !defined $tcs{$tcb}); + +if ($command eq "-c") { + foreach my $key (sort(keys(%keys))) { + next if (!defined $tc{$tca}{$key} && !defined $tc{$tcb}{$key}); + printf("%-3s %-3s %s\n", + defined $tc{$tca}{$key} ? "+" : "", + defined $tc{$tcb}{$key} ? "+" : "", + $key, + ); + } + + print "$len{$tca} - $len{$tcb}\n"; +} + +if ($command eq "-l") { + foreach my $tcs (sort(keys(%tcs))) { + next if (defined $tca && $tcs !~ /$tca/); + printf("%4d %s\n", $len{$tcs}, $tcs); + } +} + +if ($command eq "-p") { + printf("%s (%d bytes)\n", $tca, $len{$tca}); + foreach my $key (sort(keys(%keys))) { + next if (!defined $tc{$tca}{$key}); + printf("%s\n", $key); } } +if ($command eq "-r") { + foreach my $key (keys(%{$tc{$tca}})) { + next if ($key !~ /^tc=/); + $key =~ s/tc=//; + print "Links to:\t$key\n"; + } + my $first = 0; + foreach my $ref (sort(keys(%refs))) { + next if ($refs{$ref} ne $tca); + foreach my $tc (sort(keys(%tcs))) { + if (defined $tc{$tc}{"tc=$ref"}) { + if ($first++ == 0) { + print "Links from:\t"; + } else { + print "\t\t"; + } + print "$ref -> $tc\n"; + } + } + } +} -- cgit v1.1