konto_check 0.0.2 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +21 -0
- data/README.textile +595 -18
- data/Rakefile +15 -8
- data/VERSION.yml +2 -2
- data/ext/{konto_check → konto_check_raw}/extconf.rb +3 -1
- data/ext/{konto_check → konto_check_raw}/konto_check.c +6058 -2679
- data/ext/{konto_check → konto_check_raw}/konto_check.h +220 -43
- data/ext/konto_check_raw/konto_check_raw_ruby.c +2557 -0
- data/init.rb +1 -0
- data/konto_check.gemspec +25 -29
- data/lib/konto_check.rb +976 -0
- metadata +24 -28
- data/.document +0 -5
- data/.gitignore +0 -25
- data/ext/konto_check/konto_check_ruby.c +0 -129
@@ -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-
|
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
|
-
* #
|
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.
|
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
|
-
#
|
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
|
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
|
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 **
|
638
|
-
DLL_EXPORT int lut_suche_namen(char *such_name,int *anzahl,int **start_idx,int **
|
639
|
-
DLL_EXPORT int lut_suche_namen_kurz(char *such_name,int *anzahl,int **start_idx,int **
|
640
|
-
DLL_EXPORT int lut_suche_ort(char *such_name,int *anzahl,int **start_idx,int **
|
641
|
-
DLL_EXPORT int lut_suche_blz(int such1,int such2,int *anzahl,int **start_idx,int **
|
642
|
-
DLL_EXPORT int lut_suche_pz(int such1,int such2,int *anzahl,int **start_idx,int **
|
643
|
-
DLL_EXPORT int lut_suche_plz(int such1,int such2,int *anzahl,int **start_idx,int **
|
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
|
657
|
-
DLL_EXPORT
|
658
|
-
DLL_EXPORT char *
|
659
|
-
DLL_EXPORT char *
|
660
|
-
DLL_EXPORT char *
|
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;
|
685
|
-
DLL_EXPORT_V extern const char pz_str[];
|
686
|
-
DLL_EXPORT_V extern int pz_methode;
|
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;
|
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
|
+
}
|