konto_check 5.4.0 → 5.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -45,13 +45,12 @@
45
45
  * # im Internet herunterladen. #
46
46
  * ##########################################################################
47
47
  */
48
- #line 314 "konto_check.lxx"
49
48
 
50
49
  /* Definitionen und Includes */
51
50
  #ifndef VERSION
52
- #define VERSION "5.4 (final)"
51
+ #define VERSION "5.5 (final)"
53
52
  #endif
54
- #define VERSION_DATE "2014-06-02"
53
+ #define VERSION_DATE "2014-09-01"
55
54
 
56
55
  #ifndef INCLUDE_KONTO_CHECK_DE
57
56
  #define INCLUDE_KONTO_CHECK_DE 1
@@ -240,7 +239,6 @@ static int convert_encoding(char **data,UINT4 *len);
240
239
  #define free(ptr) efree(ptr)
241
240
  #endif
242
241
 
243
- #line 750 "konto_check.lxx"
244
242
 
245
243
  /* Testwert zur Markierung ung�ltiger Ziffern im BLZ-String (>8 Stellen) */
246
244
  #define BLZ_FEHLER 100000000
@@ -376,7 +374,6 @@ static int convert_encoding(char **data,UINT4 *len);
376
374
  */
377
375
  #define CHECK_RETVAL(fkt) do{if((retval=fkt)!=OK)goto fini;}while(0) /* es mu� noch aufger�umt werden, daher goto */
378
376
  #define CHECK_RETURN(fkt) do{if((retval=fkt)!=OK)return retval;}while(0)
379
- #line 891 "konto_check.lxx"
380
377
 
381
378
  /* einige Makros zur Umwandlung zwischen unsigned int und char */
382
379
  #define UCP (unsigned char*)
@@ -496,7 +493,6 @@ int pz=-777;
496
493
 
497
494
  #define E_START(x)
498
495
  #define E_END(x)
499
- #line 1016 "konto_check.lxx"
500
496
 
501
497
  /* Variable f�r die Methoden 27, 29 und 69 */
