isdn4k-utils/isdnlog/tools/dest/pp_rate

240 lines
5.3 KiB
Perl
Executable File

#! /usr/bin/perl
use wld;
use strict;
use IO::File;
$|=1;
use vars qw( %names $COUNTRY %myalias );
$COUNTRY = '../country';
&get_country;
&get_alias;
&prep_rate;
1;
sub get_country {
my ($name, $alias, $key, $nn, $na);
sub add1 {
my (@all, $a);
$names{lc $name}=$key;
$nn++;
@all=split(/\s*,\s*/, $alias);
foreach $a (@all) {
$na++;
$names{lc $a}=$key;
}
}
my $co_dat = '/usr/lib/isdn/country.dat';
open(IN,$co_dat) || die("Cant read $co_dat");
while (<IN>) {
chomp;
s/\s*#.*$//;
s/\s+$//;
if (/^N:(.*)/) {
&add1;
$alias='';
$name=$1;
}
elsif (/^[AE]:(.*)/) {
$alias = $alias ne '' ? "$alias,$1" : $1;
}
elsif (/^T:(.*)/) {
$key=$1;
}
}
&add1;
close IN;
print "$nn Countrys $na Aliases loaded\n";
}
sub get_alias {
`cp ~/.country-alias .country-alias`;
open(IN, ".country-alias");
while (<IN>) {
chomp;
my($c,$a) = split(/\t/);
$myalias{$c}=$a;
}
close(IN);
}
sub prep_rate {
my ($l, $infile, $outfile);
my (@lines, @files, @ofiles, @streams, @outf);
my ($include, $wrinclude);
my $MAX_INCLUDE=3;
$wrinclude = $include = 0;
my $inc_mode;
$infile = $ARGV[0] || '/usr/lib/isdn/rate-at.dat';
$outfile = $ARGV[1] || "$infile.new";
$files[$include]=$infile;
$ofiles[$wrinclude]=$outfile;
wopen:
$outf[$wrinclude] = new IO::File ("$ofiles[$wrinclude]",'w');
die("Cant write $ofiles[$wrinclude]") unless defined $outf[$wrinclude];
ropen:
$lines[$include] = $l = 0;
$streams[$include] = new IO::File($files[$include]) || die("Can't read $files[$include]");
ragain:
print("\nReading $files[$include]\n");
print("Writing $ofiles[$wrinclude]\n");
while ($_=$streams[$include]->getline) {
my($a,@a, $c, $oc, $r, $d, @keys, $name, $m, $tf);
$l++;
print "$l\r";# if $l % 10 == 0;
if (/^([Ii]):\s*(\S+)/) {
my $f = $2;
$inc_mode = $1;
$f =~ s/\s*#.*$//;
if ($include >= $MAX_INCLUDE+1) {
print("Include nested to deeply - ignored\n");
next;
}
$lines[$include] = $l;
$include++;
if ($f =~ m#/#) {
$files[$include] = $f;
}
else {
my $n = $files[0];
$n =~ s#(.*/).*#$1#;
$n .= $f;
$files[$include] = $n;
}
if ($inc_mode eq 'i') { # include and put contents in same outfile
goto ropen;
}
else { # make real include file
$wrinclude++;
if ($f =~ m#/#) {
$ofiles[$wrinclude] = "$f.inc";
}
else {
my $n = $ofiles[0];
$n =~ s#(.*/).*#$1#;
$n .= $f;
$ofiles[$wrinclude] = $n;
}
if($ofiles[$wrinclude] eq $files[$include]) {
$ofiles[$wrinclude] .= '.inc';
}
$f = $ofiles[$wrinclude];
$f =~ s#.*/##;
$outf[$wrinclude-1]->print ("I:$f\n");
goto wopen;
}
}
elsif (/^A:(.*)/) {
$a=$1;
$a =~ s/\s*#.*$//;
$a =~ s/[,\s]+$//;
@a=split(/\s*,\s*/, $a);
foreach $c (@a) {
next if ($c eq '');
$c = lc $c;
ok:
if ($c =~ /^\+?\d+/ || $c eq '+') {
push(@keys,$c);
}
elsif ($d=$names{$c}) {
push(@keys,$d);
}
elsif ($d=$names{$myalias{$c}}) {
push(@keys,$d);
}
else {
$oc = $c;
again:
print "'$c'";
$m=99; $tf='';
if ($COUNTRY) {
my $cc = `$COUNTRY "$c"`;
($tf, $m) = $cc =~ /<.*?>=<(.*?)>\sd=(\d+)/;
$m=99 if ($cc =~/unknown/);
$tf = lc $tf;
}
else {
foreach $name (keys(%names)) {
if (($r=wld($name,$c)) < $m) {
$m=$r; $tf=$name;
last if($m==0);
}
}
}
if ($tf && $m<=1) {
push(@keys,$names{$tf});
$names{$oc}=$names{$tf};
$myalias{$oc}=$tf;
print " -> $tf\n";
}
else {
my($x);
print "\nLine $l: $c => $tf ($m)\n ? [j,q,[+|=]...,/] : ";
$x = <STDIN>;
chomp($x);
if ($x =~ /^=(.*)/) {
$c = $1 if($1 ne '');
goto again;
}
elsif ($x =~ /^\+(.*)/) {
$c = $oc . $1;
goto again;
}
elsif ($x =~ /^\/(.*)/) {
print `grep -3 -i $1 /usr/lib/isdn/country.dat`;
goto again;
}
if ($x eq 'j') {
$c = $tf;
$myalias{$oc}=$tf;
$names{$oc}=$names{$tf};
goto ok;
}
elsif ($x eq 'h') {
print "j => Vorschlag annehmen\n";
print "q => abbrechen\n";
print "n => unbekannt ignorieren (gilt dann fuer die gesamte Datei)\n";
print "+xx => xx an unbekannt anhaengen\n";
print "= SO => SO uebernehmen\n";
print "= => unbekannt uebernehmen\n";
print "/xx => in country.dat nach xx greppen\n";
print "xx => xx ausprobieren\n";
goto again;
}
elsif ($x eq 'q') {
exit;
}
else {
$c = $x;
}
goto again;
}
} # else found
} # foreach
$outf[$wrinclude]->print ("A:", join(',',@keys),"\n") || die("can' write");
} # if A
else {
$outf[$wrinclude]->print( $_);
}
} # while IN
close($streams[$include]);
if($include) {
$include--;
$l = $lines[$include];
$infile=$files[$include];
if ($inc_mode eq 'I') { # write separate files
close($outf[$wrinclude]);
$wrinclude--;
}
goto ragain;
}
close($outf[$wrinclude]);
open(OUT, ">.country-alias") || die("Can't write .country-alias");
foreach my $c (sort(keys(%myalias))) {
print OUT "$c\t",$myalias{$c},"\n";
}
close(OUT);
`mv .country-alias ~/.country-alias`;
print "\nOk.\n";
} # prep_rate