/* * ########################################################################## * # Dies ist konto_check-at, ein Programm zum Testen der Prüfziffern von # * # österreichischen Bankkonten. Es kann jedoch auch als eigenständiges # * # Programm oder als Library zur Verwendung in anderen Programmen # * # benutzt werden. # * # # * # Copyright (C) 2006 Michael Plugge # * # # * # Dieses Programm ist freie Software; Sie dürfen es unter den # * # Bedingungen der GNU Lesser General Public License, wie von der Free # * # Software Foundation veröffentlicht, weiterverteilen und/oder # * # modifizieren; entweder gemäß Version 2.1 der Lizenz oder (nach Ihrer # * # Option) jeder späteren Version. # * # # * # Die GNU LGPL ist weniger infektiös als die normale GPL; Code, der von # * # Ihnen hinzugefügt wird, unterliegt nicht der Offenlegungspflicht # * # (wie bei der normalen GPL); außerdem müssen Programme, die diese # * # Bibliothek benutzen, nicht (L)GPL lizensiert sein, sondern können # * # beliebig kommerziell verwertet werden. Die Offenlegung des Sourcecodes# * # bezieht sich bei der LGPL *nur* auf geänderten Bibliothekscode. # * # # * # Dieses Programm wird in der Hoffnung weiterverbreitet, daß es # * # nützlich sein wird, jedoch OHNE IRGENDEINE GARANTIE, auch ohne die # * # implizierte Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR # * # EINEN BESTIMMTEN ZWECK. Mehr Details finden Sie in der GNU Lesser # * # General Public License. # * # # * # Sie sollten eine Kopie der GNU Lesser General Public License # * # zusammen mit diesem Programm erhalten haben; falls nicht, # * # schreiben Sie an die Free Software Foundation, Inc., 59 Temple # * # Place, Suite 330, Boston, MA 02111-1307, USA. Sie können sie auch # * # von # * # # * # http://www.gnu.org/licenses/lgpl.html # * # # * # im Internet herunterladen. # * # # * ########################################################################## */ #define VERSION_AT "1.3" #define VERSION_DATE_AT "16.1.2008" #define VERSION_AT_MAJOR 1 #define VERSION_AT_MINOR 1 #define VERSION_AT_RELEASE 3 #define DEFAULT_LUT_NAME_AT "blz-at.lut" /* Name der binären Bankleitzahlen-Datei */ #define MAX_BLZ_CNT_AT 20000 /* maximale Anzahl Banken in blz-at.lut; aktuell: gut 7000 */ #define MAX_TABLE_CNT_AT 200 /* maximale Anzahl Prüftabellen in blz-at.lut; aktuell: knapp 40 */ #ifndef INT4_DEFINED #define INT4_DEFINED #include #if INT_MAX==2147483647 typedef int INT4; typedef unsigned int UINT4; #elif LONG_MAX==2147483647 typedef long INT4; typedef unsigned long UINT4; #else /* Notausstieg, kann 4 Byte Integer nicht bestimmen */ #error "Typedef für 4 Byte Integer nicht definiert" #endif #endif /* * ###################################################################### * # Die konto_check-at Library ist im Gegensatz zur aktuellen # * # deutschen konto_check Library in den meisten Funktionen # * # threadfest; Ausnahmen sind die trace-Versionen (komplett, da # * # der Filedeskriptor trace global definiert sein muß) sowie die # * # Funktionen generate_lut_at(). # * # Dies dürfte jedoch in beiden Fällen kein Problem sein, da die # * # trace-Versionen nur zur Fehlersuche gedacht sind, und die # * # Funktion generate_lut_at() normalerweise auch nicht auf einem # * # laufenden Produktionssystem aufgerufen werden sollte. Damit # * # entfallen die beiden Funktionsvarianten für threadfeste und # * # nicht threadfeste Version, sowie die Initialisierungs- und # * # Aufräumarbeiten bei den ctx-Strukturen. # * # Die einzige kritische Stelle für Umgebungen mit threads stellt die # * # Funktion init_globals() dar; in der Funktion wird der kritische # * # Codeabschnitt mit einer Pseudo-Semaphoren geschützt; aber auch der # * # u.U. mögliche Fall, daß zwei threads gleichzeitig die library # * # initialisieren, würde nur dann zu Inkonsistenzen führen, falls sie # * # zwei verschiedene lut-Dateien benutzen; in dem Fall wird die Datei # * # der letzten Initialisierung verwendet (falls nicht ein thread den # * # anderen überholt - dann dürfte ein Mischmasch die Folge sein :-( ) # * # Da dies jedoch nicht sinnvoll erscheint, wurde auch eine Fehler- # * # behandlung für diesen Fall nicht implementiert. # * ###################################################################### */ /* * ###################################################################### * # DLL-Optionen für Windows # * # Der DLL-Code wurde aus der Datei dllhelpers (beim MinGW-Compiler # * # enthalten, http://www.mingw.org/) entnommen # * ###################################################################### */ #if BUILD_DLL /* DLL kompilieren */ # define DLL_EXPORT __declspec (dllexport) __stdcall # define DLL_EXPORT_V __declspec (dllexport) #elif USE_DLL /* DLL in einem anderen Programm benutzen */ # define DLL_EXPORT __declspec (dllimport) __stdcall # define DLL_EXPORT_V __declspec (dllimport) #else /* kein DLL-Krempel erforderlich */ # define DLL_EXPORT # define DLL_EXPORT_V #endif /* * ###################################################################### * # mögliche Rückgabewerte von kto_check_at() (wie konto_check) # * ###################################################################### */ #define UNDEFINED_SUBMETHOD -29 #define EXCLUDED_AT_COMPILETIME -28 #define INVALID_LUT_VERSION -27 #define INVALID_PARAMETER_STELLE1 -26 #define INVALID_PARAMETER_COUNT -25 #define INVALID_PARAMETER_PRUEFZIFFER -24 #define INVALID_PARAMETER_WICHTUNG -23 #define INVALID_PARAMETER_METHODE -22 #define LIBRARY_INIT_ERROR -21 #define LUT_CRC_ERROR -20 #define FALSE_GELOESCHT -19 #define OK_NO_CHK_GELOESCHT -18 #define OK_GELOESCHT -17 #define BLZ_GELOESCHT -16 #define INVALID_BLZ_FILE -15 #define LIBRARY_IS_NOT_THREAD_SAFE -14 #define FATAL_ERROR -13 #define INVALID_KTO_LENGTH -12 #define FILE_WRITE_ERROR -11 #define FILE_READ_ERROR -10 #define ERROR_MALLOC -9 #define NO_BLZ_FILE -8 #define INVALID_LUT_FILE -7 #define NO_LUT_FILE -6 #define INVALID_BLZ_LENGTH -5 #define INVALID_BLZ -4 #define INVALID_KTO -3 #define NOT_IMPLEMENTED -2 #define NOT_DEFINED -1 #define FALSE 0 #define OK 1 #define OK_NO_CHK 2 /* * ########################################################################### * # kto_check_at(): Test eines Kontos # * # # * # Parameter: blz: Bankleitzahl # * # # * # kto: Kontonummer (wird vor der Berechnung linksbündig # * # mit Nullen auf 11 Stellen aufgefüllt) # * # # * # lut_name: Name der Lookup-Datei, NULL oder Leerstring. # * # Falls für lut_name NULL angegeben wird, wird keine # * # lut-Datei gelesen; das Flag global_vars_initialized# * # wird in diesem Fall *nicht* gesetzt. # * # Falls für lut_name ein Leerstring angegeben wird, # * # versucht die Funktion, die Datei # * # DEFAULT_LUT_NAME_AT zu lesen. # * # # * # Rückgabewerte: s.o. # * ########################################################################### */ DLL_EXPORT int kto_check_at(char *blz,char *kto,char *lut_name); DLL_EXPORT char *kto_check_at_str(char *blz,char *kto,char *lut_name); /* ########################################################################### * # Die Funktionen kto_check_retval2txt() und kto_check_retval2html geben # * # eine Klartext-Fehlermeldung zur Variablen retval zurück. # * # In der Funktion kto_check_retval2html sind Umlaute durch die HTML-Tags # * # ersetzt, die Funktion kto_check_retval2txt liefert iso-8859-1 Umlaute. # * ########################################################################### */ DLL_EXPORT char *kto_check_retval2txt(int retval); DLL_EXPORT char *kto_check_retval2html(int retval); /* ########################################################################### * # Die Funktion get_loesch_datum() liefert bei gelöschten Bankleitzahlen # * # das Löschdatum zurück, bei gültigen BLZ's einen Leerstring. # * ########################################################################### */ DLL_EXPORT const char *get_loesch_datum(char *blz); /* ########################################################################### * # Die Funktion generate_lut_at() generiert aus der Institutsparameter- # * # Datenbankdatei (5,3 MB) eine kleine Datei (8,3 KB), in der nur die # * # Bankleitzahlen und Prüfziffermethoden gespeichert sind. Um die Datei # * # klein zu halten, wird der größte Teil der Datei binär gespeichert. # * # # * # Falls der Parameter plain_name angegeben wird, wird zu jeder INPAR- # * # Eintrag außerdem (in einem frei wählbaren Format) noch in eine Klartext-# * # datei geschrieben. Das Format der Datei wird durch den 4. Parameter # * # (plain_format) bestimmt. Es sind die folgenden Felder und Escape- # * # Sequenzen definiert (der Sortierparameter muß als erstes Zeichen # * # kommen!): # * # # * # @i Sortierung nach Identnummern # * # @b Sortierung nach Bankleitzahlen (default) # * # %b Bankleitzahl # * # %B Bankleitzahl (5-stellig, links mit Nullen aufgefüllt) # * # %f Kennzeichen fiktive Bankleitzahl # * # %h Kennzeichen Hauptstelle/Zweigstelle # * # %i Identnummer der Österreichischen Nationalbank # * # %I Identnummer der Österreichischen Nationalbank 8-stellig) # * # %l Löschdatum (DD.MM.YYYY falls vorhanden, sonst nichts) # * # %L Löschdatum (DD.MM.YYYY falls vorhanden, sonst 10 Blanks) # * # %n1 Erster Teil des Banknamens # * # %n2 Zweiter Teil des Banknamens # * # %n3 Dritter Teil des Banknamens # * # %N kompletter Bankname (alle drei Teile zusammengesetzt) # * # %p Kontoprüfparameter # * # %t Name der Prüftabelle # * # %z zugeordnete BLZ (nur bei fiktiver BLZ, sonst nichts) # * # %Z zugeordnete BLZ (5-stellig bei fiktiver BLZ, sonst 5 Blanks) # * # %% das % Zeichen selbst # * # # * # \n Zeilenvorschub # * # \r CR (für M$DOS) # * # \t Tabulatorzeichen # * # \\ ein \ # * # # * # @i (bzw. @b) muß am Anfang des Formatstrings stehen; falls keine # * # Sortierung angegeben wird, wird @b benutzt. # * # # * # Nicht definierte Felder und Escape-Sequenzen werden (zumindest momentan # * # noch) direkt in die Ausgabedatei übernommen. D.h., wenn man %x schreibt,# * # erscheint in der Ausgabedatei auch ein %x, ohne daß ein Fehler gemeldet # * # wird. Ob dies ein Bug oder Feature ist, sei dahingestellt; momentan # * # scheint es eher ein Feature zu sein ;-))). # * # # * # Falls kein plain_format angegeben wird, wird DEFAULT_PLAIN_FORMAT # * # benutzt. Die Datei ist (anders als die INPAR-Datei) nach Bankleitzahlen # * # sortiert. Nähres zur Sortierung findet sich in der Einleitung zur # * # Funktion cmp_blz(). # * # # * # Die Funktion ist **nicht** threadfest, da dies aufgrund der gewählten # * # Implementierung nur schwer zu machen wäre, und auch nicht sehr sinnvoll # * # ist (sie wird nur benötigt, um die blz-at.lut Datei zu erstellen). # * # # * # Copyright (C) 2006 Michael Plugge # * ########################################################################### */ #define DEFAULT_PLAIN_FORMAT "@B%I %B %t %N" /* Defaultwert für plain_format in generate_lut_at() */ DLL_EXPORT int generate_lut_at(char *inputname,char *outputname,char *plainname,char *plain_format); /* ########################################################################### * # dump_lutfile_at: Inhalt einer .lut-Datei als Klartextdatei ausgeben # * ########################################################################### */ DLL_EXPORT int dump_lutfile_at(char *inputname, char *outputname); /* ########################################################################### * # konto_check_at_version_major: (DLL) ABI Versionsnummer # * # konto_check_at_version_minor: Versionsnr. (1. Stelle) # * # konto_check_at_version_release: Versionsnr. (2. Stelle) # * # # * # Die ABI (Application Binary Interface) Versionsnummer ändert sich nur, # * # wenn sich im DLL interface eine Aufrufkonvention oder eine exportierte # * # Struktur ändert; die DLL und das aufrufende Programme sollten dieselbe # * # ABI Versionsnummer haben, ansonsten kann Kompatibilität nicht garantiert# * # werden. # * # # * # Die minor und release Nummern sind die üblicherweise bei der Versionsnr.# * # angegebenen Stellen (V 1.2 ist z.B. version_minor 1, version_release 2. # * ########################################################################### */ DLL_EXPORT int konto_check_at_version_major(void); DLL_EXPORT int konto_check_at_version_minor(void); DLL_EXPORT int konto_check_at_version_release(void);