502
498
  static const int m10h_digits[4][10]={
@@ -562,8 +558,6 @@ static char uk_pz_methoden[256];
562
558
  static char **qs_zeilen,*qs_hauptstelle;
563
559
  static int *qs_blz,*qs_plz,*qs_sortidx,*qs_iban_regel;
564
560
 
565
- #line 1090 "konto_check.lxx"
566
-
567
561
  static unsigned char ee[500],*eeh,*eep,eec[]={
568
562
  0x78,0xda,0x75,0x8f,0xc1,0x0d,0xc2,0x30,0x0c,0x45,0x39,0x7b,0x0a,
569
563
  0x4f,0xc0,0x04,0x55,0x4f,0x08,0xae,0x48,0x4c,0x90,0x36,0x6e,0x12,
@@ -635,6 +629,16 @@ static const int w52[] = { 2, 4, 8, 5,10, 9, 7, 3, 6, 1, 2, 4, 0, 0, 0, 0},
635
629
  w24[]={ 1, 2, 3, 1, 2, 3, 1, 2, 3 },
636
630
  w93[]= { 2, 3, 4, 5, 6, 7, 2, 3, 4 };
637
631
 
632
+ /* Array mit Pointern f�r die Windows-DLL. So k�nnen Pointer als id
633
+ * �bergeben und sp�ter wieder freigegeben werden, und man mu� nicht den
634
+ * (etwas unsch�nen) Weg �ber IntPtr w�hlen.
635
+ */
636
+ static int h_cnt;
637
+ static char **handle_ptr;
638
+ static int *handle_free;
639
+
640
+ static int kc_ptr2id(char *ptr,int *handle,int release_mem);
641
+
638
642
  /* Prototypen der static Funktionen +���2 */
639
643
  /*
640
644
  * ######################################################################
@@ -677,16 +681,16 @@ static int qcmp_ort(const void *ap,const void *bp);
677
681
  static int qcmp_sortc(const void *ap,const void *bp);
678
682
  static int qcmp_sorti(const void *ap,const void *bp);
679
683
  static int iban_init(void);
680
- static int iban_regel_cvt(char *blz,char *kto,const char **bic,int regel_version);
684
+ static int iban_regel_cvt(char *blz,char *kto,const char **bic,int regel_version,RETVAL *retvals);
681
685
  static const char *lut_bic_int(char *b,int zweigstelle,int *retval);
682
- static int bic_fkt_c(char *bic1,int mode,int filiale,int*retval,char *base,int error);
683
- static int biq_fkt_c(int idx,int*retval,char *base,int error);
686
+ static int bic_fkt_c(char *bic1,int mode,int filiale,int *retval,char *base,int error);
687
+ static int biq_fkt_c(int idx,int *retval,char *base,int error);
684
688
  static int iban_fkt_c(char *iban,int filiale,int *retval,int(*fkt)(char*,int,int*));
685
- static int bic_fkt_i(char *bic1,int mode,int filiale,int*retval,int *base,int error);
686
- static int biq_fkt_i(int idx,int*retval,int *base,int error);
689
+ static int bic_fkt_i(char *bic1,int mode,int filiale,int *retval,int *base,int error);
690
+ static int biq_fkt_i(int idx,int *retval,int *base,int error);
687
691
  static int iban_fkt_i(char *iban,int filiale,int *retval,int(*fkt)(char*,int,int*));
688
- static const char *bic_fkt_s(char *bic1,int mode,int filiale,int*retval,char **base,int error);
689
- static const char *biq_fkt_s(int idx,int*retval,char **base,int error);
692
+ static const char *bic_fkt_s(char *bic1,int mode,int filiale,int *retval,char **base,int error);
693
+ static const char *biq_fkt_s(int idx,int *retval,char **base,int error);
690
694
  static const char *iban_fkt_s(char *iban,int filiale,int *retval,const char*(*fkt)(char*,int,int*));
691
695
  #if DEBUG>0
692
696
  static int kto_check_int(char *x_blz,int pz_methode,char *kto,int untermethode,RETVAL *retvals);
@@ -938,7 +942,6 @@ static int create_lutfile_int(char *name, char *prolog, int slots,FILE **lut)
938
942
  * ###########################################################################
939
943
  */
940
944
 
941
- #line 1466 "konto_check.lxx"
942
945
  DLL_EXPORT int write_lut_block(char *lutname,UINT4 typ,UINT4 len,char *data)
943
946
  {
944
947
  char buffer[SLOT_BUFFER],*ptr;
@@ -976,7 +979,6 @@ DLL_EXPORT int write_lut_block(char *lutname,UINT4 typ,UINT4 len,char *data)
976
979
  * #############################################################################
977
980
  */
978
981
 
979
- #line 1504 "konto_check.lxx"
980
982
  static int write_lut_block_int(FILE *lut,UINT4 typ,UINT4 len,char *data)
981
983
  {
982
984
  char buffer[SLOT_BUFFER],*ptr,*cptr;
@@ -1112,7 +1114,6 @@ static int write_lut_block_int(FILE *lut,UINT4 typ,UINT4 len,char *data)
1112
1114
  * ###########################################################################
1113
1115
  */
1114
1116
 
1115
- #line 1640 "konto_check.lxx"
1116
1117
  DLL_EXPORT int read_lut_block(char *lutname, UINT4 typ,UINT4 *blocklen,char **data)
1117
1118
  {
1118
1119
  int retval;
@@ -1135,7 +1136,6 @@ DLL_EXPORT int read_lut_block(char *lutname, UINT4 typ,UINT4 *blocklen,char **da
1135
1136
  * ###########################################################################
1136
1137
  */
1137
1138
 
1138
- #line 1664 "konto_check.lxx"
1139
1139
  DLL_EXPORT int read_lut_slot(char *lutname,int slot,UINT4 *blocklen,char **data)
1140
1140
  {
1141
1141
  int retval;
@@ -1157,7 +1157,6 @@ DLL_EXPORT int read_lut_slot(char *lutname,int slot,UINT4 *blocklen,char **data)
1157
1157
  * ###########################################################################
1158
1158
  */
1159
1159
 
1160
- #line 1687 "konto_check.lxx"
1161
1160
  static int read_lut_block_int(FILE *lut,int slot,int typ,UINT4 *blocklen,char **data)
1162
1161
  {
1163
1162
  char buffer[SLOT_BUFFER],*ptr,*sbuffer,*dbuffer;
@@ -1247,7 +1246,6 @@ static int read_lut_block_int(FILE *lut,int slot,int typ,UINT4 *blocklen,char **
1247
1246
  FREE(sbuffer);
1248
1247
  RETURN(ERROR_MALLOC);
1249
1248
  }
1250
- #line 1792 "konto_check.lxx"
1251
1249
 
1252
1250
  if(fread(sbuffer,1,compressed_len,lut)<compressed_len){
1253
1251
  FREE(sbuffer);
@@ -2615,6 +2613,21 @@ DLL_EXPORT int lut_dir_dump(char *lutname,char *outputname)
2615
2613
  return OK;
2616
2614
  }
2617
2615
 
2616
+ DLL_EXPORT int lut_dir_dump_id(char *lutname,int *rv)
2617
+ {
2618
+ char *ptr;
2619
+ int retval,id;
2620
+
2621
+ if((retval=lut_dir_dump_str(lutname,&ptr))<OK){
2622
+ if(ptr)free(ptr);
2623
+ if(rv)*rv=retval;
2624
+ return -1;
2625
+ }
2626
+ if((retval=kc_ptr2id(ptr,&id,1))<0)free(ptr);
2627
+ if(rv)*rv=retval;
2628
+ return id;
2629
+ }
2630
+
2618
2631
  DLL_EXPORT int lut_dir_dump_str(char *lutname,char **dptr)
2619
2632
  {
2620
2633
  char *ptr;
@@ -2742,7 +2755,46 @@ DLL_EXPORT int lut_info_b(char *lut_name,char **info1,char **info2,int *valid1,i
2742
2755
  }
2743
2756
  else
2744
2757
  **info2=0;
2745
- RETURN(retval);
2758
+ return retval;
2759
+ }
2760
+
2761
+
2762
+ /* Funktion lut_info_id() +���1 */
2763
+ /* ###########################################################################
2764
+ * # Die Funktion lut_info_id() ist �hnlich wie lut_info_b(). F�r die #
2765
+ * # Parameter info1 und info2 wird jedoch ein Handle zur�ckgegeben, das #
2766
+ * # mittels der Funktion kc_id2ptr() in einen String umgewandelt, sowie mit #
2767
+ * # der Funktion kc_id_free() wieder freigegeben werden kann. #
2768
+ * # #
2769
+ * # Copyright (C) 2014 Michael Plugge <m.plugge@hs-mannheim.de> #
2770
+ * ###########################################################################
2771
+ */
2772
+
2773
+ DLL_EXPORT int lut_info_id(char *lut_name,int *info1,int *info2,int *valid1,int *valid2)
2774
+ {
2775
+ char *i1,*i2;
2776
+ int retval,rv;
2777
+
2778
+ retval=lut_info(lut_name,&i1,&i2,valid1,valid2);
2779
+ if(i1){
2780
+ if((rv=kc_ptr2id(i1,info1,1))<0){
2781
+ FREE(i1);
2782
+ FREE(i2);
2783
+ return rv;
2784
+ }
2785
+ }
2786
+ else
2787
+ *info1=-1;
2788
+ if(i2){
2789
+ if((rv=kc_ptr2id(i2,info2,1))<0){
2790
+ FREE(i1);
2791
+ FREE(i2);
2792
+ return rv;
2793
+ }
2794
+ }
2795
+ else
2796
+ *info2=-1;
2797
+ return retval;
2746
2798
  }
2747
2799
 
2748
2800
 
@@ -2786,7 +2838,6 @@ DLL_EXPORT int lut_info_b(char *lut_name,char **info1,char **info2,int *valid1,i
2786
2838
  * ###########################################################################
2787
2839
  */
2788
2840
 
2789
- #line 3331 "konto_check.lxx"
2790
2841
  DLL_EXPORT int lut_info(char *lut_name,char **info1,char **info2,int *valid1,int *valid2)
2791
2842
  {
2792
2843
  char *ptr,*ptr1,buffer[128];
@@ -2874,7 +2925,6 @@ DLL_EXPORT int lut_info(char *lut_name,char **info1,char **info2,int *valid1,int
2874
2925
 
2875
2926
  /* Infoblocks lesen: 1. Infoblock */
2876
2927
  if((ret=read_lut_block_int(in,0,LUT2_INFO,&cnt,&ptr))==OK){
2877
- #line 3420 "konto_check.lxx"
2878
2928
  *(ptr+cnt)=0;
2879
2929
  if(valid1){
2880
2930
  for(ptr1=ptr,v1=v2=0;*ptr1 && *ptr1!='\n' && !isdigit(*ptr1);ptr1++);
@@ -2922,7 +2972,6 @@ DLL_EXPORT int lut_info(char *lut_name,char **info1,char **info2,int *valid1,int
2922
2972
 
2923
2973
  /* Infoblocks lesen: 2. Infoblock */
2924
2974
  if((ret=read_lut_block_int(in,0,LUT2_2_INFO,&cnt,&ptr))==OK){
2925
- #line 3469 "konto_check.lxx"
2926
2975
  *(ptr+cnt)=0;
2927
2976
  if(valid2){
2928
2977
  for(ptr1=ptr,v1=v2=0;*ptr1 && *ptr1!='\n' && !isdigit(*ptr1);ptr1++);
@@ -3141,11 +3190,11 @@ DLL_EXPORT int copy_lutfile(char *old_name,char *new_name,int new_slots)
3141
3190
  qsort(slotdir,slot_cnt,sizeof(int),cmp_int);
3142
3191
  for(last_slot=-1,i=0;i<(int)slot_cnt;i++)if((typ=slotdir[i]) && typ!=(UINT4)last_slot){
3143
3192
  read_lut_block_int(lut1,0,typ,&len,&data);
3144
- #line 3689 "konto_check.lxx"
3145
3193
  write_lut_block_int(lut2,typ,len,data);
3146
3194
  FREE(data);
3147
3195
  last_slot=typ;
3148
3196
  }
3197
+ fclose(lut1);
3149
3198
  fclose(lut2);
3150
3199
  return OK;
3151
3200
  }
@@ -3370,7 +3419,6 @@ DLL_EXPORT int lut_init(char *lut_name,int required,int set)
3370
3419
  * # Copyright (C) 2008 Michael Plugge <m.plugge@hs-mannheim.de> #
3371
3420
  * ###########################################################################
3372
3421
  */
3373
- #line 3918 "konto_check.lxx"
3374
3422
  DLL_EXPORT int kto_check_init(char *lut_name,int *required,int **status,int set,int incremental)
3375
3423
  {
3376
3424
  char *ptr,*dptr,*data,*eptr,*prolog,*info,*user_info,*hs=NULL,*info1,*info2,*ci=NULL,name_buffer[LUT_PATH_LEN];
@@ -3598,7 +3646,6 @@ DLL_EXPORT int kto_check_init(char *lut_name,int *required,int **status,int set,
3598
3646
  typ1=typ;
3599
3647
  if(lut2_block_status[typ]==OK)continue; /* jeden Block nur einmal einlesen */
3600
3648
  retval=read_lut_block_int(lut,0,typ,&len,&data);
3601
- #line 4147 "konto_check.lxx"
3602
3649
 
3603
3650
  switch(retval){
3604
3651
  case LUT_CRC_ERROR:
@@ -3686,7 +3733,6 @@ DLL_EXPORT int kto_check_init(char *lut_name,int *required,int **status,int set,
3686
3733
  if(typ==LUT2_2_NAME || typ==LUT2_2_NAME_KURZ){
3687
3734
  FREE(data);
3688
3735
  i=read_lut_block_int(lut,0,LUT2_2_NAME_NAME_KURZ,&len,&data);
3689
- #line 4239 "konto_check.lxx"
3690
3736
  if(i==OK){ /* was gefunden; Typ �ndern, dann weiter wie bei OK */
3691
3737
  typ=LUT2_2_NAME_NAME_KURZ;
3692
3738
  typ1=LUT2_NAME_NAME_KURZ;
@@ -4232,6 +4278,45 @@ DLL_EXPORT int lut_blocks(int mode,char **lut_filename,char **lut_blocks_ok,char
4232
4278
  return OK;
4233
4279
  }
4234
4280
 
4281
+
4282
+ /* Funktion lut_blocks_id() +���1 */
4283
+ /* ############################################################################
4284
+ * # Die Funktion lut_blocks_id() entspricht der Funktion lut_blocks(); die #
4285
+ * # R�ckgabe erfolgt jedoch per Handle. Die Funktion ist vor allem f�r die #
4286
+ * # Windows-DLL gedacht, da der angeforderte Speicher wieder freigegeben #
4287
+ * # werden mu�. R�ckgabewerte und Parameter s.o. Die Parameter lut_blocks_ok #
4288
+ * # und lut_blocks_fehler k�nnen mit der Funktion kc_id2ptr() in einen #
4289
+ * # String umgewandelt werden; mittels kc_id_free() kann der allokierte #
4290
+ * # Speicher wieder freigegeben werden. #
4291
+ * # #
4292
+ * # Diese Funktion unterst�tzt keine optionalen Parameter, d.h. die drei #
4293
+ * # Variablen lut_filename, lut_blocks_ok und lut_blocks_fehler m�ssen immer #
4294
+ * # angegeben werden; eine �bergabe von NULL f�hrt zu einer access violation.#
4295
+ * # #
4296
+ * # Copyright (C) 2014 Michael Plugge <m.plugge@hs-mannheim.de> #
4297
+ * ############################################################################
4298
+ */
4299
+ DLL_EXPORT int lut_blocks_id(int mode,int *lut_filename,int *lut_blocks_ok,int *lut_blocks_fehler)
4300
+ {
4301
+ char *lut_filename_p,*lut_blocks_ok_p,*lut_blocks_fehler_p;
4302
+ int retval,rv;
4303
+
4304
+ retval=lut_blocks(mode,&lut_filename_p,&lut_blocks_ok_p,&lut_blocks_fehler_p);
4305
+
4306
+ /* alle drei retvals in einem if() in Handles umwandeln; es können nur
4307
+ * malloc Fehler vorkommen, dann ist doch alles zu spät... daher keine
4308
+ * weitere Unterscheidung hier.
4309
+ */
4310
+ if((rv=kc_ptr2id(lut_filename_p,lut_filename,1)<0) || (rv=kc_ptr2id(lut_blocks_ok_p,lut_blocks_ok,1)<0)
4311
+ || (rv=kc_ptr2id(lut_blocks_fehler_p,lut_blocks_fehler,1)<0)){
4312
+ FREE(lut_filename_p);
4313
+ FREE(lut_blocks_ok_p);
4314
+ FREE(lut_blocks_fehler_p);
4315
+ return rv;
4316
+ }
4317
+ return retval;
4318
+ }
4319
+
4235
4320
  /* Funktion current_lutfile_name() +���1 */
4236
4321
  /* ###########################################################################
4237
4322
  * # current_lutfile_name(): Name, benutztes Set und Init-Level der aktuellen#
@@ -4243,7 +4328,6 @@ DLL_EXPORT int lut_blocks(int mode,char **lut_filename,char **lut_blocks_ok,char
4243
4328
  * ###########################################################################
4244
4329
  */
4245
4330
 
4246
- #line 4796 "konto_check.lxx"
4247
4331
  DLL_EXPORT const char *current_lutfile_name(int *set,int *level,int *retval)
4248
4332
  {
4249
4333
  if(init_status<7 || !current_lutfile){
@@ -4660,7 +4744,7 @@ DLL_EXPORT const char *lut_bic(char *b,int zweigstelle,int *retval)
4660
4744
  else{
4661
4745
  strcpy(blz2,b);
4662
4746
  strcpy(kto2,"13"); /* nur Dummy f�r Funktionsaufruf */
4663
- iban_regel_cvt(blz2,kto2,&bic_neu,regel); /* R�ckgabewert egal, nur bic_neu interessiert */
4747
+ iban_regel_cvt(blz2,kto2,&bic_neu,regel,NULL); /* R�ckgabewert egal, nur bic_neu interessiert */
4664
4748
  if(bic && bic_neu && strcasecmp(bic,bic_neu))*retval=OK_INVALID_FOR_IBAN; /* BIC wurde durch eine Regel ge�ndert */
4665
4749
  }
4666
4750
  }
@@ -5019,12 +5103,11 @@ static int iban_init(void)
5019
5103
  * ###########################################################################
5020
5104
  */
5021
5105
 
5022
- #line 5572 "konto_check.lxx"
5023
5106
  #if USE_IBAN_RULES
5024
- static int iban_regel_cvt(char *blz,char *kto,const char **bicp,int regel_version)
5107
+ static int iban_regel_cvt(char *blz,char *kto,const char **bicp,int regel_version,RETVAL *retvals)
5025
5108
  {
5026
5109
  char tmp_buffer[16];
5027
- int regel,version,b,b_alt,b_neu,k1,k2,k3,not_ok,i,ret,loesch,idx,pz_methode,uk_cnt;
5110
+ int regel,version,b,b_alt,b_neu,k1,k2,k3,not_ok,i,ret,loesch,idx,pz_methode,uk_cnt,tmp;
5028
5111
 
5029
5112
  /* pr�fen, ob bereits initialisiert wurde */
5030
5113
  INITIALIZE_WAIT;
@@ -5898,13 +5981,6 @@ static int iban_regel_cvt(char *blz,char *kto,const char **bicp,int regel_versio
5898
5981
  */
5899
5982
  case 20:
5900
5983
 
5901
- /* die neue Version der Regel 20 wird zum 9. Dezember in den offiziellen IBAN-Regeln ver�ffentlicht;
5902
- * die Bundesbank hat jedoch schon die Regelversion am 28. August ver�ffentlicht, mit der Bitte, sie
5903
- * m�glichst schon zum 9. September einzusetzen. Der Best Guess Ansatz mit dem Fehlercode 51 bzw.
5904
- * IBAN_AMBIGUOUS_KTO wird entfernt und durch Verfahren zur Ermittlung eindeutiger IBANs ersetzt.
5905
- * Die alte Version ist jetzt (9.12.13) nicht mehr im Code enthalten, da sie ung�ltig ist.
5906
- */
5907
-
5908
5984
  /* BLZ ohne IBAN-Berechnung */
5909
5985
  if(b==10020000)return NO_IBAN_CALCULATION;
5910
5986
 
@@ -5926,6 +6002,11 @@ static int iban_regel_cvt(char *blz,char *kto,const char **bicp,int regel_versio
5926
6002
  * die IBAN-Berechnung nicht zugelassen.
5927
6003
  */
5928
6004
  if(pz_methode==127 && kto_check_pz("c7a",kto,NULL)<OK && kto_check_pz("c7c",kto,NULL)<OK){
6005
+ if(retvals){
6006
+ /* in retvals noch Werte f�r den Fehlerfall eintragen */
6007
+ retvals->methode="c7b";
6008
+ retvals->pz_methode=2127;
6009
+ }
5929
6010
  if((ret=kto_check_pz("c7b",kto,NULL))==OK)
5930
6011
  return NO_IBAN_CALCULATION;
5931
6012
  else
@@ -5935,7 +6016,11 @@ static int iban_regel_cvt(char *blz,char *kto,const char **bicp,int regel_versio
5935
6016
  /* 10-stellige Konten sind ung�ltig */
5936
6017
  if(*kto!='0')return INVALID_KTO;
5937
6018
 
5938
- /* Pr�fzifferverfahren 63 (Deutsche Bank) */
6019
+ /* jetzt kommt nur noch das Pr�fzifferverfahren 63 (Deutsche Bank) */
6020
+ if(retvals){
6021
+ retvals->methode="63";
6022
+ retvals->pz_methode=63;
6023
+ }
5939
6024
 
5940
6025
  if(k1==0){ /* erstmal maximal 7-stellige Konten */
5941
6026
  /* 1-4 stellige Konten sind generell nicht zugelassen */
@@ -5948,13 +6033,32 @@ static int iban_regel_cvt(char *blz,char *kto,const char **bicp,int regel_versio
5948
6033
  * nur Pr�fzifferverfahren 63a ist g�ltig).
5949
6034
  */
5950
6035
  if(k2<1000000){
6036
+ /* zun�chst einmal testen, ob das Konto mit Methode 63a
6037
+ * g�ltig ist, um den R�ckgabewert im Fehlerfall bei Methode
6038
+ * 63b zu setzen. Falls 63a g�ltig ist, wird dann
6039
+ * NO_IBAN_CALCULATION zur�ckgegeben.
6040
+ *
6041
+ * Falls hier nicht differenziert wird, w�rde beim normalen
6042
+ * Kontentest OK zur�ckgegeben, beim Kontentest mit
6043
+ * IBAN-Regeln jedoch FALSE, was etwas verwirrend ist.
6044
+ */
6045
+ tmp=kto_check_pz("63a",kto,NULL);
5951
6046
  for(i=0;i<8;i++)kto[i]=kto[i+2];
5952
6047
  kto[8]='0';
5953
6048
  kto[9]='0';
5954
6049
  if((ret=kto_check_pz("63a",kto,NULL))==OK)
5955
6050
  return OK_UNTERKONTO_ATTACHED;
5956
- else
5957
- return ret;
6051
+ else{
6052
+ if(retvals){
6053
+ /* in retvals noch Werte f�r den Fehlerfall eintragen */
6054
+ retvals->methode="63b";
6055
+ retvals->pz_methode=2063;
6056
+ }
6057
+ if(tmp==OK) /* urspr�ngliches Konto war mit 63a g�ltig */
6058
+ return NO_IBAN_CALCULATION;
6059
+ else
6060
+ return ret;
6061
+ }
5958
6062
  }
5959
6063
 
5960
6064
  /* 7-stellige Konten: zuerst Unterkonto 00 anh�ngen (Vorschrift
@@ -8727,7 +8831,6 @@ static int iban_regel_cvt(char *blz,char *kto,const char **bicp,int regel_versio
8727
8831
  }
8728
8832
  #endif
8729
8833
 
8730
- #line 9280 "konto_check.lxx"
8731
8834
  /* Funktion lut_multiple() +���2 */
8732
8835
  /* ###########################################################################
8733
8836
  * # lut_multiple(): Universalfunktion, um zu einer gegebenen Bankleitzahl #
@@ -8995,7 +9098,6 @@ DLL_EXPORT int lut_cleanup(void)
8995
9098
  FREE(sort_pz_f);
8996
9099
  FREE(sort_plz);
8997
9100
  FREE(sort_iban_regel);
8998
- #line 9542 "konto_check.lxx"
8999
9101
  if(name_raw && name_data!=name_raw)
9000
9102
  FREE(name_raw);
9001
9103
  else
@@ -9050,6 +9152,10 @@ DLL_EXPORT int lut_cleanup(void)
9050
9152
  for(i=0;i<last_lut_suche_idx;i++)lut_suche_free(i);
9051
9153
  FREE(lut_suche_arr);
9052
9154
  last_lut_suche_idx=0;
9155
+ if(handle_ptr){
9156
+ for(i=0;i<h_cnt;i++)if(handle_ptr[i] && handle_free[i])FREE(handle_ptr[i]);
9157
+ free(handle_ptr);
9158
+ }
9053
9159
 
9054
9160
  if(init_status&8){
9055
9161
 
@@ -9060,7 +9166,6 @@ DLL_EXPORT int lut_cleanup(void)
9060
9166
  lut_cleanup(); /* neuer Versuch, aufzur�umen */
9061
9167
  RETURN(INIT_FATAL_ERROR);
9062
9168
  }
9063
- #line 9612 "konto_check.lxx"
9064
9169
  init_status&=1;
9065
9170
  init_in_progress=0;
9066
9171
  return OK;
@@ -9235,7 +9340,7 @@ static void init_atoi_table(void)
9235
9340
 
9236
9341
  #if 1
9237
9342
  /* �nderungen zum 9.6.2014 aktivieren */
9238
- if(time(NULL)>1402264800)pz_aenderungen_aktivieren=1;
9343
+ if(time(NULL)>1410127200)pz_aenderungen_aktivieren=1;
9239
9344
  #endif
9240
9345
 
9241
9346
  /* ung�ltige Ziffern; Blanks und Tabs werden ebenfalls als ung�ltig
@@ -9501,7 +9606,6 @@ static void init_atoi_table(void)
9501
9606
  lut_block_name2[126]="2. IBAN Regel idx";
9502
9607
  lut_block_name2[127]="2. BIC Hauptst.idx";
9503
9608
  lut_blocklen_max=453;
9504
- #line 9854 "konto_check.lxx"
9505
9609
  init_status|=1;
9506
9610
  }
9507
9611
 
@@ -9561,7 +9665,6 @@ static int kto_check_int(char *x_blz,int pz_methode,char *kto)
9561
9665
 
9562
9666
  switch(pz_methode){
9563
9667
 
9564
- #line 9917 "konto_check.lxx"
9565
9668
  /* Berechnungsmethoden 00 bis 09 +���3
9566
9669
  Berechnung nach der Methode 00 +���4 */
9567
9670
  /*
@@ -11890,7 +11993,6 @@ static int kto_check_int(char *x_blz,int pz_methode,char *kto)
11890
11993
  * ######################################################################
11891
11994
  */
11892
11995
 
11893
- #line 11922 "konto_check.lxx"
11894
11996
  case 51:
11895
11997
  if(*(kto+2)=='9'){ /* Ausnahme */
11896
11998
 
@@ -12152,8 +12254,6 @@ static int kto_check_int(char *x_blz,int pz_methode,char *kto)
12152
12254
  else
12153
12255
  return FALSE;
12154
12256
 
12155
- #line 12136 "konto_check.lxx"
12156
- #line 12138 "konto_check.lxx"
12157
12257
  /* Berechnung nach der Methode 53 +���4 */
12158
12258
  /*
12159
12259
  * ######################################################################
@@ -12452,7 +12552,6 @@ static int kto_check_int(char *x_blz,int pz_methode,char *kto)
12452
12552
  * # bewerten. #
12453
12553
  * ######################################################################
12454
12554
  */
12455
- #line 12407 "konto_check.lxx"
12456
12555
  case 57:
12457
12556
  #if DEBUG>0
12458
12557
  if(retvals){
@@ -13098,7 +13197,6 @@ static int kto_check_int(char *x_blz,int pz_methode,char *kto)
13098
13197
  * # Pr�fzifferberechnung) #
13099
13198
  * ######################################################################
13100
13199
  */
13101
- #line 12987 "konto_check.lxx"
13102
13200
  case 66:
13103
13201
  #if DEBUG>0
13104
13202
  case 2066:
@@ -15443,8 +15541,8 @@ static int kto_check_int(char *x_blz,int pz_methode,char *kto)
15443
15541
  * # Ergebnis f�hren, sind nicht g�ltig. #
15444
15542
  * # #
15445
15543
  * # Die f�r die Berechnung relevante Kundennummer (K) befindet sich #
15446
- * # bei der Methode A in den Stellen 4 bis 9 der Kontonummer und bei #
15447
- * # den Methoden B bis E und G in den Stellen 5 bis 9. #
15544
+ * # bei der Methode A und G in den Stellen 4 bis 9 der Kontonummer #
15545
+ * # und bei den Methoden B bis E in den Stellen 5 bis 9. #
15448
15546
  * # #
15449
15547
  * # Ausnahme: #
15450
15548
  * # Ist nach linksb�ndigem Auff�llen mit Nullen auf 10 Stellen die #
@@ -20140,7 +20238,6 @@ static int kto_check_int(char *x_blz,int pz_methode,char *kto)
20140
20238
  return NOT_IMPLEMENTED;
20141
20239
  }
20142
20240
  }
20143
- #line 18898 "konto_check.lxx"
20144
20241
 
20145
20242
  /*
20146
20243
  * ######################################################################
@@ -20266,9 +20363,17 @@ DLL_EXPORT int kto_check_regel_dbg(char *blz,char *kto,char *blz2,char *kto2,con
20266
20363
  blz=blz_n;
20267
20364
  r=lut_iban_regel(blz,0,&ret);
20268
20365
  if(regel && ret>0)*regel=r;
20269
- if((ret_regel=iban_regel_cvt(blz,kto,&bicp,r))<OK)return ret_regel;
20366
+ if(retvals){
20367
+ /* in retvals noch Werte f�r den Fehlerfall eintragen */
20368
+ retvals->pz=-1;
20369
+ retvals->methode="-";
20370
+ retvals->pz_methode=-1;
20371
+ retvals->pz_pos=-1;
20372
+ }
20373
+ ret_regel=iban_regel_cvt(blz,kto,&bicp,r,retvals);
20270
20374
  if(!bicp)bicp=lut_bic(blz,0,NULL);
20271
20375
  if(bic)*bic=bicp;
20376
+ if(ret_regel<OK)return ret_regel;
20272
20377
  ret=kto_check_blz_dbg(blz,kto,retvals);
20273
20378
  if(strcmp(blz,blz_o) || strcmp(kto,kto_o)){ /* BLZ und/oder Kto ersetzt */
20274
20379
  if(ret_regel>3) /* ret_regel<1 wurde schon oben zur�ckgegeben */
@@ -20280,7 +20385,8 @@ DLL_EXPORT int kto_check_regel_dbg(char *blz,char *kto,char *blz2,char *kto2,con
20280
20385
  return ret;
20281
20386
  #else
20282
20387
  if(regel)*regel=0;
20283
- return kto_check_regel_dbg(blz,kto,retvals);
20388
+ if(retvals)*retvals=NULL;
20389
+ return kto_check_regel(blz,kto);
20284
20390
  #endif
20285
20391
  }
20286
20392
 
@@ -20308,7 +20414,7 @@ DLL_EXPORT int kto_check_regel(char *blz,char *kto)
20308
20414
  kto=kto_n;
20309
20415
  blz=blz_n;
20310
20416
  regel=lut_iban_regel(blz,0,&ret);
20311
- if((ret_regel=iban_regel_cvt(blz,kto,&bicp,regel))<OK)return ret_regel;
20417
+ if((ret_regel=iban_regel_cvt(blz,kto,&bicp,regel,NULL))<OK)return ret_regel;
20312
20418
  ret=kto_check_blz(blz,kto);
20313
20419
  if(strcmp(blz,blz_o) || strcmp(kto,kto_o)){ /* BLZ und/oder Kto ersetzt */
20314
20420
  if(ret_regel>3) /* ret_regel<1 wurde schon oben zur�ckgegeben */
@@ -20381,7 +20487,6 @@ DLL_EXPORT int kto_check_pz(char *pz,char *kto,char *blz)
20381
20487
  * ###########################################################################
20382
20488
  */
20383
20489
 
20384
- #line 19139 "konto_check.lxx"
20385
20490
  static int kto_check_blz_x(char *blz,char *kto,int *uk_cnt)
20386
20491
  {
20387
20492
  char *ptr,*dptr,xkto[32];
@@ -20718,7 +20823,6 @@ DLL_EXPORT int kto_check_blz_dbg(char *blz,char *kto,RETVAL *retvals)
20718
20823
  * # Copyright (C) 2007 Michael Plugge <m.plugge@hs-mannheim.de> #
20719
20824
  * ###########################################################################
20720
20825
  */
20721
- #line 19476 "konto_check.lxx"
20722
20826
  DLL_EXPORT int kto_check_pz_dbg(char *pz,char *kto,char *blz,RETVAL *retvals)
20723
20827
  {
20724
20828
  int untermethode,pz_methode;
@@ -20954,7 +21058,6 @@ DLL_EXPORT int get_lut_info2_b(char *lutname,int *version,char **prolog_p,char *
20954
21058
  }
20955
21059
  else
20956
21060
  **user_info_p=0;
20957
- #line 19697 "konto_check.lxx"
20958
21061
  FREE(prolog);
20959
21062
  return OK;
20960
21063
  }
@@ -21031,7 +21134,8 @@ DLL_EXPORT void kc_free(char *ptr)
21031
21134
  DLL_EXPORT void *kc_alloc(int size,int *retval)
21032
21135
  {
21033
21136
  void *ptr;
21034
- if(!(ptr=calloc(size,1)))
21137
+
21138
+ if(!(ptr=(void*)calloc(size,1)))
21035
21139
  *retval=ERROR_MALLOC;
21036
21140
  else
21037
21141
  *retval=OK;
@@ -21090,16 +21194,16 @@ DLL_EXPORT const char *get_kto_check_version_x(int mode)
21090
21194
  case 4: /* Datum der Pr�fziffermethode */
21091
21195
  #if 1
21092
21196
  if(pz_aenderungen_aktivieren)
21093
- return "09.06.2014";
21197
+ return "08.09.2014";
21094
21198
  else
21095
- return "09.12.2013 (Aenderungen vom 09.06.2014 enthalten aber noch nicht aktiviert)";
21199
+ return "09.06.2014 (Aenderungen vom 08.09.2014 enthalten aber noch nicht aktiviert)";
21096
21200
  #else
21097
- return "09.06.2014";
21201
+ return "08.09.2014";
21098
21202
  #endif
21099
21203
  case 5:
21100
- return "03.03.2014";
21204
+ return "08.09.2014";
21101
21205
  case 6:
21102
- return "2. Juni 2014"; /* Klartext-Datum der Bibliotheksversion */
21206
+ return "1. September 2014"; /* Klartext-Datum der Bibliotheksversion */
21103
21207
  case 7:
21104
21208
  return "final"; /* Versions-Typ der Bibliotheksversion (development, beta, final) */
21105
21209
  }
@@ -21247,7 +21351,6 @@ DLL_EXPORT int dump_lutfile(char *outputname,UINT4 *required)
21247
21351
  default:
21248
21352
  break;
21249
21353
  }
21250
- #line 19929 "konto_check.lxx"
21251
21354
  fputc('\n',out);
21252
21355
  while(--i)fputc('=',out);
21253
21356
  fputc('\n',out);
@@ -21429,8 +21532,9 @@ DLL_EXPORT int rebuild_blzfile(char *inputname,char *outputname,UINT4 set)
21429
21532
  fprintf(out,"%06d\n",regel);
21430
21533
  else
21431
21534
  fputc('\n',out);
21432
- }
21535
+ }
21433
21536
  }
21537
+ fclose(out);
21434
21538
  return OK;
21435
21539
  }
21436
21540
 
@@ -21553,6 +21657,27 @@ DLL_EXPORT const char *iban2bic(char *iban,int *retval,char *blz,char *kto)
21553
21657
  return bic;
21554
21658
  }
21555
21659
 
21660
+ /* Funktion iban2bic_id() +���1 */
21661
+ /* ###########################################################################
21662
+ * # Die Funktion iban2bic_id() entspricht der Funktion iban2bic(); f�r #
21663
+ * # die Parameter blz und kto wird allerdings Speicher allokiert und per #
21664
+ * # Handle wieder zur�ckgegeben. #
21665
+ * # #
21666
+ * # Copyright (C) 2014 Michael Plugge <m.plugge@hs-mannheim.de> #
21667
+ * ###########################################################################
21668
+ */
21669
+
21670
+ DLL_EXPORT const char *iban2bic_id(char *iban,int *retval,int *blz,int *kto)
21671
+ {
21672
+ char *b,*k;
21673
+
21674
+ if(!(b=(char*)malloc(12)) || !(k=(char*)malloc(12)) || kc_ptr2id(b,blz,1)<0 || kc_ptr2id(k,kto,1)<0){
21675
+ if(retval)*retval=ERROR_MALLOC;
21676
+ return "";
21677
+ }
21678
+ return iban2bic(iban,retval,b,k);
21679
+ }
21680
+
21556
21681
  /* Funktion iban_gen(), iban_bic_gen() und iban_bic_gen1 +���1 */
21557
21682
  /* ###########################################################################
21558
21683
  * # Die Funktion iban_gen generiert aus Bankleitzahl und Kontonummer eine #
@@ -21628,19 +21753,59 @@ DLL_EXPORT const char *iban2bic(char *iban,int *retval,char *blz,char *kto)
21628
21753
  * ###########################################################################
21629
21754
  */
21630
21755
 
21631
- #line 20310 "konto_check.lxx"
21632
21756
  DLL_EXPORT char *iban_gen(char *blz,char *kto,int *retval)
21633
21757
  {
21634
21758
  return iban_bic_gen(blz,kto,NULL,NULL,NULL,retval);
21635
21759
  }
21636
21760
 
21637
- DLL_EXPORT char *iban_bic_gen1(char *blz,char *kto,const char **bicp,int *retval)
21761
+ DLL_EXPORT int iban_gen_id(char *blz,char *kto,int *retval)
21638
21762
  {
21639
- return iban_bic_gen(blz,kto,bicp,NULL,NULL,retval);
21763
+ char *ptr;
21764
+ int rv,id;
21765
+
21766
+ if(!(ptr=iban_bic_gen(blz,kto,NULL,NULL,NULL,retval)))return -1; /* retval wurde in iban_bic_gen gesetzt, daher gleich return */
21767
+ if((rv=kc_ptr2id(ptr,&id,1))<0){
21768
+ *retval=rv;
21769
+ return -1;
21770
+ }
21771
+ return id;
21640
21772
  }
21641
21773
 
21774
+ DLL_EXPORT int iban_bic_gen_id(char *blz,char *kto,int *bic2,int *blz2,int *kto2,int *retval)
21775
+ {
21776
+ char *ptr,*bp2,*b2,*k2;
21777
+ const char *bp;
21778
+ int rv,id;
21779
+
21780
+ bp2=b2=k2=NULL;
21781
+ if(!(bp2=(char*)malloc(16)) || !(b2=(char*)malloc(16)) || !(k2=(char*)malloc(16))){
21782
+ FREE(bp2);
21783
+ FREE(b2);
21784
+ FREE(k2);
21785
+ return ERROR_MALLOC;
21786
+ }
21787
+ ptr=iban_bic_gen(blz,kto,&bp,b2,k2,retval);
21788
+ strcpy(bp2,(char*)bp);
21789
+ if((rv=kc_ptr2id(bp2,bic2,1))<0 || (rv=kc_ptr2id(b2,blz2,1))<0 || (rv=kc_ptr2id(k2,kto2,1))<0){
21790
+ FREE(bp2);
21791
+ FREE(b2);
21792
+ FREE(k2);
21793
+ *retval=rv;
21794
+ return -1;
21795
+ }
21796
+
21797
+ if(!ptr)return -1; /* Fehler bei der Generierung */
21798
+ if((rv=kc_ptr2id(ptr,&id,1))<0){
21799
+ *retval=rv;
21800
+ return -1;
21801
+ }
21802
+ return id;
21803
+ }
21642
21804
 
21643
- #line 20371 "konto_check.lxx"
21805
+ DLL_EXPORT char *iban_bic_gen1(char *blz,char *kto,const char **bicp,int *retval)
21806
+ {
21807
+ return iban_bic_gen(blz,kto,bicp,NULL,NULL,retval);
21808
+ }
21644
21809
 
21645
21810
  DLL_EXPORT char *iban_bic_gen(char *blz,char *kto,const char **bicp,char *blz2,char *kto2,int *retval)
21646
21811
  {
@@ -21706,7 +21871,7 @@ DLL_EXPORT char *iban_bic_gen(char *blz,char *kto,const char **bicp,char *blz2,c
21706
21871
  }
21707
21872
 
21708
21873
  /* IBAN-Regeln anwenden; u.U. wird BLZ und/oder Konto ersetzt */
21709
- if((ret_regel=iban_regel_cvt(blz,kto,&bic,regel))<OK){
21874
+ if((ret_regel=iban_regel_cvt(blz,kto,&bic,regel,NULL))<OK){
21710
21875
  if(!bic)bic=lut_bic(blz,0,NULL);
21711
21876
  if(!strncmp(bic," ",8))bic="";
21712
21877
  if(retval)*retval=ret_regel;
@@ -22308,6 +22473,33 @@ DLL_EXPORT int ipi_gen(char *zweck,char *dst,char *papier)
22308
22473
  return OK;
22309
22474
  }
22310
22475
 
22476
+ /* Funktion ipi_gen_id() +���1 */
22477
+ /* ###########################################################################
22478
+ * # Die Funktion ipi_gen_id entspricht der Funktion ipi_gen(); allerdings #
22479
+ * # wird f�r die beiden Parameter dst und papier Speicher allokiert und #
22480
+ * # �ber jeweils ein Handle wieder zur�ckgegeben. Mit der Funktion #
22481
+ * # kc_id2ptr() kann das Handle in einen String umgewandelt werden, sowie #
22482
+ * # mittels der Funktion kc_id_free() wieder freigegeben werden. #
22483
+ * # #
22484
+ * # Copyright (C) 2014 Michael Plugge <m.plugge@hs-mannheim.de> #
22485
+ * ###########################################################################
22486
+ */
22487
+
22488
+ DLL_EXPORT int ipi_gen_id(char *zweck,int *dst,int *papier)
22489
+ {
22490
+ char *d,*p;
22491
+ int retval,rv;
22492
+
22493
+ if(!(d=(char*)malloc(24)))return ERROR_MALLOC;
22494
+ if(!(p=(char*)malloc(32))){
22495
+ free(d);
22496
+ return ERROR_MALLOC;
22497
+ }
22498
+ retval=ipi_gen(zweck,d,p);
22499
+ if((rv=kc_ptr2id(d,dst,1)<0) || (rv=kc_ptr2id(p,papier,1)<0))return rv;
22500
+ return retval;
22501
+ }
22502
+
22311
22503
  /* Funktion ipi_check() +���1 */
22312
22504
  /* ###########################################################################
22313
22505
  * # Die Funktion ipi_check testet einen Strukturierten Verwendungszweck #
@@ -22375,7 +22567,6 @@ DLL_EXPORT int ipi_check(char *zweck)
22375
22567
  * # Copyright (C) 2009,2011 Michael Plugge <m.plugge@hs-mannheim.de> #
22376
22568
  * ###########################################################################
22377
22569
  */
22378
- #line 21106 "konto_check.lxx"
22379
22570
 
22380
22571
  /* Funktion volltext_zeichen() +���2 */
22381
22572
  /* Diese Funktion gibt f�r Zeichen die bei der Volltextsuche g�ltig sind
@@ -23221,7 +23412,6 @@ static int qcmp_bic_h(const void *ap,const void *bp)
23221
23412
  return a-b;
23222
23413
  }
23223
23414
 
23224
- #line 21952 "konto_check.lxx"
23225
23415
 
23226
23416
  /* Funktion qcmp_bic() +���3 */
23227
23417
  static int qcmp_bic(const void *ap,const void *bp)
@@ -23326,7 +23516,6 @@ static int qcmp_iban_regel(const void *ap,const void *bp)
23326
23516
  else
23327
23517
  return a-b;
23328
23518
  }
23329
- #line 21967 "konto_check.lxx"
23330
23519
 
23331
23520
  /* Funktion init_blzf() +���2
23332
23521
  * Diese Funktion initialisiert das Array mit den Bankleitzahlen f�r alle
@@ -23394,7 +23583,6 @@ DLL_EXPORT int konto_check_idx2blz(int idx,int *zweigstelle,int *retval)
23394
23583
  }
23395
23584
 
23396
23585
  /* Funktion suche_int1() +���2 */
23397
- #line 22035 "konto_check.lxx"
23398
23586
  static int suche_int1(int a1,int a2,int *anzahl,int **start_idx,int **zweigstellen_base,int **blz_base,
23399
23587
  int **base_name,int **base_sort,int(*cmp)(const void *, const void *),int cnt,int such_idx)
23400
23588
  {
@@ -23445,7 +23633,6 @@ static int suche_int1(int a1,int a2,int *anzahl,int **start_idx,int **zweigstell
23445
23633
  }
23446
23634
 
23447
23635
  /* Funktion suche_int2() +���2 */
23448
- #line 22086 "konto_check.lxx"
23449
23636
  static int suche_int2(int a1,int a2,int *anzahl,int **start_idx,int **zweigstellen_base,int **blz_base,
23450
23637
  int **base_name,int **base_sort,int(*cmp)(const void *, const void *),int such_idx,int pz_suche)
23451
23638
  {
@@ -24023,7 +24210,6 @@ static int cmp_suche_sort(const void *ap,const void *bp)
24023
24210
  DLL_EXPORT int lut_suche_sort1(int anzahl,int *blz_base,int *zweigstellen_base,int *idx,int *anzahl_o,int **idx_op,int **cnt_op,int uniq)
24024
24211
  {
24025
24212
  int i,j,last_idx,*idx_a,*cnt_o;
24026
- #line 22665 "konto_check.lxx"
24027
24213
 
24028
24214
  if(idx_op)*idx_op=NULL;
24029
24215
  if(cnt_op)*cnt_op=NULL;
@@ -24105,7 +24291,6 @@ DLL_EXPORT int lut_suche_sort2(int anzahl,int *blz,int *zweigstellen,int *anzahl
24105
24291
  return OK;
24106
24292
  }
24107
24293
 
24108
- #line 22748 "konto_check.lxx"
24109
24294
  /* Funktion lut_suche_volltext() +���2 */
24110
24295
  DLL_EXPORT int lut_suche_volltext(char *such_wort,int *anzahl,int *base_name_idx,char ***base_name,
24111
24296
  int *zweigstellen_anzahl,int **start_idx,int **zweigstellen_base,int **blz_base)
@@ -24235,7 +24420,7 @@ DLL_EXPORT int lut_suche_blz(int such1,int such2,int *anzahl,int **start_idx,int
24235
24420
  return suche_int1(such1,such2,anzahl,start_idx,zweigstellen_base,blz_base,&blz_f,&sort_blz,qcmp_blz,cnt,0);
24236
24421
  }
24237
24422
 
24238
- #line 22898 "konto_check.lxx"
24423
+ #line 23085 "konto_check.lxx"
24239
24424
  /* Funktion lut_suche_bic() +���2 */
24240
24425
  DLL_EXPORT int lut_suche_bic(char *such_name,int *anzahl,int **start_idx,int **zweigstellen_base,
24241
24426
  char ***base_name,int **blz_base)
@@ -24289,7 +24474,6 @@ DLL_EXPORT int lut_suche_pz(int such1,int such2,int *anzahl,int **start_idx,int
24289
24474
  {
24290
24475
  int retval;
24291
24476
 
24292
-
24293
24477
  if(anzahl)*anzahl=0;
24294
24478
  if(such2 && such1>such2)return INVALID_SEARCH_RANGE;
24295
24479
  if((init_status&7)<7)return LUT2_NOT_INITIALIZED;
@@ -24303,7 +24487,6 @@ DLL_EXPORT int lut_suche_pz(int such1,int such2,int *anzahl,int **start_idx,int
24303
24487
  /* Funktion lut_suche_plz() +���2 */
24304
24488
  DLL_EXPORT int lut_suche_plz(int such1,int such2,int *anzahl,int **start_idx,int **zweigstellen_base,int **base_name,int **blz_base)
24305
24489
  {
24306
-
24307
24490
  if(anzahl)*anzahl=0;
24308
24491
  if(such2 && such1>such2)return INVALID_SEARCH_RANGE;
24309
24492
  if((init_status&7)<7)return LUT2_NOT_INITIALIZED;
@@ -24316,7 +24499,6 @@ DLL_EXPORT int lut_suche_plz(int such1,int such2,int *anzahl,int **start_idx,int
24316
24499
  /* Funktion lut_suche_regel() +���2 */
24317
24500
  DLL_EXPORT int lut_suche_regel(int such1,int such2,int *anzahl,int **start_idx,int **zweigstellen_base,int **base_name,int **blz_base)
24318
24501
  {
24319
-
24320
24502
  if(anzahl)*anzahl=0;
24321
24503
  if(such2 && such1>such2)return INVALID_SEARCH_RANGE;
24322
24504
  if((init_status&7)<7)return LUT2_NOT_INITIALIZED;
@@ -24326,7 +24508,6 @@ DLL_EXPORT int lut_suche_regel(int such1,int such2,int *anzahl,int **start_idx,i
24326
24508
  return suche_int2(such1*100,such2*100+99,anzahl,start_idx,zweigstellen_base,blz_base,&iban_regel,&sort_iban_regel,qcmp_iban_regel,LUT2_IBAN_REGEL_SORT,0);
24327
24509
  }
24328
24510
 
24329
- #line 22931 "konto_check.lxx"
24330
24511
 
24331
24512
  /* Funktion lut_suche_bic_h() +���2 */
24332
24513
  DLL_EXPORT int lut_suche_bic_h(char *such_name,int *anzahl,int **start_idx,int **zweigstellen_base,
@@ -24712,9 +24893,8 @@ DLL_EXPORT const char *iban_ort(char *iban,int filiale,int*retval)
24712
24893
  {
24713
24894
  return iban_fkt_s(iban,filiale,retval,lut_ort);
24714
24895
  }
24715
- #line 23020 "konto_check.lxx"
24716
24896
 
24717
- static int bic_fkt_c(char *bic1,int mode,int filiale,int*retval,char *base,int error)
24897
+ static int bic_fkt_c(char *bic1,int mode,int filiale,int *retval,char *base,int error)
24718
24898
  {
24719
24899
  int cnt,start_idx,rv,ret1,ret2;
24720
24900
 
@@ -24740,7 +24920,7 @@ static int bic_fkt_c(char *bic1,int mode,int filiale,int*retval,char *base,int e
24740
24920
  return rv;
24741
24921
  }
24742
24922
 
24743
- static int biq_fkt_c(int idx,int*retval,char *base,int error)
24923
+ static int biq_fkt_c(int idx,int *retval,char *base,int error)
24744
24924
  {
24745
24925
  int ret;
24746
24926
 
@@ -24808,7 +24988,7 @@ static int iban_fkt_c(char *iban,int filiale,int *retval,int(*fkt)(char*,int,int
24808
24988
  return fkt(blz,filiale,retval);
24809
24989
  }
24810
24990
 
24811
- static int bic_fkt_i(char *bic1,int mode,int filiale,int*retval,int *base,int error)
24991
+ static int bic_fkt_i(char *bic1,int mode,int filiale,int *retval,int *base,int error)
24812
24992
  {
24813
24993
  int cnt,start_idx,rv,ret1,ret2;
24814
24994
 
@@ -24834,7 +25014,7 @@ static int bic_fkt_i(char *bic1,int mode,int filiale,int*retval,int *base,int er
24834
25014
  return rv;
24835
25015
  }
24836
25016
 
24837
- static int biq_fkt_i(int idx,int*retval,int *base,int error)
25017
+ static int biq_fkt_i(int idx,int *retval,int *base,int error)
24838
25018
  {
24839
25019
  int ret;
24840
25020
 
@@ -24905,7 +25085,7 @@ static int iban_fkt_i(char *iban,int filiale,int *retval,int(*fkt)(char*,int,int
24905
25085
  return fkt(blz,filiale,retval);
24906
25086
  }
24907
25087
 
24908
- static const char *bic_fkt_s(char *bic1,int mode,int filiale,int*retval,char **base,int error)
25088
+ static const char *bic_fkt_s(char *bic1,int mode,int filiale,int *retval,char **base,int error)
24909
25089
  {
24910
25090
  const char *rv;
24911
25091
  int cnt,start_idx,ret1,ret2;
@@ -24932,7 +25112,7 @@ static const char *bic_fkt_s(char *bic1,int mode,int filiale,int*retval,char **b
24932
25112
  return rv;
24933
25113
  }
24934
25114
 
24935
- static const char *biq_fkt_s(int idx,int*retval,char **base,int error)
25115
+ static const char *biq_fkt_s(int idx,int *retval,char **base,int error)
24936
25116
  {
24937
25117
  int ret;
24938
25118
 
@@ -25990,7 +26170,6 @@ DLL_EXPORT const char *pz2str(int pz,int *ret)
25990
26170
  default: return "???";
25991
26171
  }
25992
26172
  }
25993
- #line 23975 "konto_check.lxx"
25994
26173
 
25995
26174
  /* Funktion lut_keine_iban_berechnung() +���1 */
25996
26175
  /*
@@ -26153,6 +26332,264 @@ DLL_EXPORT char *kto_check_test_vars(char *txt,UINT4 i)
26153
26332
 
26154
26333
  #endif
26155
26334
 
26335
+
26336
+ /* Funktionen *_id() +���1 */
26337
+ /* ###########################################################################
26338
+ * # Die folgenden Funktionen sind die id-Varianten von Funktionen, die #
26339
+ * # normalerweise einen (konstanten) String zur�ckgeben; �ber diese Hilfs- #
26340
+ * # funktionen wird stattdessen eine ID generiert und zur�ckgegeben. Bei #
26341
+ * # Stringkonstanten wird f�r den entsprechenden id-Slot kein Speicher #
26342
+ * # allokiert, sondern der Pointer wird direkt auf den String gesetzt. Auch #
26343
+ * # beim Aufruf von kc_id_free() wird f�r den Speicherblock nicht free() #
26344
+ * # aufgerufen, sondern einfach nur der Slot freigegeben. #
26345
+ * # #
26346
+ * # Da der Aufruf f�r jede Funktionsgruppe gleich ist, wird er per Makro #
26347
+ * # gemacht. #
26348
+ * # #
26349
+ * # Copyright (C) 2014 Michael Plugge <m.plugge@hs-mannheim.de> #
26350
+ * ###########################################################################
26351
+ */
26352
+ /* numerische R�ckgabewerte in eine id umwandeln */
26353
+ #define RV_ID(fkt) \
26354
+ DLL_EXPORT int kto_check_retval2 ## fkt ## _id(int retval)\
26355
+ {\
26356
+ int handle,rv;\
26357
+ \
26358
+ rv=kc_ptr2id((char*)kto_check_retval2 ## fkt(retval),&handle,0);\
26359
+ if(rv<0)\
26360
+ return -1;\
26361
+ else\
26362
+ return handle;\
26363
+ }
26364
+
26365
+ RV_ID(txt)
26366
+ RV_ID(txt_short)
26367
+ RV_ID(html)
26368
+ RV_ID(utf8)
26369
+ RV_ID(dos)
26370
+
26371
+ /* lut_*() und iban_*() Funktionen */
26372
+ #define LUT_ID(fkt) \
26373
+ DLL_EXPORT int fkt ## _id(char *b,int zweigstelle,int *retval)\
26374
+ {\
26375
+ int handle,rv;\
26376
+ \
26377
+ rv=kc_ptr2id((char*)fkt(b,zweigstelle,retval),&handle,0);\
26378
+ if(rv<0)\
26379
+ return -1;\
26380
+ else\
26381
+ return handle;\
26382
+ }
26383
+
26384
+ LUT_ID(lut_name);
26385
+ LUT_ID(lut_name_kurz);
26386
+ LUT_ID(lut_ort);
26387
+ LUT_ID(lut_bic);
26388
+ LUT_ID(lut_bic_h);
26389
+ LUT_ID(iban_bic);
26390
+ LUT_ID(iban_bic_h);
26391
+ LUT_ID(iban_name);
26392
+ LUT_ID(iban_name_kurz);
26393
+ LUT_ID(iban_ort);
26394
+
26395
+ #define LUT_I_ID(fkt) \
26396
+ DLL_EXPORT int fkt ## _id(int b,int zweigstelle,int *retval)\
26397
+ {\
26398
+ int handle,rv;\
26399
+ \
26400
+ rv=kc_ptr2id((char*)fkt(b,zweigstelle,retval),&handle,0);\
26401
+ if(rv<0)\
26402
+ return -1;\
26403
+ else\
26404
+ return handle;\
26405
+ }
26406
+
26407
+ LUT_I_ID(lut_bic_hi);
26408
+ LUT_I_ID(lut_name_i);
26409
+ LUT_I_ID(lut_name_kurz_i);
26410
+ LUT_I_ID(lut_ort_i);
26411
+ LUT_I_ID(lut_bic_i);
26412
+
26413
+ #define BIC_ID(fkt) \
26414
+ DLL_EXPORT int fkt ## _id(char *b,int mode,int zweigstelle,int *retval)\
26415
+ {\
26416
+ int handle,rv;\
26417
+ \
26418
+ rv=kc_ptr2id((char*)fkt(b,mode,zweigstelle,retval),&handle,0);\
26419
+ if(rv<0)\
26420
+ return -1;\
26421
+ else\
26422
+ return handle;\
26423
+ }
26424
+
26425
+ BIC_ID(bic_bic);
26426
+ BIC_ID(bic_bic_h);
26427
+ BIC_ID(bic_name);
26428
+ BIC_ID(bic_name_kurz);
26429
+ BIC_ID(bic_ort);
26430
+
26431
+ #define BIQ_ID(fkt) \
26432
+ DLL_EXPORT int fkt ## _id(int idx,int *retval)\
26433
+ {\
26434
+ int handle,rv;\
26435
+ \
26436
+ rv=kc_ptr2id((char*)fkt(idx,retval),&handle,0);\
26437
+ if(rv<0)\
26438
+ return -1;\
26439
+ else\
26440
+ return handle;\
26441
+ }
26442
+
26443
+ BIQ_ID(biq_bic);
26444
+ BIQ_ID(biq_bic_h);
26445
+ BIQ_ID(biq_name);
26446
+ BIQ_ID(biq_name_kurz);
26447
+ BIQ_ID(biq_ort);
26448
+
26449
+ DLL_EXPORT int kto_check_encoding_str_id(int mode)
26450
+ {
26451
+ int handle,rv;
26452
+
26453
+ rv=kc_ptr2id((char*)kto_check_encoding_str(mode),&handle,0);
26454
+ if(rv<0)
26455
+ return -1;
26456
+ else
26457
+ return handle;
26458
+ }
26459
+
26460
+ DLL_EXPORT int get_kto_check_version_id(int mode)
26461
+ {
26462
+ int handle,rv;
26463
+
26464
+ rv=kc_ptr2id((char*)get_kto_check_version_x(mode),&handle,0);
26465
+ if(rv<0)
26466
+ return -1;
26467
+ else
26468
+ return handle;
26469
+ }
26470
+
26471
+ DLL_EXPORT int current_lutfile_name_id(int *set,int *level,int *retval)
26472
+ {
26473
+ int handle,rv;
26474
+
26475
+ rv=kc_ptr2id((char*)current_lutfile_name(set,level,retval),&handle,0);
26476
+ if(rv<0)
26477
+ return -1;
26478
+ else
26479
+ return handle;
26480
+ }
26481
+
26482
+
26483
+ /* Funktionen kc_ptr2id(), kc_id2ptr() und kc_id_free() +���1 */
26484
+ /* ###########################################################################
26485
+ * # Die folgenden Funktionen dienen dazu, ein Array von (char-)Pointern #
26486
+ * # aufzubauen, in dem die Adressen von allokierten Strings gespeichert #
26487
+ * # werden. Die Routinen, die Speicher f�r Strings allokieren, k�nnen dann #
26488
+ * # in der DLL die String-Routinen direkt verwenden und m�ssen nicht mehr #
26489
+ * # den etwas eigenwilligen (Schleich-)Weg �ber IntPtr nehmen, damit der #
26490
+ * # Speicher wieder freigegeben werden kann... #
26491
+ * # #
26492
+ * # Copyright (C) 2014 Michael Plugge <m.plugge@hs-mannheim.de> #
26493
+ * ###########################################################################
26494
+ */
26495
+
26496
+ /* Funktion kc_ptr2id() +���2 */
26497
+ /* ###########################################################################
26498
+ * # Die Funktion kc_ptr2id() sucht f�r einen Pointer einen freien Slot #
26499
+ * # in dem Array handle_ptr[]; falls kein Platz mehr in dem Array ist oder #
26500
+ * # es noch nicht initialisiert wurde, wird es erweitert. #
26501
+ * # #
26502
+ * # Falls die Variable release_mem 1 ist wird der Speicher bei Aufruf der #
26503
+ * # Funktion kc_id_free() wieder freigegeben, andernfalls bleibt der Pointer#
26504
+ * # erhalten. Beim Aufruf mit release_mem=0 k�nnen somit auch String- #
26505
+ * # Konstanten einem Handle zugeordnet werden. Falls die entsprechende #
26506
+ * # Konstante schon ein Handle hat, wird dieses zur�ckgegeben; beim Aufruf #
26507
+ * # von kc_id_free() wird es auch nicht gel�scht, der Funktionsaufruf gibt #
26508
+ * # nur OK zur�ck, ohne etwas zu tun. #
26509
+ * # #
26510
+ * # Copyright (C) 2014 Michael Plugge <m.plugge@hs-mannheim.de> #
26511
+ * ###########################################################################
26512
+ */
26513
+
26514
+ #define HANDLE_CNT_INCREMENT 100
26515
+
26516
+ static int kc_ptr2id(char *ptr,int *handle,int release_mem)
26517
+ {
26518
+ int i;
26519
+
26520
+ *handle=-1; /* f�r evl. malloc-Fehler vorbelegen */
26521
+ if(!h_cnt){
26522
+ if(!(handle_ptr=(char **)calloc(sizeof(char*),HANDLE_CNT_INCREMENT)) || !(handle_free=(int*)calloc(sizeof(int),HANDLE_CNT_INCREMENT)))return ERROR_MALLOC;
26523
+ h_cnt=HANDLE_CNT_INCREMENT;
26524
+ }
26525
+ if(!release_mem) /* Handle f�r fixen String, suchen ob er schon vergeben wurde */
26526
+ for(i=0;i<h_cnt;i++)if(handle_ptr[i]==ptr && !handle_free[i]){
26527
+ *handle=i;
26528
+ return OK;
26529
+ }
26530
+ for(i=0;i<h_cnt;i++)if(!handle_ptr[i]){
26531
+ *handle=i;
26532
+ handle_ptr[i]=ptr;
26533
+ handle_free[i]=release_mem;
26534
+ return OK;
26535
+ }
26536
+ if(!(handle_ptr=(char **)realloc(handle_ptr,sizeof(char*)*(h_cnt+HANDLE_CNT_INCREMENT)))
26537
+ || !(handle_free=(int*)realloc(handle_free,sizeof(int)*(h_cnt+HANDLE_CNT_INCREMENT))))return ERROR_MALLOC;
26538
+ h_cnt+=HANDLE_CNT_INCREMENT;
26539
+ *handle=i;
26540
+ handle_ptr[i]=ptr;
26541
+ handle_free[i++]=release_mem;
26542
+ for(;i<h_cnt;i++){
26543
+ handle_ptr[i]=NULL;
26544
+ handle_free[i]=0;
26545
+ }
26546
+ return OK;
26547
+ }
26548
+
26549
+ /* Funktion kc_id2ptr() +���2 */
26550
+ /* ###########################################################################
26551
+ * # Diese Funktion gibt den Pointer zu einem Handle zur�ck. Dieser Wert #
26552
+ * # kann dann als String-Pointer in den DLL-Routinen verwendet werden. #
26553
+ * # #
26554
+ * # Copyright (C) 2014 Michael Plugge <m.plugge@hs-mannheim.de> #
26555
+ * ###########################################################################
26556
+ */
26557
+
26558
+ DLL_EXPORT char *kc_id2ptr(int handle,int *retval)
26559
+ {
26560
+ if(handle>=0 && handle<h_cnt && handle_ptr[handle]){
26561
+ if(retval)*retval=OK;
26562
+ return handle_ptr[handle];
26563
+ }
26564
+ else{
26565
+ if(retval)*retval=INVALID_HANDLE;
26566
+ return "";
26567
+ }
26568
+ }
26569
+
26570
+ /* Funktion kc_id_free() +���2 */
26571
+ /* ###########################################################################
26572
+ * # Diese Funktion gibt den Speicher, der zu einem Handle geh�rt, wieder #
26573
+ * # frei und setzt den entsprechenden Slot-Eintrag auf NULL. #
26574
+ * # #
26575
+ * # Copyright (C) 2014 Michael Plugge <m.plugge@hs-mannheim.de> #
26576
+ * ###########################################################################
26577
+ */
26578
+
26579
+ DLL_EXPORT int kc_id_free(int handle)
26580
+ {
26581
+ if(handle>=0 && handle<h_cnt && handle_ptr[handle]){
26582
+ if(handle_free[handle]){ /* Freigabe nur bei allokiertem Speicher */
26583
+ free(handle_ptr[handle]);
26584
+ handle_ptr[handle]=NULL;
26585
+ handle_free[handle]=0;
26586
+ }
26587
+ return OK;
26588
+ }
26589
+ return INVALID_HANDLE;
26590
+ }
26591
+
26592
+
26156
26593
  #else /* !INCLUDE_KONTO_CHECK_DE */
26157
26594
  /* Leerdefinitionen f�r !INCLUDE_KONTO_CHECK_DE +���1 */
26158
26595
  #include "konto_check.h"
@@ -26200,6 +26637,8 @@ XI lut_init(char *lut_name,int required,int set)EXCLUDED
26200
26637
  XI kto_check_init(char *lut_name,int *required,int **status,int set,int incremental)EXCLUDED
26201
26638
  XI kto_check_init_p(char *lut_name,int required,int set,int incremental)EXCLUDED
26202
26639
  XI lut_info(char *lut_name,char **info1,char **info2,int *valid1,int *valid2)EXCLUDED
26640
+ XI lut_info_b(char *lut_name,char **info1,char **info2,int *valid1,int *valid2)EXCLUDED
26641
+ XI lut_info_id(char *lut_name,int *info1,int *info2,int *valid1,int *valid2)EXCLUDED
26203
26642
  XI lut_valid(void)EXCLUDED
26204
26643
  XI lut_multiple(char *b,int *cnt,int **p_blz,char ***p_name,char ***p_name_kurz,int **p_plz,char ***p_ort,
26205
26644
  int **p_pan,char ***p_bic,int *p_pz,int **p_nr,char **p_aenderung,char **p_loeschung,int **p_nachfolge_blz,
@@ -26286,10 +26725,14 @@ XI ci_check(char *ci)EXCLUDED
26286
26725
  XI bic_check(char *search_bic,int *cnt)EXCLUDED
26287
26726
  XI iban_check(char *iban,int *retval)EXCLUDED
26288
26727
  XCC iban2bic(char *iban,int *retval,char *blz,char *kto)EXCLUDED_S
26728
+ XCC iban2bic_id(char *iban,int *retval,int *blz,int *kto)EXCLUDED_S
26289
26729
  XC iban_gen(char *kto,char *blz,int *retval)EXCLUDED_S
26730
+ XI iban_gen_id(char *kto,char *blz,int *retval)EXCLUDED
26290
26731
  XC char *iban_bic_gen(char *blz,char *kto,const char **bic,char *blz2,char *kto2,int *retval)EXCLUDED_S
26291
26732
  XC char *iban_bic_gen1(char *blz,char *kto,const char **bic,int *retval)EXCLUDED_S
26292
26733
  XI ipi_gen(char *zweck,char *dst,char *papier)EXCLUDED
26734
+ XI ipi_gen_id(char *zweck,int *dst,int *papier)EXCLUDED
26735
+ XI iban_bic_gen_id(char *blz,char *kto,int *bic2,int *blz2,int *kto2,int *retval)EXCLUDED
26293
26736
  XI ipi_check(char *zweck)EXCLUDED
26294
26737
  XI kto_check_blz_dbg(char *blz,char *kto,RETVAL *retvals)EXCLUDED
26295
26738
  XI kto_check_pz_dbg(char *pz,char *kto,char *blz,RETVAL *retvals)EXCLUDED
@@ -26317,6 +26760,7 @@ XI lut_suche_multiple(char *such_str,int uniq,char *such_cmd,UINT4 *anzahl,UINT4
26317
26760
  XI lut_suche_sort1(int anzahl,int *blz_base,int *zweigstellen_base,int *idx,int *anzahl_o,int **idx_op,int **cnt_op,int uniq)EXCLUDED
26318
26761
  XI lut_suche_sort2(int anzahl,int *blz,int *zweigstellen,int *anzahl_o,int **blz_op,int **zweigstellen_op,int **cnt_o,int uniq)EXCLUDED
26319
26762
  XI lut_blocks(int mode,char **lut_filename,char **lut_blocks_ok,char **lut_blocks_fehler)EXCLUDED
26763
+ XI lut_blocks_id(int mode,int *lut_filename,int *lut_blocks_ok,int *lut_blocks_fehler)EXCLUDED
26320
26764
  XI kto_check_init_default(char *lut_name,int block_id)EXCLUDED
26321
26765
  XI kto_check_default_keys(char ***keys,int *cnt)EXCLUDED
26322
26766
  XI kto_check_set_default(char *key,char *val)EXCLUDED
@@ -26328,4 +26772,6 @@ DLL_EXPORT void *kc_alloc(int size,int *retval)EXCLUDED_VP
26328
26772
  XI set_default_compression(int mode)EXCLUDED
26329
26773
  XI lut_keine_iban_berechnung(char *iban_blacklist,char *lutfile,int set)EXCLUDED
26330
26774
  XI pz_aenderungen_enable(int set)EXCLUDED
26775
+ XC kc_id2ptr(int handle,int *retval)EXCLUDED_S
26776
+ XI kc_id_free(int handle)EXCLUDED
26331
26777
  #endif