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