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 )