On Sun, May 23, 1999 at 02:55:43PM +0200, Michael Reinelt wrote:
> Leopold Toetsch wrote:
> >
> > Hallo,
> > Meine vorgeschlagenen Loesung der Reduktion durch Wildcards funkt.
> > Die oesterr. Verzonungstabelle eines 'groesseren' Providers, die dieser uns
> > liebenswerter Weise 'finden liess', hat 1028*1027/2 i.e. 527878 Eintraege
> > (7.3 MB).
> > Die reduzierte Zonendatei mit Wildcards hat 16811 Zeilen, d.h. 3.2% des
> > Originals.
Aha! Genau meine Vermutung! Die Vorwahlen werden nicht mit der "Lostrommel"
ermittelt, sondern enthalten durchaus noch mehr an Informationen!
> > Zum Suchen darin sind maximal 4 Zugriffe notwendig.
>
> Gut. Sehr gut sogar.
>
> Wenn unsere Freunde aus Deutschland sich dieser Variante anschlie�en
> k�nnen (Andreas?), und die Reduktion der dortigen Verzonung ebensogut
Ja klar!
> funktioniert (Andreas, kannst du dem Leo erkl�ren, wie er aus deiner
> bin�ren Datei Daten rausbekommt?), k�nnten wir N�gel mit K�pfen machen.
Das Auslesen der "vorwahl.dat" ist einfach. Im folgenden ein Perl-Script, da�
das kann:
---------------------------------------------------------------------------
#!/usr/bin/perl
require "getopts.pl";
&Getopts ("v:crdq:");
if (!$opt_q && !$opt_c && !$opt_r) {
&usage();
}
if ($opt_q) {
if ($opt_c || $opt_r) {
&usage();
}
}
if ($opt_c || $opt_r) {
if ($opt_q) {
&usage();
}
}
sub usage {
printf "%s -v <eigene vorwahl> [ -q <query vorwahl> | { -c | -r} ] [ -d ]\n", $0;
printf "where\t-d\tdebug\n";
printf "\t-c\tCity\n";
printf "\t-r\tR50\n";
exit (-1);
}
# ohne 0
$meinevorwahl = $opt_v if $opt_v;
$q_vorw = sprintf ("%s", $opt_q) if $opt_q;
$vorwahl = "/usr/lib/isdn/vorwahl.dat";
open (VORWAHL, "<$vorwahl") || die "cannot open $vorwahl: $!\n";
# alle Vorwahlen einlesen
read (VORWAHL, $anzahl, 2, 0);
$anz = unpack ("s2", $anzahl);
printf ("Anzahl = %ld, Anz = %s\n", $anzahl, $anz) if $opt_d;
# Wert 4*$anz+3 weicht von der Vorgabe ab!
# Soll: 4*(AnzVorwahl + 1) -> 1 weniger
seek (VORWAHL, 4*$anz+3, 0);
for ($i = 0; $i < $anz ; $i++) {
read (VORWAHL, $num, 2);
$nummer[$i] = unpack ("s2", $num) + 32768;
printf ("nummer[%d]=%d\n", $i, $nummer[$i]) if $opt_d;
if ($meinevorwahl == $nummer[$i]) {
$index = $i;
printf ("Index = %d\n", $index) if $opt_d;
}
}
# Pointerliste einlesen
seek (VORWAHL, 3, 0);
for ($i = 0; $i < $anz; $i++) {
read (VORWAHL, $ptr, 4);
$pointer[$i] = unpack ("l", $ptr);
printf ("Pointer[%d]=%lu\n", $i, $pointer[$i]) if $opt_d;
}
# jetzt auf den Pointer zu meiner Vorwahl stellen
# Pointer - 1???
$p = $pointer[$index]-1;
seek (VORWAHL, $p, 0);
printf ("-> %lu\n", $p) if $opt_d;
# Nahbereich einlesen
read (VORWAHL, $anz_nah, 2);
$anzahl_nah = unpack ("s2", $anz_nah);
printf ("Anzahl Nah-Nummern f�r $meinevorwahl: %d\n", $anzahl_nah) if $opt_d;
for ($i = 0; $i < $anzahl_nah; $i++) {
read (VORWAHL, $num, 2);
$vorw = unpack ("s2", $num) + 32768;
printf ("%d\n", $vorw) if $opt_c;
$a_vorw = sprintf ("%s", $vorw);
if ($opt_q && $q_vorw =~ /^$a_vorw/) {
printf "City\n";
close VORWAHL;
# exitcode 1 f�r City
exit (1);
}
}
# R50 einlesen
read (VORWAHL, $anz_reg, 2);
$anzahl_reg = unpack ("s2", $anz_reg);
printf ("Anzahl R50-Nummern f�r $meinevorwahl: %d\n", $anzahl_reg) if $opt_d;
for ($i = 0; $i < $anzahl_reg; $i++) {
read (VORWAHL, $num, 2);
$vorw = unpack ("s2", $num) + 32768;
printf ("%d\n", $vorw) if $opt_r;
$a_vorw = sprintf ("%s", $vorw);
if ($opt_q && $q_vorw =~ /^$a_vorw/) {
printf "R50\n";
close VORWAHL;
# exitcode 2 f�r R50
exit (2);
}
}
close VORWAHL;
exit (0);
---------------------------------------------------------------------------
Mit folgendem Trivial-Script habe ich vergangene Woche die ganze
"vorwahl.dat" ausgelesen:
---------------------------------------------------------------------------
cat Verzonung.dat | while read L; do
xIFS="$IFS"
IFS=';'
set -- $L
IFS=$xIFS
if [ -n $1 ]; then
echo $1:$3:C:`/usr/local/bin/vorwahl -v $1 -c`:R:`/usr/local/bin/vorwahl -v $1 -r`
else
echo UNKNOWN: $L
fi
done
---------------------------------------------------------------------------
Wobei "Verzonung.dat" die alternative Verzonungstabelle ist, die ich vor
ein paar Tagen hier in dieser Liste gepostet habe, und
"/usr/local/bin/vorwahl" obiger Perl-Script.
isdnlog selbst verwendet nat�rlich eine C-Variante obigen Perl-Scripts.
Der Code findet sich in "isdn4k-utils/lib/isdntools.c", und da die
Routine "area_diff()"
> Nachdem Leo ein doch nicht sooo begeisterter Tarif-Hunter ist, k�nnten
> wir ihn zum Autor des (zuk�nftigen) zone.c k�ren. Hats du Lust, Leo?
> Traust du dir das zu?
Also ich habe nix dagegen!
> Ich habe n�mlich wenig Zeit (ich habe gestern ein Motorrad "gefunden",
> sprich ein Freund hat sich ein neues gekauft, und �berl��t mir seine
> alte 450er Suzi zum "Bewegen". Komisch, irgendwie ist mir an diesem
> Pfingstwochenende �berhaupt nicht nach Programmieren. Woran k�nnte das
> liegen?), au�erdem habe ich einige andere Sachen am Herd (country.c,
> lcd4linux)
>
> Wenn alle obigen Fragen mit "Ja" beantwortet werden, so h�tte ich schon
> noch ein paar konkrete Vorstellungen bez�glich der Schnittstelle, die
> will ich aber jetzt noch nicht in die Diskussion einwerfen.
>
> bye, Michi (der Wilde mit seiner Maschin')
Viel Spa�!
> --
> netWorks Vox: +43 316 698260
> Michael Reinelt Fax: +43 316 692343
> Geisslergasse 4 GSM: +43 676 3079941
> A-8045 Graz, Austria e-mail: [EMAIL PROTECTED]
Ciao,
Andreas
--
Andreas Kool ([EMAIL PROTECTED] * http://www.pweb.de/kool.f)
PGP: 3FBF2411 Fingerprint: B5 35 34 74 25 60 2A 7A 89 06 92 C4 08 BA A5 BD
(To get my PGP key, send me a mail with subject "send pgp key")
Transmission of this message via the Microsoft Network is prohibited
_______________________________________________
Rates4linux-devel mailing list
[EMAIL PROTECTED]
http://lists.SourceForge.net/mailman/listinfo/rates4linux-devel