vim:tw=80:ft=text:ai

########################################################################
#          PRFZIFFERBERECHNUNG VON DEUTSCHEN KONTONUMMERN             #
#                     C-/Perl/PHP-Bibliothek                           #
########################################################################
#                                                                      #
# Autor             : Michael Plugge <m.plugge@fh-mannheim.de>         #
# Version           : 2.4                                              #
# Datum             : 13.11.2007                                       #
########################################################################

Versionen der deutschen Bibliothek:

  01.05.02  Version 0.1:
                 erste Version (nur privat, wenige Methoden)

  13.06.02  Version 0.2:
                 Berechnungsmethoden umgeschrieben, zustzliche Methoden
                 eingefgt.

                 Jede implementierte Methode wird mit dem Perl-Modul
                 Business::konto.pm von Andreas Butzko <andreas@butzko.net> mit
                 mindestens 40000 Testkontonummern (oft auch mehr) getestet.

  10.07.02  Version 0.3:
                 weitere Berechnungsmethoden; zustzliche Datei blz_utils.c mit
                 diversen Hilfsfunktionen fr (wesentlich) schnelleren Zugriff
                 auf die Prfziffer- methoden (unter VMS ergab sich fr eine
                 Testdatei mit knapp 200 Eintrgen eine Beschleunigung von 4,9s
                 auf 0,13s (mit einem remote filesystem); bei Linux (mit lokalem
                 Filesystem und blz.txt/blz.lut im Cache) von 175 ms auf 2,4
                 ms).

                 Fr die Brechnung wird nicht mehr auf die Datei der Deutschen
                 Bundesbank zugegriffen, sondern nur noch auf eine generierte
                 Binrdatei (blz.lut); sie kann mit der Funktion generate_lut()
                 aus der Bundesbank- datei erzeugt werden.

 --------------------------------------------------------------------------------

  13.9.02  Version 1.0:
                 Die Berechnungsmethoden sind jetzt komplett;  bis auf Methode
                 87 (Pascalcode) wurden alle Methoden mit dem Perl-Modul
                 konto.pm mit jeweils ca. 50000... 100000 Testkontonummern
                 berprft (dabei wurden auch einige Fehler im Perl-Modul
                 aufgedeckt und beseitigt).

                 Die Funktionen aus blz_utils.c sind jetzt in die Hauptdatei
                 integriert; diese kann als stand-alone Programm oder als
                 library verwendet werden.

   10.10.02 Version 1.0.1:
                 Einige kleine Fehler wurden noch korrigiert und die main()
                 Funktion etwas erweitert.

   06.11.02 Version 1.0.2:
                 main() Routine mit Hilfefunktion, DOS-Exe in das
                 pub-Verzeichnis

   04.02.03 Version 1.0.3:
                 Bugfixes:
                 - Fehler in den Methoden 47, 52, 87 und 93 behoben
                 - falls der 1. Parameter (BLZ/Prfziffermethode) nur
                   zweistellig angegeben wird, wurde die Funktion init_w() nicht
                   aufgerufen, so da etliche Varibalen undefiniert blieben.
                 - Lizenzbedingungen: Unterschied der LGPL zur normalen GPL im
                   readme und am Programmanfang deutlicher gesagt (nicht nur
                   Hinweis auf den Text)
                 - neues blz.lut aus der Datei blz0212.exe

   13.03.03 Version 1.1.0:
                 Bugfixes:
                 - Methode 95: Ausnahmekonten 0001999999 etc. gelten als richtig
                   (ohne Test; Im Vergleich wurde auf kleiner getestet statt auf
                   kleiner/gleich)

                 Weitere nderungen:
                 - Die Konstanten MAYBE_OK/MAYBE_FALSE werden nicht mehr benutzt
                   und wurden entfernt (dadurch ndern sich die numerischen
                   Rckgabewerte, nicht jedoch die symbolischen).
                 - Datei konto_check.h geschrieben mit public interface und
                   mglichen Rckgabewerten.
                 - die Methode A1 wird zum 9.6.2003 gendert; das neue
                   Berechnungsverfahren kann ber eine globale Variable
                   ausgewhlt werden.
                 - Die Methoden A2...A5 wurden implementiert (neue Verfahren)
                 - Neues Dateiformat fr die Datei blz.lut: sie enthlt jetzt
                   eine Infozeile, in der das Erzeugungsdatum und der Name der
                   ursprnglichen Bankleitzahlendatei festgehalten wird.
                 - neue Funktionen get_lut_info(): gibt (beim neuen Format) die
                   Infozeile der LUT-Datei zurck.
                 - neue Funktion get_kto_check_version() zur Versions- kontrolle
                 - main() Routine in eigene Datei ausgelagert
                 - Test von Untermethoden mit dreistelliger "BLZ"

   25.03.03 Version 1.1.1:
                 - zustzlicher Test in read_lut(), ob die LUT-Datei gelesen
                   wurde.
                 - eine Reihe Untermethoden wurde anders numeriert (dies
                   betrifft nur die Debug-Version und ist nur fr Tests
                   relevant; es hat keine Auswirkung auf das normale Programm).
                 - neue Variable pz_str (char[4]), in der die benutzte
                   Prfmethode und Untermethode zurckgegeben wird. Falls die
                   Untermethode unerwnscht ist, kann sie mit pz_str[2]=0
                   gelscht werden. Die Methode entspricht der Notation der
                   Deutschen Bundesbank (00 bis A5), fr die Untermethoden
                   werden kleine Buchstaben benutzt (a, b, c...).

   10.06.03 Version 1.1.2:
                 - Fehler in Methode 21 behoben (Quersumme der Faktoren fehlte)
                 - Methode A1 auf neues Berechnungsverfahren umgestellt
                 - (Bei dem Generator fr die Testkonten wurde noch einige
                   Pattern berichtigt)

   28.01.04 Version 1.1.3 (aus 2.0-Alpha1 hinzugefgt in 1.1.2)=
                 - Die Fehler in Methode 76.2 und 80 (s.u., Version 2.0-Alpha1
                   wurden korrigiert

                 - Die neu definierten Methoden (A6 bis A9) sind jetzt
                   iplementiert.

                 - Methode A1 alt gelscht

   12.10.04 Version 1.1.4 (aus 2.0-Beta-1)
                 - Methoden B1 und B2 neu
                 - Marker fr vim folding eingefhrt

   16.12.04 Version 1.1.5 (aus 2.0-Beta-2)
                 - Methoden B0 und B3 neu

 ----------------------------------------------------------------------

   16.01.04 Version 2.0-Alpha-1
                 - Geschwindigkeitsoptimierung aller Methoden sowie der
                   Hilfsfunktionen und der main() Routine

                 - Methode 80: Der Sonderfall mit 99 an der 3. und 4. Stelle
                   wird jetzt nur noch fr die Variante 2 angenommen, nicht
                   global.

                 - In Methode 76.2 wurde die 1. Stelle auf 1,2,3,5 getestet;
                   aufgrund der Verschiebung mu jedoch die 3. Stelle getestet
                   werden.

                 - Die neu definierten Methoden (A6 bis A9) sind jetzt
                   iplementiert.

                 - Methode A1 alt gelscht

   16.01.04 Version 2.0-Alpha-2
                 - DLL-Support fr Windows eingefhrt

   12.10.04 Version 2.0-Beta-1
                 - Methoden B1 und B2 neu
                 - Marker fr vim folding eingefhrt

   16.12.04 Version 2.0-Beta-2
                 - library threadfest gemacht (optional; noch Testphase)
                 - Methoden B0 und B3 neu

   06.08.05 Version 2.0 final
                 - Makefiles aktualisiert
                 - sharable library fr Linux/Unix
                 - Fehler bei BLZ-Lookup beseitigt (nicht existierende BLZ wurde
                   u.U. auf die 1. BLZ-Methode gefhrt)
                 - Methoden B1, B2 und B4 bis B8 neu implementiert
                 - Die Datei pruefziffermethoden_0509.pdf wurde noch einmal mit
                   den implementierten Methoden verglichen; die Methoden 73, 80,
                   81, 84, 86, 87, 90, 91, A4, A8 wurden danach aktualisiert
                 - Variable methode_a1_alt herausgenommen (obsolet)
                 - set_globals() an mehreren Stellen in generate_lut() eingefgt
                   (in der threadfesten Version wurde der Rckgabetext nicht in
                   die globalen Variablen eingesetzt, da die Funktion direkt
                   aufgerufen wird).

   01.12.05 Version 2.0.1
                 - Methoden B9 und C0 implementiert

   26.05.06 Version 2.0.2
                 - Methoden C1 und C2 implementiert
                 - neues BLZ-Dateiformat (Bundesbank) eingebaut
                 - Variable methode_a1_alt gelscht

   23.08.06 Version 2.0.3
                 - Default fr lut_version in generate_lut() auf 2 (vorher war
                   kein Defaultwert definiert; bei einem ungltigem Wert fr
                   lut_version wurde eine fehler- hafte blz.lut Datei generiert,
                   jedoch flschlich OK zurckgegeben.

   20.11.06 Version 2.0.4
                 - falsche Berechnung in Methode B6 korrigiert
                 - falsche Berechnung in Methode 74b korrigiert

   13.03.07 Version 2.0.5
                 - Methoden C3 und C4 implementiert

   26.05.07 Version 2.1
                 - falls die LUT-Datei nicht gefunden wurde, strzte das
                   Programm beim nchsten Aufruf mit einer access violation ab;
                   korrigiert.
                 - falls als Dateiname fr die LUT-Datei ein Leerstring
                   angegeben wird, wird jetzt der Defaultname benutzt.
                 - die main() Routine kann jetzt auch im Filterbetrieb arbeiten
                 - Fehler in Methode 74 beseitigt: wenn die Unterkonto- nummer
                   nicht angegeben war, wurde bei einer Prf- ziffer von 10
                   gleich INVALID_KTO zurckgegeben, statt den Test mit
                   Unterkontonummer "00" zu wiederholen.
                 - einige Deklarationen mit long ersetzt durch INT4, da auf 64
                   Bit Systemen Probleme entstanden (betrifft vor allem die
                   Funktion adler32)
                 - erste Perl-Version mittels h2xs generiert
                 - einige Anpassungen fr Perl, Perl Dokumentation


   22.08.07 Version 2.2
                    Diese Version ist nur ein Zwischenrelease, um die neu
                    definierten Prfmethoden C5 und C6, die ab September gltig
                    werden, in die Library einzufgen. Ansonsten wurden in der
                    kleinere Details gendert. Die Threadfestigkeit wurde zwar
                    angegangen, ist bis jetzt allerdings nur in der
                    Entwicklerversion implementiert (braucht noch einige Tests).

                  - Methoden C5 und C6 implementiert
                  - einige Aufrumarbeiten, unbenutzte Prototypen fr das LUT2
                    Datei-Format entfernt. Die Funktionen werden in der nchsten
                    greren Version eingefhrt.

   25.08.07 Version 2.3
                    Bugfix-Release fr den Perl-Port von Version 2.2.

                  - In Version 2.2 (Perl) fehlten die beiden Dateien
                    testkonten.txt und testkonten-at.txt. Bei make test ein
                    Fehler zurckgeliefert (eigentlich unkritisch, aber nicht
                    sehr schn).

                  - neuer Rckgabewert OK_TEST_BLZ_USED fr die Methoden 52, 53,
                    B6 und C0 (keine Warnung mehr nach stderr, falls die
                    Prfziffermethode direkt angegeben wird, ohne BLZ).

   13.11.07 Version 2.4
                    Diese Version ist wieder ein Zwischenrelease, um die neu
                    definierte Prfmethode C7 (gltig ab Dezember) in die
                    Library einzufgen; auerdem wurde ein Fehler in der Methode
                    B9 beseitigt.

                  - Methoden C7 implementiert

                  - In Methode B9 war fr den Test auf 3 fhrende Nullen
                    irrtmlich if(kto[3]!='0') (statt if(kto[2]!='0') )
                    geschrieben; korrigiert.

   16.02.08 Version 2.5
                    Diese Version ist ein bergangsrelease, da in der Version
                    3.0 sehr viel Code neu geschrieben wurde; die Version 2.5
                    enthlt noch den alten Code mit einigen kleineren Bugfixes
                    und kann als stabile Variante angesehen werden (3.0 ist noch
                    etwas experimentell, und macht unter Windows in Zusammen-
                    hang mit VB ziemlig Probleme; die C- und Perlversion
                    scheinen dagegen zu laufen).

                  - Methode 50b wird nur noch angewendet, falls die Kontonummer
                    nicht mehr als sieben Stellen hat; nur in dem Fall scheint
                    es mglich zu sein, da ein Unterkonto weggelassen wurde.

                  - Bei Methode 74b wird die Prfziffer (aus der 10. Stelle)
                    modulo 5 genommen, da bei mindestens einer Bank Prfziffern
                    fr 74b >5 vorkommen.

                  - Falls in der Bundesbankdatei fr eine Bank mehrere
                    Prfverfahren angegeben sind, wird das der Haupt- stelle
                    benutzt. Die alte Version nutzte als Prf- zifferverfahren
                    dasjenige, das in der Bankdatei als letztes aufgefhrt
                    wurde; dieses ist oft von einer Nebenstelle und ist somit
                    i.A. nicht korrekt.

   03.04.08 Version 2.6
                    Diese Version ist wieder ein bergangsrelease zu Version 3.0
                    die Version 2.6 enthlt noch den alten Code mit den neu
                    definierten Prfziffermethoden.

                  - Prfziffermethoden C8 und C9 implementiert



##############################################################################
#          PRFZIFFERBERECHNUNG VON STERREICHISCHEN KONTONUMMERN            #
#                           C-/Perl-Bibliothek                               #
##############################################################################
#                                                                            #
# Autor             : Michael Plugge <m.plugge@fh-mannheim.de>               #
# Version           : 2.1                                                    #
# Datum             : 11.06.2007                                             #
##############################################################################

Versionen der sterreichischen Bibliothek:


Version 0.1 (13.7.06, initiale Version)
==============================

 - Prffunktionalitt komplett
 - die Datei blz-at.lut wird von einem externen Programm generiert


Version 0.2 (20.7.06):
======================

 - einige VIM-Faltungen eingefgt

 - exit in etlichen Funktionen durch return mit Fehlercode ersetzt

 - kto_check_msg herausgenommen wegen Kollision mit der deutschen Version,
   funktional ersetzt durch kto_check_retval2txt().

 - kleine nderungen der main() Routine

 - falls eine BLZ als erstes Zeichen ein - enthlt, wird das Konto auch
   getestet, falls die BLZ gelscht ist; die Rckgabewerte sind in dem Fall
   dann OK_GELOESCHT, OK_NO_CHK_GELOESCHT oder FALSE_GELOESCHT.

 - Geschwindigkeitsoptimierungen:

    * search_blz() fr die Methodensuche ersetzt durch Array,
      in dem die Methoden gespeichert sind

    * atoi() zur Umwandlung der BLZ in Integer ersetzt durch eigene Funktion.
      Eine Arrayvariante zur Umwandlung bringt keinen Geschwindigkeitsvorteil.

    * l_datum (globale Variable) ersetzt durch Array (binr); das Lschdatum
      erhlt man nun ber die Funktion get_loesch_datum()

      Die beiden ersten Funktionen waren im Vergleich zur insgesamt bentigten
      Zeit unverhltnismig langsam. Daher wurde die zugehrige Prftabelle und
      die Information, ob eine Bankleitzahl gelscht ist, in zwei Byte-Arrays
      mit jeweils 100.000 Elementen transferiert; die Arrayabfrage ist natrlich
      wesentlich schneller als der Funktionsaufruf. Durch diese Umstellung wird
      die Variable l_datum nicht mehr gesetzt; falls man setzen wollte, mte
      der Index fr jede Bankleitzahl gespeichert werden. In diesem Fall mte
      man fr das Array fr das Lschdatum ein Integer-Array (4 Byte Integer)
      benutzen; da das Lschdatum aber wohl nicht oft bentigt wird, wird es
      nicht mehr in jedem Fall bestimmt, sondern nur noch durch den
      Funktionsaufruf.


 - Fehlerkorrekturen:

   * im Makro ZIFFERNSUMME_7:
      if(pz1>59)pz1-=56;  ersetzt durch if(pz1>59)pz1-=54;
      (falsche Ziffer eingefgt => Ziffernsumme wird falsch)

   * in der Funktion kto_check_at (Rechenvorgang der Prfziffer):
      methode=*ptr++-'0'; ersetzt durch methode=char2num[*ptr++];
      (die alte Variante stimmt nur fr einen Rechenvorgang bis 9)

   * in der Funktion kto_check_at (Array-Version, nach Rechenvorgang der Prfziffer):
      wichtung-='0';  ersetzt durch    wichtung=char2num[wichtung];
      stelle_1-='1';  ersetzt durch    stelle_1=char2num[stelle_1]-1;
      (die alte Variante stimmt nur fr Werte bis 9)


Version 1.0 (1.9.06):
=====================

 - weitere Tests mit realen Konten, noch keine weiteren Fehler gefunden

 - einige Kommentare eingefgt

 - noch einige VIM-Faltungen eingefgt

 - CRC-Test fr die lut-Datei (mit adler32 als Prfsumme)

 - optional bei generate_lut_at(): Ausgabe der Bankdaten auch als plain-Datei
   in frei whlbarem Format

 - neue Funktion dump_lutfile(), die den Inhalt einer lut-Datei als Klartext
   ausgibt (Ausgabefelder: BLZ, Lschdatum, Prftabelle/-parameter).

 - Funktion generate_lut_at in die Bibliothek integriert; inpar2lut.c ist dadurch
   obsolet geworden (bzw. nur noch fr spezielle Prfzwecke relevant), und daher
   aus der Distribution herausgenommen. Die Umlaute werden von CP 850 auf
   iso-8859-1 umgesetzt (aktuell nur fr die plain Ausgabe; es ist jedoch fr
   eine sptere Erweiterung der lut-Datei auf zustzliche Ausgabefelder
   relevant).

 - das Prprozessor-Makro HTML_UMLAUTE in kto_check_retval2txt() ist jetzt
   obsolet; stattdessen gibt es eine zustzliche Funktion
   kto_check_retval2html(), die HTML-Umlaute liefert.

 - kleine nderungen in der Sortier-Routine fr generate_lut. Dadurch ndern
   sich fr einige Bankleitzahlen der lut-Datei das Lschdatum, da nun
   Hauptstellen vor Zweigstellen sortiert werden (es wird nur eine Bank
   pro BLZ in die lut-Datei aufgenommen; manchmal werden allerdings laut der
   Bankleitzahlendatei Hauptstellen vor Zweigstellen gelscht - schwer
   verstndlich, aber so steht es da). Ansonsten ist die lut-Datei mit der alten
   Version identisch (lt sich leicht mittels dump_lutfile() berprfen ;-) ).

 - die library ist jetzt threadfest (sogar ohne Sonderfunktionen wie bei der
   deutschen Variante).

 - beim Lesen und Schreiben der lut-Datei ist der Modus auf rb bzw. wb gesetzt
   (das Programm war noch nicht unter Windows getestet).

 - die Prfroutinen liefern denselben Wert wie Version 0.2 (getestet mit einer
   Spezialversion, die die Prfziffer noch vor der Bildung des Modulus
   bercksichtigt). Ein Problem ist nur die BLZ 00001: in der inporwo.txt finden
   sich fr die BLZ 00001 die folgenden Eintrge:

-   53791 00001 00032 GELOESCHT - BANKHAUS CARL SPAENGLER & CO.
-   53813 00001 00032 BANKKOMMANDITGESELLSCHAFT ANTONI, HACKER & CO.
+   76040 00001 00032 VORARLBERGER LANDESBANK-HOLDING
+  116408 00001 00013 ANTEILSVERWALTUNGSSPARKASSE STOCKERAU
+  163902 00001 00000 GELOESCHT - BANK AUSTRIA TREUHAND & BETEILIGUNGSFONDS AKTIENGESELLSCHAFT
-  166286 00001 00032 Kathrein & Co. Bankkommanditgesellschaft
-  184195 00001 00032 BANKHAUS SCHELHAMMER & SCHATTERA
-  196053 00001 00032 GELOESCHT - Bankhaus Krentschker & Co. Zweigniederlassung Wien
-  267511 00001 00032 GELOESCHT - RAIFFEISENBANK HARD REG.GEN.M.B.H.
- 1337939 00001 00032 GELOESCHT - SECURITY KAPITAL-ANLAGEGESELLSCHAFT M.B.H.
- 4888804 00001 00032 Verwaltungsgenossenschaft der vbankdirekt AG reg.Gen.m.b.H.

   Die drei Eintrge mit einem + in der ersten Spalte werden in die blz-at.lut
   Datei bernommen; falls eine BLZ 00001 auftaucht, wird allerdings der Eintrag
   mit der ID 163902 (Tabelle 0, immer ok) benutzt. In der Version 0.2 wurde
   stattdessen der Eintrag mit der ID 76040 (Tabelle 32) benutzt (aufgrund der
   genderten Sortierroutine). Die BLZ scheint allerdings keine reale BLZ zu
   sein, sondern nur ein Testfall, da die Banken auf den ersten Blick nichts
   miteinander zu tun haben und drei verschiedene Prfverfahren (0, 13 und 32)
   angegeben sind.


Version 1.1 (8.9.06):
=======================

Diese Version enthlt einige kleine nderungen, die sich fr das cgi-Programm
als ntzlich erwiesen haben, sowie zwei Bugfixes:

 - falls in kto_check_at() fr den Parameter lut_name NULL bergeben wird,
   werden nur die Arrays initialisiert, aber keine lut-Datei geladen. Dies ist
   ntzlich, falls statt einer Bankleitzahl direkt die Prfparameter angegeben
   werden (mit vorgestelltem p). Falls fr den Parameter lut_name ein Leerstring
   bergeben wird, wird versucht, die Datei DEFAULT_LUT_NAME zu lesen.

 - der Filedeskriptor trace ist jetzt als globale Variable (in der DLL auch
   exportiert) deklariert; damit kann die trace-Datei auch aus einem anderen
   Modul initialisiert werden. Die Trace-Version ist natrlich nicht threadfest,
   aber sie wird ja nur zur Fehlersuche bentigt.

 - in der Funktion generate_lut_at werden einige groe Array-Variablen allokiert
   (ca. 3,5 MB bei MAX_BLZ_CNT_AT=30000); sie sind jetzt als static deklariert,
   da ansonsten unter Windows das Programm beim Generieren einer lut-Datei mit
   einer Schreibschutzverletzung abstrzt.

 - die Funktion dump_lutfile() lieferte keine vernnftigen Werte, da whrend der
   Entwicklung (kurzzeitig) die Arrays per malloc allokiert wurden, und spter
   wieder als Arrays deklariert wurden; in der Funktion war noch die
   malloc-Version, und die Adressierung ging schief.

 - kleine nderungen in der main() Routine

 - die Fehlermeldungen die von kto_check_retval2txt() geliefert werden, sind
   jetzt reine Fehlermeldungen, ohne in ### eingeschlossen zu sein


Version 1.2 (11.9.06):
=======================

 - kleiner Fehler in der Trace-Version: falls trace==NULL war, wurden einige
   Berechnungen nicht gemacht, und das Ergebnis meist als richtig angesehen
   (dies betrifft nur die Trace-Version, nicht die normale; wurde beim
   cgi-Programm entdeckt).

 - Die Dateien mit dem INPAR Handbuch und -Vertrag werden nach Rcksprache mit
   First Data (H. Krickel) nicht mehr in das Paket aufgenommen, sondern sollten
   direkt bei First Data (Andreas.Krickl@firstdata.at) angefragt, bzw. von der
   Website von First Data Austria heruntergeladen werden (nheres in der Datei
   00liesmich unter Punkt 4. Prfparameter).

Version 2.1 (4.6.07):
=======================
 - Die Versionszhlung luft jetzt synchron mit der deutschen Version von
   konto_check, da die beiden Pakete fr die Perl-Version zusammen verwendet
   werden
 - einige kleinere nderungen fr die Anpassung an Perl
 - Der Datentyp von adler32 wurde von unsigned long auf UINT4 gendert, um
   Probleme mit modernen 64 Bit Compilern zu beheben.
