konto_check 0.0.2 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,3 @@
1
- #line 6 "konto_check_h.lx"
2
1
  /*
3
2
  * ##########################################################################
4
3
  * # Dies ist konto_check, ein Programm zum Testen der Pr�fziffern #
@@ -7,7 +6,7 @@
7
6
  * # Verwendung in anderen Programmen bzw. Programmiersprachen benutzt #
8
7
  * # werden. #
9
8
  * # #
10
- * # Copyright (C) 2002-2007 Michael Plugge <m.plugge@hs-mannheim.de> #
9
+ * # Copyright (C) 2002-2011 Michael Plugge <m.plugge@hs-mannheim.de> #
11
10
  * # #
12
11
  * # Dieses Programm ist freie Software; Sie d�rfen es unter den #
13
12
  * # Bedingungen der GNU Lesser General Public License, wie von der Free #
@@ -44,6 +43,30 @@
44
43
  #ifndef KONTO_CHECK_H_INCLUDED
45
44
  #define KONTO_CHECK_H_INCLUDED
46
45
 
46
+ /*
47
+ * ##########################################################################
48
+ * # Die Berechnungsmethoden B6 und D1 werden zum 5.9.11 ge�ndert; mit dem #
49
+ * # folgenden Makro werden die neuen Berechnungsmethoden aktiviert. #
50
+ * ##########################################################################
51
+ */
52
+ #define METHODE_NEU_2011_09_05 1
53
+
54
+ /* Das Makro DEFAULT_ENCODING legt die Ausgabe-Kodierung f�r die Funktion
55
+ * kto_check_retval2txt() und die Blocks Name, Kurzname und Ort aus der
56
+ * LUT-Datei fest. Die folgenden Werte sind m�glich:
57
+ *
58
+ * 1: ISO-8859-1
59
+ * 2: UTF-8
60
+ * 3: HTML Entities
61
+ * 4: DOS CP-850
62
+ *
63
+ * Werte au�erhalb dieses Bereichs d�rften schnell zum Absturz f�hren, da
64
+ * einige Arrays damit initialisiert werden.
65
+ */
66
+
67
+ #define DEFAULT_ENCODING 1
68
+ #define KEEP_RAW_DATA 1
69
+
47
70
  /*
48
71
  * ##########################################################################
49
72
  * # Fallls das folgende Makro auf 1 gesetzt wird, werden unterschiedliche #
@@ -61,21 +84,30 @@
61
84
  /*
62
85
  * ##########################################################################
63
86
  * # Fallls das Makro DEBUG auf 1 gesetzt wird, werden zwei- und drei- #
64
- * # stellige Methoden (Methode + evl. Untermethode) akzeptiert. #
65
- * # Au�erdem wird die Pr�fziffer (pz) als globale Variable deklariert. #
87
+ * # stellige Methoden (Methode + evl. Untermethode) akzeptiert, sowie noch #
88
+ * # diverser Debug-Code mit eingebaut. #
89
+ * # #
90
+ * # Das Makro VERBOSE_DEBUG wird f�r einige spezielle Problemf�lle benutzt;#
91
+ * # falls es gesetzt ist, wird im Fehlerfall mittels perror() eine etwas #
92
+ * # detailliertere Fehlermeldung ausgegeben (im Moment nur bei fopen()). #
93
+ * # Es wird ebenfalls f�r zum Debuggen von R�ckgabewerteN (Makro RETURN(r) #
94
+ * # bei Problemen benutzt. #
66
95
  * ##########################################################################
67
96
  */
68
97
  #ifndef DEBUG
69
98
  #define DEBUG 1
70
99
  #endif
71
100
 
101
+ #ifndef VERBOSE_DEBUG
102
+ #define VERBOSE_DEBUG 1
103
+ #endif
104
+
72
105
  /*
73
106
  * ##########################################################################
74
107
  * # falls das folgende Makro auf 1 gesetzt wird, werden f�r das PHP-Modul #
75
108
  * # symbolische Konstanten definiert (analog zu den #define's aus der #
76
109
  * # C Bibliothek. Der Wert false ist in PHP allerdings schon belegt und #
77
110
  * # kann nicht verwendet werden; stattdessen wird NOT_OK definiert. #
78
- * # gesamte Datei nach BLZs sortiert wird). #
79
111
  * ##########################################################################
80
112
  */
81
113
  #define SYMBOLIC_RETVALS 1
@@ -147,7 +179,7 @@
147
179
  * ######################################################################
148
180
  */
149
181
 
150
- #define DEFAULT_LUT_NAME "blz.lut","blz.lut2","blz.lut1"
182
+ #define DEFAULT_LUT_NAME "blz.lut","blz.lut2f","blz.lut2"
151
183
 
152
184
  #if _WIN32>0
153
185
  #define DEFAULT_LUT_PATH ".","C:","C:\\Programme\\konto_check"
@@ -171,6 +203,12 @@
171
203
  #define DEFAULT_INIT_LEVEL 5
172
204
  #define LAST_LUT_BLOCK 100
173
205
 
206
+ /* falls das n�chste Makro auf 0 gesetzt wird, werden von generate_lut2() immer
207
+ * LUT-Dateien im neuen Format generieret; falls f�r lut_version ein Wert <3 angegeben
208
+ * wurde, wird er auf 3 gesetzt.
209
+ */
210
+ #define GENERATE_OLD_LUTFILE 0
211
+
174
212
  /* Das folgende Makro bestimmt das Verhalten, wenn zu einer LUT-Datei Blocks
175
213
  * hinzugef�gt werden sollen und bereits (mindestens) ein Block mit
176
214
  * demselben Typ in der Datei enthalten ist. Falls das Makro 1 ist, wird f�r
@@ -201,6 +239,13 @@
201
239
  #define LUT2_NACHFOLGE_BLZ 13
202
240
  #define LUT2_NAME_NAME_KURZ 14
203
241
  #define LUT2_INFO 15
242
+ #define LUT2_BIC_SORT 16
243
+ #define LUT2_NAME_SORT 17
244
+ #define LUT2_NAME_KURZ_SORT 18
245
+ #define LUT2_ORT_SORT 19
246
+ #define LUT2_PLZ_SORT 20
247
+ #define LUT2_PZ_SORT 21
248
+ #define LUT2_OWN_IBAN 22
204
249
 
205
250
  #define LUT2_2_BLZ 101
206
251
  #define LUT2_2_FILIALEN 102
@@ -217,11 +262,20 @@
217
262
  #define LUT2_2_NACHFOLGE_BLZ 113
218
263
  #define LUT2_2_NAME_NAME_KURZ 114
219
264
  #define LUT2_2_INFO 115
265
+ #define LUT2_2_BIC_SORT 116
266
+ #define LUT2_2_NAME_SORT 117
267
+ #define LUT2_2_NAME_KURZ_SORT 118
268
+ #define LUT2_2_ORT_SORT 119
269
+ #define LUT2_2_PLZ_SORT 120
270
+ #define LUT2_2_PZ_SORT 121
271
+ #define LUT2_2_OWN_IBAN 122
272
+
273
+ #define LUT2_DEFAULT 501
220
274
 
221
275
  #ifdef KONTO_CHECK_VARS
222
- char *lut2_feld_namen[256];
276
+ const char *lut2_feld_namen[256];
223
277
  #else
224
- extern char *lut2_feld_namen[256];
278
+ extern const char *lut2_feld_namen[256];
225
279
  #endif
226
280
 
227
281
  /*
@@ -231,6 +285,40 @@ extern char *lut2_feld_namen[256];
231
285
  */
232
286
 
233
287
  #undef FALSE
288
+ #define NO_OWN_IBAN_CALCULATION -113
289
+ #define KTO_CHECK_UNSUPPORTED_COMPRESSION -112
290
+ #define KTO_CHECK_INVALID_COMPRESSION_LIB -111
291
+ #define OK_UNTERKONTO_ATTACHED -110
292
+ #define KTO_CHECK_DEFAULT_BLOCK_INVALID -109
293
+ #define KTO_CHECK_DEFAULT_BLOCK_FULL -108
294
+ #define KTO_CHECK_NO_DEFAULT_BLOCK -107
295
+ #define KTO_CHECK_KEY_NOT_FOUND -106
296
+ #define LUT2_NO_LONGER_VALID_BETTER -105
297
+ #define DTA_SRC_KTO_DIFFERENT -104
298
+ #define DTA_SRC_BLZ_DIFFERENT -103
299
+ #define DTA_CR_LF_IN_FILE -102
300
+ #define DTA_INVALID_C_EXTENSION -101
301
+ #define DTA_FOUND_SET_A_NOT_C -100
302
+ #define DTA_FOUND_SET_E_NOT_C -99
303
+ #define DTA_FOUND_SET_C_NOT_EXTENSION -98
304
+ #define DTA_FOUND_SET_E_NOT_EXTENSION -97
305
+ #define DTA_INVALID_EXTENSION_COUNT -96
306
+ #define DTA_INVALID_NUM -95
307
+ #define DTA_INVALID_CHARS -94
308
+ #define DTA_CURRENCY_NOT_EURO -93
309
+ #define DTA_EMPTY_AMOUNT -92
310
+ #define DTA_INVALID_TEXT_KEY -91
311
+ #define DTA_EMPTY_STRING -90
312
+ #define DTA_MARKER_A_NOT_FOUND -89
313
+ #define DTA_MARKER_C_NOT_FOUND -88
314
+ #define DTA_MARKER_E_NOT_FOUND -87
315
+ #define DTA_INVALID_SET_C_LEN -86
316
+ #define DTA_INVALID_SET_LEN -85
317
+ #define DTA_WAERUNG_NOT_EURO -84
318
+ #define DTA_INVALID_ISSUE_DATE -83
319
+ #define DTA_INVALID_DATE -82
320
+ #define DTA_FORMAT_ERROR -81
321
+ #define DTA_FILE_WITH_ERRORS -80
234
322
  #define INVALID_SEARCH_RANGE -79
235
323
  #define KEY_NOT_FOUND -78
236
324
  #define BAV_FALSE -77
@@ -318,7 +406,12 @@ extern char *lut2_feld_namen[256];
318
406
  #define LUT2_NO_VALID_DATE 5
319
407
  #define LUT1_SET_LOADED 6
320
408
  #define LUT1_FILE_GENERATED 7
321
- #line 204 "konto_check_h.lx"
409
+ #define DTA_FILE_WITH_WARNINGS 8
410
+ #define LUT_V2_FILE_GENERATED 9
411
+ #define KTO_CHECK_VALUE_REPLACED 10
412
+ #define OK_UNTERKONTO_POSSIBLE 11
413
+ #define OK_UNTERKONTO_GIVEN 12
414
+ #define OK_SLOT_CNT_MIN_USED 13
322
415
 
323
416
  #define MAX_BLZ_CNT 30000 /* maximale Anzahl BLZ's in generate_lut() */
324
417
 
@@ -344,7 +437,7 @@ typedef unsigned long UINT4;
344
437
  * Als erstes neues Element wird pz_pos (Position der Pr�fziffer) eingef�hrt.
345
438
  */
