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

Antwort per Email an