konto_check 0.0.2 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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
+ }