346
439
  typedef struct{
347
- char *methode;
440
+ const char *methode;
348
441
  INT4 pz_methode;
349
442
  INT4 pz;
350
443
  signed char pz_pos;
@@ -388,6 +481,57 @@ typedef struct{
388
481
  int c2,d2,a5,p,konto[11];
389
482
  } KTO_CHK_CTX;
390
483
 
484
+ /*
485
+ * ##########################################################################
486
+ * # SLOT_CNT_MIN: Minimale Anzahl Slots f�r eine LUT-Daei. #
487
+ * # Dieser Parameter gibt an, wieviele Slots das Inhaltsverzeichnis einer #
488
+ * # LUT-Datei mindestens haben soll. F�r jeden Block in der LUT-Datei wird #
489
+ * # ein Slot im Inhaltsverzeichnis ben�tigt; bei einer LUT-Datei mit allen #
490
+ * # Eintr�gen (Level 9) sind das 19 Slots, falls zwei Datens�tze in der #
491
+ * # Datei gehalten werden sollen, 38 (inklusive Indexblocks). #
492
+ * # #
493
+ * # Das Slotverzeichnis ist eine relativ einfache Datenstruktur; es #
494
+ * # enth�lt f�r jeden Slot nur drei 4 Byte-Integers (Typ, Offset und #
495
+ * # L�nge); daher ist es auch kein Problem, f�r das Slotverzeichnis einen #
496
+ * # etwas gr��eren Wert zu w�hlen. Die Datei wird dadurch nur minimal #
497
+ * # gr��er. Die angegebene Anzahl Slots kann nachtr�glich nicht mehr #
498
+ * # ge�ndert werden, da das Slotverzeichnis am Beginn des Datenblocks #
499
+ * # steht und sich bei einer Vergr��erung alle Offsets in der Datei �ndern #
500
+ * # w�rden; au�erdem m��ten alle Blocks verschoben werden. Es gibt die #
501
+ * # M�glichkeit, eine LUT-Datei zu kopieren (mittels copy_lutfile()); bei #
502
+ * # dieser Funktion kann eine neue Anzahl Slots angegeben werden. #
503
+ * # #
504
+ * ##########################################################################
505
+ */
506
+ #define SLOT_CNT_MIN 40
507
+
508
+ /*
509
+ * ##########################################################################
510
+ * # Benutzte Kompressionsbibliothek f�r die LUT-Datei. M�gliche Werte: #
511
+ * # COMPRESSION_NONE keine Kompression #
512
+ * # COMPRESSION_ZLIB zlib #
513
+ * # COMPRESSION_BZIP2 bzip2 #
514
+ * # COMPRESSION_LZO lzo #
515
+ * # #
516
+ * # Beim Lesen wird die benutzte Kompressionsmethode aus dem Klartext- #
517
+ * # Header gelesen; beim Schreiben wird normalerweise die zlib benutzt. #
518
+ * # Falls eine LUT-Datei mit einem anderen Kompressionsverfahren oder ohne #
519
+ * # Kompression geschrieben werden soll, kann die Umstellung durch einen #
520
+ * # Aufruf der Funktion set_default_compression() erfolgen. #
521
+ * # #
522
+ * # Die Unterschiede der verschiedenen Kompressionsbibliotheken k�nnen im #
523
+ * # Detail der Datei 0test_compression.txt entnommen werden. #
524
+ * ##########################################################################
525
+ */
526
+
527
+ #define COMPRESSION_NONE 1
528
+ #define COMPRESSION_ZLIB 2
529
+ #define COMPRESSION_BZIP2 3
530
+ #define COMPRESSION_LZO 4
531
+ #define COMPRESSION_LZMA 5
532
+
533
+ DLL_EXPORT int set_default_compression(int mode);
534
+
391
535
  /*
392
536
  * ######################################################################
393
537
  * # kto_check(): Test eines Kontos #
@@ -416,8 +560,7 @@ typedef struct{
416
560
  */
417
561
  DLL_EXPORT int kto_check(char *x_blz,char *kto,char *lut_name);
418
562
  DLL_EXPORT int kto_check_t(char *x_blz,char *kto,char *lut_name,KTO_CHK_CTX *ctx);
419
- DLL_EXPORT char *kto_check_str(char *x_blz,char *kto,char *lut_name);
420
- DLL_EXPORT char *kto_check_str_t(char *x_blz,char *kto,char *lut_name,KTO_CHK_CTX *ctx);
563
+ DLL_EXPORT const char *kto_check_str(char *x_blz,char *kto,char *lut_name);
421
564
 
422
565
  /* ###########################################################################
423
566
  * # Die Funktion kto_check_blz() ist die neue externe Schnittstelle zur #
@@ -545,7 +688,14 @@ DLL_EXPORT int get_lut_info_t(char **info,char *lut_name,KTO_CHK_CTX *ctx);
545
688
  * # Diese Funktion wird erst ab Version 1.1 der library unterst�tzt. #
546
689
  * ######################################################################
547
690
  */
548
- DLL_EXPORT char *get_kto_check_version(void);
691
+ DLL_EXPORT const char *get_kto_check_version(void);
692
+
693
+ /*
694
+ * ######################################################################
695
+ * # kc_free(): Speicher freigeben (f�r das Perl-Modul) #
696
+ * ######################################################################
697
+ */
698
+ DLL_EXPORT void kc_free(char *ptr);
549
699
 
550
700
  #if DEBUG>0
551
701
  /* ###########################################################################
@@ -560,11 +710,16 @@ DLL_EXPORT char *get_kto_check_version(void);
560
710
  * # ip: Pointer auf Integerarray (4 Byte Integer-Werte) #
561
711
  * ###########################################################################
562
712
  */
563
-
564
713
  DLL_EXPORT char *kto_check_test_vars(char *txt,UINT4 i);
565
- DLL_EXPORT int set_verbose_debug(int mode);
566
714
  #endif
567
715
 
716
+ /*
717
+ * ############################################################################
718
+ * # set_verbose_debug(): zus�tzliche Debugmeldungen einschalten (bei Bedarf) #
719
+ * ############################################################################
720
+ */
721
+ DLL_EXPORT int set_verbose_debug(int mode);
722
+
568
723
  /*
569
724
  * ######################################################################
570
725
  * # public interface der lut2-Routinen #
@@ -578,9 +733,10 @@ DLL_EXPORT int write_lut_block(char *lutname,UINT4 typ,UINT4 len,char *data);
578
733
  DLL_EXPORT int read_lut_block(char *lutname, UINT4 typ,UINT4 *blocklen,char **data);
579
734
  DLL_EXPORT int read_lut_slot(char *lutname,int slot,UINT4 *blocklen,char **data);
580
735
  DLL_EXPORT int lut_dir_dump(char *lutname,char *outputname);
736
+ DLL_EXPORT int lut_dir_dump_str(char *lutname,char **dptr);
581
737
  DLL_EXPORT int generate_lut2_p(char *inputname,char *outputname,char *user_info,char *gueltigkeit,
582
738
  UINT4 felder,UINT4 filialen,int slots,int lut_version,int set);
583
- DLL_EXPORT int generate_lut2(char *inputname,char *outputname,char *user_info,
739
+ DLL_EXPORT int generate_lut2(char *inputname,char *outputname,const char *user_info,
584
740
  char *gueltigkeit,UINT4 *felder,UINT4 slots,UINT4 lut_version,UINT4 set);
585
741
  DLL_EXPORT int copy_lutfile(char *old_name,char *new_name,int new_slots);
586
742
  DLL_EXPORT int lut_init(char *lut_name,int required,int set);
@@ -589,6 +745,7 @@ DLL_EXPORT int kto_check_init2(char *lut_name);
589
745
  DLL_EXPORT int *lut2_status(void);
590
746
  DLL_EXPORT int kto_check_init_p(char *lut_name,int required,int set,int incremental);
591
747
  DLL_EXPORT int lut_info(char *lut_name,char **info1,char **info2,int *valid1,int *valid2);
748
+ DLL_EXPORT const char *current_lutfile_name(int *set,int *level,int *retval);
592
749
  DLL_EXPORT int lut_valid(void);
593
750
  DLL_EXPORT int get_lut_info2(char *lut_name,int *version_p,char **prolog_p,char **info_p,char **user_info_p);
594
751
  DLL_EXPORT int get_lut_info_b(char **info,char *lutname);
@@ -599,29 +756,30 @@ DLL_EXPORT int dump_lutfile(char *outputname,UINT4 *required);
599
756
  DLL_EXPORT int dump_lutfile_p(char *outputname,UINT4 felder);
600
757
 
601
758
  /* Universalfunktion, die Pointer auf die internen Variablen zur�ckliefert (von Haupt- und Nebenstellen) */
602
- DLL_EXPORT int lut_multiple(char *b,int *cnt,int **p_blz,char ***p_name,char ***p_name_kurz,int **p_plz,char ***p_ort,
759
+ DLL_EXPORT int lut_multiple(char *b,int *cnt,int **p_blz,char ***p_name,char ***p_name_kurz,int **p_plz,char ***p_ort,
603
760
  int **p_pan,char ***p_bic,int *p_pz,int **p_nr,char **p_aenderung,char **p_loeschung,int **p_nachfolge_blz,
604
761
  int *id,int *cnt_all,int **start_idx);
605
- DLL_EXPORT int lut_multiple_i(int b,int *cnt,int **p_blz,char ***p_name,char ***p_name_kurz,
762
+ DLL_EXPORT int lut_multiple_i(int b,int *cnt,int **p_blz,char ***p_name,char ***p_name_kurz,
606
763
  int **p_plz,char ***p_ort,int **p_pan,char ***p_bic,int *p_pz,int **p_nr,
607
764
  char **p_aenderung,char **p_loeschung,int **p_nachfolge_blz,int *id,
608
765
  int *cnt_all,int **start_idx);
609
766
 
610
767
  /* Funktionen, um einzelne Felder zu bestimmen (R�ckgabe direkt) */
768
+ DLL_EXPORT int lut_blz(char *b,int zweigstelle);
611
769
  DLL_EXPORT int lut_filialen(char *b,int *retval);
612
770
  DLL_EXPORT int lut_filialen_i(int b,int *retval);
613
- DLL_EXPORT char *lut_name(char *b,int zweigstelle,int *retval);
614
- DLL_EXPORT char *lut_name_i(int b,int zweigstelle,int *retval);
615
- DLL_EXPORT char *lut_name_kurz(char *b,int zweigstelle,int *retval);
616
- DLL_EXPORT char *lut_name_kurz_i(int b,int zweigstelle,int *retval);
771
+ DLL_EXPORT const char *lut_name(char *b,int zweigstelle,int *retval);
772
+ DLL_EXPORT const char *lut_name_i(int b,int zweigstelle,int *retval);
773
+ DLL_EXPORT const char *lut_name_kurz(char *b,int zweigstelle,int *retval);
774
+ DLL_EXPORT const char *lut_name_kurz_i(int b,int zweigstelle,int *retval);
617
775
  DLL_EXPORT int lut_plz(char *b,int zweigstelle,int *retval);
618
776
  DLL_EXPORT int lut_plz_i(int b,int zweigstelle,int *retval);
619
- DLL_EXPORT char *lut_ort(char *b,int zweigstelle,int *retval);
620
- DLL_EXPORT char *lut_ort_i(int b,int zweigstelle,int *retval);
777
+ DLL_EXPORT const char *lut_ort(char *b,int zweigstelle,int *retval);
778
+ DLL_EXPORT const char *lut_ort_i(int b,int zweigstelle,int *retval);
621
779
  DLL_EXPORT int lut_pan(char *b,int zweigstelle,int *retval);
622
780
  DLL_EXPORT int lut_pan_i(int b,int zweigstelle,int *retval);
623
- DLL_EXPORT char *lut_bic(char *b,int zweigstelle,int *retval);
624
- DLL_EXPORT char *lut_bic_i(int b,int zweigstelle,int *retval);
781
+ DLL_EXPORT const char *lut_bic(char *b,int zweigstelle,int *retval);
782
+ DLL_EXPORT const char *lut_bic_i(int b,int zweigstelle,int *retval);
625
783
  DLL_EXPORT int lut_nr(char *b,int zweigstelle,int *retval);
626
784
  DLL_EXPORT int lut_nr_i(int b,int zweigstelle,int *retval);
627
785
  DLL_EXPORT int lut_pz(char *b,int zweigstelle,int *retval);
@@ -632,32 +790,51 @@ DLL_EXPORT int lut_loeschung(char *b,int zweigstelle,int *retval);
632
790
  DLL_EXPORT int lut_loeschung_i(int b,int zweigstelle,int *retval);
633
791
  DLL_EXPORT int lut_nachfolge_blz(char *b,int zweigstelle,int *retval);
634
792
  DLL_EXPORT int lut_nachfolge_blz_i(int b,int zweigstelle,int *retval);
793
+ DLL_EXPORT int lut_keine_iban_berechnung(char *iban_blacklist,char *lutfile,int set);
635
794
 
636
795
  /* Suche von BLZs */
637
- DLL_EXPORT int lut_suche_bic(char *such_name,int *anzahl,int **start_idx,int **zweigstelle,char ***base_name,int **blz_base);
638
- DLL_EXPORT int lut_suche_namen(char *such_name,int *anzahl,int **start_idx,int **zweigstelle,char ***base_name,int **blz_base);
639
- DLL_EXPORT int lut_suche_namen_kurz(char *such_name,int *anzahl,int **start_idx,int **zweigstelle,char ***base_name,int **blz_base);
640
- DLL_EXPORT int lut_suche_ort(char *such_name,int *anzahl,int **start_idx,int **zweigstelle,char ***base_name,int **blz_base);
641
- DLL_EXPORT int lut_suche_blz(int such1,int such2,int *anzahl,int **start_idx,int **zweigstelle,int **base_name,int **blz_base);
642
- DLL_EXPORT int lut_suche_pz(int such1,int such2,int *anzahl,int **start_idx,int **zweigstelle,int **base_name,int **blz_base);
643
- DLL_EXPORT int lut_suche_plz(int such1,int such2,int *anzahl,int **start_idx,int **zweigstelle,int **base_name,int **blz_base);
796
+ DLL_EXPORT int lut_suche_bic(char *such_name,int *anzahl,int **start_idx,int **zweigstelle_base,char ***base_name,int **blz_base);
797
+ DLL_EXPORT int lut_suche_namen(char *such_name,int *anzahl,int **start_idx,int **zweigstelle_base,char ***base_name,int **blz_base);
798
+ DLL_EXPORT int lut_suche_namen_kurz(char *such_name,int *anzahl,int **start_idx,int **zweigstelle_base,char ***base_name,int **blz_base);
799
+ DLL_EXPORT int lut_suche_ort(char *such_name,int *anzahl,int **start_idx,int **zweigstelle_base,char ***base_name,int **blz_base);
800
+ DLL_EXPORT int lut_suche_blz(int such1,int such2,int *anzahl,int **start_idx,int **zweigstelle_base,int **base_name,int **blz_base);
801
+ DLL_EXPORT int lut_suche_pz(int such1,int such2,int *anzahl,int **start_idx,int **zweigstelle_base,int **base_name,int **blz_base);
802
+ DLL_EXPORT int lut_suche_plz(int such1,int such2,int *anzahl,int **start_idx,int **zweigstelle_base,int **base_name,int **blz_base);
803
+ DLL_EXPORT int konto_check_idx2blz(int idx,int *zweigstelle,int *retval);
804
+
805
+ /* (Benutzerdefinierte) Default-Werte in der LUT-Datei lesen und schreiben */
806
+ #define DEFAULT_CNT 50 /* Anzahl Eintr�ge (fest) */
807
+
808
+ DLL_EXPORT int kto_check_init_default(char *lut_name,int block_id);
809
+ DLL_EXPORT int kto_check_default_keys(char ***keys,int *cnt);
810
+ DLL_EXPORT int kto_check_set_default(char *key,char *val);
811
+ DLL_EXPORT int kto_check_set_default_bin(char *key,char *val,int size);
812
+ DLL_EXPORT int kto_check_get_default(char *key,char **val,int *size);
813
+ DLL_EXPORT int kto_check_write_default(char *lutfile,int block_id);
644
814
 
645
815
  /* Aufr�umarbeiten */
646
816
  DLL_EXPORT int lut_cleanup(void);
647
817
 
648
818
  /* IBAN-Sachen */
649
819
  DLL_EXPORT int iban_check(char *iban,int *retval);
650
- DLL_EXPORT char *iban2bic(char *iban,int *retval,char *blz,char *kto);
820
+ DLL_EXPORT const char *iban2bic(char *iban,int *retval,char *blz,char *kto);
651
821
  DLL_EXPORT char *iban_gen(char *kto,char *blz,int *retval);
652
822
  DLL_EXPORT int ipi_gen(char *zweck,char *dst,char *papier);
653
823
  DLL_EXPORT int ipi_check(char *zweck);
654
824
 
655
825
  /* R�ckgabewerte in Klartext umwandeln */
656
- DLL_EXPORT char *kto_check_retval2txt(int retval);
657
- DLL_EXPORT char *kto_check_retval2txt_short(int retval);
658
- DLL_EXPORT char *kto_check_retval2html(int retval);
659
- DLL_EXPORT char *kto_check_retval2utf8(int retval);
660
- DLL_EXPORT char *kto_check_retval2dos(int retval);
826
+ DLL_EXPORT int kto_check_encoding(int mode);
827
+ DLL_EXPORT int keep_raw_data(int mode);
828
+ DLL_EXPORT const char *kto_check_encoding_str(int mode);
829
+ DLL_EXPORT const char *kto_check_retval2txt(int retval);
830
+ DLL_EXPORT const char *kto_check_retval2iso(int retval);
831
+ DLL_EXPORT const char *kto_check_retval2txt_short(int retval);
832
+ DLL_EXPORT const char *kto_check_retval2html(int retval);
833
+ DLL_EXPORT const char *kto_check_retval2utf8(int retval);
834
+ DLL_EXPORT const char *kto_check_retval2dos(int retval);
835
+
836
+ /* Pr�fziffer (numerisch) in String umwandeln */
837
+ const DLL_EXPORT char *pz2str(int pz,int *ret);
661
838
 
662
839
  /*
663
840
  * ######################################################################
@@ -681,11 +858,11 @@ DLL_EXPORT_V extern UINT4 current_date;
681
858
  */
682
859
 
683
860
  #if INCLUDE_DUMMY_GLOBALS>0
684
- DLL_EXPORT_V extern const char *kto_check_msg; /* globaler char-ptr mit Klartext-Ergebnis des Tests */
685
- DLL_EXPORT_V extern const char pz_str[]; /* benutzte Pr�fziffer-Methode und -Untermethode (als String) */
686
- DLL_EXPORT_V extern int pz_methode; /* pz_methode: benutzte Pr�fziffer-Methode (numerisch) */
861
+ DLL_EXPORT_V extern const char *kto_check_msg; /* globaler char-ptr mit Klartext-Ergebnis des Tests */
862
+ DLL_EXPORT_V extern const char pz_str[]; /* benutzte Pr�fziffer-Methode und -Untermethode (als String) */
863
+ DLL_EXPORT_V extern int pz_methode; /* pz_methode: benutzte Pr�fziffer-Methode (numerisch) */
687
864
  #if DEBUG>0
688
- DLL_EXPORT_V extern int pz; /* Pr�fziffer (bei DEBUG als globale Variable f�r Testzwecke) */
865
+ DLL_EXPORT_V extern int pz; /* Pr�fziffer (bei DEBUG als globale Variable f�r Testzwecke) */
689
866
  #endif /* DEBUG */
690
867
  #endif /* INCLUDE_DUMMY_GLOBALS */
691
868
  #endif /* KONTO_CHECK_VARS */
@@ -0,0 +1,2557 @@
1
+ /*==================================================================
2
+ *
3
+ * KontoCheck Module, C Ruby Extension
4
+ *
5
+ * Copyright (c) 2010 Provideal Systems GmbH
6
+ *
7
+ * Peter Horn, peter.horn@provideal.net
8
+ *
9
+ * many extensions by Michael Plugge, m.plugge@hs-mannheim.de
10
+ *
11
+ * ------------------------------------------------------------------
12
+ *
13
+ * ACKNOWLEDGEMENT
14
+ *
15
+ * This module is entirely based on the C library konto_check
16
+ * http://www.informatik.hs-mannheim.de/konto_check/
17
+ * http://sourceforge.net/projects/kontocheck/
18
+ * by Michael Plugge.
19
+ *
20
+ * The first Ruby port was written by Peter Horn; Jan Martin introduced the
21
+ * split into konto_check_raw (low-level interface to the C library) and
22
+ * konto_check (high-level interface); last Michael Plugge added the Ruby 1.9
23
+ * compatibility definitions, a new initialization function and many more
24
+ * functions of the C library to the Ruby interface.
25
+ *
26
+ * ------------------------------------------------------------------
27
+ *
28
+ * LICENCE
29
+ *
30
+ * This program is free software: you can redistribute it and/or modify
31
+ * it under the terms of the GNU Lesser General Public License as published by
32
+ * the Free Software Foundation, either version 3 of the License, or (at your
33
+ * option) any later version.
34
+ *
35
+ * This program is distributed in the hope that it will be useful,
36
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
37
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
38
+ * GNU Lesser General Public License for more details.
39
+ *
40
+ * You should have received a copy of the GNU Lesser General Public License
41
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
42
+ */
43
+
44
+ // Include the Ruby headers and goodies
45
+ #include "ruby.h"
46
+ #include <stdio.h>
47
+ #include "konto_check.h"
48
+
49
+ /* Ruby 1.8/1.9 compatibility definitions */
50
+ #ifndef RSTRING_PTR
51
+ #define RSTRING_LEN(x) (RSTRING(x)->len)
52
+ #define RSTRING_PTR(x) (RSTRING(x)->ptr)
53
+ #endif
54
+
55
+ #ifndef RUBY_T_STRING
56
+ #define RUBY_T_STRING T_STRING
57
+ #define RUBY_T_FLOAT T_FLOAT
58
+ #define RUBY_T_FIXNUM T_FIXNUM
59
+ #define RUBY_T_BIGNUM T_BIGNUM
60
+ #define RUBY_T_ARRAY T_ARRAY
61
+ #endif
62
+
63
+ #define RUNTIME_ERROR(error) do{ \
64
+ snprintf(error_msg,511,"KontoCheck::%s, %s",kto_check_retval2txt_short(error),kto_check_retval2txt(error)); \
65
+ rb_raise(rb_eRuntimeError,error_msg); \
66
+ }while(0)
67
+
68
+ // Defining a space for information and references about the module to be stored internally
69
+ VALUE KontoCheck = Qnil;
70
+
71
+ /**
72
+ * get_params_file()
73
+ *
74
+ * extract params from argc/argv (filename and optional integer parameters)
75
+ */
76
+ static void get_params_file(int argc,VALUE* argv,char *arg1s,int *arg1i,int *arg2i,int opts)
77
+ {
78
+ int len,typ1,typ2;
79
+ VALUE v1_rb=0,v2_rb,v3_rb;
80
+
81
+ switch(opts){
82
+ case 1:
83
+ /* ein Dateiname, zwei Integer; alle optional (für lut_init) Die
84
+ * Reihenfolge der beiden ersten Parameter ist nicht festgelegt. In
85
+ * der ersten API-Version war als erster Parameter der Dateiname,
86
+ * an zweiter Stelle der Level. Allerdings kommt es oft vor, daß
87
+ * man nur den Level angeben will, da der Dateiname sich aus den
88
+ * Defaultwerten ergibt.
89
+ *
90
+ * Daher wird die Reihenfolge der Parameter level und dateiname on
91
+ * the fly ermittelt. Der Level ist immer ein Integerwert, der
92
+ * Dateiname immer ein String; so ist es eindeutig zu entscheiden,
93
+ * welcher Parameter welchem Wert zuzuordnen ist. Werden zwei
94
+ * Integerwerte oder zwei Strings übergeben, wird eine TypeError
95
+ * Exception ausgelöst.
96
+ */
97
+ rb_scan_args(argc,argv,"03",&v1_rb,&v2_rb,&v3_rb);
98
+
99
+ if(NIL_P(v1_rb)){ /* kein Parameter angegeben, nur Defaultwerte benutzen */
100
+ *arg1s=0;
101
+ *arg1i=DEFAULT_INIT_LEVEL;
102
+ *arg2i=0;
103
+ return;
104
+ }
105
+
106
+ switch(TYPE(v1_rb)){
107
+ case RUBY_T_FLOAT:
108
+ case RUBY_T_FIXNUM:
109
+ case RUBY_T_BIGNUM:
110
+ typ1=1;
111
+ break;
112
+ case RUBY_T_STRING:
113
+ typ1=2;
114
+ break;
115
+ default:
116
+ typ1=0;
117
+ break;
118
+ }
119
+ switch(TYPE(v2_rb)){
120
+ case RUBY_T_FLOAT:
121
+ case RUBY_T_FIXNUM:
122
+ case RUBY_T_BIGNUM:
123
+ typ2=1;
124
+ break;
125
+ case RUBY_T_STRING:
126
+ typ2=2;
127
+ break;
128
+ default:
129
+ typ2=0;
130
+ break;
131
+ }
132
+ /* es muß genau ein Integer und ein String vorkommen: die Summe ist dann 3 */
133
+ if(typ1+typ2!=3)rb_raise(rb_eTypeError,"wrong type for filename or init level");
134
+
135
+ if(typ1==1){ /* Argumente: Level, Dateiname; Level setzen und die Argumente tauschen */
136
+ *arg1i=NUM2INT(v1_rb);
137
+ v1_rb=v2_rb; /* der weitere Code erwartet den Dateinamen in v1_rb */
138
+ }
139
+ else{ /* Argumente: Dateiname, Level. Die Reihenfolge ist ok, nur Level auslesen */
140
+ if(NIL_P(v2_rb)) /* Level nicht angegeben, Defaultwerte benutzen */
141
+ *arg1i=DEFAULT_INIT_LEVEL;
142
+ else
143
+ *arg1i=NUM2INT(v2_rb);
144
+ }
145
+
146
+ if(NIL_P(v3_rb)) /* Set; letzter Parameter */
147
+ *arg2i=0;
148
+ else
149
+ *arg2i=NUM2INT(v3_rb);
150
+ break;
151
+
152
+ case 2: /* ein Dateiname (für dump_lutfile) */
153
+ rb_scan_args(argc,argv,"10",&v1_rb);
154
+ break;
155
+
156
+ case 3: /* ein optionaler Dateiname (für lut_info) */
157
+ rb_scan_args(argc,argv,"01",&v1_rb);
158
+ break;
159
+
160
+ default:
161
+ break;
162
+ }
163
+ if(NIL_P(v1_rb)){ /* Leerstring zurückgeben => Defaultwerte probieren */
164
+ *arg1s=0;
165
+ }
166
+ else if(TYPE(v1_rb)==RUBY_T_STRING){
167
+ strncpy(arg1s,RSTRING_PTR(v1_rb),FILENAME_MAX);
168
+ /* der Ruby-String ist nicht notwendig null-terminiert; manuell erledigen */
169
+ if((len=RSTRING_LEN(v1_rb))>FILENAME_MAX)len=FILENAME_MAX;
170
+ *(arg1s+len)=0;
171
+ }
172
+ else
173
+ rb_raise(rb_eTypeError,"wrong type for filename");
174
+ }
175
+
176
+ /**
177
+ * get_params_int()
178
+ *
179
+ * extract two numeric params from argc/argv (for integer search functions)
180
+ */
181
+ static void get_params_int(int argc,VALUE* argv,int *arg1,int *arg2)
182
+ {
183
+ char buffer[16];
184
+ int len,cnt;
185
+ VALUE arg1_rb,arg2_rb,*arr_ptr;
186
+
187
+ rb_scan_args(argc,argv,"11",&arg1_rb,&arg2_rb);
188
+
189
+ /* Falls als erster Parameter ein Array übergeben wird, wird der erste
190
+ * Wert werden als Minimal- und der zweite als Maximalwert genommen.
191
+ */
192
+ if(TYPE(arg1_rb)==RUBY_T_ARRAY){
193
+ cnt=RARRAY_LEN(arg1_rb); /* Anzahl Werte */
194
+ arr_ptr=RARRAY_PTR(arg1_rb); /* Pointer auf die Array-Daten */
195
+ switch(cnt){
196
+ case 0:
197
+ arg1_rb=arg2_rb=Qnil;
198
+ break;
199
+ case 1:
200
+ arg1_rb=*arr_ptr;
201
+ arg2_rb=Qnil;
202
+ break;
203
+ default:
204
+ arg1_rb=arr_ptr[0];
205
+ arg2_rb=arr_ptr[1];
206
+ break;
207
+ }
208
+ }
209
+
210
+ if(NIL_P(arg1_rb))
211
+ *arg1=0;
212
+ else if(TYPE(arg1_rb)==RUBY_T_STRING){
213
+ strncpy(buffer,RSTRING_PTR(arg1_rb),15);
214
+ /* der Ruby-String ist nicht notwendig null-terminiert; manuell erledigen */
215
+ if((len=RSTRING_LEN(arg1_rb))>15)len=15;
216
+ *(buffer+len)=0;
217
+ *arg1=atoi(buffer);
218
+ }
219
+ else
220
+ *arg1=NUM2INT(arg1_rb);
221
+
222
+ if(NIL_P(arg2_rb))
223
+ *arg2=*arg1;
224
+ else if(TYPE(arg2_rb)==RUBY_T_STRING){
225
+ strncpy(buffer,RSTRING_PTR(arg2_rb),15);
226
+ if((len=RSTRING_LEN(arg2_rb))>15)len=15;
227
+ *(buffer+len)=0;
228
+ *arg2=atoi(buffer);
229
+ }
230
+ else
231
+ *arg2=NUM2INT(arg2_rb);
232
+ }
233
+
234
+ /**
235
+ * get_params()
236
+ *
237
+ * extract params from argc/argv, convert&check results
238
+ */
239
+ static void get_params(int argc,VALUE* argv,char *arg1s,char *arg2s,char *arg3s,int *argi,int arg_mode)
240
+ {
241
+ int len,maxlen=9;
242
+ VALUE arg1_rb,arg2_rb,arg3_rb;
243
+
244
+ switch(arg_mode){
245
+ case 0: /* ein notwendiger Parameter (für lut_filialen und lut_pz) */
246
+ rb_scan_args(argc,argv,"10",&arg1_rb);
247
+ break;
248
+
249
+ case 1: /* ein notwendiger, ein optionaler Parameter (für viele lut-Funktionen) */
250
+ rb_scan_args(argc,argv,"11",&arg1_rb,&arg2_rb);
251
+ if(NIL_P(arg2_rb)) /* Filiale; Hauptstelle ist 0 */
252
+ *argi=0;
253
+ else
254
+ *argi=NUM2INT(arg2_rb);
255
+ break;
256
+
257
+ case 2: /* zwei notwendige Parameter (für konto_check und iban_gen) */
258
+ rb_scan_args(argc,argv,"20",&arg1_rb,&arg2_rb);
259
+ break;
260
+
261
+ case 3: /* ein notwendiger Parameter (für iban_check) */
262
+ rb_scan_args(argc,argv,"10",&arg1_rb);
263
+ maxlen=128;
264
+ break;
265
+
266
+ case 4: /* ein notwendiger Parameter (für ipi_gen) */
267
+ rb_scan_args(argc,argv,"10",&arg1_rb);
268
+ maxlen=24;
269
+ break;
270
+
271
+ case 5: /* zwei notwendige, ein optionaler Parameter (für konto_check_pz) */
272
+ rb_scan_args(argc,argv,"21",&arg1_rb,&arg2_rb,&arg3_rb);
273
+ break;
274
+
275
+ default:
276
+ break;
277
+ }
278
+
279
+ switch(TYPE(arg1_rb)){
280
+ case RUBY_T_STRING:
281
+ strncpy(arg1s,RSTRING_PTR(arg1_rb),maxlen);
282
+ if((len=RSTRING_LEN(arg1_rb))>maxlen)len=maxlen;
283
+ *(arg1s+len)=0;
284
+ break;
285
+ case RUBY_T_FLOAT:
286
+ case RUBY_T_FIXNUM:
287
+ case RUBY_T_BIGNUM:
288
+ /* Zahlwerte werden zunächst nach double umgewandelt, da der
289
+ * Zahlenbereich von 32 Bit Integers nicht groß genug ist für
290
+ * z.B. Kontonummern (10 Stellen). Mit snprintf wird dann eine
291
+ * Stringversion erzeugt - nicht schnell aber einfach :-).
292
+ */
293
+ if(arg_mode==2)
294
+ snprintf(arg1s,16,"%08.0f",NUM2DBL(arg1_rb));
295
+ else
296
+ snprintf(arg1s,16,"%02.0f",NUM2DBL(arg1_rb));
297
+ break;
298
+ default:
299
+ if(!arg_mode)
300
+ rb_raise(rb_eTypeError,"Unable to convert given blz.");
301
+ else
302
+ rb_raise(rb_eTypeError,"Unable to convert given value.");
303
+ break;
304
+ }
305
+ if(arg_mode==2 || arg_mode==5)switch(TYPE(arg2_rb)){ /* für konto_check() und iban_gen(): kto holen */
306
+ case RUBY_T_STRING:
307
+ strncpy(arg2s,RSTRING_PTR(arg2_rb),15);
308
+ if((len=RSTRING_LEN(arg2_rb))>15)len=15;
309
+ *(arg2s+len)=0;
310
+ break;
311
+ case RUBY_T_FLOAT:
312
+ case RUBY_T_FIXNUM:
313
+ case RUBY_T_BIGNUM:
314
+ snprintf(arg2s,16,"%010.0f",NUM2DBL(arg2_rb));
315
+ break;
316
+ default:
317
+ rb_raise(rb_eTypeError,"Unable to convert given kto.");
318
+ break;
319
+ }
320
+ if(arg_mode==5){ /* für konto_check_pz(): BLZ (optional) holen */
321
+ if(NIL_P(arg3_rb)) /* keine BLZ angegeben */
322
+ *arg3s=0;
323
+ else
324
+ switch(TYPE(arg3_rb)){
325
+ case RUBY_T_STRING:
326
+ strncpy(arg3s,RSTRING_PTR(arg3_rb),15);
327
+ if((len=RSTRING_LEN(arg3_rb))>15)len=15;
328
+ *(arg3s+len)=0;
329
+ break;
330
+ case RUBY_T_FLOAT:
331
+ case RUBY_T_FIXNUM:
332
+ case RUBY_T_BIGNUM:
333
+ snprintf(arg3s,16,"%5.0f",NUM2DBL(arg3_rb));
334
+ break;
335
+ default:
336
+ rb_raise(rb_eTypeError,"Unable to convert given blz.");
337
+ break;
338
+ }
339
+ }
340
+ }
341
+
342
+ /**
343
+ * ===<tt>KontoCheckRaw::konto_check_pz(pz,kto)</tt>
344
+ * =====<tt>KontoCheck::konto_check_pz(pz,kto)</tt>
345
+ *
346
+ * Diese Funktion testet, ob eine gegebene Prüfziffer/Kontonummer-Kombination gültig ist.
347
+ *
348
+ * Der zusätzliche Parameter blz ist nur für die Verfahren 52, 53, B6 und C0 notwendig; bei
349
+ * diesen Verfahren geht die BLZ in die Berechnung der Prüfziffer ein. Bei allen anderen
350
+ * Prüfzifferverfahren wird er ignoriert. Wird er bei einem dieser Verfahren nicht angegeben,
351
+ * wird stattdessen eine Test-BLZ eingesetzt.
352
+ *
353
+ * Die Funktion gibt einen skalaren Statuswert zurück, der das Ergebnis der
354
+ * Prüfung enthält. Mögliche Rückgabewerte sind:
355
+ *
356
+ * -77 (BAV_FALSE) "BAV denkt, das Konto ist falsch (konto_check hält es für richtig)"
357
+ * -69 (MISSING_PARAMETER) "bei der Kontoprüfung fehlt ein notwendiger Parameter (BLZ oder Konto)"
358
+ * -40 (LUT2_NOT_INITIALIZED) "die Programmbibliothek wurde noch nicht initialisiert"
359
+ * -29 (UNDEFINED_SUBMETHOD) "die (Unter)Methode ist nicht definiert"
360
+ * -12 (INVALID_KTO_LENGTH) "ein Konto muß zwischen 1 und 10 Stellen haben"
361
+ * -3 (INVALID_KTO) "das Konto ist ungültig"
362
+ * -2 (NOT_IMPLEMENTED) "die Methode wurde noch nicht implementiert"
363
+ * -1 (NOT_DEFINED) "die Methode ist nicht definiert"
364
+ * 0 (FALSE) "falsch"
365
+ * 1 (OK) "ok"
366
+ * 2 (OK_NO_CHK) "ok, ohne Prüfung"
367
+ */
368
+ static VALUE konto_check_pz(int argc,VALUE* argv,VALUE self)
369
+ {
370
+ char pz[16],blz[16],kto[16],error_msg[512];
371
+ int retval;
372
+
373
+ get_params(argc,argv,pz,kto,blz,NULL,5);
374
+ if((retval=kto_check_pz(pz,kto,blz))==LUT2_NOT_INITIALIZED || retval==MISSING_PARAMETER)RUNTIME_ERROR(retval);
375
+ return INT2FIX(retval);
376
+ }
377
+
378
+ /**
379
+ * ===<tt>KontoCheckRaw::konto_check(blz,kto)</tt>
380
+ * =====<tt>KontoCheck::konto_check(blz,kto)</tt>
381
+ * Test, ob eine BLZ/Konto-Kombination eine gültige Prüfziffer enthält. Die Funktion gibt einen skalaren
382
+ * Statuswert zurück, der das Ergebnis der Prüfung enthält. Mögliche Rückgabewerte sind:
383
+ *
384
+ * -77 BAV_FALSE "BAV denkt, das Konto ist falsch (konto_check hält es für richtig)"
385
+ * -69 MISSING_PARAMETER "Bei der Kontoprüfung fehlt ein notwendiger Parameter (BLZ oder Konto)"
386
+ * -40 LUT2_NOT_INITIALIZED "die Programmbibliothek wurde noch nicht initialisiert"
387
+ * -29 UNDEFINED_SUBMETHOD "Die (Unter)Methode ist nicht definiert"
388
+ * -12 INVALID_KTO_LENGTH "ein Konto muß zwischen 1 und 10 Stellen haben"
389
+ * -5 INVALID_BLZ_LENGTH "die Bankleitzahl ist nicht achtstellig"
390
+ * -4 INVALID_BLZ "die Bankleitzahl ist ungültig"
391
+ * -3 INVALID_KTO "das Konto ist ungültig"
392
+ * -2 NOT_IMPLEMENTED "die Methode wurde noch nicht implementiert"
393
+ * -1 NOT_DEFINED "die Methode ist nicht definiert"
394
+ * 0 FALSE "falsch"
395
+ * 1 OK "ok"
396
+ * 2 OK_NO_CHK "ok, ohne Prüfung"
397
+ */
398
+ static VALUE konto_check(int argc,VALUE* argv,VALUE self)
399
+ {
400
+ char kto[16],blz[16],error_msg[512];
401
+ int retval;
402
+
403
+ get_params(argc,argv,blz,kto,NULL,NULL,2);
404
+ if((*blz=='0' || strlen(blz)!=8) && lut_blz(kto+2,0)==OK) /* BLZ/Kto vertauscht, altes Interface */
405
+ rb_raise(rb_eRuntimeError, "It seems that you use the old interface of konto_check?\n"
406
+ "Please check the order of function arguments for konto_test(); should be (blz,kto)");
407
+ if((retval=kto_check_blz(blz,kto))==LUT2_NOT_INITIALIZED || retval==MISSING_PARAMETER)RUNTIME_ERROR(retval);
408
+ return INT2FIX(retval);
409
+ }
410
+
411
+ /**
412
+ * ===<tt>KontoCheckRaw::init([<p1>[,<p2>[,<set>]]])</tt>
413
+ * =====<tt>KontoCheck::init([<p1>[,<p2>[,<set>]]])</tt>
414
+ * Die Variablen p1 und p2 stehen für level und lutfile (in beliebiger
415
+ * Reihenfolge); die Zuordnung der beiden Parameter erfolgt on the fly durch
416
+ * eine Typüberprüfung.
417
+ *
418
+ * Diese Funktion initialisiert die Bibliothek und lädt die gewünschten
419
+ * Datenblocks in den Speicher. Alle Argumente sind optional; in konto_check.h
420
+ * werden die Defaultwerte definiert.
421
+ *
422
+ * Die beiden ersten Parameter sind der Dateiname und der
423
+ * Initialisierungslevel. Der Dateiname ist immer als String anzugeben, der
424
+ * Initialisierungslevel immer als Zahl, ansonsten wird eine TypeError
425
+ * Exception geworfen. Auf diese Weise ist es problemlos möglich festzustellen,
426
+ * wie die Parameter p1 und p2 den Variablen lutfile und level zuzuordnen
427
+ * sind.
428
+ *
429
+ * Für die LUT-Datei ist als Defaultwert sowohl für den Pfad als auch den
430
+ * Dateinamen eine Liste möglich, die sequenziell abgearbeitet wird; diese wird
431
+ * in konto_check.h spezifiziert (Compilerzeit-Konstante der C-Bibliothek). Die
432
+ * folgenden Werte sind in der aktuellen konto_check.h definiert:
433
+ *
434
+ * DEFAULT_LUT_NAME blz.lut, blz.lut2f, blz.lut2
435
+ * DEFAULT_LUT_PATH ., /usr/local/etc/, /etc/, /usr/local/bin/, /opt/konto_check/ (für nicht-Windows-Systeme)
436
+ * DEFAULT_LUT_PATH ., C:, C:\\Programme\\konto_check (für Windows-Systeme)
437
+ *
438
+ * Der Defaultwert für level ist ebenfalls in konto_check.h definiert; in der
439
+ * aktuellen Version ist er 5. Bei diesem Level werden die Blocks BLZ,
440
+ * Prüfziffer, Name, Kurzname, PLZ, Ort und BIC geladen.
441
+ *
442
+ * Falls der Parameter set nicht angegeben ist, wird versucht, das aktuell
443
+ * gültige Set aus dem Systemdatum und dem Gültigkeitszeitraum der in der
444
+ * LUT-Datei gespeicherten Sets zu bestimmen.
445
+ *
446
+ * Hier noch einmal ein Überblick über die Parameter:
447
+ *
448
+ * * lutfile: die LUT-Datei, mit der initialisiert werden soll
449
+ * * level: (0-9) Welche Daten geladen werden sollen (PZ steht in der folgenden Tabelle für Prüfziffer, NAME_NAME_KURZ ist ein Block, der sowohl den Namen als auch den Kurznamen der Bank enthält; dieser läßt sich besser komprimieren als wenn beide Blocks getrennt sind):
450
+ * 0. BLZ,PZ
451
+ * 1. BLZ,PZ,NAME_KURZ
452
+ * 2. BLZ,PZ,NAME_KURZ,BIC
453
+ * 3. BLZ,PZ,NAME,PLZ,ORT
454
+ * 4. BLZ,PZ,NAME,PLZ,ORT,BIC
455
+ * 5. BLZ,PZ,NAME_NAME_KURZ,PLZ,ORT,BIC
456
+ * 6. BLZ,PZ,NAME_NAME_KURZ,PLZ,ORT,BIC,NACHFOLGE_BLZ
457
+ * 7. BLZ,PZ,NAME_NAME_KURZ,PLZ,ORT,BIC,NACHFOLGE_BLZ,AENDERUNG
458
+ * 8. BLZ,PZ,NAME_NAME_KURZ,PLZ,ORT,BIC,NACHFOLGE_BLZ,AENDERUNG,LOESCHUNG
459
+ * 9. BLZ,PZ,NAME_NAME_KURZ,PLZ,ORT,BIC,NACHFOLGE_BLZ,AENDERUNG,LOESCHUNG,PAN,NR
460
+ * * set (1 oder 2): Datensatz
461
+ *
462
+ * Mögliche Rückgabewerte:
463
+ *
464
+ * -112 (KTO_CHECK_UNSUPPORTED_COMPRESSION) "die notwendige Kompressions-Bibliothek wurden beim Kompilieren nicht eingebunden"
465
+ * -64 (INIT_FATAL_ERROR) "Initialisierung fehlgeschlagen (init_wait geblockt)"
466
+ * -63 (INCREMENTAL_INIT_NEEDS_INFO) "Ein inkrementelles Initialisieren benötigt einen Info-Block in der LUT-Datei"
467
+ * -62 (INCREMENTAL_INIT_FROM_DIFFERENT_FILE) "Ein inkrementelles Initialisieren mit einer anderen LUT-Datei ist nicht möglich"
468
+ * -38 (LUT2_PARTIAL_OK) "es wurden nicht alle Blocks geladen"
469
+ * -36 (LUT2_Z_MEM_ERROR) "Memory error in den ZLIB-Routinen"
470
+ * -35 (LUT2_Z_DATA_ERROR) "Datenfehler im komprimierten LUT-Block"
471
+ * -34 (LUT2_BLOCK_NOT_IN_FILE) "Der Block ist nicht in der LUT-Datei enthalten"
472
+ * -33 (LUT2_DECOMPRESS_ERROR) "Fehler beim Dekomprimieren eines LUT-Blocks"
473
+ * -31 (LUT2_FILE_CORRUPTED) "Die LUT-Datei ist korrumpiert"
474
+ * -20 (LUT_CRC_ERROR) "Prüfsummenfehler in der blz.lut Datei"
475
+ * -10 (FILE_READ_ERROR) "kann Datei nicht lesen"
476
+ * -9 (ERROR_MALLOC) "kann keinen Speicher allokieren"
477
+ * -7 (INVALID_LUT_FILE) "die blz.lut Datei ist inkosistent/ungültig"
478
+ * -6 (NO_LUT_FILE) "die blz.lut Datei wurde nicht gefunden"
479
+ *
480
+ * 1 (OK) "ok"
481
+ * 6 (LUT1_SET_LOADED) "Die Datei ist im alten LUT-Format (1.0/1.1)"
482
+ *
483
+ * Anmerkung: Falls der Statuscode LUT2_PARTIAL_OK ist, waren bei der
484
+ * Initialisierung nicht alle Blocks in der LUT-Datei enthalten.
485
+ */
486
+ static VALUE init(int argc,VALUE* argv,VALUE self)
487
+ {
488
+ char lut_name[FILENAME_MAX+1],error_msg[512];
489
+ int retval,level,set;
490
+
491
+ get_params_file(argc,argv,lut_name,&level,&set,1);
492
+ retval=lut_init(lut_name,level,set);
493
+ switch(retval){
494
+ case OK:
495
+ case LUT1_SET_LOADED:
496
+ case LUT2_PARTIAL_OK:
497
+ break;
498
+ default:
499
+ RUNTIME_ERROR(retval);
500
+ }
501
+ return INT2FIX(retval);
502
+ }
503
+
504
+ /**
505
+ * ===<tt>KontoCheckRaw::current_lutfile_name()</tt>
506
+ * =====<tt>KontoCheck::current_lutfile_name()</tt>
507
+ * =====<tt>KontoCheck::current_lutfile_set()</tt>
508
+ * =====<tt>KontoCheck::current_init_level()</tt>
509
+ *
510
+ * Diese Funktion bestimmt den Dateinamen der zur Initialisierung benutzen
511
+ * LUT-Datei, das benutzte Set und den Initialisierungslevel der aktuellen
512
+ * Initialisierung. Rückgabewert ist ein Array mit vier Elementen: das erste
513
+ * ist der Dateiname der LUT-Datei, das zweite das benutzte Set (0, falls
514
+ * nicht initialisiert wurde, sonst 1 oder 2), das dritte der
515
+ * Initialisierungslevel und das vierte der Statuscode.
516
+ *
517
+ * Mögliche Statuscodes:
518
+ *
519
+ * -40 (LUT2_NOT_INITIALIZED) "die Programmbibliothek wurde noch nicht initialisiert"
520
+ * 1 (OK) "ok"
521
+ */
522
+ static VALUE current_lutfile_name_rb(VALUE self)
523
+ {
524
+ char *lut_filename;
525
+ int set,level,retval;
526
+ VALUE lut_filename_rb;
527
+
528
+ if(!(lut_filename=current_lutfile_name(&set,&level,&retval)))
529
+ lut_filename_rb=Qnil;
530
+ else
531
+ lut_filename_rb=rb_str_new2(lut_filename);
532
+ return rb_ary_new3(4,lut_filename_rb,INT2FIX(set),INT2FIX(level),INT2FIX(retval));
533
+ }
534
+
535
+ /**
536
+ * ===<tt>KontoCheckRaw::free()</tt>
537
+ * =====<tt>KontoCheck::free()</tt>
538
+ *
539
+ * Diese Funktion gibt allen allokierten Speicher wieder frei. Der Rückgabewert ist immer true.
540
+ */
541
+ static VALUE free_rb(VALUE self)
542
+ {
543
+ lut_cleanup();
544
+ return Qtrue;
545
+ }
546
+
547
+ /**
548
+ * ===<tt>KontoCheckRaw::generate_lutfile(inputfile,outputfile [,user_info [,gueltigkeit [,felder [,filialen [,set [,iban_file]]]]]])</tt>
549
+ * =====<tt>KontoCheck::generate_lutfile(inputfile,outputfile [,user_info [,gueltigkeit [,felder [,filialen [,set [,iban_file]]]]]])</tt>
550
+ *
551
+ * Diese Funktion generiert eine neue LUT-Datei aus der BLZ-Datei der Deutschen Bundesbank. Die folgenden
552
+ * Parameter werden unterstützt:
553
+ * * inputfile: Eingabedatei (Textdatei) der Bundesbank
554
+ * * outputfile: Name der Ausgabedatei
555
+ * * user_info: Info-String der in die LUT-Datei geschrieben wird (frei wählbar; wird in den Info-Block aufgenommen)
556
+ * * gueltigkeit: Gültigkeit des Datensatzes im Format JJJJMMTT-JJJJMMTT. Diese Angabe wird benutzt, um festzustellen, ob ein Datensatz aktuell noch gültig ist.
557
+ * * felder: (0-9) Welche Daten aufgenommmen werden sollen (PZ steht in der folgenden Tabelle für Prüfziffer, NAME_NAME_KURZ ist ein Block, der sowohl den Namen als auch den Kurznamen der Bank enthält; dieser läßt sich besser komprimieren als wenn beide Blocks getrennt sind):
558
+ * 0. BLZ,PZ
559
+ * 1. BLZ,PZ,NAME_KURZ
560
+ * 2. BLZ,PZ,NAME_KURZ,BIC
561
+ * 3. BLZ,PZ,NAME,PLZ,ORT
562
+ * 4. BLZ,PZ,NAME,PLZ,ORT,BIC
563
+ * 5. BLZ,PZ,NAME_NAME_KURZ,PLZ,ORT,BIC
564
+ * 6. BLZ,PZ,NAME_NAME_KURZ,PLZ,ORT,BIC,NACHFOLGE_BLZ
565
+ * 7. BLZ,PZ,NAME_NAME_KURZ,PLZ,ORT,BIC,NACHFOLGE_BLZ,AENDERUNG
566
+ * 8. BLZ,PZ,NAME_NAME_KURZ,PLZ,ORT,BIC,NACHFOLGE_BLZ,AENDERUNG,LOESCHUNG
567
+ * 9. BLZ,PZ,NAME_NAME_KURZ,PLZ,ORT,BIC,NACHFOLGE_BLZ,AENDERUNG,LOESCHUNG,PAN,NR
568
+ * * filialen: (0 oder 1) Flag, ob nur die Daten der Hauptstellen (0) oder auch die der Filialen aufgenommen werden sollen
569
+ * * set (0, 1 oder 2): Datensatz-Nummer. Jede LUT-Datei kann zwei Datensätze enthalten. Falls bei der Initialisierung nicht ein bestimmter Datensatz ausgewählt wird, wird derjenige genommen, der (laut Gültigkeitsstring) aktuell gültig ist.
570
+ * * iban_file: Datei der Banken, die einer Selbstberechnung des IBAN nicht zugestimmt haben. Näheres dazu (inklusive Weblink) findet sich bei der Funktion KontoCheckRaw::iban_gen(blz,kto).
571
+ *
572
+ * Mögliche Rückgabewerte:
573
+ *
574
+ * -112 (KTO_CHECK_UNSUPPORTED_COMPRESSION) "die notwendige Kompressions-Bibliothek wurden beim Kompilieren nicht eingebunden"
575
+ * -57 (LUT2_GUELTIGKEIT_SWAPPED) "Im Gültigkeitsdatum sind Anfangs- und Enddatum vertauscht"
576
+ * -56 (LUT2_INVALID_GUELTIGKEIT) "Das angegebene Gültigkeitsdatum ist ungültig (Soll: JJJJMMTT-JJJJMMTT)"
577
+ * -32 (LUT2_COMPRESS_ERROR) "Fehler beim Komprimieren eines LUT-Blocks"
578
+ * -31 (LUT2_FILE_CORRUPTED) "Die LUT-Datei ist korrumpiert"
579
+ * -30 (LUT2_NO_SLOT_FREE) "Im Inhaltsverzeichnis der LUT-Datei ist kein Slot mehr frei"
580
+ * -15 (INVALID_BLZ_FILE) "Fehler in der blz.txt Datei (falsche Zeilenlänge)"
581
+ * -11 (FILE_WRITE_ERROR) "kann Datei nicht schreiben"
582
+ * -10 (FILE_READ_ERROR) "kann Datei nicht lesen"
583
+ * -9 (ERROR_MALLOC) "kann keinen Speicher allokieren"
584
+ * -7 (INVALID_LUT_FILE) "die blz.lut Datei ist inkosistent/ungültig"
585
+ * 1 (OK) "ok"
586
+ * 7 (LUT1_FILE_GENERATED) "ok; es wurde allerdings eine LUT-Datei im alten Format (1.0/1.1) generiert"
587
+ */
588
+ static VALUE generate_lutfile_rb(int argc,VALUE* argv,VALUE self)
589
+ {
590
+ char input_name[FILENAME_MAX+1],output_name[FILENAME_MAX+1],iban_file[FILENAME_MAX+1];
591
+ char user_info[256],gueltigkeit[20],buffer[16],error_msg[512];
592
+ int retval,felder,filialen,set,len;
593
+ VALUE input_name_rb,output_name_rb,user_info_rb,
594
+ gueltigkeit_rb,felder_rb,filialen_rb,set_rb,iban_file_rb;
595
+
596
+ rb_scan_args(argc,argv,"26",&input_name_rb,&output_name_rb,
597
+ &user_info_rb,&gueltigkeit_rb,&felder_rb,&filialen_rb,&set_rb,&iban_file_rb);
598
+
599
+ if(TYPE(input_name_rb)==RUBY_T_STRING){
600
+ strncpy(input_name,RSTRING_PTR(input_name_rb),FILENAME_MAX);
601
+ if((len=RSTRING_LEN(input_name_rb))>FILENAME_MAX)len=FILENAME_MAX;
602
+ *(input_name+len)=0;
603
+ }
604
+ else
605
+ rb_raise(rb_eTypeError,"Unable to convert given input filename.");
606
+
607
+ if(TYPE(output_name_rb)==RUBY_T_STRING){
608
+ strncpy(output_name,RSTRING_PTR(output_name_rb),FILENAME_MAX);
609
+ if((len=RSTRING_LEN(output_name_rb))>FILENAME_MAX)len=FILENAME_MAX;
610
+ *(output_name+len)=0;
611
+ }
612
+ else
613
+ rb_raise(rb_eTypeError,"Unable to convert given output filename.");
614
+
615
+ if(NIL_P(user_info_rb)){
616
+ *user_info=0;
617
+ }
618
+ else if(TYPE(user_info_rb)==RUBY_T_STRING){
619
+ strncpy(user_info,RSTRING_PTR(user_info_rb),255);
620
+ if((len=RSTRING_LEN(user_info_rb))>255)len=255;
621
+ *(user_info+len)=0;
622
+ }
623
+ else
624
+ rb_raise(rb_eTypeError,"Unable to convert given user_info string.");
625
+
626
+ if(NIL_P(gueltigkeit_rb)){
627
+ *gueltigkeit=0;
628
+ }
629
+ else if(TYPE(gueltigkeit_rb)==RUBY_T_STRING){
630
+ strncpy(gueltigkeit,RSTRING_PTR(gueltigkeit_rb),19);
631
+ if((len=RSTRING_LEN(gueltigkeit_rb))>19)len=19;
632
+ *(gueltigkeit+len)=0;
633
+ }
634
+ else
635
+ rb_raise(rb_eTypeError,"Unable to convert given gueltigkeit string.");
636
+
637
+ if(NIL_P(felder_rb))
638
+ felder=DEFAULT_LUT_FIELDS_NUM;
639
+ else if(TYPE(felder_rb)==RUBY_T_STRING){
640
+ strncpy(buffer,RSTRING_PTR(felder_rb),15);
641
+ if((len=RSTRING_LEN(felder_rb))>15)len=15;
642
+ *(buffer+len)=0;
643
+ felder=atoi(buffer);
644
+ }
645
+ else
646
+ felder=NUM2INT(felder_rb);
647
+
648
+ if(NIL_P(filialen_rb))
649
+ filialen=0;
650
+ else if(TYPE(filialen_rb)==RUBY_T_STRING){
651
+ strncpy(buffer,RSTRING_PTR(filialen_rb),15);
652
+ if((len=RSTRING_LEN(felder_rb))>15)len=15;
653
+ *(buffer+len)=0;
654
+ filialen=atoi(buffer);
655
+ }
656
+ else
657
+ filialen=NUM2INT(filialen_rb);
658
+
659
+ if(NIL_P(set_rb))
660
+ set=0;
661
+ else if(TYPE(set_rb)==RUBY_T_STRING){
662
+ strncpy(buffer,RSTRING_PTR(set_rb),15);
663
+ if((len=RSTRING_LEN(set_rb))>15)len=15;
664
+ *(buffer+len)=0;
665
+ set=atoi(buffer);
666
+ }
667
+ else
668
+ set=NUM2INT(set_rb);
669
+
670
+ if(NIL_P(iban_file_rb)){
671
+ *iban_file=0;
672
+ }
673
+ else if(TYPE(iban_file_rb)==RUBY_T_STRING){
674
+ strncpy(iban_file,RSTRING_PTR(iban_file_rb),FILENAME_MAX);
675
+ if((len=RSTRING_LEN(iban_file_rb))>FILENAME_MAX)len=FILENAME_MAX;
676
+ *(iban_file+len)=0;
677
+ }
678
+ else
679
+ rb_raise(rb_eTypeError,"Unable to convert given iban file name to string.");
680
+
681
+ retval=generate_lut2_p(input_name,output_name,user_info,gueltigkeit,felder,filialen,0,0,set);
682
+ if(retval<0)RUNTIME_ERROR(retval);
683
+ if(*iban_file)lut_keine_iban_berechnung(iban_file,output_name,0);
684
+ return INT2FIX(retval);
685
+ }
686
+
687
+ static int enc_mode(int argc,VALUE *argv)
688
+ {
689
+ int mode,t;
690
+ VALUE mode_rb=Qnil;
691
+
692
+ rb_scan_args(argc,argv,"01",&mode_rb);
693
+ if(mode_rb==Qnil)
694
+ return 0;
695
+ else switch(TYPE(mode_rb)){
696
+ case RUBY_T_STRING:
697
+ if((mode=atoi(RSTRING_PTR(mode_rb)))>0)return mode;
698
+ mode=*(RSTRING_PTR(mode_rb));
699
+ if(mode=='m' || mode=='M')switch(*(RSTRING_PTR(mode_rb)+1)){
700
+ case 'i':
701
+ case 'I': return 51;
702
+ case 'u':
703
+ case 'U': return 52;
704
+ case 'h':
705
+ case 'H': return 53;
706
+ case 'd':
707
+ case 'D': return 54;
708
+ default: return DEFAULT_ENCODING%10+50; /* nicht recht spezifiziert, Makro+Default-Encoding nehmen */
709
+ }
710
+ else
711
+ return mode;
712
+
713
+ break;
714
+ case RUBY_T_FLOAT:
715
+ case RUBY_T_FIXNUM:
716
+ case RUBY_T_BIGNUM:
717
+ return NUM2INT(mode_rb);
718
+ break;
719
+ default:
720
+ rb_raise(rb_eTypeError,"Unable to convert given value to int");
721
+ break;
722
+ }
723
+ }
724
+
725
+ /**
726
+ * ===<tt>KontoCheckRaw::encoding([mode])</tt>
727
+ * =====<tt>KontoCheck::encoding([mode])</tt>
728
+ * =====<tt>KontoCheckRaw::encoding_str([mode])</tt>
729
+ * =====<tt>KontoCheckRaw::keep_raw_data(mode)</tt>
730
+ *
731
+ * Diese Funktion legt den benutzten Zeichensatz für Fehlermeldungen durch die
732
+ * Funktion KontoCheckRaw::retval2txt() und einige Felder der LUT-Datei (Name,
733
+ * Kurzname, Ort) fest. Wenn die Funktion nicht aufgerufen wird, wird der Wert
734
+ * DEFAULT_ENCODING aus konto_check.h benutzt.
735
+ *
736
+ * _Achtung_: Das Verhalten der Funktion hängt von dem Flag keep_raw_data der
737
+ * C-Bibliothek ab. Falls das Flag gesetzt ist, werden die Rohdaten der Blocks
738
+ * Name, Kurzname und Ort im Speicher gehalten; bei einem Wechsel der Kodierung
739
+ * wird auch für diese Blocks die Kodierung umgesetzt. Falls das Flag nicht
740
+ * gesetzt ist, sollte die Funktion *vor* der Initialisierung aufgerufen werden,
741
+ * da in dem Fall die Daten der LUT-Datei nur bei der Initialisierung konvertiert
742
+ * werden. Mit der Funktion KontoCheckRaw::keep_raw_data() kann das Flag gesetzt
743
+ * oder gelöscht werden.
744
+ *
745
+ * Für den Parameter mode werden die folgenden Werte akzeptiert (die Strings
746
+ * sind nicht case sensitiv; Mi oder mI oder MI ist z.B. auch möglich. Wird der
747
+ * Parameter nicht angegeben, wird die aktuelle Kodierung ausgegeben):
748
+ *
749
+ * 0: aktuelle Kodierung ausgeben
750
+ * 1, 'i', 'I': ISO-8859-1
751
+ * 2, 'u', 'U': UTF-8
752
+ * 3, 'h', 'H': HTML
753
+ * 4, 'd', 'D': DOS CP 850
754
+ * 51, 'mi': ISO-8859-1, Makro für Fehlermeldungen
755
+ * 52, 'mu': UTF-8, Makro für Fehlermeldungen
756
+ * 53, 'mh': HTML, Makro für Fehlermeldungen
757
+ * 54, 'md': DOS CP 850, Makro für Fehlermeldungen
758
+ *
759
+ * Rückgabewert ist die aktuelle Kodierung als Integer (falls zwei Kodierungen
760
+ * angegeben sind, ist die erste die der Statusmeldungen, die zweite die der
761
+ * LUT-Blocks):
762
+ *
763
+ * 0: "noch nicht spezifiziert" (vor der Initialisierung)
764
+ * 1: "ISO-8859-1";
765
+ * 2: "UTF-8";
766
+ * 3: "HTML entities";
767
+ * 4: "DOS CP 850";
768
+ * 12: "ISO-8859-1/UTF-8";
769
+ * 13: "ISO-8859-1/HTML";
770
+ * 14: "ISO-8859-1/DOS CP 850";
771
+ * 21: "UTF-8/ISO-8859-1";
772
+ * 23: "UTF-8/HTML";
773
+ * 24: "UTF-8/DOS CP-850";
774
+ * 31: "HTML entities/ISO-8859-1";
775
+ * 32: "HTML entities/UTF-8";
776
+ * 34: "HTML entities/DOS CP-850";
777
+ * 41: "DOS CP-850/ISO-8859-1";
778
+ * 42: "DOS CP-850/UTF-8";
779
+ * 43: "DOS CP-850/HTML";
780
+ * 51: "Makro/ISO-8859-1";
781
+ * 52: "Makro/UTF-8";
782
+ * 53: "Makro/HTML";
783
+ * 54: "Makro/DOS CP 850";
784
+ */
785
+ static VALUE encoding_rb(int argc,VALUE* argv,VALUE self)
786
+ {
787
+ return INT2FIX(kto_check_encoding(enc_mode(argc,argv)));
788
+ }
789
+
790
+ /**
791
+ * ===<tt>KontoCheckRaw::encoding_str(mode)</tt>
792
+ * =====<tt>KontoCheck::encoding_str(mode)</tt>
793
+ * =====<tt>KontoCheckRaw::encoding(mode)</tt>
794
+ * =====<tt>KontoCheckRaw::keep_raw_data(mode)</tt>
795
+ *
796
+ * Diese Funktion entspricht der Funktion KontoCheck::encoding(). Allerdings
797
+ * ist der Rückgabewert nicht numerisch, sondern ein String, der die aktuelle
798
+ * Kodierung angibt. Die folgenden Rückgabewerte sind möglich (falls zwei
799
+ * Kodierungen angegeben sind, ist die erste die der Statusmeldungen, die
800
+ * zweite die der LUT-Blocks):
801
+ *
802
+ * "noch nicht spezifiziert" (vor der Initialisierung)
803
+ * "ISO-8859-1";
804
+ * "UTF-8";
805
+ * "HTML entities";
806
+ * "DOS CP 850";
807
+ * "ISO-8859-1/UTF-8";
808
+ * "ISO-8859-1/HTML";
809
+ * "ISO-8859-1/DOS CP 850";
810
+ * "UTF-8/ISO-8859-1";
811
+ * "UTF-8/HTML";
812
+ * "UTF-8/DOS CP-850";
813
+ * "HTML entities/ISO-8859-1";
814
+ * "HTML entities/UTF-8";
815
+ * "HTML entities/DOS CP-850";
816
+ * "DOS CP-850/ISO-8859-1";
817
+ * "DOS CP-850/UTF-8";
818
+ * "DOS CP-850/HTML";
819
+ * "Makro/ISO-8859-1";
820
+ * "Makro/UTF-8";
821
+ * "Makro/HTML";
822
+ * "Makro/DOS CP 850";
823
+ */
824
+ static VALUE encoding_str_rb(int argc,VALUE* argv,VALUE self)
825
+ {
826
+ return rb_str_new2((kto_check_encoding_str(enc_mode(argc,argv))));
827
+ }
828
+
829
+ /**
830
+ * ===<tt>KontoCheckRaw::keep_raw_data(mode)</tt>
831
+ * =====<tt>KontoCheckRaw::encoding(mode)</tt>
832
+ * =====<tt>KontoCheck::encoding(mode)</tt>
833
+ *
834
+ * Diese Funktion setzt bzw. liest das Flag keep_raw_data in der C-Bibliothek.
835
+ * Falls es gesetzt ist, werden werden die Rohdaten der Blocks Name, Kurzname
836
+ * und Ort im Speicher gehalten; bei einem Wechsel der Kodierung werden diese
837
+ * Blocks dann auch auf die neue Kodierung umgesetzt. Für die Speicherung der
838
+ * Blocks werden allerdings etwa 900 KB Hauptspeicher benötigt, die andernfalls
839
+ * wieder freigegeben würden.
840
+ *
841
+ * Da diese Funktion etwas exotisch ist, ist sie nur in der KontoCheckRaw
842
+ * Bibliothek enthalten, nicht in KontoCheck..
843
+ *
844
+ * Parameter:
845
+ * -1: Flag keep_raw_data ausschalten
846
+ * 1: Flag keep_raw_data einschalten
847
+ * 0: Flag lesen
848
+ *
849
+ * Der Rückgabewert ist true oder false.
850
+ */
851
+ static VALUE keep_raw_data_rb(VALUE self, VALUE mode_rb)
852
+ {
853
+ int t,mode;
854
+
855
+ if(NIL_P(mode_rb))
856
+ mode=0;
857
+ else if((t=TYPE(mode_rb))==RUBY_T_STRING)
858
+ mode=*(RSTRING_PTR(mode_rb))-'0';
859
+ else if(t==RUBY_T_FLOAT || t==RUBY_T_FIXNUM || t==RUBY_T_BIGNUM)
860
+ mode=FIX2INT(mode_rb);
861
+ else /* nicht unterstützter Typ */
862
+ mode=0;
863
+ return keep_raw_data(mode)?Qtrue:Qfalse;
864
+ }
865
+
866
+ /**
867
+ * ===<tt>KontoCheckRaw::retval2txt(retval)</tt>
868
+ * =====<tt>KontoCheck::retval2txt(retval)</tt>
869
+ *
870
+ * Diese Funktion konvertiert einen numerischen Rückgabewert in einen String.
871
+ * Der benutzte Zeichensatz wird über die Funktion KontoCheckRaw::encoding()
872
+ * festgelegt. Falls diese Funktion nicht aufgerufen wurde, wird der Wert des
873
+ * Makros DEFAULT_ENCODING aus konto_check.h benutzt.
874
+ */
875
+ static VALUE retval2txt_rb(VALUE self, VALUE retval)
876
+ {
877
+ return rb_str_new2(kto_check_retval2txt(FIX2INT(retval)));
878
+ }
879
+
880
+ /**
881
+ * ===<tt>KontoCheckRaw::retval2iso(retval)</tt>
882
+ * =====<tt>KontoCheck::retval2iso(retval)</tt>
883
+ *
884
+ * Diese Funktion konvertiert einen numerischen Rückgabewert in einen String.
885
+ * Der benutzte Zeichensatz ist ISO 8859-1.
886
+ */
887
+ static VALUE retval2iso_rb(VALUE self, VALUE retval)
888
+ {
889
+ return rb_str_new2(kto_check_retval2iso(FIX2INT(retval)));
890
+ }
891
+
892
+ /**
893
+ * ===<tt>KontoCheckRaw::retval2txt_short(retval)</tt>
894
+ * =====<tt>KontoCheck::retval2txt_short(retval)</tt>
895
+ *
896
+ * Diese Funktion konvertiert einen numerischen Rückgabewert in einen kurzen
897
+ * String. Die Ausgabe ist der Makroname, wie er in C benutzt wird.
898
+ */
899
+ static VALUE retval2txt_short_rb(VALUE self, VALUE retval)
900
+ {
901
+ return rb_str_new2(kto_check_retval2txt_short(FIX2INT(retval)));
902
+ }
903
+
904
+ /**
905
+ * ===<tt>KontoCheckRaw::retval2dos(<retval>)</tt>
906
+ * =====<tt>KontoCheck::retval2dos(<retval>)</tt>
907
+ *
908
+ * Diese Funktion konvertiert einen numerischen Rückgabewert in einen String.
909
+ * Der benutzte Zeichensatz ist cp850 (DOS).
910
+ */
911
+ static VALUE retval2dos_rb(VALUE self, VALUE retval)
912
+ {
913
+ return rb_str_new2(kto_check_retval2dos(FIX2INT(retval)));
914
+ }
915
+
916
+ /**
917
+ * ===<tt>KontoCheckRaw::retval2html(<retval>)</tt>
918
+ * =====<tt>KontoCheck::retval2html(<retval>)</tt>
919
+ *
920
+ * Diese Funktion konvertiert einen numerischen Rückgabewert in einen String.
921
+ * Für Umlaute werden HTML-Entities benutzt.
922
+ */
923
+ static VALUE retval2html_rb(VALUE self, VALUE retval)
924
+ {
925
+ return rb_str_new2(kto_check_retval2html(FIX2INT(retval)));
926
+ }
927
+
928
+ /**
929
+ * ===<tt>KontoCheckRaw::retval2utf8(<retval>)</tt>
930
+ * =====<tt>KontoCheck::retval2utf8(<retval>)</tt>
931
+ *
932
+ * Diese Funktion konvertiert einen numerischen Rückgabewert in einen String.
933
+ * Der benutzte Zeichensatz ist UTF-8.
934
+ */
935
+ static VALUE retval2utf8_rb(VALUE self, VALUE retval)
936
+ {
937
+ return rb_str_new2(kto_check_retval2utf8(FIX2INT(retval)));
938
+ }
939
+
940
+ /**
941
+ * ===<tt>KontoCheckRaw::dump_lutfile(lutfile)</tt>
942
+ * =====<tt>KontoCheck::dump_lutfile(lutfile)</tt>
943
+ *
944
+ * Diese Funktion liefert detaillierte Informationen über alle Blocks, die in
945
+ * der LUT-Datei gespeichert sind, sowie noch einige Internas der LUT-Datei.
946
+ * Der Rückgabewert ist ein Array mit zwei Elementen: im ersten steht ein
947
+ * String mit den Infos, im zweiten ein Statuscode. Im Fehlerfall wird für den
948
+ * Infostring nil zurückgegeben.
949
+ *
950
+ * Mögliche Werte für den Statuscode sind:
951
+ *
952
+ * -112 (KTO_CHECK_UNSUPPORTED_COMPRESSION) "die notwendige Kompressions-Bibliothek wurden beim Kompilieren nicht eingebunden"
953
+ * -70 (LUT1_FILE_USED) "Es wurde eine LUT-Datei im Format 1.0/1.1 geladen"
954
+ * -36 (LUT2_Z_MEM_ERROR) "Memory error in den ZLIB-Routinen"
955
+ * -35 (LUT2_Z_DATA_ERROR) "Datenfehler im komprimierten LUT-Block"
956
+ * -33 (LUT2_DECOMPRESS_ERROR) "Fehler beim Dekomprimieren eines LUT-Blocks"
957
+ * -31 (LUT2_FILE_CORRUPTED) "Die LUT-Datei ist korrumpiert"
958
+ * -20 (LUT_CRC_ERROR) "Prüfsummenfehler in der blz.lut Datei"
959
+ * -10 (FILE_READ_ERROR) "kann Datei nicht lesen"
960
+ * -9 (ERROR_MALLOC) "kann keinen Speicher allokieren"
961
+ * -7 (INVALID_LUT_FILE) "die blz.lut Datei ist inkosistent/ungültig"
962
+ * 1 (OK) "ok"
963
+ */
964
+ static VALUE dump_lutfile_rb(int argc,VALUE* argv,VALUE self)
965
+ {
966
+ char lut_name[FILENAME_MAX+1],*ptr;
967
+ int retval;
968
+ VALUE dump;
969
+
970
+ get_params_file(argc,argv,lut_name,NULL,NULL,2);
971
+ retval=lut_dir_dump_str(lut_name,&ptr);
972
+ if(retval<=0)
973
+ dump=Qnil;
974
+ else
975
+ dump=rb_str_new2(ptr);
976
+ kc_free(ptr); /* die C-Funktion allokiert Speicher, der muß wieder freigegeben werden */
977
+ return rb_ary_new3(2,dump,INT2FIX(retval));
978
+ }
979
+
980
+ /**
981
+ * ===<tt>KontoCheckRaw::lut_info([lutfile])</tt>
982
+ * =====<tt>KontoCheck::lut_info()</tt>
983
+ * =====<tt>KontoCheck::lut_info1(lutfile)</tt>
984
+ * =====<tt>KontoCheck::lut_info2(lutfile)</tt>
985
+ *
986
+ * Diese Funktion liefert Informationen über die Datensätze sowie die beiden
987
+ * Infoblocks einer LUT-Datei. Falls sie ohne Parameter aufgerufen wird,
988
+ * werden Infos über die geladenen Blocks zurückgegeben.
989
+ *
990
+ * Der Rückgabewert ist ein Array mit 5 Elementen:
991
+ *
992
+ * 0. retval: Statuscode
993
+ * 1. valid1: Gültigkeitscode für den ersten Block
994
+ * 2. valid2: Gültigkeitscode für den zweiten Block
995
+ * 3. info1: erster Infoblock, oder nil, falls der Block nicht existiert
996
+ * 4. info2: zweiter Infoblock, oder nil, falls der Block nicht existiert
997
+ *
998
+ * Mögliche Statuscodes für valid1 and valid2 sind:
999
+ *
1000
+ * -105 (LUT2_NO_LONGER_VALID_BETTER) "Beide Datensätze sind nicht mehr gültig; dieser ist aber jünger als der andere"
1001
+ * -59 (LUT2_NOT_YET_VALID) "Der Datenblock ist noch nicht gültig"
1002
+ * -58 (LUT2_NO_LONGER_VALID) "Der Datenblock ist nicht mehr gültig"
1003
+ * -34 (LUT2_BLOCK_NOT_IN_FILE) "Die LUT-Datei enthält den Infoblock nicht"
1004
+ * 4 (LUT2_VALID) "Der Datenblock ist aktuell gültig"
1005
+ * 5 (LUT2_NO_VALID_DATE) "Der Datenblock enthält kein Gültigkeitsdatum"
1006
+ *
1007
+ * Mögliche Werte für den Statuscode retval:
1008
+ *
1009
+ * -112 (KTO_CHECK_UNSUPPORTED_COMPRESSION) "die notwendige Kompressions-Bibliothek wurden beim Kompilieren nicht eingebunden"
1010
+ * -10 (FILE_READ_ERROR) "kann Datei nicht lesen"
1011
+ * -70 (LUT1_FILE_USED) "Es wurde eine LUT-Datei im Format 1.0/1.1 geladen"
1012
+ * -40 (LUT2_NOT_INITIALIZED) "die Programmbibliothek wurde noch nicht initialisiert"
1013
+ * -37 (LUT2_Z_BUF_ERROR) "Buffer error in den ZLIB Routinen"
1014
+ * -36 (LUT2_Z_MEM_ERROR) "Memory error in den ZLIB-Routinen"
1015
+ * -35 (LUT2_Z_DATA_ERROR) "Datenfehler im komprimierten LUT-Block"
1016
+ * -34 (LUT2_BLOCK_NOT_IN_FILE) "Der Block ist nicht in der LUT-Datei enthalten"
1017
+ * -31 (LUT2_FILE_CORRUPTED) "Die LUT-Datei ist korrumpiert"
1018
+ * -20 (LUT_CRC_ERROR) "Prüfsummenfehler in der blz.lut Datei"
1019
+ * -9 (ERROR_MALLOC) "kann keinen Speicher allokieren"
1020
+ * -7 (INVALID_LUT_FILE) "die blz.lut Datei ist inkosistent/ungültig"
1021
+ * 1 (OK) "ok"
1022
+ */
1023
+ static VALUE lut_info_rb(int argc,VALUE* argv,VALUE self)
1024
+ {
1025
+ char lut_name[FILENAME_MAX+1],*info1,*info2,error_msg[512];
1026
+ int retval,valid1,valid2;
1027
+ VALUE info1_rb,info2_rb;
1028
+
1029
+ get_params_file(argc,argv,lut_name,NULL,NULL,3);
1030
+ retval=lut_info(lut_name,&info1,&info2,&valid1,&valid2);
1031
+ if(!info1)
1032
+ info1_rb=Qnil;
1033
+ else
1034
+ info1_rb=rb_str_new2(info1);
1035
+ if(!info2)
1036
+ info2_rb=Qnil;
1037
+ else
1038
+ info2_rb=rb_str_new2(info2);
1039
+ kc_free(info1); /* die C-Funktion allokiert Speicher, der muß wieder freigegeben werden */
1040
+ kc_free(info2);
1041
+ if(retval<0)RUNTIME_ERROR(retval);
1042
+ return rb_ary_new3(5,INT2FIX(retval),INT2FIX(valid1),INT2FIX(valid2),info1_rb,info2_rb);
1043
+ }
1044
+
1045
+ /**
1046
+ * ===<tt>KontoCheckRaw::load_bank_data(<datafile>)</tt>
1047
+ * =====<tt>KontoCheck::load_bank_data(<datafile>)</tt>
1048
+ *
1049
+ * Diese Funktion war die alte Initialisierungsroutine für konto_check; es ist
1050
+ * nun durch die Funktionen KontoCheck::init() und KontoCheck::generate_lutfile()
1051
+ * ersetzt. Zur Initialisierung benutzte sie die Textdatei der Deutschen
1052
+ * Bundesbank und generiertge daraus eine LUT-Datei, die dann von der
1053
+ * Initialisierungsroutine der C-Bibliothek benutzt wurde.
1054
+ *
1055
+ * Die init() Funktion ist wesentlich schneller (7..20 mal so schnell ohne
1056
+ * Generierung der Indexblocks; mit Indexblocks macht es noch wesentlich mehr
1057
+ * aus) und hat eine Reihe weiterer Vorteile. So ist es z.B. möglich, zwwei
1058
+ * Datensätze mit unterschiedlichem Gültigkeitszeitraum in einer Datei zu
1059
+ * halten und den jeweils gültigen Satz automatisch (nach der Systemzeit)
1060
+ * auswählen zu lassen. Die einzelnen Datenblocks (Bankleitzahlen,
1061
+ * Prüfziffermethoden, PLZ, Ort...) sind in der LUT-Datei in jeweils
1062
+ * unabhängigen Blocks gespeichert und können einzeln geladen werden; die
1063
+ * Bankdatei von der Deutschen Bundesbank enthält alle Felder in einem linearen
1064
+ * Format, so daß einzelne Blocks nicht unabhängig von anderen geladen werden
1065
+ * können.
1066
+ *
1067
+ * Die Funktion load_bank_data() wird nur noch als ein schibbolet benutzt, um
1068
+ * zu testen, ob jemand das alte Interface benutzt. Bei der Routine
1069
+ * KontoCheck::konto_check() wurde die Reihenfolge der Parameter getauscht, so
1070
+ * daß man in dem Falle den alten Code umstellen muß.
1071
+ */
1072
+
1073
+ static VALUE load_bank_data(VALUE self, VALUE path_rb)
1074
+ {
1075
+ rb_raise(rb_eRuntimeError, "Perhaps you used the old interface of konto_check.\n"
1076
+ "Use KontoCheck::init() to initialize the library\n"
1077
+ "and check the order of function arguments for konto_test(blz,kto)");
1078
+ }
1079
+
1080
+ /**
1081
+ * ===<tt>KontoCheckRaw::iban2bic(iban)</tt>
1082
+ * =====<tt>KontoCheck::iban2bic(iban)</tt>
1083
+ *
1084
+ * Diese Funktion bestimmt zu einer (deutschen!) IBAN den zugehörigen BIC (Bank
1085
+ * Identifier Code). Der BIC wird für eine EU-Standard-Überweisung im
1086
+ * SEPA-Verfahren (Single Euro Payments Area) benötigt; für die deutschen
1087
+ * Banken ist er in der BLZ-Datei enthalten. Nähere Infos gibt es z.B. unter
1088
+ * http://www.bic-code.de/
1089
+ *
1090
+ * Der Rückgabewert ist ein Array mit vier Elementen: im ersten steht der BIC,
1091
+ * im zweiten ein Statuscode, im dritten die BLZ und im vierten die Kontonummer
1092
+ * (die beiden letzteren werden aus der IBAN extrahiert). Im Fehlerfall wird
1093
+ * für BIC, BLZ und Kontonummer nil zurückgegeben.
1094
+ *
1095
+ * Mögliche Statuscodes:
1096
+ *
1097
+ * -68 (IBAN2BIC_ONLY_GERMAN) "Die Funktion iban2bic() arbeitet nur mit deutschen Bankleitzahlen"
1098
+ * -46 (LUT2_BIC_NOT_INITIALIZED) "Das Feld BIC wurde nicht initialisiert"
1099
+ * -40 (LUT2_NOT_INITIALIZED) "die Programmbibliothek wurde noch nicht initialisiert"
1100
+ * -5 (INVALID_BLZ_LENGTH) "die Bankleitzahl ist nicht achtstellig"
1101
+ * -4 (INVALID_BLZ) "die Bankleitzahl ist ungültig"
1102
+ * 1 (OK) "ok"
1103
+ */
1104
+ static VALUE iban2bic_rb(int argc,VALUE* argv,VALUE self)
1105
+ {
1106
+ char iban[128],error_msg[512],blz[10],kto[16];
1107
+ const char *bic;
1108
+ int retval;
1109
+
1110
+ get_params(argc,argv,iban,NULL,NULL,NULL,3);
1111
+ bic=iban2bic(iban,&retval,blz,kto);
1112
+ if(retval<0 && retval!=INVALID_BLZ)RUNTIME_ERROR(retval);
1113
+ return rb_ary_new3(4,retval<=0?Qnil:rb_str_new2(bic),INT2FIX(retval),
1114
+ retval<=0?Qnil:rb_str_new2(blz),retval<=0?Qnil:rb_str_new2(kto));
1115
+ }
1116
+
1117
+ /**
1118
+ * ===<tt>KontoCheckRaw::iban_gen(blz,kto)</tt>
1119
+ * =====<tt>KontoCheck::iban_gen(kto,blz)</tt>
1120
+ * Diese Funktion generiert aus (deutscher) BLZ und Konto einen IBAN. Hierbei
1121
+ * ist zu beachten, daß nicht alle Banken der Selbstberechnung zugestimmt
1122
+ * haben. Es gibt von den Sparkassen eine Liste dieser Institute; sie ist auch
1123
+ * in der LUT-Datei mit der ID 22 (1. Eigene IBAN) enthalten. Bei diesen Banken
1124
+ * wird - falls der Block in der LUT-Datei enthalten ist - keine Berechnung
1125
+ * durchgeführt, sondern die Status-Variable auf NO_OWN_IBAN_CALCULATION
1126
+ * gesetzt.
1127
+ *
1128
+ * Alle Banken der Liste erzeugen eine Statusmeldung mit dem Wert
1129
+ * OK_UNTERKONTO_ATTACHED, OK_UNTERKONTO_POSSIBLE oder OK_UNTERKONTO_GIVEN.
1130
+ * Falls einer dieser Stauswerte zurückgegeben wird, ist somit immer Vorsicht
1131
+ * geboten; der generierte IBAN sollte direkt bei dem zugehörigen Institut
1132
+ * überprüft werden.
1133
+ *
1134
+ * Hier ein Auszug aus der Anleitung des SEPA Account Converters:
1135
+ *
1136
+ * Der SEPA Account Converter ist so eingestellt, dass nur Kontoverbindungen in
1137
+ * IBAN und BIC umgerechnet werden, bei denen das ausgebende Kreditinstitut der
1138
+ * Umrechnung zugestimmt hat. Kreditinstitute, welche einer Umrechnung nicht
1139
+ * zugestimmt haben und welche zum Teil spezielle, dem SEPA Account Converter
1140
+ * nicht bekannte Umrechnungsmethoden verwenden, sind in der Datei "CONFIG.INI"
1141
+ * hinterlegt. Durch Löschen der Datei "CONFIG.INI" aus dem Programmverzeichnis
1142
+ * haben Sie die Möglichkeit, eine Umrechnung für alle Konten durchzuführen.
1143
+ * Bitte beachten Sie dabei, dass die so erhaltenen IBAN und BIC fehlerhaft
1144
+ * sein können und deshalb mit ihren Kunden zu überprüfen sind.
1145
+ *
1146
+ * Weblinks:
1147
+ *
1148
+ * https://www.sparkasse-rhein-neckar-nord.de/pdf/content/sepa/kurzanleitung.pdf
1149
+ * https://www.sparkasse-rhein-neckar-nord.de/firmenkunden/internationales_geschaeft/sepa/vorteile/index.php
1150
+ * https://www.sparkasse-rhein-neckar-nord.de/firmenkunden/internationales_geschaeft/sepa/vorteile/sepa_account_converter.msi
1151
+ *
1152
+ * Es ist möglich, sowohl die Prüfung auf Stimmigkeit der Kontonummer als auch
1153
+ * auf Zulässigkeit der Selbstberechnung zu deaktivieren. Falls die IBAN trotz
1154
+ * fehlender Zustimmung der Bank berechnet werden, ist vor die BLZ ein @ zu
1155
+ * setzen; falls auch bei falscher Bankverbindung ein IBAN berechnet werden
1156
+ * soll, ist vor die BLZ ein + zu setzen. Um beide Prüfungen zu deaktiviern,
1157
+ * kann @+ (oder +@) vor die BLZ gesetzt werden. Die so erhaltenen IBANs sind
1158
+ * dann i.A. allerdings wohl nicht gültig.
1159
+ *
1160
+ * Mögliche Statuscodes sind:
1161
+ * -110 OK_UNTERKONTO_ATTACHED "wahrscheinlich OK; es wurde allerdings ein (weggelassenes) Unterkonto angefügt"
1162
+ * -77 (BAV_FALSE) "BAV denkt, das Konto ist falsch (konto_check hält es für richtig)"
1163
+ * -74 (NO_GERMAN_BIC) "Ein Konto kann kann nur für deutsche Banken geprüft werden"
1164
+ * -69 (MISSING_PARAMETER) "Bei der Kontoprüfung fehlt ein notwendiger Parameter (BLZ oder Konto)"
1165
+ * -40 (LUT2_NOT_INITIALIZED) "die Programmbibliothek wurde noch nicht initialisiert"
1166
+ * -29 (UNDEFINED_SUBMETHOD) "Die (Unter)Methode ist nicht definiert"
1167
+ * -12 (INVALID_KTO_LENGTH) "ein Konto muß zwischen 1 und 10 Stellen haben"
1168
+ * -5 (INVALID_BLZ_LENGTH) "die Bankleitzahl ist nicht achtstellig"
1169
+ * -4 (INVALID_BLZ) "Die (Unter)Methode ist nicht definiert"
1170
+ * -3 (INVALID_KTO) "das Konto ist ungültig"
1171
+ * -2 (NOT_IMPLEMENTED) "die Methode wurde noch nicht implementiert"
1172
+ * -1 (NOT_DEFINED) "die Methode ist nicht definiert"
1173
+ * 0 (FALSE) "falsch"
1174
+ * 1 (OK) "ok"
1175
+ * 2 (OK_NO_CHK) "ok, ohne Prüfung"
1176
+ * 11 (OK_UNTERKONTO_POSSIBLE) "wahrscheinlich ok; die Kontonummer kann allerdings (nicht angegebene) Unterkonten enthalten"
1177
+ * 12 (OK_UNTERKONTO_GIVEN) "wahrscheinlich ok; die Kontonummer enthält eine Unterkontonummer"
1178
+ */
1179
+ static VALUE iban_gen_rb(int argc,VALUE* argv,VALUE self)
1180
+ {
1181
+ char iban[128],*papier,*ptr,*dptr,blz[20],kto[20];
1182
+ int retval;
1183
+ VALUE iban_rb,papier_rb;
1184
+
1185
+ get_params(argc,argv,blz,kto,NULL,NULL,2);
1186
+ papier=iban_gen(blz,kto,&retval);
1187
+ if(retval==OK || retval==OK_UNTERKONTO_ATTACHED || retval==OK_UNTERKONTO_POSSIBLE || retval==OK_UNTERKONTO_GIVEN){
1188
+ for(ptr=papier,dptr=iban;*ptr;ptr++)if(*ptr!=' ')*dptr++=*ptr;
1189
+ *dptr=0;
1190
+ iban_rb=rb_str_new2(iban);
1191
+ papier_rb=rb_str_new2(papier);
1192
+ kc_free(papier); /* die C-Funktion allokiert Speicher, der muß wieder freigegeben werden */
1193
+ }
1194
+ else
1195
+ iban_rb=papier_rb=Qnil;
1196
+ return rb_ary_new3(3,iban_rb,papier_rb,INT2FIX(retval));
1197
+ }
1198
+
1199
+ /**
1200
+ * ===<tt>KontoCheckRaw::iban_check(blz)</tt>
1201
+ * =====<tt>KontoCheck::iban_check(iban)</tt>
1202
+ * Diese Funktion testet eine IBAN; bei deutschen Bankverbindungen wird
1203
+ * zusätzlich noch die Plausibilität der Bankverbindung getestet und im
1204
+ * Statuswert zurückgegeben. Die Rückgabe ist ein Array mit zwei Elementen: im
1205
+ * ersten (retval) wird das Testergebnis für die IBAN zurückgegeben, im zweiten
1206
+ * (bei deutschen Bankverbindungen) das Testergebnis des Kontotests.
1207
+ *
1208
+ * Mögliche Rückgabewerte für den IBAN-Test:
1209
+ *
1210
+ * -67 (IBAN_OK_KTO_NOT) "Die Prüfziffer der IBAN stimmt, die der Kontonummer nicht"
1211
+ * -66 (KTO_OK_IBAN_NOT) "Die Prüfziffer der Kontonummer stimmt, die der IBAN nicht"
1212
+ * 0 (FALSE) "falsch"
1213
+ * 1 (OK) "ok"
1214
+ *
1215
+ * Mögliche Rückgabewerte für den Kontotest:
1216
+ * -77 (BAV_FALSE) "BAV denkt, das Konto ist falsch (konto_check hält es für richtig)"
1217
+ * -74 (NO_GERMAN_BIC) "Ein Konto kann kann nur für deutsche Banken geprüft werden"
1218
+ * -69 (MISSING_PARAMETER) "Bei der Kontoprüfung fehlt ein notwendiger Parameter (BLZ oder Konto)"
1219
+ * -40 (LUT2_NOT_INITIALIZED) "die Programmbibliothek wurde noch nicht initialisiert"
1220
+ * -29 (UNDEFINED_SUBMETHOD) "Die (Unter)Methode ist nicht definiert"
1221
+ * -12 (INVALID_KTO_LENGTH) "ein Konto muß zwischen 1 und 10 Stellen haben"
1222
+ * -5 (INVALID_BLZ_LENGTH) "die Bankleitzahl ist nicht achtstellig"
1223
+ * -4 (INVALID_BLZ) "Die (Unter)Methode ist nicht definiert"
1224
+ * -3 (INVALID_KTO) "das Konto ist ungültig"
1225
+ * -2 (NOT_IMPLEMENTED) "die Methode wurde noch nicht implementiert"
1226
+ * -1 (NOT_DEFINED) "die Methode ist nicht definiert"
1227
+ * 0 (FALSE) "falsch"
1228
+ * 1 (OK) "ok"
1229
+ * 2 (OK_NO_CHK) "ok, ohne Prüfung"
1230
+ */
1231
+ static VALUE iban_check_rb(int argc,VALUE* argv,VALUE self)
1232
+ {
1233
+ char iban[128];
1234
+ int retval,retval_kc;
1235
+
1236
+ get_params(argc,argv,iban,NULL,NULL,NULL,3);
1237
+ retval=iban_check(iban,&retval_kc);
1238
+ return rb_ary_new3(2,INT2FIX(retval),INT2FIX(retval_kc));
1239
+ }
1240
+
1241
+ /**
1242
+ * ===<tt>KontoCheckRaw::ipi_gen(<zweck>)</tt>
1243
+ * =====<tt>KontoCheck::ipi_gen(<zweck>)</tt>
1244
+ *
1245
+ * Diese Funktion generiert einen "Strukturierten Verwendungszweck" für SEPA-Überweisungen.
1246
+ * Der Rückgabewert ist der Strukturierte Verwendungszweck als String oder nil, falls ein Fehler
1247
+ * aufgetreten ist.
1248
+ *
1249
+ * Der String für den Strukturierten Verwendungszweck darf maximal 18 Byte lang sein und nur
1250
+ * alphanumerische Zeichen enthalten (also auch keine Umlaute).
1251
+ *
1252
+ * Der Rückgabewert ist ein Array mit drei Elementen: im ersten steht der Strukturierte Verwendungszweck,
1253
+ * im zweiten ein Statuscode und im dritten die Papierform (mit eingestreuten Blanks).
1254
+ *
1255
+ * Mögliche Statuscodes:
1256
+ *
1257
+ * -71 (IPI_INVALID_LENGTH) "Die Länge des IPI-Verwendungszwecks darf maximal 18 Byte sein"
1258
+ * -72 (IPI_INVALID_CHARACTER) "Im strukturierten Verwendungszweck dürfen nur alphanumerische Zeichen vorkommen"
1259
+ * 1 (OK) "ok"
1260
+ */
1261
+ static VALUE ipi_gen_rb(int argc,VALUE* argv,VALUE self)
1262
+ {
1263
+ char zweck[24],dst[24],papier[30];
1264
+ int retval;
1265
+
1266
+ get_params(argc,argv,zweck,NULL,NULL,NULL,4);
1267
+ retval=ipi_gen(zweck,dst,papier);
1268
+ if(retval==OK)
1269
+ return rb_ary_new3(3,rb_str_new2(dst),INT2FIX(retval),rb_str_new2(papier));
1270
+ else
1271
+ return rb_ary_new3(3,Qnil,INT2FIX(retval),Qnil);
1272
+ }
1273
+
1274
+ /**
1275
+ * ===<tt>KontoCheckRaw::ipi_check(<zweck>)</tt>
1276
+ * =====<tt>KontoCheck::ipi_check(<zweck>)</tt>
1277
+ *
1278
+ * Die Funktion testet, ob ein Strukturierter Verwendungszweck gültig ist
1279
+ * (Anzahl Zeichen, Prüfziffer). Die Rückgabe ist ein Statuscode, der die
1280
+ * folgenden Werte annehmen kann:
1281
+ *
1282
+ * -73 (IPI_CHECK_INVALID_LENGTH) "Der zu validierende strukturierete Verwendungszweck muß genau 20 Zeichen enthalten"
1283
+ * 0 (FALSE) "falsch"
1284
+ * 1 (OK) "ok"
1285
+ */
1286
+ static VALUE ipi_check_rb(int argc,VALUE* argv,VALUE self)
1287
+ {
1288
+ char zweck[128];
1289
+
1290
+ get_params(argc,argv,zweck,NULL,NULL,NULL,3);
1291
+ return INT2FIX(ipi_check(zweck));
1292
+ }
1293
+
1294
+ /**
1295
+ * ====<tt>KontoCheckRaw::bank_valid(blz [,filiale])</tt>
1296
+ * ====== <tt>KontoCheck::bank_valid(blz [,filiale])</tt>
1297
+ * ====== <tt>KontoCheck::bank_valid?(blz [,filiale])</tt>
1298
+ * Diese Funktion testet, ob eine gegebene BLZ gültig ist. Der Rückgabewert ist ein
1299
+ * Statuscode mit den unten angegebenen Werten. Falls das Argument filiale auch
1300
+ * angegeben ist, wird zusätzlich noch getestet, ob eine Filiale mit dem gegebenen
1301
+ * Index existiert.
1302
+ *
1303
+ * Mögliche Rückgabewerte sind:
1304
+ *
1305
+ * -55 (LUT2_INDEX_OUT_OF_RANGE) "Der Index für die Filiale ist ungültig"
1306
+ * -53 (LUT2_BLZ_NOT_INITIALIZED) "Das Feld BLZ wurde nicht initialisiert"
1307
+ * -5 (INVALID_BLZ_LENGTH) "die Bankleitzahl ist nicht achtstellig"
1308
+ * -4 (INVALID_BLZ) "die Bankleitzahl ist ungültig"
1309
+ * 1 (OK) "ok"
1310
+ */
1311
+ static VALUE bank_valid(int argc,VALUE* argv,VALUE self)
1312
+ {
1313
+ char blz[16],error_msg[512];
1314
+ int filiale,retval;
1315
+
1316
+ get_params(argc,argv,blz,NULL,NULL,&filiale,1);
1317
+ retval=lut_blz(blz,filiale);
1318
+ if(retval==LUT2_BLZ_NOT_INITIALIZED)RUNTIME_ERROR(retval);
1319
+ return INT2FIX(retval);
1320
+ }
1321
+
1322
+ /**
1323
+ * ===<tt>KontoCheckRaw::bank_filialen(blz)</tt>
1324
+ * =====<tt>KontoCheck::bank_filialen(blz)</tt>
1325
+ *
1326
+ * Diese Funktion liefert die Anzahl Filialen einer Bank (inklusive Hauptstelle).
1327
+ * Die LUT-Datei muß dazu natürlich mit den Filialdaten generiert sein, sonst
1328
+ * wird für alle Banken nur 1 zurückgegeben. Der Rückgabewert ist ein Array mit
1329
+ * der Anzahl Filialen im ersten Parameter, und einem Statuscode im zwweiten.
1330
+ *
1331
+ * Mögliche Statuswerte sind:
1332
+ *
1333
+ * -55 (LUT2_INDEX_OUT_OF_RANGE) "Der Index für die Filiale ist ungültig"
1334
+ * -53 (LUT2_BLZ_NOT_INITIALIZED) "Das Feld BLZ wurde nicht initialisiert"
1335
+ * -52 (LUT2_FILIALEN_NOT_INITIALIZED) "Das Feld Filialen wurde nicht initialisiert"
1336
+ * -5 (INVALID_BLZ_LENGTH) "die Bankleitzahl ist nicht achtstellig"
1337
+ * -4 (INVALID_BLZ) "die Bankleitzahl ist ungültig"
1338
+ * 1 (OK) "ok"
1339
+ */
1340
+
1341
+ static VALUE bank_filialen(int argc,VALUE* argv,VALUE self)
1342
+ {
1343
+ char blz[16],error_msg[512];
1344
+ int retval,cnt;
1345
+
1346
+ get_params(argc,argv,blz,NULL,NULL,NULL,0);
1347
+ cnt=lut_filialen(blz,&retval);
1348
+ if(retval==LUT2_BLZ_NOT_INITIALIZED || retval==LUT2_FILIALEN_NOT_INITIALIZED)RUNTIME_ERROR(retval);
1349
+ return rb_ary_new3(2,retval<=0?Qnil:INT2FIX(cnt),INT2FIX(retval));
1350
+ }
1351
+
1352
+ /**
1353
+ * ===<tt>KontoCheckRaw::bank_alles(blz[,filiale])</tt>
1354
+ * =====<tt>KontoCheck::bank_alles(blz[,filiale])</tt>
1355
+ *
1356
+ * Dies ist eine Mammutfunktion, die alle vorhandenen Informationen über eine
1357
+ * Bank zurückliefert. Das Ergebnis ist ein Array mit den folgenden Komponenten:
1358
+ * 0: Statuscode
1359
+ * 1: Anzahl Filialen
1360
+ * 2: Name
1361
+ * 3: Kurzname
1362
+ * 4: PLZ
1363
+ * 5: Ort
1364
+ * 6: PAN
1365
+ * 7: BIC
1366
+ * 8: Prüfziffer
1367
+ * 9: Laufende Nr.
1368
+ * 10: Änderungs-Flag
1369
+ * 11: Löeschung-Flag
1370
+ * 12: Nachfolge-BLZ
1371
+ *
1372
+ * Der Statuscode (Element 0) kann folgende Werte annehmen:
1373
+ *
1374
+ * -40 (LUT2_NOT_INITIALIZED) "die Programmbibliothek wurde noch nicht initialisiert"
1375
+ * -38 (LUT2_PARTIAL_OK) "es wurden nicht alle Blocks geladen"
1376
+ * -5 (INVALID_BLZ_LENGTH) "die Bankleitzahl ist nicht achtstellig"
1377
+ * -4 (INVALID_BLZ) "die Bankleitzahl ist ungültig"
1378
+ * 1 (OK) "ok"
1379
+ *
1380
+ * Anmerkung: Falls der Statuscode LUT2_PARTIAL_OK ist, wurden bei der
1381
+ * Initialisierung nicht alle Blocks geladen (oder es sind nicht alle verfügbar);
1382
+ * die entsprechenden Elemente haben dann den Wert nil.
1383
+ */
1384
+
1385
+ static VALUE bank_alles(int argc,VALUE* argv,VALUE self)
1386
+ {
1387
+ char blz[16],**p_name,**p_name_kurz,**p_ort,**p_bic,*p_aenderung,*p_loeschung,aenderung[2],loeschung[2],error_msg[512];
1388
+ int retval,filiale,cnt,*p_blz,*p_plz,*p_pan,p_pz,*p_nr,*p_nachfolge_blz;
1389
+
1390
+ get_params(argc,argv,blz,NULL,NULL,&filiale,1);
1391
+ retval=lut_multiple(blz,&cnt,&p_blz, &p_name,&p_name_kurz,&p_plz,&p_ort,&p_pan,&p_bic,&p_pz,&p_nr,
1392
+ &p_aenderung,&p_loeschung,&p_nachfolge_blz,NULL,NULL,NULL);
1393
+ if(retval==LUT2_BLZ_NOT_INITIALIZED)RUNTIME_ERROR(retval);
1394
+ if(filiale<0 || (cnt && filiale>=cnt))return(INT2FIX(LUT2_INDEX_OUT_OF_RANGE)); /* ungültige Filiale */
1395
+
1396
+ /* Fehler; die C-Arrays dürfen in diesem Fall nicht dereferenziert werden */
1397
+ if(retval<=0 && retval!=LUT2_PARTIAL_OK)return rb_ary_new3(2,INT2FIX(retval),Qnil);
1398
+
1399
+ if(p_aenderung){
1400
+ *aenderung=p_aenderung[filiale];
1401
+ *(aenderung+1)=0;
1402
+ }
1403
+ else
1404
+ *aenderung=0;
1405
+
1406
+ if(p_loeschung){
1407
+ *loeschung=p_loeschung[filiale];
1408
+ *(loeschung+1)=0;
1409
+ }
1410
+ else
1411
+ *loeschung=0;
1412
+
1413
+ /* Makros für StringValue und IntegerValue definieren, damit die Rückgabe
1414
+ * einigermaßen übersichtlich bleibt
1415
+ */
1416
+ #define SV(x) *x?rb_str_new2(x):Qnil
1417
+ #define IV(x) x>=0?INT2FIX(x):Qnil
1418
+ return rb_ary_new3(13,INT2FIX(retval),IV(cnt),SV(p_name[filiale]),
1419
+ SV(p_name_kurz[filiale]),IV(p_plz[filiale]),SV(p_ort[filiale]),
1420
+ IV(p_pan[filiale]),SV(p_bic[filiale]),IV(p_pz),IV(p_nr[filiale]),
1421
+ SV(aenderung),SV(loeschung),IV(p_nachfolge_blz[filiale]));
1422
+ }
1423
+
1424
+ /**
1425
+ * ===<tt>KontoCheckRaw::bank_name(blz[,filiale])</tt>
1426
+ * =====<tt>KontoCheck::bank_name(blz[,filiale])</tt>
1427
+ *
1428
+ * Diese Funktion liefert den Namen einer Bank. Der Rückgabewert ist ein
1429
+ * Array mit zwei Elementen: im ersten steht ein String mit dem Namen, im
1430
+ * zweiten ein Statuscode. Im Fehlerfall wird für den Namen nil zurückgegeben.
1431
+ *
1432
+ * Mögliche Statuscodes:
1433
+ *
1434
+ * -55 (LUT2_INDEX_OUT_OF_RANGE) "Der Index für die Filiale ist ungültig"
1435
+ * -53 (LUT2_BLZ_NOT_INITIALIZED) "Das Feld BLZ wurde nicht initialisiert"
1436
+ * -51 (LUT2_NAME_NOT_INITIALIZED) "Das Feld Bankname wurde nicht initialisiert"
1437
+ * -5 (INVALID_BLZ_LENGTH) "die Bankleitzahl ist nicht achtstellig"
1438
+ * -4 (INVALID_BLZ) "die Bankleitzahl ist ungültig"
1439
+ * 1 (OK) "ok"
1440
+ */
1441
+ static VALUE bank_name(int argc,VALUE* argv,VALUE self)
1442
+ {
1443
+ char blz[16],error_msg[512];
1444
+ const char *name;
1445
+ int retval,filiale;
1446
+
1447
+ get_params(argc,argv,blz,NULL,NULL,&filiale,1);
1448
+ name=lut_name(blz,filiale,&retval);
1449
+ if(retval==LUT2_BLZ_NOT_INITIALIZED || retval==LUT2_NAME_NOT_INITIALIZED)RUNTIME_ERROR(retval);
1450
+ return rb_ary_new3(2,retval<=0?Qnil:rb_str_new2(name),INT2FIX(retval));
1451
+ }
1452
+
1453
+ /**
1454
+ * ===<tt>KontoCheckRaw::bank_name_kurz(blz [,filiale])</tt>
1455
+ * =====<tt>KontoCheck::bank_name_kurz(blz [,filiale])</tt>
1456
+ *
1457
+ * Diese Funktion liefert den Kurznamen einer Bank. Der Rückgabewert ist ein
1458
+ * Array mit zwei Elementen: im ersten steht ein String mit dem Namen, im
1459
+ * zweiten ein Statuscode. Im Fehlerfall wird für den Namen nil zurückgegeben.
1460
+ *
1461
+ * Mögliche Statuscodes:
1462
+ *
1463
+ * -55 (LUT2_INDEX_OUT_OF_RANGE) "Der Index für die Filiale ist ungültig"
1464
+ * -53 (LUT2_BLZ_NOT_INITIALIZED) "Das Feld BLZ wurde nicht initialisiert"
1465
+ * -48 (LUT2_NAME_KURZ_NOT_INITIALIZED) "Das Feld Kurzname wurde nicht initialisiert"
1466
+ * -5 (INVALID_BLZ_LENGTH) "die Bankleitzahl ist nicht achtstellig"
1467
+ * -4 (INVALID_BLZ) "die Bankleitzahl ist ungültig"
1468
+ * 1 (OK) "ok"
1469
+ */
1470
+ static VALUE bank_name_kurz(int argc,VALUE* argv,VALUE self)
1471
+ {
1472
+ char blz[16],error_msg[512];
1473
+ const char *name;
1474
+ int retval,filiale;
1475
+
1476
+ get_params(argc,argv,blz,NULL,NULL,&filiale,1);
1477
+ name=lut_name_kurz(blz,filiale,&retval);
1478
+ if(retval==LUT2_BLZ_NOT_INITIALIZED || retval==LUT2_NAME_KURZ_NOT_INITIALIZED)RUNTIME_ERROR(retval);
1479
+ return rb_ary_new3(2,retval<=0?Qnil:rb_str_new2(name),INT2FIX(retval));
1480
+ }
1481
+
1482
+ /**
1483
+ * ===<tt>KontoCheckRaw::bank_ort(blz[,filiale])</tt>
1484
+ * =====<tt>KontoCheck::bank_ort(blz[,filiale])</tt>
1485
+ *
1486
+ * Diese Funktion liefert den Ort einer Bank. Falls der Parameter filiale nicht
1487
+ * angegeben ist, wird der Sitz der Hauptstelle ausgegeben. Der Rückgabewert
1488
+ * ist ein Array mit zwei Elementen: im ersten steht ein String mit dem Namen,
1489
+ * im zweiten ein Statuscode. Im Fehlerfall wird für den Ort nil
1490
+ * zurückgegeben.
1491
+ *
1492
+ * Mögliche Statuscodes:
1493
+ *
1494
+ * -53 (LUT2_BLZ_NOT_INITIALIZED) "Das Feld BLZ wurde nicht initialisiert"
1495
+ * -49 (LUT2_ORT_NOT_INITIALIZED) "Das Feld Ort wurde nicht initialisiert"
1496
+ * -55 (LUT2_INDEX_OUT_OF_RANGE) "Der Index für die Filiale ist ungültig"
1497
+ * -5 (INVALID_BLZ_LENGTH) "die Bankleitzahl ist nicht achtstellig"
1498
+ * -4 (INVALID_BLZ) "die Bankleitzahl ist ungültig"
1499
+ * 1 (OK) "ok"
1500
+ */
1501
+ static VALUE bank_ort(int argc,VALUE* argv,VALUE self)
1502
+ {
1503
+ char blz[16],error_msg[512];
1504
+ const char *ort;
1505
+ int retval,filiale;
1506
+
1507
+ get_params(argc,argv,blz,NULL,NULL,&filiale,1);
1508
+ ort=lut_ort(blz,filiale,&retval);
1509
+ if(retval==LUT2_BLZ_NOT_INITIALIZED || retval==LUT2_ORT_NOT_INITIALIZED)RUNTIME_ERROR(retval);
1510
+ return rb_ary_new3(2,retval<=0?Qnil:rb_str_new2(ort),INT2FIX(retval));
1511
+ }
1512
+
1513
+ /**
1514
+ * ===<tt>KontoCheckRaw::bank_plz(blz [,filiale])</tt>
1515
+ * =====<tt>KontoCheck::bank_plz(blz [,filiale])</tt>
1516
+ *
1517
+ * Diese Funktion liefert die Postleitzahl einer Bank. Falls der Parameter
1518
+ * filiale nicht angegeben ist, wird die PLZ der Hauptstelle ausgegeben. Der
1519
+ * Rückgabewert ist ein Array mit zwei Elementen: im ersten steht die PLZ, im
1520
+ * zweiten ein Statuscode. Im Fehlerfall wird für die PLZ nil zurückgegeben.
1521
+ *
1522
+ * Mögliche Statuscodes:
1523
+ *
1524
+ * -55 (LUT2_INDEX_OUT_OF_RANGE) "Der Index für die Filiale ist ungültig"
1525
+ * -53 (LUT2_BLZ_NOT_INITIALIZED) "Das Feld BLZ wurde nicht initialisiert"
1526
+ * -50 (LUT2_PLZ_NOT_INITIALIZED) "Das Feld PLZ wurde nicht initialisiert"
1527
+ * -5 (INVALID_BLZ_LENGTH) "die Bankleitzahl ist nicht achtstellig"
1528
+ * -4 (INVALID_BLZ) "die Bankleitzahl ist ungültig"
1529
+ * 1 (OK) "ok"
1530
+ */
1531
+ static VALUE bank_plz(int argc,VALUE* argv,VALUE self)
1532
+ {
1533
+ char blz[16],error_msg[512];
1534
+ int retval,plz,filiale;
1535
+
1536
+ get_params(argc,argv,blz,NULL,NULL,&filiale,1);
1537
+ plz=lut_plz(blz,filiale,&retval);
1538
+ if(retval==LUT2_BLZ_NOT_INITIALIZED || retval==LUT2_PLZ_NOT_INITIALIZED)RUNTIME_ERROR(retval);
1539
+ return rb_ary_new3(2,retval<=0?Qnil:INT2FIX(plz),INT2FIX(retval));
1540
+ }
1541
+
1542
+ /**
1543
+ * ===<tt>KontoCheckRaw::bank_pz(blz)</tt>
1544
+ * =====<tt>KontoCheck::bank_pz(blz)</tt>
1545
+ *
1546
+ * Diese Funktion liefert die Prüfziffer einer Bank. Die Funktion unterstützt
1547
+ * keine Filialen; zu jeder BLZ kann es in der LUT-Datei nur eine
1548
+ * Prüfziffermethode geben. Der Rückgabewert ist ein Array mit zwei Elementen:
1549
+ * im ersten steht die Prüfziffer, im zweiten ein Statuscode. Im Fehlerfall
1550
+ * wird für den Prüfziffer nil zurückgegeben.
1551
+ *
1552
+ * Mögliche Statuscodes:
1553
+ *
1554
+ * -55 (LUT2_INDEX_OUT_OF_RANGE) "Der Index für die Filiale ist ungültig"
1555
+ * -53 (LUT2_BLZ_NOT_INITIALIZED) "Das Feld BLZ wurde nicht initialisiert"
1556
+ * -45 (LUT2_PZ_NOT_INITIALIZED) "Das Feld Prüfziffer wurde nicht initialisiert"
1557
+ * -5 (INVALID_BLZ_LENGTH) "die Bankleitzahl ist nicht achtstellig"
1558
+ * -4 (INVALID_BLZ) "die Bankleitzahl ist ungültig"
1559
+ * 1 (OK) "ok"
1560
+ */
1561
+ static VALUE bank_pz(int argc,VALUE* argv,VALUE self)
1562
+ {
1563
+ char blz[16],error_msg[512];
1564
+ int retval,pz;
1565
+
1566
+ get_params(argc,argv,blz,NULL,NULL,NULL,0);
1567
+ pz=lut_pz(blz,0,&retval);
1568
+ if(retval==LUT2_BLZ_NOT_INITIALIZED || retval==LUT2_PZ_NOT_INITIALIZED)RUNTIME_ERROR(retval);
1569
+ return rb_ary_new3(2,retval<=0?Qnil:INT2FIX(pz),INT2FIX(retval));
1570
+ }
1571
+
1572
+ /**
1573
+ * ===<tt>KontoCheckRaw::bank_bic(blz[,filiale])</tt>
1574
+ * =====<tt>KontoCheck::bank_bic(blz[,filiale])</tt>
1575
+ *
1576
+ * Diese Funktion liefert den BIC (Bank Identifier Code) einer Bank. Der
1577
+ * Rückgabewert ist ein Array mit zwei Elementen: im ersten steht ein String
1578
+ * mit dem BIC, im zweiten ein Statuscode. Im Fehlerfall wird für den BIC
1579
+ * nil zurückgegeben.
1580
+ *
1581
+ * Mögliche Statuscodes:
1582
+ *
1583
+ * -55 (LUT2_INDEX_OUT_OF_RANGE) "Der Index für die Filiale ist ungültig"
1584
+ * -53 (LUT2_BLZ_NOT_INITIALIZED) "Das Feld BLZ wurde nicht initialisiert"
1585
+ * -46 (LUT2_BIC_NOT_INITIALIZED) "Das Feld BIC wurde nicht initialisiert"
1586
+ * -5 (INVALID_BLZ_LENGTH) "die Bankleitzahl ist nicht achtstellig"
1587
+ * -4 (INVALID_BLZ) "die Bankleitzahl ist ungültig"
1588
+ * 1 (OK) "ok"
1589
+ */
1590
+ static VALUE bank_bic(int argc,VALUE* argv,VALUE self)
1591
+ {
1592
+ char blz[16],error_msg[512];
1593
+ const char *ptr;
1594
+ int retval,filiale;
1595
+
1596
+ get_params(argc,argv,blz,NULL,NULL,&filiale,1);
1597
+ ptr=lut_bic(blz,filiale,&retval);
1598
+ if(retval==LUT2_BLZ_NOT_INITIALIZED || retval==LUT2_BIC_NOT_INITIALIZED)RUNTIME_ERROR(retval);
1599
+ return rb_ary_new3(2,retval<=0?Qnil:rb_str_new2(ptr),INT2FIX(retval));
1600
+ }
1601
+
1602
+ /**
1603
+ * ===<tt>KontoCheckRaw::bank_aenderung(blz [,filiale])</tt>
1604
+ * =====<tt>KontoCheck::bank_aenderung(blz [,filiale])</tt>
1605
+ *
1606
+ * Diese Funktion liefert das 'Änderung' Flag einer Bank (als string).
1607
+ * Mögliche Werte sind: A (Addition), M (Modified), U (Unchanged), D
1608
+ * (Deletion). Der Rückgabewert ist ein Array mit zwei Elementen: im ersten
1609
+ * steht ein String mit dem Änderungsflag, im zweiten ein Statuscode. Im
1610
+ * Fehlerfall wird für das Flag nil zurückgegeben.
1611
+ *
1612
+ * Mögliche Statuscodes:
1613
+ *
1614
+ * -55 (LUT2_INDEX_OUT_OF_RANGE) "Der Index für die Filiale ist ungültig"
1615
+ * -53 (LUT2_BLZ_NOT_INITIALIZED) "Das Feld BLZ wurde nicht initialisiert"
1616
+ * -43 (LUT2_AENDERUNG_NOT_INITIALIZED) "Das Feld Änderung wurde nicht initialisiert"
1617
+ * -5 (INVALID_BLZ_LENGTH) "die Bankleitzahl ist nicht achtstellig"
1618
+ * -4 (INVALID_BLZ) "die Bankleitzahl ist ungültig"
1619
+ * 1 (OK) "ok"
1620
+ */
1621
+ static VALUE bank_aenderung(int argc,VALUE* argv,VALUE self)
1622
+ {
1623
+ char blz[16],aenderung[2],error_msg[512];
1624
+ int retval,filiale;
1625
+
1626
+ get_params(argc,argv,blz,NULL,NULL,&filiale,1);
1627
+ *aenderung=lut_aenderung(blz,filiale,&retval);
1628
+ aenderung[1]=0;
1629
+ if(retval==LUT2_BLZ_NOT_INITIALIZED || retval==LUT2_AENDERUNG_NOT_INITIALIZED)RUNTIME_ERROR(retval);
1630
+ return rb_ary_new3(2,retval<=0?Qnil:rb_str_new2(aenderung),INT2FIX(retval));
1631
+ }
1632
+
1633
+ /**
1634
+ * ===<tt>KontoCheck::bank_loeschung(blz [,filiale])</tt>
1635
+ * =====<tt>KontoCheckRaw::bank_loeschung(blz [,filiale])</tt>
1636
+ *
1637
+ * Diese Funktion liefert das Lösch-Flag für eine Bank zurück (als Integer;
1638
+ * mögliche Werte sind 0 und 1). Der Rückgabewert ist ein Array mit zwei
1639
+ * Elementen: im ersten steht das Flag, im zweiten ein Statuscode. Im
1640
+ * Fehlerfall wird für das Flag nil zurückgegeben.
1641
+ *
1642
+ * Mögliche Statuscodes:
1643
+ *
1644
+ * -55 (LUT2_INDEX_OUT_OF_RANGE) "Der Index für die Filiale ist ungültig"
1645
+ * -53 (LUT2_BLZ_NOT_INITIALIZED) "Das Feld BLZ wurde nicht initialisiert"
1646
+ * -42 (LUT2_LOESCHUNG_NOT_INITIALIZED) "Das Feld Löschung wurde nicht initialisiert"
1647
+ * -5 (INVALID_BLZ_LENGTH) "die Bankleitzahl ist nicht achtstellig"
1648
+ * -4 (INVALID_BLZ) "die Bankleitzahl ist ungültig"
1649
+ * 1 (OK) "ok"
1650
+ */
1651
+ static VALUE bank_loeschung(int argc,VALUE* argv,VALUE self)
1652
+ {
1653
+ char blz[16],error_msg[512];
1654
+ int retval,loeschung,filiale;
1655
+
1656
+ get_params(argc,argv,blz,NULL,NULL,&filiale,1);
1657
+ loeschung=lut_loeschung(blz,filiale,&retval)-'0';
1658
+ if(retval==LUT2_BLZ_NOT_INITIALIZED || retval==LUT2_LOESCHUNG_NOT_INITIALIZED)RUNTIME_ERROR(retval);
1659
+ return rb_ary_new3(2,retval<=0?Qnil:INT2FIX(loeschung),INT2FIX(retval));
1660
+ }
1661
+
1662
+ /**
1663
+ * ===<tt>KontoCheckRaw::bank_nachfolge_blz(blz [,filiale])</tt>
1664
+ * =====<tt>KontoCheck::bank_nachfolge_blz(blz [,filiale])</tt>
1665
+ *
1666
+ * Diese Funktion liefert die Nachfolge-BLZ für eine Bank, die gelöscht werden
1667
+ * soll (bei der das 'Löschung' Flag 1 ist). Der Rückgabewert ist ein Array mit
1668
+ * zwei Elementen: im ersten steht die Nachfolge-BLZ, im zweiten ein Statuscode. Im
1669
+ * Fehlerfall wird für die Nachfolge-BLZ nil zurückgegeben.
1670
+ *
1671
+ * Mögliche Statuscodes:
1672
+ *
1673
+ * -55 (LUT2_INDEX_OUT_OF_RANGE) "Der Index für die Filiale ist ungültig"
1674
+ * -53 (LUT2_BLZ_NOT_INITIALIZED) "Das Feld BLZ wurde nicht initialisiert"
1675
+ * -41 (LUT2_NACHFOLGE_BLZ_NOT_INITIALIZED) "Das Feld Nachfolge-BLZ wurde nicht initialisiert"
1676
+ * -5 (INVALID_BLZ_LENGTH) "die Bankleitzahl ist nicht achtstellig"
1677
+ * -4 (INVALID_BLZ) "die Bankleitzahl ist ungültig"
1678
+ * 1 (OK) "ok"
1679
+ */
1680
+ static VALUE bank_nachfolge_blz(int argc,VALUE* argv,VALUE self)
1681
+ {
1682
+ char blz[16],error_msg[512];
1683
+ int retval,n_blz,filiale;
1684
+
1685
+ get_params(argc,argv,blz,NULL,NULL,&filiale,1);
1686
+ n_blz=lut_nachfolge_blz(blz,filiale,&retval);
1687
+ if(retval==LUT2_BLZ_NOT_INITIALIZED || retval==LUT2_NACHFOLGE_BLZ_NOT_INITIALIZED)RUNTIME_ERROR(retval);
1688
+ return rb_ary_new3(2,retval<=0?Qnil:INT2FIX(n_blz),INT2FIX(retval));
1689
+ }
1690
+
1691
+ /**
1692
+ * ===<tt>KontoCheckRaw::bank_pan(blz[,filiale])</tt>
1693
+ *
1694
+ * ===<tt>KontoCheckRaw::bank_pan(blz [,filiale])</tt>
1695
+ * =====<tt>KontoCheck::bank_pan(blz [,filiale])</tt>
1696
+ *
1697
+ * Diese Funktion liefert den PAN (Primary Account Number) einer Bank. Der
1698
+ * Rückgabewert ist ein Array mit zwei Elementen: im ersten steht der PAN, im
1699
+ * zweiten ein Statuscode. Im Fehlerfall wird für den PAN nil zurückgegeben.
1700
+ *
1701
+ * Mögliche Statuscodes:
1702
+ *
1703
+ * -55 (LUT2_INDEX_OUT_OF_RANGE) "Der Index für die Filiale ist ungültig"
1704
+ * -53 (LUT2_BLZ_NOT_INITIALIZED) "Das Feld BLZ wurde nicht initialisiert"
1705
+ * -47 (LUT2_PAN_NOT_INITIALIZED) "Das Feld PAN wurde nicht initialisiert"
1706
+ * -5 (INVALID_BLZ_LENGTH) "die Bankleitzahl ist nicht achtstellig"
1707
+ * -4 (INVALID_BLZ) "die Bankleitzahl ist ungültig"
1708
+ * 1 (OK) "ok"
1709
+ */
1710
+ static VALUE bank_pan(int argc,VALUE* argv,VALUE self)
1711
+ {
1712
+ char blz[16],error_msg[512];
1713
+ int retval,pan,filiale;
1714
+
1715
+ get_params(argc,argv,blz,NULL,NULL,&filiale,1);
1716
+ pan=lut_pan(blz,filiale,&retval);
1717
+ if(retval==LUT2_BLZ_NOT_INITIALIZED || retval==LUT2_PAN_NOT_INITIALIZED)RUNTIME_ERROR(retval);
1718
+ return rb_ary_new3(2,retval<=0?Qnil:INT2FIX(pan),INT2FIX(retval));
1719
+ }
1720
+
1721
+ /**
1722
+ * ===<tt>KontoCheck::bank_nr(blz [,filiale])</tt>
1723
+ * =====<tt>KontoCheckRaw::bank_nr(blz[,filiale])</tt>
1724
+ *
1725
+ * Diese Funktion liefert die laufende Nummer einer Bank (internes Feld der
1726
+ * BLZ-Datei). Der Wert wird wahrscheinlich nicht oft benötigt, ist aber der
1727
+ * Vollständigkeit halber enthalten. Der Rückgabewert ist ein Array mit zwei
1728
+ * Elementen: im ersten steht die Nummer, im zweiten ein Statuscode. Im Fehlerfall
1729
+ * wird für die Nummer nil zurückgegeben.
1730
+ *
1731
+ * Mögliche Statuscodes:
1732
+ *
1733
+ * Possible return values (and short description):
1734
+ *
1735
+ * -55 (LUT2_INDEX_OUT_OF_RANGE) "Der Index für die Filiale ist ungültig"
1736
+ * -53 (LUT2_BLZ_NOT_INITIALIZED) "Das Feld BLZ wurde nicht initialisiert"
1737
+ * -44 (LUT2_NR_NOT_INITIALIZED) "Das Feld NR wurde nicht initialisiert"
1738
+ * -5 (INVALID_BLZ_LENGTH) "die Bankleitzahl ist nicht achtstellig"
1739
+ * -4 (INVALID_BLZ) "die Bankleitzahl ist ungültig"
1740
+ * 1 (OK) "ok"
1741
+ */
1742
+ static VALUE bank_nr(int argc,VALUE* argv,VALUE self)
1743
+ {
1744
+ char blz[16],error_msg[512];
1745
+ int retval,nr,filiale;
1746
+
1747
+ get_params(argc,argv,blz,NULL,NULL,&filiale,1);
1748
+ nr=lut_nr(blz,filiale,&retval);
1749
+ if(retval==LUT2_BLZ_NOT_INITIALIZED || retval==LUT2_NR_NOT_INITIALIZED)RUNTIME_ERROR(retval);
1750
+ return rb_ary_new3(2,retval<=0?Qnil:INT2FIX(nr),INT2FIX(retval));
1751
+ }
1752
+
1753
+ /**
1754
+ * Die Suchroutinen der C-Bibliothek sind eher Low-Level Routinen und ohne
1755
+ * einen Blick in die Sourcen nicht intuitiv nutzbar ;-), daher hier zunächst
1756
+ * eine kurze Einführung.
1757
+ *
1758
+ * Beim ersten Aufruf einer dieser Routinen wird zunächst getestet, ob das
1759
+ * Array mit den Zweigstellen bereits erstellt wurde. Dieses Array
1760
+ * korrespondiert mit der Tabelle der Bankleitzahlen; es enthält zu jedem Index
1761
+ * die jeweilige Zweigstellennummer, wobei Hauptstellen den Wert 0 erhalten.
1762
+ * Das erste Element in diesem Array entspricht der Bundesbank.
1763
+ *
1764
+ * Als zweites wird getestet, ob das Array mit den sortierten Werten schon
1765
+ * vorhanden ist; falls nicht, wird Speicher allokiert, der entsprechende Block
1766
+ * sortiert und die Indizes in das Array eingetragen (es wäre zu testen, ob die
1767
+ * Initialisierung schneller ist, wenn man das Array in der LUT-Datei
1768
+ * speichert).
1769
+ *
1770
+ * Um einen bestimmten Wert zu finden, wird eine binäre Suche durchgeführt.
1771
+ * Wird das gesuchte Element gefunden, werden die folgenden Werte zurückgegeben:
1772
+ *
1773
+ * - anzahl: Anzahl der gefundenen Werte, die den Suchkriterien entsprechen
1774
+ *
1775
+ * - start_idx: Pointer auf den ersten Wert im Sortierarray. Die nächsten
1776
+ * <anzahl> Elemente ab diesem Element entsprechen den
1777
+ * Sortierkriterien. Die Werte geben dabei den Index innerhalb
1778
+ * der BLZ-Datei an, beginnend mit 0 für die Bundesbank.
1779
+ *
1780
+ * - zweigstelle: Dieses Array enthält die Zweigstellennummern der
1781
+ * jeweiligen Banken. Es umfasst jedoch den Gesamtbestand der
1782
+ * BLZ-Datei, nicht den des Sortierarrays.
1783
+ *
1784
+ * - base_name: Dies ist ein Array das die Werte der Suchfunktion (in der
1785
+ * Reihenfolge der BLZ-Datei) enthält.
1786
+ *
1787
+ * - blz_base: Dies ist das Array mit den Bankleitzahlen.
1788
+ *
1789
+ * Beispiel: Der Aufruf
1790
+ *
1791
+ * retval=lut_suche_ort("aa",&anzahl,&start_idx,&zweigstelle,&base_name,&blz_base);
1792
+ *
1793
+ * liefert das folgende Ergebnis (mit der LUT-Datei vom 7.3.2011; bei anderen LUT-Dateien
1794
+ * können sich die Indizes natürlich verschieben):
1795
+ *
1796
+ * anzahl: 38
1797
+ * i: 0, start_idx[ 0]: 9259, blz_base[ 9259]: 58550130, zweigstelle[ 9259]: 42, base_name[ 9259]: Aach b Trier
1798
+ * i: 1, start_idx[ 1]: 12862, blz_base[12862]: 69251445, zweigstelle[12862]: 1, base_name[12862]: Aach, Hegau
1799
+ * i: 2, start_idx[ 2]: 12892, blz_base[12892]: 69290000, zweigstelle[12892]: 5, base_name[12892]: Aach, Hegau
1800
+ * i: 3, start_idx[ 3]: 3946, blz_base[ 3946]: 31010833, zweigstelle[ 3946]: 13, base_name[ 3946]: Aachen
1801
+ * i: 4, start_idx[ 4]: 4497, blz_base[ 4497]: 37060590, zweigstelle[ 4497]: 3, base_name[ 4497]: Aachen
1802
+ * i: 5, start_idx[ 5]: 4830, blz_base[ 4830]: 39000000, zweigstelle[ 4830]: 0, base_name[ 4830]: Aachen
1803
+ * i: 6, start_idx[ 6]: 4831, blz_base[ 4831]: 39010111, zweigstelle[ 4831]: 0, base_name[ 4831]: Aachen
1804
+ * i: 7, start_idx[ 7]: 4833, blz_base[ 4833]: 39020000, zweigstelle[ 4833]: 0, base_name[ 4833]: Aachen
1805
+ * i: 8, start_idx[ 8]: 4834, blz_base[ 4834]: 39040013, zweigstelle[ 4834]: 0, base_name[ 4834]: Aachen
1806
+ * i: 9, start_idx[ 9]: 4841, blz_base[ 4841]: 39050000, zweigstelle[ 4841]: 0, base_name[ 4841]: Aachen
1807
+ * i: 10, start_idx[10]: 4851, blz_base[ 4851]: 39060180, zweigstelle[ 4851]: 0, base_name[ 4851]: Aachen
1808
+ * i: 11, start_idx[11]: 4857, blz_base[ 4857]: 39060180, zweigstelle[ 4857]: 6, base_name[ 4857]: Aachen
1809
+ * i: 12, start_idx[12]: 4858, blz_base[ 4858]: 39060630, zweigstelle[ 4858]: 0, base_name[ 4858]: Aachen
1810
+ * i: 13, start_idx[13]: 4861, blz_base[ 4861]: 39070020, zweigstelle[ 4861]: 0, base_name[ 4861]: Aachen
1811
+ * i: 14, start_idx[14]: 4872, blz_base[ 4872]: 39070024, zweigstelle[ 4872]: 0, base_name[ 4872]: Aachen
1812
+ * i: 15, start_idx[15]: 4883, blz_base[ 4883]: 39080005, zweigstelle[ 4883]: 0, base_name[ 4883]: Aachen
1813
+ * i: 16, start_idx[16]: 4889, blz_base[ 4889]: 39080098, zweigstelle[ 4889]: 0, base_name[ 4889]: Aachen
1814
+ * i: 17, start_idx[17]: 4890, blz_base[ 4890]: 39080099, zweigstelle[ 4890]: 0, base_name[ 4890]: Aachen
1815
+ * i: 18, start_idx[18]: 4891, blz_base[ 4891]: 39160191, zweigstelle[ 4891]: 0, base_name[ 4891]: Aachen
1816
+ * i: 19, start_idx[19]: 4892, blz_base[ 4892]: 39161490, zweigstelle[ 4892]: 0, base_name[ 4892]: Aachen
1817
+ * i: 20, start_idx[20]: 4896, blz_base[ 4896]: 39162980, zweigstelle[ 4896]: 3, base_name[ 4896]: Aachen
1818
+ * i: 21, start_idx[21]: 4906, blz_base[ 4906]: 39500000, zweigstelle[ 4906]: 0, base_name[ 4906]: Aachen
1819
+ * i: 22, start_idx[22]: 6333, blz_base[ 6333]: 50120383, zweigstelle[ 6333]: 1, base_name[ 6333]: Aachen
1820
+ * i: 23, start_idx[23]: 10348, blz_base[10348]: 60420000, zweigstelle[10348]: 18, base_name[10348]: Aachen
1821
+ * i: 24, start_idx[24]: 16183, blz_base[16183]: 76026000, zweigstelle[16183]: 1, base_name[16183]: Aachen
1822
+ * i: 25, start_idx[25]: 10001, blz_base[10001]: 60069673, zweigstelle[10001]: 1, base_name[10001]: Aalen, Württ
1823
+ * i: 26, start_idx[26]: 10685, blz_base[10685]: 61370024, zweigstelle[10685]: 1, base_name[10685]: Aalen, Württ
1824
+ * i: 27, start_idx[27]: 10695, blz_base[10695]: 61370086, zweigstelle[10695]: 3, base_name[10695]: Aalen, Württ
1825
+ * i: 28, start_idx[28]: 10714, blz_base[10714]: 61420086, zweigstelle[10714]: 0, base_name[10714]: Aalen, Württ
1826
+ * i: 29, start_idx[29]: 10715, blz_base[10715]: 61430000, zweigstelle[10715]: 0, base_name[10715]: Aalen, Württ
1827
+ * i: 30, start_idx[30]: 10716, blz_base[10716]: 61440086, zweigstelle[10716]: 0, base_name[10716]: Aalen, Württ
1828
+ * i: 31, start_idx[31]: 10717, blz_base[10717]: 61450050, zweigstelle[10717]: 0, base_name[10717]: Aalen, Württ
1829
+ * i: 32, start_idx[32]: 10755, blz_base[10755]: 61450191, zweigstelle[10755]: 0, base_name[10755]: Aalen, Württ
1830
+ * i: 33, start_idx[33]: 10756, blz_base[10756]: 61480001, zweigstelle[10756]: 0, base_name[10756]: Aalen, Württ
1831
+ * i: 34, start_idx[34]: 10757, blz_base[10757]: 61490150, zweigstelle[10757]: 0, base_name[10757]: Aalen, Württ
1832
+ * i: 35, start_idx[35]: 10766, blz_base[10766]: 61490150, zweigstelle[10766]: 9, base_name[10766]: Aalen, Württ
1833
+ * i: 36, start_idx[36]: 7002, blz_base[ 7002]: 51050015, zweigstelle[ 7002]: 69, base_name[ 7002]: Aarbergen
1834
+ * i: 37, start_idx[37]: 7055, blz_base[ 7055]: 51091700, zweigstelle[ 7055]: 2, base_name[ 7055]: Aarbergen
1835
+ *
1836
+ */
1837
+
1838
+ /**
1839
+ * ===<tt>KontoCheckRaw::bank_suche_bic(search_bic)</tt>
1840
+ * =====<tt>KontoCheck::suche()</tt>
1841
+ *
1842
+ * Diese Funktion sucht alle Banken, deren BIC mit dem angegebenen Wert <search_bic> beginnen.
1843
+ * Die Rückgabe ist ein Array mit fünf Elementen:
1844
+ *
1845
+ * 0. Das erste Element ist ein Array mit den gefundenen BIC-Werten
1846
+ * 1. Das zweite Element ist ein Array mit den Bankleitzahlen, die auf das Suchmuster passen
1847
+ * 2. Das dritte Element ist ein Array mit den Zweigstellen-Indizes der gefundenen Bankleitzahlen
1848
+ * 3. das vierte Element ist der Statuscode (s.u.)
1849
+ * 4. das fünfte Element gibt die Anzahl der gefundenen Banken zurück.
1850
+ *
1851
+ * Mögliche Statuscodes:
1852
+ *
1853
+ * -78 (KEY_NOT_FOUND) "Die Suche lieferte kein Ergebnis"
1854
+ * -70 (LUT1_FILE_USED) "Es wurde eine LUT-Datei im Format 1.0/1.1 geladen"
1855
+ * -46 (LUT2_BIC_NOT_INITIALIZED) "Das Feld BIC wurde nicht initialisiert"
1856
+ * -40 (LUT2_NOT_INITIALIZED) "die Programmbibliothek wurde noch nicht initialisiert"
1857
+ * -9 (ERROR_MALLOC) "kann keinen Speicher allokieren"
1858
+ * 1 (OK) "ok"
1859
+ */
1860
+ static VALUE bank_suche_bic(int argc,VALUE* argv,VALUE self)
1861
+ {
1862
+ char such_name[128],**base_name,error_msg[512];
1863
+ int i,j,retval,anzahl,*start_idx,*zweigstelle,*blz_base;
1864
+ VALUE ret_blz,ret_idx,ret_suche;
1865
+
1866
+ get_params(argc,argv,such_name,NULL,NULL,NULL,3);
1867
+ retval=lut_suche_bic(such_name,&anzahl,&start_idx,&zweigstelle,&base_name,&blz_base);
1868
+ if(retval==KEY_NOT_FOUND)return rb_ary_new3(5,Qnil,Qnil,Qnil,INT2FIX(retval),INT2FIX(0));
1869
+ if(retval<0)RUNTIME_ERROR(retval);
1870
+ ret_suche=rb_ary_new2(anzahl);
1871
+ ret_blz=rb_ary_new2(anzahl);
1872
+ ret_idx=rb_ary_new2(anzahl);
1873
+ for(i=0;i<anzahl;i++){
1874
+ j=start_idx[i]; /* Index innerhalb der BLZ-Datei */
1875
+ rb_ary_store(ret_suche,i,rb_str_new2(base_name[j]));
1876
+ rb_ary_store(ret_blz,i,INT2FIX(blz_base[j]));
1877
+ rb_ary_store(ret_idx,i,INT2FIX(zweigstelle[j]));
1878
+ }
1879
+ return rb_ary_new3(5,ret_suche,ret_blz,ret_idx,INT2FIX(retval),INT2FIX(anzahl));
1880
+ }
1881
+
1882
+ /**
1883
+ * ===<tt>KontoCheckRaw::bank_suche_namen(name)</tt>
1884
+ * =====<tt>KontoCheck::suche()</tt>
1885
+ *
1886
+ * Diese Funktion sucht alle Banken, deren Namen mit dem angegebenen Wert <search_bic> beginnen.
1887
+ * Die Rückgabe ist ein Array mit fünf Elementen:
1888
+ *
1889
+ * 0. Das erste Element ist ein Array mit den gefundenen Namenswerten
1890
+ * 1. Das zweite Element ist ein Array mit den Bankleitzahlen, die auf das Suchmuster passen
1891
+ * 2. Das dritte Element ist ein Array mit den Zweigstellen-Indizes der gefundenen Bankleitzahlen
1892
+ * 3. das vierte Element ist der Statuscode (s.u.)
1893
+ * 4. das fünfte Element gibt die Anzahl der gefundenen Banken zurück.
1894
+ *
1895
+ * Mögliche Statuscodes:
1896
+ *
1897
+ * -78 (KEY_NOT_FOUND) "Die Suche lieferte kein Ergebnis"
1898
+ * -70 (LUT1_FILE_USED) "Es wurde eine LUT-Datei im Format 1.0/1.1 geladen"
1899
+ * -51 (LUT2_NAME_NOT_INITIALIZED) "Das Feld Bankname wurde nicht initialisiert"
1900
+ * -40 (LUT2_NOT_INITIALIZED) "die Programmbibliothek wurde noch nicht initialisiert"
1901
+ * -9 (ERROR_MALLOC) "kann keinen Speicher allokieren"
1902
+ * 1 (OK) "ok"
1903
+ */
1904
+ static VALUE bank_suche_namen(int argc,VALUE* argv,VALUE self)
1905
+ {
1906
+ char such_name[128],**base_name,error_msg[512];
1907
+ int i,j,retval,anzahl,*start_idx,*zweigstelle,*blz_base;
1908
+ VALUE ret_blz,ret_idx,ret_suche;
1909
+
1910
+ get_params(argc,argv,such_name,NULL,NULL,NULL,3);
1911
+ retval=lut_suche_namen(such_name,&anzahl,&start_idx,&zweigstelle,&base_name,&blz_base);
1912
+ if(retval==KEY_NOT_FOUND)return rb_ary_new3(5,Qnil,Qnil,Qnil,INT2FIX(retval),INT2FIX(0));
1913
+ if(retval<0)RUNTIME_ERROR(retval);
1914
+ ret_suche=rb_ary_new2(anzahl);
1915
+ ret_blz=rb_ary_new2(anzahl);
1916
+ ret_idx=rb_ary_new2(anzahl);
1917
+ for(i=0;i<anzahl;i++){
1918
+ j=start_idx[i]; /* Index innerhalb der BLZ-Datei */
1919
+ rb_ary_store(ret_suche,i,rb_str_new2(base_name[j]));
1920
+ rb_ary_store(ret_blz,i,INT2FIX(blz_base[j]));
1921
+ rb_ary_store(ret_idx,i,INT2FIX(zweigstelle[j]));
1922
+ }
1923
+ return rb_ary_new3(5,ret_suche,ret_blz,ret_idx,INT2FIX(retval),INT2FIX(anzahl));
1924
+ }
1925
+
1926
+ /**
1927
+ * ===<tt>KontoCheckRaw::bank_suche_namen_kurz(short_name)</tt>
1928
+ * =====<tt>KontoCheck::suche()</tt>
1929
+ *
1930
+ * Diese Funktion sucht alle Banken, deren Kurznamen mit dem angegebenen Wert <search_bic> beginnen.
1931
+ * Die Rückgabe ist ein Array mit fünf Elementen:
1932
+ *
1933
+ * 0. Das erste Element ist ein Array mit den gefundenen Namenswerten
1934
+ * 1. Das zweite Element ist ein Array mit den Bankleitzahlen, die auf das Suchmuster passen
1935
+ * 2. Das dritte Element ist ein Array mit den Zweigstellen-Indizes der gefundenen Bankleitzahlen
1936
+ * 3. das vierte Element ist der Statuscode (s.u.)
1937
+ * 4. das fünfte Element gibt die Anzahl der gefundenen Banken zurück.
1938
+ *
1939
+ * Mögliche Statuscodes:
1940
+ *
1941
+ * -78 (KEY_NOT_FOUND) "Die Suche lieferte kein Ergebnis"
1942
+ * -70 (LUT1_FILE_USED) "Es wurde eine LUT-Datei im Format 1.0/1.1 geladen"
1943
+ * -48 (LUT2_NAME_KURZ_NOT_INITIALIZED) "Das Feld Kurzname wurde nicht initialisiert"
1944
+ * -40 (LUT2_NOT_INITIALIZED) "die Programmbibliothek wurde noch nicht initialisiert"
1945
+ * -9 (ERROR_MALLOC) "kann keinen Speicher allokieren"
1946
+ * 1 (OK) "ok"
1947
+ */
1948
+ static VALUE bank_suche_namen_kurz(int argc,VALUE* argv,VALUE self)
1949
+ {
1950
+ char such_name[128],**base_name,error_msg[512];
1951
+ int i,j,retval,anzahl,*start_idx,*zweigstelle,*blz_base;
1952
+ VALUE ret_blz,ret_idx,ret_suche;
1953
+
1954
+ get_params(argc,argv,such_name,NULL,NULL,NULL,3);
1955
+ retval=lut_suche_namen_kurz(such_name,&anzahl,&start_idx,&zweigstelle,&base_name,&blz_base);
1956
+ if(retval==KEY_NOT_FOUND)return rb_ary_new3(5,Qnil,Qnil,Qnil,INT2FIX(retval),INT2FIX(0));
1957
+ if(retval<0)RUNTIME_ERROR(retval);
1958
+ ret_suche=rb_ary_new2(anzahl);
1959
+ ret_blz=rb_ary_new2(anzahl);
1960
+ ret_idx=rb_ary_new2(anzahl);
1961
+ for(i=0;i<anzahl;i++){
1962
+ j=start_idx[i]; /* Index innerhalb der BLZ-Datei */
1963
+ rb_ary_store(ret_suche,i,rb_str_new2(base_name[j]));
1964
+ rb_ary_store(ret_blz,i,INT2FIX(blz_base[j]));
1965
+ rb_ary_store(ret_idx,i,INT2FIX(zweigstelle[j]));
1966
+ }
1967
+ return rb_ary_new3(5,ret_suche,ret_blz,ret_idx,INT2FIX(retval),INT2FIX(anzahl));
1968
+ }
1969
+
1970
+ /**
1971
+ * ===<tt>KontoCheckRaw::bank_suche_plz(plz1[,plz2])</tt>
1972
+ * =====<tt>KontoCheck::suche()</tt>
1973
+ *
1974
+ * Diese Funktion sucht alle Banken, deren PLZ gleich <plz1> ist oder (bei
1975
+ * Angabe von plz2) die im Bereich zwischen <plz1> und <plz2> liegen.. Die
1976
+ * Rückgabe ist ein Array mit fünf Elementen:
1977
+ *
1978
+ * 0. Das erste Element ist ein Array mit den gefundenen Namenswerten
1979
+ * 1. Das zweite Element ist ein Array mit den Bankleitzahlen, die auf das Suchmuster passen
1980
+ * 2. Das dritte Element ist ein Array mit den Zweigstellen-Indizes der gefundenen Bankleitzahlen
1981
+ * 3. das vierte Element ist der Statuscode (s.u.)
1982
+ * 4. das fünfte Element gibt die Anzahl der gefundenen Banken zurück.
1983
+ *
1984
+ * Mögliche Statuscodes:
1985
+ *
1986
+ * -78 (KEY_NOT_FOUND) "Die Suche lieferte kein Ergebnis"
1987
+ * -70 (LUT1_FILE_USED) "Es wurde eine LUT-Datei im Format 1.0/1.1 geladen"
1988
+ * -50 (LUT2_PLZ_NOT_INITIALIZED) "Das Feld PLZ wurde nicht initialisiert"
1989
+ * -40 (LUT2_NOT_INITIALIZED) "die Programmbibliothek wurde noch nicht initialisiert"
1990
+ * -9 (ERROR_MALLOC) "kann keinen Speicher allokieren"
1991
+ * 1 (OK) "ok"
1992
+ */
1993
+ static VALUE bank_suche_plz(int argc,VALUE* argv,VALUE self)
1994
+ {
1995
+ char error_msg[512];
1996
+ int i,j,retval,such1,such2,anzahl,*start_idx,*base_name,*zweigstelle,*blz_base;
1997
+ VALUE ret_blz,ret_idx,ret_suche;
1998
+
1999
+ get_params_int(argc,argv,&such1,&such2);
2000
+ retval=lut_suche_plz(such1,such2,&anzahl,&start_idx,&zweigstelle,&base_name,&blz_base);
2001
+ if(retval==KEY_NOT_FOUND)return rb_ary_new3(5,Qnil,Qnil,Qnil,INT2FIX(retval),INT2FIX(0));
2002
+ if(retval<0)RUNTIME_ERROR(retval);
2003
+ ret_suche=rb_ary_new2(anzahl);
2004
+ ret_blz=rb_ary_new2(anzahl);
2005
+ ret_idx=rb_ary_new2(anzahl);
2006
+ for(i=0;i<anzahl;i++){
2007
+ j=start_idx[i]; /* Index innerhalb der BLZ-Datei */
2008
+ rb_ary_store(ret_suche,i,INT2FIX(base_name[j]));
2009
+ rb_ary_store(ret_blz,i,INT2FIX(blz_base[j]));
2010
+ rb_ary_store(ret_idx,i,INT2FIX(zweigstelle[j]));
2011
+ }
2012
+ return rb_ary_new3(5,ret_suche,ret_blz,ret_idx,INT2FIX(retval),INT2FIX(anzahl));
2013
+ }
2014
+
2015
+ /**
2016
+ * ===<tt>KontoCheckRaw::bank_suche_pz(pz1[,pz2])</tt>
2017
+ * =====<tt>KontoCheck::suche()</tt>
2018
+ *
2019
+ * Diese Funktion sucht alle Banken, deren Prüfziffer gleich <pz1> ist oder (bei
2020
+ * Angabe von pz2) die im Bereich zwischen <pz1> und <pz2> liegen.. Die
2021
+ * Rückgabe ist ein Array mit fünf Elementen:
2022
+ *
2023
+ * 0. Das erste Element ist ein Array mit den gefundenen Prüfziffern
2024
+ * 1. Das zweite Element ist ein Array mit den Bankleitzahlen, die auf das Suchmuster passen
2025
+ * 2. Das dritte Element ist ein Array mit den Zweigstellen-Indizes der gefundenen Bankleitzahlen
2026
+ * 3. das vierte Element ist der Statuscode (s.u.)
2027
+ * 4. das fünfte Element gibt die Anzahl der gefundenen Banken zurück.
2028
+ *
2029
+ * Mögliche Statuscodes:
2030
+ *
2031
+ * -78 (KEY_NOT_FOUND) "Die Suche lieferte kein Ergebnis"
2032
+ * -70 (LUT1_FILE_USED) "Es wurde eine LUT-Datei im Format 1.0/1.1 geladen"
2033
+ * -45 (LUT2_PZ_NOT_INITIALIZED) "Das Feld Prüfziffer wurde nicht initialisiert"
2034
+ * -40 (LUT2_NOT_INITIALIZED) "die Programmbibliothek wurde noch nicht initialisiert"
2035
+ * -9 (ERROR_MALLOC) "kann keinen Speicher allokieren"
2036
+ * 1 (OK) "ok"
2037
+ */
2038
+ static VALUE bank_suche_pz(int argc,VALUE* argv,VALUE self)
2039
+ {
2040
+ char error_msg[512];
2041
+ int i,j,retval,such1,such2,anzahl,*start_idx,*base_name,*zweigstelle,*blz_base;
2042
+ VALUE ret_blz,ret_idx,ret_suche;
2043
+
2044
+ get_params_int(argc,argv,&such1,&such2);
2045
+ retval=lut_suche_pz(such1,such2,&anzahl,&start_idx,&zweigstelle,&base_name,&blz_base);
2046
+ if(retval==KEY_NOT_FOUND)return rb_ary_new3(5,Qnil,Qnil,Qnil,INT2FIX(retval),INT2FIX(0));
2047
+ if(retval<0)RUNTIME_ERROR(retval);
2048
+ ret_suche=rb_ary_new2(anzahl);
2049
+ ret_blz=rb_ary_new2(anzahl);
2050
+ ret_idx=rb_ary_new2(anzahl);
2051
+ for(i=0;i<anzahl;i++){
2052
+ j=start_idx[i]; /* Index innerhalb der BLZ-Datei */
2053
+ rb_ary_store(ret_suche,i,INT2FIX(base_name[j]));
2054
+ rb_ary_store(ret_blz,i,INT2FIX(blz_base[j]));
2055
+ rb_ary_store(ret_idx,i,INT2FIX(zweigstelle[j]));
2056
+ }
2057
+ return rb_ary_new3(5,ret_suche,ret_blz,ret_idx,INT2FIX(retval),INT2FIX(anzahl));
2058
+ }
2059
+
2060
+ /**
2061
+ * ===<tt>KontoCheckRaw::bank_suche_blz(blz1[,blz2])</tt>
2062
+ * =====<tt>KontoCheck::suche()</tt>
2063
+ *
2064
+ * Diese Funktion sucht alle Banken, deren Bankleitzahl gleich <blz1> ist oder (bei
2065
+ * Angabe von blz2) die im Bereich zwischen <blz1> und <blz2> liegen.. Die
2066
+ * Rückgabe ist ein Array mit fünf Elementen:
2067
+ *
2068
+ * 0. Das erste Element ist ein Array mit den gefundenen Bankleitzahlen
2069
+ * 1. Das zweite Element ist ein Array mit den Bankleitzahlen, die auf das Suchmuster passen (bei dieser Funktion doppelt gemoppelt :-) )
2070
+ * 2. Das dritte Element ist ein Array mit den Zweigstellen-Indizes der gefundenen Bankleitzahlen
2071
+ * 3. das vierte Element ist der Statuscode (s.u.)
2072
+ * 4. das fünfte Element gibt die Anzahl der gefundenen Banken zurück.
2073
+ *
2074
+ * Mögliche Statuscodes:
2075
+ *
2076
+ * find all banks with bic between blz1 and blz2
2077
+ *
2078
+ * possible return values (and short description):
2079
+ *
2080
+ * -78 (KEY_NOT_FOUND) "Die Suche lieferte kein Ergebnis"
2081
+ * -70 (LUT1_FILE_USED) "Es wurde eine LUT-Datei im Format 1.0/1.1 geladen"
2082
+ * -53 (LUT2_BLZ_NOT_INITIALIZED) "Das Feld BLZ wurde nicht initialisiert"
2083
+ * -40 (LUT2_NOT_INITIALIZED) "die Programmbibliothek wurde noch nicht initialisiert"
2084
+ * -9 (ERROR_MALLOC) "kann keinen Speicher allokieren"
2085
+ * 1 (OK) "ok"
2086
+ */
2087
+ static VALUE bank_suche_blz(int argc,VALUE* argv,VALUE self)
2088
+ {
2089
+ char error_msg[512];
2090
+ int i,j,retval,such1,such2,anzahl,*start_idx,*base_name,*zweigstelle,*blz_base;
2091
+ VALUE ret_blz,ret_idx,ret_suche;
2092
+
2093
+ get_params_int(argc,argv,&such1,&such2);
2094
+ retval=lut_suche_blz(such1,such2,&anzahl,&start_idx,&zweigstelle,&base_name,&blz_base);
2095
+ if(retval==KEY_NOT_FOUND)return rb_ary_new3(5,Qnil,Qnil,Qnil,INT2FIX(retval),INT2FIX(0));
2096
+ if(retval<0)RUNTIME_ERROR(retval);
2097
+ ret_suche=rb_ary_new2(anzahl);
2098
+ ret_blz=rb_ary_new2(anzahl);
2099
+ ret_idx=rb_ary_new2(anzahl);
2100
+ for(i=0;i<anzahl;i++){
2101
+ j=start_idx[i]; /* Index innerhalb der BLZ-Datei */
2102
+ rb_ary_store(ret_suche,i,INT2FIX(base_name[j]));
2103
+ rb_ary_store(ret_blz,i,INT2FIX(blz_base[j]));
2104
+ rb_ary_store(ret_idx,i,INT2FIX(zweigstelle[j]));
2105
+ }
2106
+ return rb_ary_new3(5,ret_suche,ret_blz,ret_idx,INT2FIX(retval),INT2FIX(anzahl));
2107
+ }
2108
+
2109
+ /**
2110
+ * ===<tt>KontoCheckRaw::bank_suche_ort(suchort)</tt>
2111
+ * =====<tt>KontoCheck::suche()</tt>
2112
+ *
2113
+ * Diese Funktion sucht alle Banken, deren Sitz mit dem angegebenen Wert <suchort> beginnen.
2114
+ * Die Rückgabe ist ein Array mit fünf Elementen:
2115
+ *
2116
+ * 0. Das erste Element ist ein Array mit den gefundenen Orten
2117
+ * 1. Das zweite Element ist ein Array mit den Bankleitzahlen, die auf das Suchmuster passen
2118
+ * 2. Das dritte Element ist ein Array mit den Zweigstellen-Indizes der gefundenen Bankleitzahlen
2119
+ * 3. das vierte Element ist der Statuscode (s.u.)
2120
+ * 4. das fünfte Element gibt die Anzahl der gefundenen Banken zurück.
2121
+ *
2122
+ * Mögliche Statuscodes:
2123
+ *
2124
+ * LUT1_FILE_USED "Es wurde eine LUT-Datei im Format 1.0/1.1 geladen"
2125
+ * LUT2_NOT_INITIALIZED "die Programmbibliothek wurde noch nicht initialisiert"
2126
+ * LUT2_ORT_NOT_INITIALIZED "Das Feld Ort wurde nicht initialisiert"
2127
+ * ERROR_MALLOC "kann keinen Speicher allokieren"
2128
+ * KEY_NOT_FOUND "Die Suche lieferte kein Ergebnis"
2129
+ * OK "ok"
2130
+ */
2131
+ static VALUE bank_suche_ort(int argc,VALUE* argv,VALUE self)
2132
+ {
2133
+ char such_name[128],**base_name,error_msg[512];
2134
+ int i,j,retval,anzahl,*start_idx,*zweigstelle,*blz_base;
2135
+ VALUE ret_blz,ret_idx,ret_suche;
2136
+
2137
+ get_params(argc,argv,such_name,NULL,NULL,NULL,3);
2138
+ retval=lut_suche_ort(such_name,&anzahl,&start_idx,&zweigstelle,&base_name,&blz_base);
2139
+ if(retval==KEY_NOT_FOUND)return rb_ary_new3(5,Qnil,Qnil,Qnil,INT2FIX(retval),INT2FIX(0));
2140
+ if(retval<0)RUNTIME_ERROR(retval);
2141
+ ret_suche=rb_ary_new2(anzahl);
2142
+ ret_blz=rb_ary_new2(anzahl);
2143
+ ret_idx=rb_ary_new2(anzahl);
2144
+ for(i=0;i<anzahl;i++){
2145
+ j=start_idx[i]; /* Index innerhalb der BLZ-Datei */
2146
+ rb_ary_store(ret_suche,i,rb_str_new2(base_name[j]));
2147
+ rb_ary_store(ret_blz,i,INT2FIX(blz_base[j]));
2148
+ rb_ary_store(ret_idx,i,INT2FIX(zweigstelle[j]));
2149
+ }
2150
+ return rb_ary_new3(5,ret_suche,ret_blz,ret_idx,INT2FIX(retval),INT2FIX(anzahl));
2151
+ }
2152
+
2153
+ /**
2154
+ * ===<tt>KontoCheckRaw::version()</tt>
2155
+ * =====<tt>KontoCheck::version()</tt>
2156
+ *
2157
+ * Diese Funktion gibt den Versions-String der C-Bibliothek zurück.
2158
+ */
2159
+ static VALUE version_rb(int argc,VALUE* argv,VALUE self)
2160
+ {
2161
+ return rb_str_new2(get_kto_check_version());
2162
+ }
2163
+
2164
+ /**
2165
+ * The initialization method for this module
2166
+ */
2167
+ void Init_konto_check_raw()
2168
+ {
2169
+ /*
2170
+ * This is a C/Ruby library to check the validity of German Bank Account
2171
+ * Numbers. All currently defined test methods by Deutsche Bundesbank (April
2172
+ * 2011: 00 to D8) are implemented.
2173
+ *
2174
+ * <b>ATTENTION:</b> There are a few important changes in the API between version 0.0.2 (version
2175
+ * by Peter Horn/Provideal), version 0.0.6 (jeanmartin) and this version:
2176
+ *
2177
+ * * The function KontoCheck::load_bank_data() is no longer used; it is replaced by KontoCheck::init() and KontoCheck::generate_lutfile().
2178
+ * * The function KontoCheck::konto_check(blz,kto) changed the order of parameters from (kto,blz) to (blz,kto)
2179
+ *
2180
+ * Another change affects only the version 0.0.6 by jeanmartin:
2181
+ *
2182
+ * * In KontoCheck::init(level,name,set) the order of the two first parameters is now free; the order is determined by the type of the variable (level is integer, filename string).
2183
+ *
2184
+ * Because this class is inteded for german bank accounts, the rest of the
2185
+ * documentation is in german too.
2186
+ *
2187
+ * Diese Bibliothek implementiert die Prüfziffertests für deutsche Bankkonten.
2188
+ * Die meisten Konten enthalten eine Prüfziffer; mit dieser kann getestet
2189
+ * werden, ob eine Bankleitzahl plausibel ist oder nicht. Auf diese Weise
2190
+ * können Zahlendreher oder Zifferverdopplungen oft festgestellt werden. Es ist
2191
+ * natürlich nicht möglich, zu bestimmen, ob ein Konto wirklich existiert; dazu
2192
+ * müßte jeweils eine Anfrage bei der Bank gemacht werden ;-).
2193
+ *
2194
+ * Die Bibliothek ist in zwei Teile gesplittet: KontoCheckRaw bildet die
2195
+ * direkte Schnittstelle zur C-Bibliothek und ist daher manchmal etwas sperrig;
2196
+ * KontoCheck ist dagegen mehr Ruby-artig ausgelegt. KontoCheck gibt meist nur
2197
+ * eine Teilmenge von KontoCheckRaw zurück, aber (hoffentlich) die Teile, die
2198
+ * man unmittelbar von den jeweiligen Funktionen erwartet. Eine Reihe einfacher
2199
+ * Funktionen sind auch in beiden Versionen identisch.
2200
+ *
2201
+ * Die Bankleitzahldaten werden in einem eigenen (komprimierten) Format in einer
2202
+ * sogenannten LUT-Datei gespeichert. Diese Datei läßt sich mit der Funktion
2203
+ * KontoCheck::generate_lutfile bzw. KontoCheckRaw::generate_lutfile aus der
2204
+ * Datei der Deutschen Bundesbank (online erhältlich unter
2205
+ * http://www.bundesbank.de/zahlungsverkehr/zahlungsverkehr_bankleitzahlen_download.php)
2206
+ * erzeugen. Die LUT-Datei hat den großen Vorteil, daß die Datenblocks (BLZ,
2207
+ * Prüfziffer, Bankname, Ort, ...) unabhängig voneinander gespeichert sind;
2208
+ * jeder Block kann für sich geladen werden. In einer Datei können zwei
2209
+ * Datensätze der Bundesbank mit unterschiedlichem Gültigkeitsdatum enthalten
2210
+ * sein. Wenn bei der Initialisierung kein bestimmter Datensatz ausgewählt
2211
+ * wird, prüft die Bibliothek aufgrund des mit jedem Datensatz gespeicherten
2212
+ * Gültigkeitszeitraums welcher Satz aktuell gültig ist und lädt diesen dann in
2213
+ * den Speicher.
2214
+ *
2215
+ * Numerische Werte (z.B. Bankleitzahlen, Kontonummern, PLZ,...) können als
2216
+ * Zahlwerte oder als String angegeben werden; sie werden automatisch
2217
+ * konvertiert. Prüfziffermethoden können ebenfalls als Zahl oder String
2218
+ * angegeben werden; die Angabe als Zahl ist allerdings nicht immer eindeutig. So
2219
+ * kann z.B. 131 sowohl für D1 als auch 13a stehen; daher ist es besser, die
2220
+ * Prüfziffermethode als String anzugeben (in diesem Beispiel würde 131 als 13a
2221
+ * interpretiert).
2222
+ */
2223
+ KontoCheck = rb_define_module("KontoCheckRaw");
2224
+
2225
+ /* die Parameteranzahl -1 bei den folgenden Funktionen meint eine variable
2226
+ * Anzahl Parameter; die genaue Anzahl wird bei der Funktion rb_scan_args()
2227
+ * als 3. Parameter angegeben.
2228
+ *
2229
+ * Bei -1 erfolgt die Übergabe als C-Array, bei -2 ist die Übergabe als
2230
+ * Ruby-Array (s. http://karottenreibe.github.com/2009/10/28/ruby-c-extension-5/):
2231
+ *
2232
+ * A positive number means, your function will take just that many
2233
+ * arguments, none less, none more.
2234
+ * -1 means the function takes a variable number of arguments, passed
2235
+ * as a C array.
2236
+ * -2 means the function takes a variable number of arguments, passed
2237
+ * as a Ruby array.
2238
+ *
2239
+ * Was in ext_ruby.pdf (S.39) dazu steht, ist einfach falsch (das hat
2240
+ * mich einige Zeit gekostet):
2241
+ *
2242
+ * In some of the function definitions that follow, the parameter argc
2243
+ * specifies how many arguments a Ruby method takes. It may have the
2244
+ * following values. If the value is not negative, it specifies the
2245
+ * number of arguments the method takes. If negative, it indicates
2246
+ * that the method takes optional arguments. In this case, the
2247
+ * absolute value of argc minus one is the number of required
2248
+ * arguments (so -1 means all arguments are optional, -2 means one
2249
+ * mandatory argument followed by optional arguments, and so on).
2250
+ *
2251
+ * Es wäre zu testen, ob dieses Verhalten bei älteren Versionen gilt;
2252
+ * dann müßte man u.U. eine entsprechende Verzweigung einbauen. Bei den
2253
+ * aktuellen Varianten (Ruby 1.8.6 und 1.9.2) funktioniert diese
2254
+ * Variante.
2255
+ */
2256
+ rb_define_module_function(KontoCheck,"init",init,-1);
2257
+ rb_define_module_function(KontoCheck,"current_lutfile_name",current_lutfile_name_rb,0);
2258
+ rb_define_module_function(KontoCheck,"free",free_rb,0);
2259
+ rb_define_module_function(KontoCheck,"konto_check",konto_check,-1);
2260
+ rb_define_module_function(KontoCheck,"konto_check_pz",konto_check_pz,-1);
2261
+ rb_define_module_function(KontoCheck,"bank_valid",bank_valid,-1);
2262
+ rb_define_module_function(KontoCheck,"bank_filialen",bank_filialen,-1);
2263
+ rb_define_module_function(KontoCheck,"bank_alles",bank_alles,-1);
2264
+ rb_define_module_function(KontoCheck,"bank_name",bank_name,-1);
2265
+ rb_define_module_function(KontoCheck,"bank_name_kurz",bank_name_kurz,-1);
2266
+ rb_define_module_function(KontoCheck,"bank_plz",bank_plz,-1);
2267
+ rb_define_module_function(KontoCheck,"bank_ort",bank_ort,-1);
2268
+ rb_define_module_function(KontoCheck,"bank_pan",bank_pan,-1);
2269
+ rb_define_module_function(KontoCheck,"bank_bic",bank_bic,-1);
2270
+ rb_define_module_function(KontoCheck,"bank_nr",bank_nr,-1);
2271
+ rb_define_module_function(KontoCheck,"bank_pz",bank_pz,-1);
2272
+ rb_define_module_function(KontoCheck,"bank_aenderung",bank_aenderung,-1);
2273
+ rb_define_module_function(KontoCheck,"bank_loeschung",bank_loeschung,-1);
2274
+ rb_define_module_function(KontoCheck,"bank_nachfolge_blz",bank_nachfolge_blz,-1);
2275
+ rb_define_module_function(KontoCheck,"dump_lutfile",dump_lutfile_rb,-1);
2276
+ rb_define_module_function(KontoCheck,"lut_info",lut_info_rb,-1);
2277
+ rb_define_module_function(KontoCheck,"keep_raw_data",keep_raw_data_rb,1);
2278
+ rb_define_module_function(KontoCheck,"encoding",encoding_rb,-1);
2279
+ rb_define_module_function(KontoCheck,"encoding_str",encoding_str_rb,-1);
2280
+ rb_define_module_function(KontoCheck,"retval2txt",retval2txt_rb,1);
2281
+ rb_define_module_function(KontoCheck,"retval2iso",retval2iso_rb,1);
2282
+ rb_define_module_function(KontoCheck,"retval2txt_short",retval2txt_short_rb,1);
2283
+ rb_define_module_function(KontoCheck,"retval2dos",retval2dos_rb,1);
2284
+ rb_define_module_function(KontoCheck,"retval2html",retval2html_rb,1);
2285
+ rb_define_module_function(KontoCheck,"retval2utf8",retval2utf8_rb,1);
2286
+ rb_define_module_function(KontoCheck,"generate_lutfile",generate_lutfile_rb,-1);
2287
+ rb_define_module_function(KontoCheck,"iban_check",iban_check_rb,-1);
2288
+ rb_define_module_function(KontoCheck,"iban2bic",iban2bic_rb,-1);
2289
+ rb_define_module_function(KontoCheck,"iban_gen",iban_gen_rb,-1);
2290
+ rb_define_module_function(KontoCheck,"ipi_gen",ipi_gen_rb,-1);
2291
+ rb_define_module_function(KontoCheck,"ipi_check",ipi_check_rb,-1);
2292
+ rb_define_module_function(KontoCheck,"bank_suche_bic",bank_suche_bic,-1);
2293
+ rb_define_module_function(KontoCheck,"bank_suche_namen",bank_suche_namen,-1);
2294
+ rb_define_module_function(KontoCheck,"bank_suche_namen_kurz",bank_suche_namen_kurz,-1);
2295
+ rb_define_module_function(KontoCheck,"bank_suche_ort",bank_suche_ort,-1);
2296
+ rb_define_module_function(KontoCheck,"bank_suche_blz",bank_suche_blz,-1);
2297
+ rb_define_module_function(KontoCheck,"bank_suche_plz",bank_suche_plz,-1);
2298
+ rb_define_module_function(KontoCheck,"bank_suche_pz",bank_suche_pz,-1);
2299
+ rb_define_module_function(KontoCheck,"version",version_rb,0);
2300
+ rb_define_module_function(KontoCheck,"load_bank_data",load_bank_data,1);
2301
+
2302
+ /* Rückgabewerte der konto_check Bibliothek */
2303
+ /* (-113) das Institut erlaubt keine eigene IBAN-Berechnung */
2304
+ rb_define_const(KontoCheck,"NO_OWN_IBAN_CALCULATION",INT2FIX(NO_OWN_IBAN_CALCULATION));
2305
+ /* (-112) die notwendige Kompressions-Bibliothek wurden beim Kompilieren nicht eingebunden */
2306
+ rb_define_const(KontoCheck,"KTO_CHECK_UNSUPPORTED_COMPRESSION",INT2FIX(KTO_CHECK_UNSUPPORTED_COMPRESSION));
2307
+ /* (-111) der angegebene Wert für die Default-Kompression ist ungültig */
2308
+ rb_define_const(KontoCheck,"KTO_CHECK_INVALID_COMPRESSION_LIB",INT2FIX(KTO_CHECK_INVALID_COMPRESSION_LIB));
2309
+ /* (-110) wahrscheinlich OK; es wurde allerdings ein (weggelassenes) Unterkonto angefügt */
2310
+ rb_define_const(KontoCheck,"OK_UNTERKONTO_ATTACHED",INT2FIX(OK_UNTERKONTO_ATTACHED));
2311
+ /* (-109) Ungültige Signatur im Default-Block */
2312
+ rb_define_const(KontoCheck,"KTO_CHECK_DEFAULT_BLOCK_INVALID",INT2FIX(KTO_CHECK_DEFAULT_BLOCK_INVALID));
2313
+ /* (-108) Die maximale Anzahl Einträge für den Default-Block wurde erreicht */
2314
+ rb_define_const(KontoCheck,"KTO_CHECK_DEFAULT_BLOCK_FULL",INT2FIX(KTO_CHECK_DEFAULT_BLOCK_FULL));
2315
+ /* (-107) Es wurde noch kein Default-Block angelegt */
2316
+ rb_define_const(KontoCheck,"KTO_CHECK_NO_DEFAULT_BLOCK",INT2FIX(KTO_CHECK_NO_DEFAULT_BLOCK));
2317
+ /* (-106) Der angegebene Schlüssel wurde im Default-Block nicht gefunden */
2318
+ rb_define_const(KontoCheck,"KTO_CHECK_KEY_NOT_FOUND",INT2FIX(KTO_CHECK_KEY_NOT_FOUND));
2319
+ /* (-105) Beide Datensätze sind nicht mehr gültig; dieser ist aber jünger als der andere */
2320
+ rb_define_const(KontoCheck,"LUT2_NO_LONGER_VALID_BETTER",INT2FIX(LUT2_NO_LONGER_VALID_BETTER));
2321
+ /* (-104) Die Auftraggeber-Kontonummer des C-Datensatzes unterscheidet sich von der des A-Satzes */
2322
+ rb_define_const(KontoCheck,"DTA_SRC_KTO_DIFFERENT",INT2FIX(DTA_SRC_KTO_DIFFERENT));
2323
+ /* (-103) Die Auftraggeber-Bankleitzahl des C-Datensatzes unterscheidet sich von der des A-Satzes */
2324
+ rb_define_const(KontoCheck,"DTA_SRC_BLZ_DIFFERENT",INT2FIX(DTA_SRC_BLZ_DIFFERENT));
2325
+ /* (-102) Die DTA-Datei enthält (unzulässige) Zeilenvorschübe */
2326
+ rb_define_const(KontoCheck,"DTA_CR_LF_IN_FILE",INT2FIX(DTA_CR_LF_IN_FILE));
2327
+ /* (-101) ungültiger Typ bei einem Erweiterungsblock eines C-Datensatzes */
2328
+ rb_define_const(KontoCheck,"DTA_INVALID_C_EXTENSION",INT2FIX(DTA_INVALID_C_EXTENSION));
2329
+ /* (-100) Es wurde ein C-Datensatz erwartet, jedoch ein E-Satz gefunden */
2330
+ rb_define_const(KontoCheck,"DTA_FOUND_SET_A_NOT_C",INT2FIX(DTA_FOUND_SET_A_NOT_C));
2331
+ /* (-99) Es wurde ein C-Datensatz erwartet, jedoch ein E-Satz gefunden */
2332
+ rb_define_const(KontoCheck,"DTA_FOUND_SET_E_NOT_C",INT2FIX(DTA_FOUND_SET_E_NOT_C));
2333
+ /* (-98) Es wurde ein C-Datensatzerweiterung erwartet, jedoch ein C-Satz gefunden */
2334
+ rb_define_const(KontoCheck,"DTA_FOUND_SET_C_NOT_EXTENSION",INT2FIX(DTA_FOUND_SET_C_NOT_EXTENSION));
2335
+ /* (-97) Es wurde ein C-Datensatzerweiterung erwartet, jedoch ein E-Satz gefunden */
2336
+ rb_define_const(KontoCheck,"DTA_FOUND_SET_E_NOT_EXTENSION",INT2FIX(DTA_FOUND_SET_E_NOT_EXTENSION));
2337
+ /* (-96) Die Anzahl Erweiterungen paßt nicht zur Blocklänge */
2338
+ rb_define_const(KontoCheck,"DTA_INVALID_EXTENSION_COUNT",INT2FIX(DTA_INVALID_EXTENSION_COUNT));
2339
+ /* (-95) Ungültige Zeichen in numerischem Feld */
2340
+ rb_define_const(KontoCheck,"DTA_INVALID_NUM",INT2FIX(DTA_INVALID_NUM));
2341
+ /* (-94) Ungültige Zeichen im Textfeld */
2342
+ rb_define_const(KontoCheck,"DTA_INVALID_CHARS",INT2FIX(DTA_INVALID_CHARS));
2343
+ /* (-93) Die Währung des DTA-Datensatzes ist nicht Euro */
2344
+ rb_define_const(KontoCheck,"DTA_CURRENCY_NOT_EURO",INT2FIX(DTA_CURRENCY_NOT_EURO));
2345
+ /* (-92) In einem DTA-Datensatz wurde kein Betrag angegeben */
2346
+ rb_define_const(KontoCheck,"DTA_EMPTY_AMOUNT",INT2FIX(DTA_EMPTY_AMOUNT));
2347
+ /* (-91) Ungültiger Textschlüssel in der DTA-Datei */
2348
+ rb_define_const(KontoCheck,"DTA_INVALID_TEXT_KEY",INT2FIX(DTA_INVALID_TEXT_KEY));
2349
+ /* (-90) Für ein (alphanumerisches) Feld wurde kein Wert angegeben */
2350
+ rb_define_const(KontoCheck,"DTA_EMPTY_STRING",INT2FIX(DTA_EMPTY_STRING));
2351
+ /* (-89) Die Startmarkierung des A-Datensatzes wurde nicht gefunden */
2352
+ rb_define_const(KontoCheck,"DTA_MARKER_A_NOT_FOUND",INT2FIX(DTA_MARKER_A_NOT_FOUND));
2353
+ /* (-88) Die Startmarkierung des C-Datensatzes wurde nicht gefunden */
2354
+ rb_define_const(KontoCheck,"DTA_MARKER_C_NOT_FOUND",INT2FIX(DTA_MARKER_C_NOT_FOUND));
2355
+ /* (-87) Die Startmarkierung des E-Datensatzes wurde nicht gefunden */
2356
+ rb_define_const(KontoCheck,"DTA_MARKER_E_NOT_FOUND",INT2FIX(DTA_MARKER_E_NOT_FOUND));
2357
+ /* (-86) Die Satzlänge eines C-Datensatzes muß zwischen 187 und 622 Byte betragen */
2358
+ rb_define_const(KontoCheck,"DTA_INVALID_SET_C_LEN",INT2FIX(DTA_INVALID_SET_C_LEN));
2359
+ /* (-85) Die Satzlänge eines A- bzw. E-Satzes muß 128 Byte betragen */
2360
+ rb_define_const(KontoCheck,"DTA_INVALID_SET_LEN",INT2FIX(DTA_INVALID_SET_LEN));
2361
+ /* (-84) als Währung in der DTA-Datei ist nicht Euro eingetragen */
2362
+ rb_define_const(KontoCheck,"DTA_WAERUNG_NOT_EURO",INT2FIX(DTA_WAERUNG_NOT_EURO));
2363
+ /* (-83) das Ausführungsdatum ist zu früh oder zu spät (max. 15 Tage nach Dateierstellung) */
2364
+ rb_define_const(KontoCheck,"DTA_INVALID_ISSUE_DATE",INT2FIX(DTA_INVALID_ISSUE_DATE));
2365
+ /* (-82) das Datum ist ungültig */
2366
+ rb_define_const(KontoCheck,"DTA_INVALID_DATE",INT2FIX(DTA_INVALID_DATE));
2367
+ /* (-81) Formatfehler in der DTA-Datei */
2368
+ rb_define_const(KontoCheck,"DTA_FORMAT_ERROR",INT2FIX(DTA_FORMAT_ERROR));
2369
+ /* (-80) die DTA-Datei enthält Fehler */
2370
+ rb_define_const(KontoCheck,"DTA_FILE_WITH_ERRORS",INT2FIX(DTA_FILE_WITH_ERRORS));
2371
+ /* (-79) ungültiger Suchbereich angegeben (unten>oben) */
2372
+ rb_define_const(KontoCheck,"INVALID_SEARCH_RANGE",INT2FIX(INVALID_SEARCH_RANGE));
2373
+ /* (-78) Die Suche lieferte kein Ergebnis */
2374
+ rb_define_const(KontoCheck,"KEY_NOT_FOUND",INT2FIX(KEY_NOT_FOUND));
2375
+ /* (-77) BAV denkt, das Konto ist falsch (konto_check hält es für richtig) */
2376
+ rb_define_const(KontoCheck,"BAV_FALSE",INT2FIX(BAV_FALSE));
2377
+ /* (-76) User-Blocks müssen einen Typ > 500 haben */
2378
+ rb_define_const(KontoCheck,"LUT2_NO_USER_BLOCK",INT2FIX(LUT2_NO_USER_BLOCK));
2379
+ /* (-75) für ein LUT-Set sind nur die Werte 0, 1 oder 2 möglich */
2380
+ rb_define_const(KontoCheck,"INVALID_SET",INT2FIX(INVALID_SET));
2381
+ /* (-74) Ein Konto kann kann nur für deutsche Banken geprüft werden */
2382
+ rb_define_const(KontoCheck,"NO_GERMAN_BIC",INT2FIX(NO_GERMAN_BIC));
2383
+ /* (-73) Der zu validierende strukturierete Verwendungszweck muß genau 20 Zeichen enthalten */
2384
+ rb_define_const(KontoCheck,"IPI_CHECK_INVALID_LENGTH",INT2FIX(IPI_CHECK_INVALID_LENGTH));
2385
+ /* (-72) Im strukturierten Verwendungszweck dürfen nur alphanumerische Zeichen vorkommen */
2386
+ rb_define_const(KontoCheck,"IPI_INVALID_CHARACTER",INT2FIX(IPI_INVALID_CHARACTER));
2387
+ /* (-71) Die Länge des IPI-Verwendungszwecks darf maximal 18 Byte sein */
2388
+ rb_define_const(KontoCheck,"IPI_INVALID_LENGTH",INT2FIX(IPI_INVALID_LENGTH));
2389
+ /* (-70) Es wurde eine LUT-Datei im Format 1.0/1.1 geladen */
2390
+ rb_define_const(KontoCheck,"LUT1_FILE_USED",INT2FIX(LUT1_FILE_USED));
2391
+ /* (-69) Bei der Kontoprüfung fehlt ein notwendiger Parameter (BLZ oder Konto) */
2392
+ rb_define_const(KontoCheck,"MISSING_PARAMETER",INT2FIX(MISSING_PARAMETER));
2393
+ /* (-68) Die Funktion iban2bic() arbeitet nur mit deutschen Bankleitzahlen */
2394
+ rb_define_const(KontoCheck,"IBAN2BIC_ONLY_GERMAN",INT2FIX(IBAN2BIC_ONLY_GERMAN));
2395
+ /* (-67) Die Prüfziffer der IBAN stimmt, die der Kontonummer nicht */
2396
+ rb_define_const(KontoCheck,"IBAN_OK_KTO_NOT",INT2FIX(IBAN_OK_KTO_NOT));
2397
+ /* (-66) Die Prüfziffer der Kontonummer stimmt, die der IBAN nicht */
2398
+ rb_define_const(KontoCheck,"KTO_OK_IBAN_NOT",INT2FIX(KTO_OK_IBAN_NOT));
2399
+ /* (-65) Es sind nur maximal 500 Slots pro LUT-Datei möglich (Neukompilieren erforderlich) */
2400
+ rb_define_const(KontoCheck,"TOO_MANY_SLOTS",INT2FIX(TOO_MANY_SLOTS));
2401
+ /* (-64) Initialisierung fehlgeschlagen (init_wait geblockt) */
2402
+ rb_define_const(KontoCheck,"INIT_FATAL_ERROR",INT2FIX(INIT_FATAL_ERROR));
2403
+ /* (-63) Ein inkrementelles Initialisieren benötigt einen Info-Block in der LUT-Datei */
2404
+ rb_define_const(KontoCheck,"INCREMENTAL_INIT_NEEDS_INFO",INT2FIX(INCREMENTAL_INIT_NEEDS_INFO));
2405
+ /* (-62) Ein inkrementelles Initialisieren mit einer anderen LUT-Datei ist nicht möglich */
2406
+ rb_define_const(KontoCheck,"INCREMENTAL_INIT_FROM_DIFFERENT_FILE",INT2FIX(INCREMENTAL_INIT_FROM_DIFFERENT_FILE));
2407
+ /* (-61) Die Funktion ist nur in der Debug-Version vorhanden */
2408
+ rb_define_const(KontoCheck,"DEBUG_ONLY_FUNCTION",INT2FIX(DEBUG_ONLY_FUNCTION));
2409
+ /* (-60) Kein Datensatz der LUT-Datei ist aktuell gültig */
2410
+ rb_define_const(KontoCheck,"LUT2_INVALID",INT2FIX(LUT2_INVALID));
2411
+ /* (-59) Der Datensatz ist noch nicht gültig */
2412
+ rb_define_const(KontoCheck,"LUT2_NOT_YET_VALID",INT2FIX(LUT2_NOT_YET_VALID));
2413
+ /* (-58) Der Datensatz ist nicht mehr gültig */
2414
+ rb_define_const(KontoCheck,"LUT2_NO_LONGER_VALID",INT2FIX(LUT2_NO_LONGER_VALID));
2415
+ /* (-57) Im Gültigkeitsdatum sind Anfangs- und Enddatum vertauscht */
2416
+ rb_define_const(KontoCheck,"LUT2_GUELTIGKEIT_SWAPPED",INT2FIX(LUT2_GUELTIGKEIT_SWAPPED));
2417
+ /* (-56) Das angegebene Gültigkeitsdatum ist ungültig (Soll: JJJJMMTT-JJJJMMTT) */
2418
+ rb_define_const(KontoCheck,"LUT2_INVALID_GUELTIGKEIT",INT2FIX(LUT2_INVALID_GUELTIGKEIT));
2419
+ /* (-55) Der Index für die Filiale ist ungültig */
2420
+ rb_define_const(KontoCheck,"LUT2_INDEX_OUT_OF_RANGE",INT2FIX(LUT2_INDEX_OUT_OF_RANGE));
2421
+ /* (-54) Die Bibliothek wird gerade neu initialisiert */
2422
+ rb_define_const(KontoCheck,"LUT2_INIT_IN_PROGRESS",INT2FIX(LUT2_INIT_IN_PROGRESS));
2423
+ /* (-53) Das Feld BLZ wurde nicht initialisiert */
2424
+ rb_define_const(KontoCheck,"LUT2_BLZ_NOT_INITIALIZED",INT2FIX(LUT2_BLZ_NOT_INITIALIZED));
2425
+ /* (-52) Das Feld Filialen wurde nicht initialisiert */
2426
+ rb_define_const(KontoCheck,"LUT2_FILIALEN_NOT_INITIALIZED",INT2FIX(LUT2_FILIALEN_NOT_INITIALIZED));
2427
+ /* (-51) Das Feld Bankname wurde nicht initialisiert */
2428
+ rb_define_const(KontoCheck,"LUT2_NAME_NOT_INITIALIZED",INT2FIX(LUT2_NAME_NOT_INITIALIZED));
2429
+ /* (-50) Das Feld PLZ wurde nicht initialisiert */
2430
+ rb_define_const(KontoCheck,"LUT2_PLZ_NOT_INITIALIZED",INT2FIX(LUT2_PLZ_NOT_INITIALIZED));
2431
+ /* (-49) Das Feld Ort wurde nicht initialisiert */
2432
+ rb_define_const(KontoCheck,"LUT2_ORT_NOT_INITIALIZED",INT2FIX(LUT2_ORT_NOT_INITIALIZED));
2433
+ /* (-48) Das Feld Kurzname wurde nicht initialisiert */
2434
+ rb_define_const(KontoCheck,"LUT2_NAME_KURZ_NOT_INITIALIZED",INT2FIX(LUT2_NAME_KURZ_NOT_INITIALIZED));
2435
+ /* (-47) Das Feld PAN wurde nicht initialisiert */
2436
+ rb_define_const(KontoCheck,"LUT2_PAN_NOT_INITIALIZED",INT2FIX(LUT2_PAN_NOT_INITIALIZED));
2437
+ /* (-46) Das Feld BIC wurde nicht initialisiert */
2438
+ rb_define_const(KontoCheck,"LUT2_BIC_NOT_INITIALIZED",INT2FIX(LUT2_BIC_NOT_INITIALIZED));
2439
+ /* (-45) Das Feld Prüfziffer wurde nicht initialisiert */
2440
+ rb_define_const(KontoCheck,"LUT2_PZ_NOT_INITIALIZED",INT2FIX(LUT2_PZ_NOT_INITIALIZED));
2441
+ /* (-44) Das Feld NR wurde nicht initialisiert */
2442
+ rb_define_const(KontoCheck,"LUT2_NR_NOT_INITIALIZED",INT2FIX(LUT2_NR_NOT_INITIALIZED));
2443
+ /* (-43) Das Feld Änderung wurde nicht initialisiert */
2444
+ rb_define_const(KontoCheck,"LUT2_AENDERUNG_NOT_INITIALIZED",INT2FIX(LUT2_AENDERUNG_NOT_INITIALIZED));
2445
+ /* (-42) Das Feld Löschung wurde nicht initialisiert */
2446
+ rb_define_const(KontoCheck,"LUT2_LOESCHUNG_NOT_INITIALIZED",INT2FIX(LUT2_LOESCHUNG_NOT_INITIALIZED));
2447
+ /* (-41) Das Feld Nachfolge-BLZ wurde nicht initialisiert */
2448
+ rb_define_const(KontoCheck,"LUT2_NACHFOLGE_BLZ_NOT_INITIALIZED",INT2FIX(LUT2_NACHFOLGE_BLZ_NOT_INITIALIZED));
2449
+ /* (-40) die Programmbibliothek wurde noch nicht initialisiert */
2450
+ rb_define_const(KontoCheck,"LUT2_NOT_INITIALIZED",INT2FIX(LUT2_NOT_INITIALIZED));
2451
+ /* (-39) der Block mit der Filialenanzahl fehlt in der LUT-Datei */
2452
+ rb_define_const(KontoCheck,"LUT2_FILIALEN_MISSING",INT2FIX(LUT2_FILIALEN_MISSING));
2453
+ /* (-38) es wurden nicht alle Blocks geladen */
2454
+ rb_define_const(KontoCheck,"LUT2_PARTIAL_OK",INT2FIX(LUT2_PARTIAL_OK));
2455
+ /* (-37) Buffer error in den ZLIB Routinen */
2456
+ rb_define_const(KontoCheck,"LUT2_Z_BUF_ERROR",INT2FIX(LUT2_Z_BUF_ERROR));
2457
+ /* (-36) Memory error in den ZLIB-Routinen */
2458
+ rb_define_const(KontoCheck,"LUT2_Z_MEM_ERROR",INT2FIX(LUT2_Z_MEM_ERROR));
2459
+ /* (-35) Datenfehler im komprimierten LUT-Block */
2460
+ rb_define_const(KontoCheck,"LUT2_Z_DATA_ERROR",INT2FIX(LUT2_Z_DATA_ERROR));
2461
+ /* (-34) Der Block ist nicht in der LUT-Datei enthalten */
2462
+ rb_define_const(KontoCheck,"LUT2_BLOCK_NOT_IN_FILE",INT2FIX(LUT2_BLOCK_NOT_IN_FILE));
2463
+ /* (-33) Fehler beim Dekomprimieren eines LUT-Blocks */
2464
+ rb_define_const(KontoCheck,"LUT2_DECOMPRESS_ERROR",INT2FIX(LUT2_DECOMPRESS_ERROR));
2465
+ /* (-32) Fehler beim Komprimieren eines LUT-Blocks */
2466
+ rb_define_const(KontoCheck,"LUT2_COMPRESS_ERROR",INT2FIX(LUT2_COMPRESS_ERROR));
2467
+ /* (-31) Die LUT-Datei ist korrumpiert */
2468
+ rb_define_const(KontoCheck,"LUT2_FILE_CORRUPTED",INT2FIX(LUT2_FILE_CORRUPTED));
2469
+ /* (-30) Im Inhaltsverzeichnis der LUT-Datei ist kein Slot mehr frei */
2470
+ rb_define_const(KontoCheck,"LUT2_NO_SLOT_FREE",INT2FIX(LUT2_NO_SLOT_FREE));
2471
+ /* (-29) Die (Unter)Methode ist nicht definiert */
2472
+ rb_define_const(KontoCheck,"UNDEFINED_SUBMETHOD",INT2FIX(UNDEFINED_SUBMETHOD));
2473
+ /* (-28) Der benötigte Programmteil wurde beim Kompilieren deaktiviert */
2474
+ rb_define_const(KontoCheck,"EXCLUDED_AT_COMPILETIME",INT2FIX(EXCLUDED_AT_COMPILETIME));
2475
+ /* (-27) Die Versionsnummer für die LUT-Datei ist ungültig */
2476
+ rb_define_const(KontoCheck,"INVALID_LUT_VERSION",INT2FIX(INVALID_LUT_VERSION));
2477
+ /* (-26) ungültiger Prüfparameter (erste zu prüfende Stelle) */
2478
+ rb_define_const(KontoCheck,"INVALID_PARAMETER_STELLE1",INT2FIX(INVALID_PARAMETER_STELLE1));
2479
+ /* (-25) ungültiger Prüfparameter (Anzahl zu prüfender Stellen) */
2480
+ rb_define_const(KontoCheck,"INVALID_PARAMETER_COUNT",INT2FIX(INVALID_PARAMETER_COUNT));
2481
+ /* (-24) ungültiger Prüfparameter (Position der Prüfziffer) */
2482
+ rb_define_const(KontoCheck,"INVALID_PARAMETER_PRUEFZIFFER",INT2FIX(INVALID_PARAMETER_PRUEFZIFFER));
2483
+ /* (-23) ungültiger Prüfparameter (Wichtung) */
2484
+ rb_define_const(KontoCheck,"INVALID_PARAMETER_WICHTUNG",INT2FIX(INVALID_PARAMETER_WICHTUNG));
2485
+ /* (-22) ungültiger Prüfparameter (Rechenmethode) */
2486
+ rb_define_const(KontoCheck,"INVALID_PARAMETER_METHODE",INT2FIX(INVALID_PARAMETER_METHODE));
2487
+ /* (-21) Problem beim Initialisieren der globalen Variablen */
2488
+ rb_define_const(KontoCheck,"LIBRARY_INIT_ERROR",INT2FIX(LIBRARY_INIT_ERROR));
2489
+ /* (-20) Prüfsummenfehler in der blz.lut Datei */
2490
+ rb_define_const(KontoCheck,"LUT_CRC_ERROR",INT2FIX(LUT_CRC_ERROR));
2491
+ /* (-19) falsch (die BLZ wurde außerdem gelöscht) */
2492
+ rb_define_const(KontoCheck,"FALSE_GELOESCHT",INT2FIX(FALSE_GELOESCHT));
2493
+ /* (-18) ok, ohne Prüfung (die BLZ wurde allerdings gelöscht) */
2494
+ rb_define_const(KontoCheck,"OK_NO_CHK_GELOESCHT",INT2FIX(OK_NO_CHK_GELOESCHT));
2495
+ /* (-17) ok (die BLZ wurde allerdings gelöscht) */
2496
+ rb_define_const(KontoCheck,"OK_GELOESCHT",INT2FIX(OK_GELOESCHT));
2497
+ /* (-16) die Bankleitzahl wurde gelöscht */
2498
+ rb_define_const(KontoCheck,"BLZ_GELOESCHT",INT2FIX(BLZ_GELOESCHT));
2499
+ /* (-15) Fehler in der blz.txt Datei (falsche Zeilenlänge) */
2500
+ rb_define_const(KontoCheck,"INVALID_BLZ_FILE",INT2FIX(INVALID_BLZ_FILE));
2501
+ /* (-14) undefinierte Funktion; die library wurde mit THREAD_SAFE=0 kompiliert */
2502
+ rb_define_const(KontoCheck,"LIBRARY_IS_NOT_THREAD_SAFE",INT2FIX(LIBRARY_IS_NOT_THREAD_SAFE));
2503
+ /* (-13) schwerer Fehler im Konto_check-Modul */
2504
+ rb_define_const(KontoCheck,"FATAL_ERROR",INT2FIX(FATAL_ERROR));
2505
+ /* (-12) ein Konto muß zwischen 1 und 10 Stellen haben */
2506
+ rb_define_const(KontoCheck,"INVALID_KTO_LENGTH",INT2FIX(INVALID_KTO_LENGTH));
2507
+ /* (-11) kann Datei nicht schreiben */
2508
+ rb_define_const(KontoCheck,"FILE_WRITE_ERROR",INT2FIX(FILE_WRITE_ERROR));
2509
+ /* (-10) kann Datei nicht lesen */
2510
+ rb_define_const(KontoCheck,"FILE_READ_ERROR",INT2FIX(FILE_READ_ERROR));
2511
+ /* (-9) kann keinen Speicher allokieren */
2512
+ rb_define_const(KontoCheck,"ERROR_MALLOC",INT2FIX(ERROR_MALLOC));
2513
+ /* (-8) die blz.txt Datei wurde nicht gefunden */
2514
+ rb_define_const(KontoCheck,"NO_BLZ_FILE",INT2FIX(NO_BLZ_FILE));
2515
+ /* (-7) die blz.lut Datei ist inkosistent/ungültig */
2516
+ rb_define_const(KontoCheck,"INVALID_LUT_FILE",INT2FIX(INVALID_LUT_FILE));
2517
+ /* (-6) die blz.lut Datei wurde nicht gefunden */
2518
+ rb_define_const(KontoCheck,"NO_LUT_FILE",INT2FIX(NO_LUT_FILE));
2519
+ /* (-5) die Bankleitzahl ist nicht achtstellig */
2520
+ rb_define_const(KontoCheck,"INVALID_BLZ_LENGTH",INT2FIX(INVALID_BLZ_LENGTH));
2521
+ /* (-4) die Bankleitzahl ist ungültig */
2522
+ rb_define_const(KontoCheck,"INVALID_BLZ",INT2FIX(INVALID_BLZ));
2523
+ /* (-3) das Konto ist ungültig */
2524
+ rb_define_const(KontoCheck,"INVALID_KTO",INT2FIX(INVALID_KTO));
2525
+ /* (-2) die Methode wurde noch nicht implementiert */
2526
+ rb_define_const(KontoCheck,"NOT_IMPLEMENTED",INT2FIX(NOT_IMPLEMENTED));
2527
+ /* (-1) die Methode ist nicht definiert */
2528
+ rb_define_const(KontoCheck,"NOT_DEFINED",INT2FIX(NOT_DEFINED));
2529
+ /* (0) falsch */
2530
+ rb_define_const(KontoCheck,"FALSE",INT2FIX(FALSE));
2531
+ /* (1) ok */
2532
+ rb_define_const(KontoCheck,"OK",INT2FIX(OK));
2533
+ /* (2) ok, ohne Prüfung */
2534
+ rb_define_const(KontoCheck,"OK_NO_CHK",INT2FIX(OK_NO_CHK));
2535
+ /* (3) ok; für den Test wurde eine Test-BLZ verwendet */
2536
+ rb_define_const(KontoCheck,"OK_TEST_BLZ_USED",INT2FIX(OK_TEST_BLZ_USED));
2537
+ /* (4) Der Datensatz ist aktuell gültig */
2538
+ rb_define_const(KontoCheck,"LUT2_VALID",INT2FIX(LUT2_VALID));
2539
+ /* (5) Der Datensatz enthält kein Gültigkeitsdatum */
2540
+ rb_define_const(KontoCheck,"LUT2_NO_VALID_DATE",INT2FIX(LUT2_NO_VALID_DATE));
2541
+ /* (6) Die Datei ist im alten LUT-Format (1.0/1.1) */
2542
+ rb_define_const(KontoCheck,"LUT1_SET_LOADED",INT2FIX(LUT1_SET_LOADED));
2543
+ /* (7) ok; es wurde allerdings eine LUT-Datei im alten Format (1.0/1.1) generiert */
2544
+ rb_define_const(KontoCheck,"LUT1_FILE_GENERATED",INT2FIX(LUT1_FILE_GENERATED));
2545
+ /* (8) In der DTAUS-Datei wurden kleinere Fehler gefunden */
2546
+ rb_define_const(KontoCheck,"DTA_FILE_WITH_WARNINGS",INT2FIX(DTA_FILE_WITH_WARNINGS));
2547
+ /* (9) ok; es wurde allerdings eine LUT-Datei im Format 2.0 generiert (Compilerswitch) */
2548
+ rb_define_const(KontoCheck,"LUT_V2_FILE_GENERATED",INT2FIX(LUT_V2_FILE_GENERATED));
2549
+ /* (10) ok; der Wert für den Schlüssel wurde überschrieben */
2550
+ rb_define_const(KontoCheck,"KTO_CHECK_VALUE_REPLACED",INT2FIX(KTO_CHECK_VALUE_REPLACED));
2551
+ /* (11) wahrscheinlich ok; die Kontonummer kann allerdings (nicht angegebene) Unterkonten enthalten */
2552
+ rb_define_const(KontoCheck,"OK_UNTERKONTO_POSSIBLE",INT2FIX(OK_UNTERKONTO_POSSIBLE));
2553
+ /* (12) wahrscheinlich ok; die Kontonummer enthält eine Unterkontonummer */
2554
+ rb_define_const(KontoCheck,"OK_UNTERKONTO_GIVEN",INT2FIX(OK_UNTERKONTO_GIVEN));
2555
+ /* (13) ok; die Anzahl Slots wurde auf SLOT_CNT_MIN hochgesetzt */
2556
+ rb_define_const(KontoCheck,"OK_SLOT_CNT_MIN_USED",INT2FIX(OK_SLOT_CNT_MIN_USED));
2557
+ }