Business-KontoCheck
view release on metacpan or search on metacpan
konto_check.c view on Meta::CPAN
/* Iban-Regel 0028.00 +§§§3 */
/* Sparkasse Hannover */
case 28:
if(b==25050180)return OK;
strcpy(blz,"25050180");
*bicp="SPKHDE2HXXX";
return OK_BLZ_REPLACED;
/* Iban-Regel 0029.00 +§§§3 */
/* Société Générale */
case 29:
/* 10-stellige Kontennummern (d. h. die 1. Ziffer der Kontonummer ist
* ungleich "0"), die in Position 4 eine "0" enthalten, können nicht
* 1:1 in eine gültige IBAN konvertiert werden.
*
* In diesen Fällen wird die korrekte Kontonummer für IBAN gebildet
* indem die 4. Ziffer (die "0") entfernt wird. Man erhält eine
* 9-stellige Konto-Nummer, die 1. Ziffer der Kontonummer in der IBAN
* ist damit implizit eine "0".
*/
if(*kto!='0' && *(kto+3)=='0'){
kto[3]=kto[2];
kto[2]=kto[1];
kto[1]=*kto;
*kto='0';
RETURN_OK_KTO_REPLACED;
}
RETURN_OK;
/* Iban-Regel 0030.00 +§§§3 */
/* Pommersche Volksbank eG */
case 30:
/* ab September 2018 entfällt die Regel 30, bleibt jedoch frei */
return OK;
/* Iban-Regeln 0031.01 ... 0035.01 +§§§3 */
/* UniCredit Bank AG:
* Diese Bank definiert fünf verschiedene Regeln, die teilweise
* aufeinander aufbauen. Sie werden daher gemeinsam behandelt.
*/
case 31: /* Regel 0031.01 */
case 32: /* Regel 0032.00 */
case 33: /* Regel 0033.01 */
case 34: /* Regel 0034.00 */
case 35: /* Regel 0035.01 */
/* Berechnungsregel 31: Ehemalige HYPO-Bank
* Wird eine Bankleitzahl mit Löschkennzeichen - erkennbar an
* Kennzeichen "1" in Feld 12 der Bankleitzahlendatei - und mit dem
* oben genannten IBAN-Kennzeichen - siehe Feld 14 der Bankleitzahlen-
* datei - im Feld "Bankleitzahl" angeliefert, so ist die als Anlage
* beigefügte Tabelle
*
* "Tabelle zu Kontokreise exHypo"
*
* anzufragen und anhand des genannten Kontokreises in der ersten
* Spalte bzw. Kontonummernbereich "von-bis" in der dritten und vierten
* Spalte die Nachfolge-Bankleitzahl zu ermitteln.
*
* Nur die ermittelte Nachfolge-BLZ darf zur IBAN-Berechnung verwendet werden.
*
* Achtung:
*
* * Diese Vorgehensweise gilt nur für 10-stellige Kontonummern!
*
* * Die Prüfziffer der Kontonummer ist zu prüfen!
*
* * Kürzere Kontonummern sind nicht zugelassen!
*
* * Diese IBAN-Regel überstimmt die in der Bankleitzahlendatei in Feld
* 13 jeweils gemeldeten Nachfolge-Bankleitzahlen!
*
* * Es ist stets der BIC der ausgetauschten Bankleitzahl gemäß Eintrag
* in Feld 8 der Bankleitzahlendatei auszugeben.
*
***************************************************************************
*
* Berechnungsregel 32: HYPO-Bank-Nachfolge
*
* * Die IBAN-Regel Nr. 0032 ist das Gegenstück zu IBAN-Regel Nr. 0031
* und verdeutlicht die zugelassenen Kontokreise für die aufnehmenden
* Bankleitzahlen der ehemaligen HYPO-Bank.
*
* * Bei Bankleitzahlen mit dem Kennzeichen 0032 - siehe Feld 14 der
* Bankleitzahlendatei - erfolgt die Anfrage nach zulässigen
* Kontonummern ebenfalls anhand der Tabelle "Tabelle zu Kontokreise
* exHypo", die der IBAN-Regel 0031 als Anlage beigefügt ist.
*
* * Die Bankleitzahlen enthalten kein Löschkennzeichen in Feld 12 der
* Bankleitzahlendatei.
*
* * Die IBAN-Regel Nr. 0032 gilt nur für 10-stellige Kontonummern.
*
* * Kürzere Kontonummern sind zugelassen, im Rahmen der entsprechenden
* Prüfziffernberechnungsmethode - mit Ausnahme des Kontonummern-
* bereiches 800 000 000 bis 899 999 999.
*
***************************************************************************
*
* Berechnungsregel 33: BLZ 700 202 70, UniCredit Bank München
*
* * Die IBAN-Regel Nr. 0033 ist nur für die BLZ 700 202 70 gültig.
* Sie ist eine Kombination aus mehreren Besonderheiten:
*
* a. Logik der IBAN-Regel Nr. 0032 in Bezug auf 10-stellige
* Kontonummernkreise: Die Tabelle "Tabelle zu Kontokreise exHypo",
* die der IBAN-Regel 0031 als Anlage beigefügt ist, ist zu
* berücksichtigen.
*
* b. Kürzere Kontonummern sind zugelassen, im Rahmen der
* Prüfziffernberechnungsmethode:
*
* c. Der Kontokreis 800 000 000 bis 899 999 999 ist allein unter BLZ
* 700 202 70 gültig
*
* d. Berücksichtigung von Pseudokontonummern:
* Bei den nachfolgenden Spendenkonten erfolgt die Anlieferung im
* Feld Konto-Nr. mit einer Pseudokontonummer. Diese ist durch die
* angegebene Kontonummer zur IBAN-Berechnung zu ersetzen.
*
* Pseudokonto BLZ reale Kontonummer
* 22222 70020270 5803435253
* 1111111 70020270 39908140
* 94 70020270 2711931
* 7777777 70020270 5800522694
* 55555 70020270 5801800000
*
***************************************************************************
*
* Berechnungsregel 34: BLZ 600 202 90, UniCredit Bank Stuttgart
*
* * Die IBAN-Regel Nr. 0034 ist nur für die BLZ 600 202 90 gültig.
*
* * Sie ist eine Kombination aus mehreren Besonderheiten:
*
* a. Logik der IBAN-Regel Nr. 0032 in Bezug auf 10-stellige
* Kontonummernkreise:
* Die Tabelle "Tabelle zu Kontokreise exHypo", die der IBAN-Regel
* 0031 als Anlage beigefügt ist, ist zu berücksichtigen.
*
* b. Kürzere Kontonummern sind zugelassen, im Rahmen der
* Prüfziffernberechnungsmethode.
*
* c. Der Kontokreis 800 000 000 bis 899 999 999 ist nicht zugelassen.
*
konto_check.c view on Meta::CPAN
/* Bei Bankverbindungen mit der Bankleitzahl 622 200 00 ist generell
* die IBAN = DE96 5006 0400 0000 0114 04 und der BIC GENODEFFXXX als
* Ergebnis der Ermittlung zur Verfügung zu stellen.
*
* Die angegebene BIC und IBAN ist die Bankverbindung für das Konto der
* Bausparkasse Schwäbisch Hall AG bei der DZ Bank AG Frankfurt am
* Main.
*/
if(b==62220000){
strcpy(blz,"50060400");
strcpy(kto,"0000011404");
*bicp="GENODEFFXXX";
return OK_BLZ_KTO_REPLACED;
}
RETURN_OK; /* sollte wohl nicht vorkommen, aber zur Sicherheit... */
/* Iban-Regel 0042.01 +§§§3 */
/* Deutsche Bundesbank */
case 42:
/* ab Dezember 2016 sind auch 10-stellige Konten der Form nnn4400001 bis nnn4499999 zulässig */
if(k1>=10){ /* 10-stellige Kontonummern ab Dezember 2016 */
if(kto[3]=='4' && kto[4]=='4' && (kto[5]!='0' || kto[6]!='0' || kto[7]!='0' || kto[8]!='0' || kto[9]!='0'))
return OK;
else
return NO_IBAN_CALCULATION;
}
/* ansonsten sind nur noch 8-stellige Konten freigegeben */
if(k1!=0 || k2<10000000)return NO_IBAN_CALCULATION;
/* Konten ohne IBAN-Berechnung: nnn 0 0000 bis nnn 0 0999 */
if(kto[5]=='0' && kto[6]=='0')return NO_IBAN_CALCULATION;
/* Die Kontonummer muss an der 4. Stelle immer gleich '0' sein.
*
* Anm. (MP): die "4." Stelle bezieht sich hier auf die 4. Stelle
* der 8-stelligen Kontonummer, nicht die der 10-stelligen; daher
* wird kto[5] auf '0' getestet. Als Beispiel wird 100 0 1000
* angegeben, wobei die 0 nach initialen 100 damit gemeint ist. Die
* beiden führenden Nullen werden nicht berücksichtigt.
*/
if(kto[5]=='0')return OK;
/* außerdem freigegeben: 50462000 bis 50463999 sowie 50469000 bis 50469999 */
if(!k1 && ((k2>=50462000 && k2<=50463999) || (k2>=50469000 && k2<=50469999)))return OK;
return NO_IBAN_CALCULATION;
/* Iban-Regel 0043.01 +§§§3 */
/* Sparkasse Pforzheim Calw
*
* Die alte BLZ 60651070 verwendet die Prüfziffermethode A9 (diese
* geht auf die Methoden 06 und 01), um eine sanfte Umstellung der
* Konten nach der Fusion zu ermöglichen. Die neue BLZ verwendet nur
* noch die Methode 06. Die Fusion war vor ca. 10 Jahren; Kontonummern
* die nur nach der Methode A9a gültig sind, sollen nach Aussage der
* Bank als ungültig betrachtet werden (Anfrage am 24.5.13, Klarstellung
* ebenfalls in der Email der Bundesbank vom 1.8.13).
*/
case 43:
if(b==60651070){
strcpy(blz,"66650085");
*bicp="PZHSDE66XXX";
return OK_BLZ_REPLACED;
}
RETURN_OK;
/* Iban-Regel 0044.00 +§§§3 */
/* Sparkasse Freiburg */
case 44:
/* Sonderkonto */
if(!k1 && k2==202){
strcpy(kto,"0002282022");
RETURN_OK_KTO_REPLACED;
}
RETURN_OK;
/* Iban-Regel 0045.01 +§§§3 */
/* SEB AG */
case 45:
/* ab September 2017 entfällt die Regel 45, bleibt jedoch frei */
return OK;
/* Iban-Regel 0046.00 +§§§3 */
/* Santander Consumer Bank */
case 46:
if(b==31010833)return OK;
strcpy(blz,"31010833");
*bicp="CCBADE31XXX";
return OK_BLZ_REPLACED;
/* Iban-Regel 0047.00 +§§§3 */
/* Santander Consumer Bank */
case 47:
/* Achtstellige Kontonummern sind rechtsbündig mit Nullen
* aufzufüllen. Alle anderen Kontonummern mit weniger als zehn
* Stellen werden nach der Standard-Regel linksbündig mit Nullen
* aufgefüllt.
*/
if(*kto=='0' && kto[1]=='0' && kto[2]!='0'){
for(i=0;i<8;i++)kto[i]=kto[i+2];
kto[8]=kto[9]='0';
RETURN_OK_KTO_REPLACED;
}
RETURN_OK;
/* Iban-Regel 0048.00 +§§§3 */
/* VON ESSEN GmbH & Co. KG Bankgesellschaft */
konto_check.c view on Meta::CPAN
retvals->methode="07";
retvals->pz_methode=7;
}
#endif
pz = (kto[0]-'0') * 10
+ (kto[1]-'0') * 9
+ (kto[2]-'0') * 8
+ (kto[3]-'0') * 7
+ (kto[4]-'0') * 6
+ (kto[5]-'0') * 5
+ (kto[6]-'0') * 4
+ (kto[7]-'0') * 3
+ (kto[8]-'0') * 2;
MOD_11_352; /* pz%=11 */
if(pz)pz=11-pz;
INVALID_PZ10;
CHECK_PZ10;
/* Berechnung nach der Methode 08 +§§§4 */
/*
* ######################################################################
* # Berechnung nach der Methode 08 #
* ######################################################################
* # Modulus 10, Gewichtung 2, 1, 2, 1, 2, 1, 2, 1, 2 (modifiziert). #
* # Die Berechnung erfolgt wie bei Verfahren 00, jedoch erst #
* # ab der Kontonummer 60 000. #
* ######################################################################
*/
case 8:
#if DEBUG>0
if(retvals){
retvals->methode="08";
retvals->pz_methode=8;
}
#endif
/* Kontonummern unter 60 000: keine Prüfzifferberechnung oder falsch???
*
* Die Beschreibung in der PDF-Datei sagt nichts darüber aus, was mit Kontonummern
* unter 60 000 ist. Ich bekam jetzt zwei Emails, bei denen reale Konten in diesem
* Bereich existieren; ein kleiner Test mit verschiedenen "Konkurrenzprodukten"
* ergibt folgendes Bild:
*
* ckonto.de: ok
* ktoblzcheck: ok
* kontonummern.de: ok, ohne Prüfzifferberechnung
* iban-rechner.de: ok, ohne Prüfzifferberechnung
* VR-IBAN-Konverter: ok
* SEPA-Account-Konverter (Sparkasse): ok
*
* BAV: falsch
* bankleitzahlen.de: Prüffehler.
* bankdatencheck.de: nicht gültig
*
* Die Mehrheit der Programme sieht die Konten als richtig an (bzw. ohne
* Prüfzifferberechnung als gültig). Daher - und vor allem auch aufgrund der vorhandenen
* realen Konten - wird der Rückgabewert für diesen Kontenkreis von INVALID_KTO auf
* OK_NO_CHK geändert.
*
* Markus Malkusch hat nach einer kurzen Rückfrage auch den BAV umgestellt, daß die Konten
* ohne Prüfung als richtig angesehen werden.
*/
if(strcmp(kto,"0000060000")<0)RETURN(OK_NO_CHK);
#ifdef __ALPHA
pz = ((kto[0]<'5') ? (kto[0]-'0')*2 : (kto[0]-'0')*2-9)
+ (kto[1]-'0')
+ ((kto[2]<'5') ? (kto[2]-'0')*2 : (kto[2]-'0')*2-9)
+ (kto[3]-'0')
+ ((kto[4]<'5') ? (kto[4]-'0')*2 : (kto[4]-'0')*2-9)
+ (kto[5]-'0')
+ ((kto[6]<'5') ? (kto[6]-'0')*2 : (kto[6]-'0')*2-9)
+ (kto[7]-'0')
+ ((kto[8]<'5') ? (kto[8]-'0')*2 : (kto[8]-'0')*2-9);
#else
pz=(kto[1]-'0')+(kto[3]-'0')+(kto[5]-'0')+(kto[7]-'0');
if(kto[0]<'5')pz+=(kto[0]-'0')*2; else pz+=(kto[0]-'0')*2-9;
if(kto[2]<'5')pz+=(kto[2]-'0')*2; else pz+=(kto[2]-'0')*2-9;
if(kto[4]<'5')pz+=(kto[4]-'0')*2; else pz+=(kto[4]-'0')*2-9;
if(kto[6]<'5')pz+=(kto[6]-'0')*2; else pz+=(kto[6]-'0')*2-9;
if(kto[8]<'5')pz+=(kto[8]-'0')*2; else pz+=(kto[8]-'0')*2-9;
#endif
MOD_10_80; /* pz%=10 */
if(pz)pz=10-pz;
CHECK_PZ10;
/* Berechnung nach der Methode 09 +§§§4 */
/*
* ######################################################################
* # Berechnung nach der Methode 09 #
* ######################################################################
* # Keine Prüfziffernberechung (es wird immer richtig zurückgegeben). #
* ######################################################################
*/
case 9:
#if DEBUG>0
if(retvals){
retvals->methode="09";
retvals->pz_methode=9;
}
#endif
return OK_NO_CHK;
/* Berechnungsmethoden 10 bis 19 +§§§3
Berechnung nach der Methode 10 +§§§4 */
/*
* ######################################################################
* # Berechnung nach der Methode 10 #
* ######################################################################
* # Modulus 11, Gewichtung 2, 3, 4, 5, 6, 7, 8, 9, 10 (modifiziert). #
* # Die Berechnung erfolgt wie bei Verfahren 06. #
* ######################################################################
*/
case 10:
#if DEBUG>0
if(retvals){
retvals->methode="10";
retvals->pz_methode=10;
}
konto_check.c view on Meta::CPAN
/* Berechnung nach der Methode 44 +§§§4 */
/*
* ######################################################################
* # Berechnung nach der Methode 44 #
* ######################################################################
* # Modulus 11, Gewichtung 2, 4, 8, 5, A, 0, 0, 0, 0 (A = 10) #
* # #
* # Die Berechnung erfolgt wie bei Verfahren 33. #
* # Stellennr.: 1 2 3 4 5 6 7 8 9 10 #
* # Kontonr.: x x x x x x x x x P #
* # Gewichtung: 0 0 0 0 A 5 8 4 2 (A = 10) #
* # #
* # Es gibt noch einen Sonderfall, der in der IBAN-Regel 49 angegeben #
* # ist: Konten mit 9 an der ersten oder 5. Stelle enthalten keine #
* # Prüfziffer. sondern sind ohne Prüfung als richtig anzusehen. #
* ######################################################################
*/
case 44:
#if DEBUG>0
if(retvals){
retvals->methode="44";
retvals->pz_methode=44;
}
#endif
pz = (kto[4]-'0') * 10
+ (kto[5]-'0') * 5
+ (kto[6]-'0') * 8
+ (kto[7]-'0') * 4
+ (kto[8]-'0') * 2;
MOD_11_176; /* pz%=11 */
if(pz<=1)
pz=0;
else
pz=11-pz;
CHECK_PZX10;
/* Noch ein Sonderfall aus der IBAN-Regel 49 (WGZ-Bank, diese Prüfziffermethode
* wird nur von der Bank verwendet). Bei Konten mit einer '9' an der 5. Stelle
* oder 10-stellige Konten die mit '9' beginnen (diese sind schon herumgedreht)
* wird die Ausnahme aus IBAN-Regel 49 angewendet:
*
* Für Kontonummern mit einer '9' an der 5. Stelle muss die
* Kontonummer, auf deren Basis die IBAN ermittelt wird, abweichend
* berechnet werden. Die ersten 4 Stellen (inkl. aufgefüllter
* Nullen) müssen ans Ende gestellt werden, so dass die Kontonummer
* dann immer mit der '9' anfängt.
*
* Beispiel:
*
* Kontonummer alt: 0001991182
* Kontonummer für die Berechnung der IBAN: 9911820001
*
* Diese neu ermittelte Kontonummer hat keine Prüfziffer, die
* daher auch nicht geprüft werden darf. Ansonsten kann mit
* dieser Kontonummer die IBAN mit der Standard-IBAN-Regel
* ermittelt werden.
*
* Das Verhalten mit der führenden '9' ist nicht in der IBAN-Regel angegeben,
* wurde aber aufgrund realer Kontodaten gefunden und durch eine Nachfrage bei
* der Bank bestätigt (Vielen Dank an Stefan Banse für den Hinweis).
*/
if(*kto=='9' || *(kto+4)=='9')
return OK_NO_CHK;
else
return FALSE;
/* Berechnung nach der Methode 45 +§§§4 */
/*
* ######################################################################
* # Berechnung nach der Methode 45 #
* ######################################################################
* # Modulus 10, Gewichtung 2, 1, 2, 1, 2, 1, 2, 1, 2 #
* # Die Berechnung erfolgt wie bei Verfahren 00 #
* # Ausnahme: #
* # Kontonummern, die an Stelle 1 (von links) eine 0 enthalten, #
* # und Kontonummern, die an Stelle 5 eine 1 enthalten, #
* # beinhalten keine Prüfziffer. #
* # Testkontonummern: #
* # 3545343232, 4013410024 #
* # Keine Prüfziffer enthalten: #
* # 0994681254, 0000012340 (da 1. Stelle = 0) #
* # 1000199999, 0100114240 (da 5. Stelle = 1) #
* ######################################################################
*/
case 45:
#if DEBUG>0
if(retvals){
retvals->methode="45";
retvals->pz_methode=45;
}
#endif
if(*kto=='0' || *(kto+4)=='1'){
#if DEBUG>0
pz= *(kto+9)-'0';
#endif
return OK_NO_CHK;
}
#ifdef __ALPHA
pz = ((kto[0]<'5') ? (kto[0]-'0')*2 : (kto[0]-'0')*2-9)
+ (kto[1]-'0')
+ ((kto[2]<'5') ? (kto[2]-'0')*2 : (kto[2]-'0')*2-9)
+ (kto[3]-'0')
+ ((kto[4]<'5') ? (kto[4]-'0')*2 : (kto[4]-'0')*2-9)
+ (kto[5]-'0')
+ ((kto[6]<'5') ? (kto[6]-'0')*2 : (kto[6]-'0')*2-9)
+ (kto[7]-'0')
+ ((kto[8]<'5') ? (kto[8]-'0')*2 : (kto[8]-'0')*2-9);
#else
pz=(kto[1]-'0')+(kto[3]-'0')+(kto[5]-'0')+(kto[7]-'0');
if(kto[0]<'5')pz+=(kto[0]-'0')*2; else pz+=(kto[0]-'0')*2-9;
if(kto[2]<'5')pz+=(kto[2]-'0')*2; else pz+=(kto[2]-'0')*2-9;
if(kto[4]<'5')pz+=(kto[4]-'0')*2; else pz+=(kto[4]-'0')*2-9;
if(kto[6]<'5')pz+=(kto[6]-'0')*2; else pz+=(kto[6]-'0')*2-9;
if(kto[8]<'5')pz+=(kto[8]-'0')*2; else pz+=(kto[8]-'0')*2-9;
#endif
MOD_10_80; /* pz%=10 */
if(pz)pz=10-pz;
CHECK_PZ10;
konto_check.c view on Meta::CPAN
/* Funktion kto_check_encoding_str() +§§§1 */
/* ###########################################################################
* # Diese Funktion entspricht der Funktion kto_check_encoding(); allerdings #
* # ist der Rückgabewert nicht numerisch, sondern ein String. #
* # #
* # Copyright (C) 2011 Michael Plugge <konto_check@yahoo.com> #
* ###########################################################################
*/
DLL_EXPORT const char *kto_check_encoding_str(int mode)
{
switch(kto_check_encoding(mode)){
case 0: return "noch nicht spezifiziert";
case 1:
case 11: return "ISO-8859-1";
case 2:
case 22: return "UTF-8";
case 3:
case 33: return "HTML entities";
case 4:
case 44: return "DOS CP-850";
case 21: return "UTF-8/ISO-8859-1";
case 31: return "HTML entities/ISO-8859-1";
case 41: return "DOS CP-850/ISO-8859-1";
case 12: return "ISO-8859-1/UTF-8";
case 32: return "HTML entities/UTF-8";
case 42: return "DOS CP-850/UTF-8";
case 13: return "ISO-8859-1/HTML";
case 23: return "UTF-8/HTML";
case 43: return "DOS CP-850/HTML";
case 14: return "ISO-8859-1/DOS CP 850";
case 24: return "UTF-8/DOS CP-850";
case 34: return "HTML entities/DOS CP-850";
case 51: return "Makro/ISO-8859-1";
case 52: return "Makro/UTF-8";
case 53: return "Makro/HTML";
case 54: return "Makro/DOS CP-850";
default: return "Unbekannte Kodierung";
}
}
/* Funktion keep_raw_data() +§§§1 */
/* ###########################################################################
* # Diese Funktion setzt oder löscht das Flag keep_raw_data_flag. Das Flag #
* # legt fest, ob die raw-Daten der Lut-Blocks Name, Kurzname und Ort .#
* # gespeichert werden sollen; falls ja, werden sie bei einem Wechsel der #
* # Kodierung auch umkodiert, falls nein, ist das nicht möglich. Die #
* # Speicherung der raw-Daten benötigt etwa 900 KB an Hauptspeicher. Einige #
* # Anmerkungen zu dem Flag finden sich auch oben bei der Deklaration von #
* # current_encoding etc. #
* # #
* # Mögliche Werte für den Funktionsparameter mode: #
* # 1: Flag setzen #
* # 0: Flag abfragen, nicht verändern #
* # -1: Flag löschen, Speicher der raw-Daten freigeben #
* # #
* # Copyright (C) 2011 Michael Plugge <konto_check@yahoo.com> #
* ###########################################################################
*/
DLL_EXPORT int keep_raw_data(int mode)
{
if(mode==1)
keep_raw_data_flag=1;
else if(mode==-1){
/* Speicher für die raw-Daten wieder freigeben */
keep_raw_data_flag=0;
if(name_raw!=name_data)
FREE(name_raw);
else
name_raw=NULL;
if(name_kurz_raw!=name_kurz_data)
FREE(name_kurz_raw);
else
name_kurz_raw=NULL;
if(name_name_kurz_raw!=name_name_kurz_data)
FREE(name_name_kurz_raw);
else
name_name_kurz_raw=NULL;
if(ort_raw!=ort_data)
FREE(ort_raw);
else
ort_raw=NULL;
name_raw_len=name_kurz_raw_len=name_name_kurz_raw_len=ort_raw_len=0;
}
return keep_raw_data_flag;
}
/* Funktion convert_encoding() +§§§1 */
/* ###########################################################################
* # Diese Funktion konvertiert einen gelesenen LUT-Block in die gewünschte #
* # Kodierung. Der ursprünglich allokierte Speicher wird wieder freigegeben.#
* # #
* # Copyright (C) 2011 Michael Plugge <konto_check@yahoo.com> #
* ###########################################################################
*/
static int convert_encoding(char **data,UINT4 *len)
{
unsigned char *buffer,*sptr,*dptr,*ptr,*eptr1,*eptr2;
int buflen,offset;
buflen=*len;
switch(encoding){
case 1:
case 51: /* ISO 8859-1 */
current_encoding=(current_encoding/10)*10+1;
break;
case 2: /* UTF-8 */
case 52:
if(!(buffer=(unsigned char *)malloc(buflen+=8192)))return ERROR_MALLOC;
current_encoding=(current_encoding/10)*10+2;
sptr=UCP *data;
konto_check.c view on Meta::CPAN
/* die Daten einlesen */
for(cnt=0;!feof(in);){
if(!fgets(line,1024,in))break;
if(!isdigit(*line))continue; /* Kommentarzeilen etc. */
for(ptr=line,i=0;i<8 && isdigit(*ptr);i++,ptr++);
if(i<8 && strncmp(line,"2718281",7))continue; /* eine BLZ muß 8 Ziffern enthalten (Sonderfall: Marker 2718281 */
if(*ptr=='=' && *(ptr+1)=='0') /* Dateiformat: <BLZ>=0 */
*ptr=0;
else
continue;
ibuffer[cnt++]=atoi(line);
}
qsort(ibuffer,cnt,sizeof(int),cmp_int);
if(!(ptr=buffer=(char *)calloc(cnt+10,sizeof(int))))return ERROR_MALLOC;
bufsize=(cnt+10)*sizeof(int);
/* nun den Block in die LUT-Datei schreiben: zuerst die Anzahl, dann die BLZs */
UL2C(cnt,ptr);
for(i=0;i<(int)cnt;i++)UL2C(ibuffer[i],ptr);
if(set==2)
set_offset=SET_OFFSET;
else
set_offset=0;
retval=write_lut_block_int(lut,LUT2_OWN_IBAN+set_offset,ptr-buffer,buffer);
fflush(lut);
/* Info-Block holen und Blockliste aktualisieren (falls noch nicht geschehen) */
if(read_lut_block_int(lut,0,LUT2_INFO+set_offset,&cnt,&sptr)>0){
if(bufsize<(int)cnt+16 && !(buffer=(char *)realloc(buffer,cnt+16)))return ERROR_MALLOC; /* buffer u.U. vergrößern */
for(fertig=i=0,ptr=sptr,dptr=buffer;i<(int)cnt && !fertig;){
for(dptr1=dptr;*ptr!='\n' && i<(int)cnt && !fertig;i++)*dptr++=*ptr++; /* eine Zeile holen */
*dptr=0;
if(*ptr=='\n')ptr++;
if(!strncmp(dptr1,"Enthaltene Felder:",18)){
if(!strcmp(dptr-10,", OWN_IBAN")){
fertig=1; /* Block ist schon eingetragen, nicht ersetzen */
break;
}
else
for(ptr1=(char*)", OWN_IBAN";(*dptr=*ptr1++);dptr++);
}
*dptr++='\n';
i++;
}
free(sptr);
}
/* der Block wurde um 10 Byte vergrößert, daher cnt+10 Byte schreiben */
if(!fertig)write_lut_block_int(lut,LUT2_INFO+set_offset,cnt+10,buffer);
fclose(in);
fclose(lut);
free(buffer);
free(ibuffer);
return retval;
}
/* Funktion pz_aenderungen_enable() +§§§1 */
/* ###########################################################################
* # Die Funktion pz_aenderungen_enable() dient dazu, den Status des Flags #
* # pz_aenderungen_aktivieren_2019_12 abzufragen bzw. zu setzen. Falls die Variable #
* # set 1 ist, werden die Änderungen aktiviert, falls sie 0 ist, werden #
* # die Änderungen deaktiviert. Bei allen anderen Werten wird das aktuelle #
* # Flag nicht verändert, sondern nur der Status zurückgegeben. #
* # #
* # Parameter: #
* # set: 0 oder 1: Änderungen deaktivieren/aktivieren #
* # anderer Wert: nur Abfrage des Status #
* # Rückgabe: aktueller Status des Flags # #
* # #
* # Copyright (C) 2014 Michael Plugge <konto_check@yahoo.com> #
* ###########################################################################
*/
DLL_EXPORT int pz_aenderungen_enable(int set)
{
if(set==0 || set==1)pz_aenderungen_aktivieren_2019_12=set;
return pz_aenderungen_aktivieren_2019_12;
}
#if DEBUG>0
/* Funktion kto_check_test_vars() +§§§1 */
/* ###########################################################################
* # Die Funktion kto_check_test_vars() macht nichts anderes, als die beiden #
* # übergebenen Variablen txt und i auszugeben und als String zurückzugeben.#
* # Sie kann für Debugzwecke benutzt werden, wenn Probleme mit Variablen in #
* # der DLL auftreten; ansonsten ist sie nicht allzu nützlich. Sie ist #
* # allerdings nicht threadfest, da sie mit *einem* statischem Buffer für #
* # die Ausgabe arbeitet ;-). #
* # #
* # Parameter: #
* # txt: Textvariable #
* # i: Integervariable (4 Byte) #
* # #
* # Copyright (C) 2006 Michael Plugge <konto_check@yahoo.com> #
* ###########################################################################
*/
DLL_EXPORT char *kto_check_test_vars(char *txt,UINT4 i)
{
static char test_buffer[200];
snprintf(test_buffer,200,"Textvariable: %s, Integervariable: %d (Hexwert: 0x%08X)\n",txt,i,i);
return test_buffer;
}
#endif
#line 23808 "konto_check.lxx"
/* Funktionen *_id() +§§§1 */
/* ###########################################################################
* # Die folgenden Funktionen sind die id-Varianten von Funktionen, die #
* # normalerweise einen (konstanten) String zurückgeben; über diese Hilfs- #
* # funktionen wird stattdessen eine ID generiert und zurückgegeben. Bei #
* # Stringkonstanten wird für den entsprechenden id-Slot kein Speicher #
* # allokiert, sondern der Pointer wird direkt auf den String gesetzt. Auch #
* # beim Aufruf von kc_id_free() wird für den Speicherblock nicht free() #
* # aufgerufen, sondern einfach nur der Slot freigegeben. #
* # #
* # Da der Aufruf für jede Funktionsgruppe gleich ist, wird er per Makro #
* # gemacht. #
* # #
* # Copyright (C) 2014 Michael Plugge <konto_check@yahoo.com> #
* ###########################################################################
*/
/* numerische Rückgabewerte in eine id umwandeln */
#define RV_ID(fkt) \
( run in 1.208 second using v1.01-cache-2.11-cpan-364913b4093 )