konto_check 5.4.0 → 5.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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