X-Git-Url: https://git.infodrom.org/?p=infodrom%2Fdtaus;a=blobdiff_plain;f=dtaus.c;h=7c7ea71455cfe64fba277eca521afc3881711403;hp=ec2c48719eb9a6216eb8ccaa665519e7e41fe2c4;hb=3d273cb142348440d9f53bbd5f95de342c836300;hpb=b58d88d471d4d1e6d273bae057e2370595f67f5b diff --git a/dtaus.c b/dtaus.c index ec2c487..7c7ea71 100644 --- a/dtaus.c +++ b/dtaus.c @@ -1,6 +1,6 @@ /* - dtaus.c - Datenträgeraustausch mit einer Bank - Copyright (c) 1996,8,2001 Martin Schulze + dtaus.c - Belegloser Datenträgeraustausch mit einer Bank + Copyright (c) 1996,8,2001,2 Martin Schulze This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -28,6 +28,11 @@ #include #include +#define DEFAULT_EURO +#ifndef DEFAULT_EURO +int use_euro = 0; +#endif + /* * First: Some control structures */ @@ -55,6 +60,7 @@ dtaus_record recA[] = { {"BLZ", 7, 8, REQ}, {"Referenz", 70, 10, OPT}, {"Datum", 50, 6, IGN}, + {"Ausfuehrung", 95, 8, OPT}, {"Euro", 127, 1, OPT}, {NULL, 0, 0} }; @@ -65,15 +71,20 @@ dtaus_record recA[] = { #define A_BLZ 3 #define A_REF 4 #define A_DATE 5 -#define A_EURO 6 -#define A_LEN 7 +#define A_TODO 6 +#define A_EURO 7 +#define A_LEN 8 dtaus_record recC[] = { {"Name", 93, 27, REQ}, {"Konto", 21, 10, REQ}, {"BLZ", 13, 8, REQ}, {"Transaktion", 44, 5, REQ}, +#ifndef DEFAULT_EURO {"Betrag", 50, 11, REQ}, +#else + {"Betrag", 79, 11, REQ}, +#endif {"Zweck", 155, 27, REQ}, {"myName", 128, 27, OPT}, {"myKonto", 69, 10, OPT}, @@ -81,6 +92,9 @@ dtaus_record recC[] = { {"Euro", 182, 1, IGN}, {"Text", 187, 29, OPT}, {"Extension", 216, 29, OPT}, +#ifndef DEFAULT_EURO + {"Betrag-Euro", 79, 11, IGN}, +#endif {NULL, 0, 0} }; @@ -96,15 +110,27 @@ dtaus_record recC[] = { #define C_EURO 9 #define C_TEXT 10 #define C_EXT 11 +#ifndef DEFAULT_EURO +#define C_EUR 12 +#define C_LEN 13 +#else #define C_LEN 12 +#endif -#define MAX_TEXT 61 +#define MAX_TEXT 14 dtaus_record recE[] = { {"Anzahl", 10, 7, IGN}, +#ifndef DEFAULT_EURO {"Summe", 17, 13, IGN}, +#else + {"Summe", 64, 13, IGN}, +#endif {"Kontos", 30, 17, IGN}, {"BLZs", 47, 17, IGN}, +#ifndef DEFAULT_EURO + {"Summe-Euro", 64, 13, IGN}, +#endif {NULL, 0, 0} }; @@ -112,7 +138,9 @@ dtaus_record recE[] = { #define E_VAL 1 #define E_KTO 2 #define E_BLZ 3 -#define E_LEN 0 +#ifndef DEFAULT_EURO +#define E_EUR 4 +#endif /* * Second: Some low level routines @@ -120,7 +148,7 @@ dtaus_record recE[] = { size_t dtaus_nextrec (void **buf, FILE *f) { - bzero (buf, 128); + memset (buf, 0, 128); return fread(buf, 128, 1, f); } @@ -206,7 +234,7 @@ char *strip_nondigits (char *s) char dtaus_char (void *buf, unsigned int pos) { static char res; - char *bufp = buf; + char *bufp = (char *)buf; bufp+=pos; memcpy(&res, bufp, 1); @@ -318,7 +346,7 @@ char *ext2string (char *s) unsigned long int dtaus_int(void *buf, unsigned int pos, unsigned int len) { char tmp[30]; - char *bufp = buf; + char *bufp = (char *)buf; static unsigned long int res; bufp+=pos; @@ -338,8 +366,8 @@ char *extract_ident (char *line) static char word[30]; if (strlen(line) > 0) { - x = index (line, ' '); - y = index (line, '\t'); + x = strchr (line, ' '); + y = strchr (line, '\t'); if (!x && !y) { strncpy(word, line, 29); @@ -412,8 +440,8 @@ size_t control_nextline (void **buf, int len, FILE *f) char *cp; int i; - bzero (line, sizeof(line)); - bzero (buf, len); + memset (line, 0, sizeof(line)); + memset (buf, 0, len); cp = line; while (!strlen(line) && (cp = fgets(line, 100, f))) { @@ -424,7 +452,7 @@ size_t control_nextline (void **buf, int len, FILE *f) while (tmp[strlen(tmp)-1] != '\n' && (cp = fgets(tmp, 100, f))); } else line[strlen(line)-1] = '\0'; - if (line[strlen(line)-1] == ' ') + if (line[strlen(line)-1] == '\r') line[strlen(line)-1] = '\0'; for (i=strlen(line);(line[i-1] == ' '||line[i-1] == '\t')&&i>0; i--) line[i-1] = '\0'; @@ -455,6 +483,10 @@ char *get_date() return res; } +/* + * Prepare a record A according to the specs. + * See dtaus.txt for explanation + */ void dtaus_prepareA (char *buf) { int i; @@ -462,7 +494,7 @@ void dtaus_prepareA (char *buf) struct tm *loctime; char tmp[10]; - bzero (buf, 129); + memset (buf, 0, 129); timer = time ( NULL ); loctime = localtime(&timer); @@ -471,65 +503,89 @@ void dtaus_prepareA (char *buf) buf[2] = '2'; buf[3] = '8'; buf[4] = 'A'; - for (i=15;i<15+8; i++) buf[i] = '0'; + for (i=15;i<15+8; i++) buf[i] = '0'; /* A5 */ sprintf(tmp, "%02d%02d%02d", loctime->tm_mday, loctime->tm_mon+1, loctime->tm_year % 100); - for (i=0; i<6; i++) buf[50+i] = tmp[i]; - for (i=56;i<56+4; i++) buf[i] = ' '; - for (i=70;i<70+10; i++) buf[i] = '0'; - for (i=80;i<80+48; i++) buf[i] = ' '; + for (i=0; i<6; i++) buf[50+i] = tmp[i]; /* A7 (Date) */ + for (i=56;i<56+4; i++) buf[i] = ' '; /* A8 */ + for (i=70;i<70+10; i++) buf[i] = '0'; /* A10 */ + for (i=80;i<80+48; i++) buf[i] = ' '; /* A11 */ +#ifdef DEFAULT_EURO + buf[recA[A_EURO].pos] = '1'; /* A12 (Currency) */ +#else + if (use_euro) + buf[recA[A_EURO].pos] = '1'; /* A12 (Currency) */ + else + buf[recA[A_EURO].pos] = ' '; /* A12 (Currency) */ +#endif } +/* + * Prepare a record C according to the specs. + * See dtaus.txt for explanation + */ void dtaus_prepareC (char *buf, int normaltext, int maxtext) { int i; int appendix = 0; - div_t res; - bzero (buf, 257); - buf[0] = '0'; + memset (buf, 0, 257); if (normaltext) appendix = 1; - if (maxtext) { - res = div (maxtext-1, 4); - appendix += res.quot; - if (res.rem) appendix++; - } + appendix += maxtext; i = 187 + (appendix * 29); /* Bail out if the number is too large, shouldn't be possible though */ - if (i>1000) + if (i >= 1000) exit (1); + buf[0] = (i/1000)+48;i-=(i/1000)*100; buf[1] = (i/100)+48;i-=(i/100)*100; buf[2] = (i/10)+48;i-=(i/10)*10; buf[3] = i+48; buf[4] = 'C'; - for (i=31;i<31+13; i++) buf[i] = '0'; - buf[49] = ' '; - for (i=79;i<79+11; i++) buf[i] = '0'; - for (i=90;i<90+3; i++) buf[i] = ' '; - for (i=120;i<120+8; i++) buf[i] = ' '; - for (i=182;i<182+3; i++) buf[i] = ' '; - for (i=185;i<185+2; i++) buf[i] = '0'; - for (i=187;i<187+(29*2); i++) buf[i] = ' '; - for (i=245;i<245+11; i++) buf[i] = ' '; + for (i=31;i<31+13; i++) buf[i] = '0'; /* C6 */ + buf[49] = ' '; /* C8 */ + for (i=50;i<50+11; i++) buf[i] = '0'; /* C9 (Betrag) */ + for (i=79;i<79+11; i++) buf[i] = '0'; /* C12 (Betrag Euro) */ + for (i=90;i<90+3; i++) buf[i] = ' '; /* C13 */ + for (i=93;i<90+27; i++) buf[i] = ' '; /* C14a (Kunde) */ + for (i=120;i<120+8; i++) buf[i] = ' '; /* C14b */ +#ifdef DEFAULT_EURO + buf[recC[C_EURO].pos] = '1'; /* C17a (Currency) */ +#else + if (use_euro) + buf[recC[C_EURO].pos] = '1'; /* C17a (Currency) */ + else + buf[recC[C_EURO].pos] = ' '; /* C17a (Currency) */ +#endif + for (i=183;i<183+2; i++) buf[i] = ' '; /* C17b */ + for (i=187;i<187+(29*2); i++) buf[i] = ' '; /* C19-C22 (misc text) */ + for (i=245;i<245+11; i++) buf[i] = ' '; /* C23 */ + + buf[185+0] = (appendix/10)+48;appendix-=(appendix/10)*10; + buf[185+1] = appendix+48; } +/* + * Prepare a record E according to the specs. + * See dtaus.txt for explanation + */ void dtaus_prepareE (char *buf) { int i; - bzero (buf, 129); + memset (buf, 0, 129); buf[0] = '0'; buf[1] = '1'; buf[2] = '2'; buf[3] = '8'; buf[4] = 'E'; - for (i=5;i<5+5; i++) buf[i] = ' '; - for (i=64;i<64+13; i++) buf[i] = '0'; - for (i=77;i<77+51; i++) buf[i] = ' '; + for (i=5;i<5+5; i++) buf[i] = ' '; /* E3 */ + for (i=17;i<17+13; i++) buf[i] = '0'; /* E8 (Check Betrag) */ + for (i=64;i<64+13; i++) buf[i] = '0'; /* E8 (Check Euro) */ + for (i=77;i<77+51; i++) buf[i] = ' '; /* E9 */ } int dtaus_writeA(FILE *f, char **values) @@ -555,12 +611,16 @@ int dtaus_writeA(FILE *f, char **values) dtaus_prepareA(buf); buf[5] = values[A_TRANS][0]; buf[6] = values[A_TRANS][1]; - sprintf (tmp, "%s", padzeroclip (strip_nondigits (values[A_BLZ]),8)); - for (i=0; i<8; i++) buf[recA[A_BLZ].pos+i] = tmp[i]; - sprintf (tmp, "%-27s", upcase(values[A_NAME])); + sprintf (tmp, "%s", padzeroclip (strip_nondigits (values[A_BLZ]),recA[A_BLZ].len)); + for (i=0; i recC[i].len) - values[i][recC[i].len] = '\0'; + values[i][recC[i].len-2] = '\0'; i=C_ZWECK;if (values[i] && strlen(values[i]) > recC[i].len) values[i][recC[i].len] = '\0'; i=C_MYNAM;if (values[i] && strlen(values[i]) > recC[i].len) values[i][recC[i].len] = '\0'; i=C_TEXT;if (values[i] && strlen(values[i]) > recC[i].len) values[i][recC[i].len] = '\0'; - i=C_EXT;if (values[i] && strlen(values[i]) > recC[i].len) - values[i][recC[i].len] = '\0'; dtaus_prepareC (buf, values[C_TEXT] != NULL, maxtext); for (i=0; i<5; i++) buf[recC[C_TRANS].pos+i] = tmp[i]; @@ -620,41 +677,41 @@ int dtaus_writeC(FILE *f, char **valuesA, char **values, char **text) sprintf (tmp, "%s", padzeroclip (strip_nondigits (values[C_KTO]),10)); for (i=0; i 0) { + res = div (extC, 4); + extC = res.quot; + if (res.rem) extC++; + } } if (dtaus_nextrec(buf, fdtaus) != 1) - bzero (buf, sizeof(buf)); + memset (buf, 0, sizeof(buf)); /* * Are there extension records that we have to check? @@ -826,7 +954,7 @@ void dtaus2control (char *cdtaus, char *ccontrol) * instead of 00 we should let it in so it can read its own * old files... *sigh* */ - while (extC > 0 && dtaus_char(buf,4) != 'C') { + while (extC > 0 && dtaus_char(buf,4) != 'C' && dtaus_char(buf,4) != 'E') { for (index=0; index < 4; index++) { if ((dtaus_char(buf,index*29) != ' ')) { bufp = buf + index*29; @@ -836,7 +964,7 @@ void dtaus2control (char *cdtaus, char *ccontrol) } } if (dtaus_nextrec(buf, fdtaus) != 1) - bzero (buf, sizeof(buf)); + memset (buf, 0, sizeof(buf)); extC--; } fprintf(fcontrol, "}\n"); @@ -852,12 +980,24 @@ void dtaus2control (char *cdtaus, char *ccontrol) fprintf(fcontrol, "\nEND {\n"); for (index=E_COUNT; index <= E_BLZ; index++) { +#ifndef DEFAULT_EURO + if (use_euro && index == E_VAL) + index = E_EUR; +#endif bufp = buf + recE[index].pos; memcpy(tmp, bufp, recE[index].len); tmp[recE[index].len] = '\0'; +#ifndef DEFAULT_EURO + if (index == E_VAL || index == E_EUR) +#else if (index == E_VAL) +#endif printctln(fcontrol, recE[index].name, strip_zeros(string2real(tmp))); else printctln(fcontrol, recE[index].name, strip_zeros(tmp)); +#ifndef DEFAULT_EURO + if (use_euro && index == E_EUR) + index = E_VAL; +#endif } fprintf(fcontrol, "}\n"); @@ -929,7 +1069,7 @@ int control2dtaus (char *ccontrol, char *cdtaus, char *cbeleg, char *ccheck) /* * Record A lesen */ - bzero(valA, sizeof(valA)); + memset (valA, 0, sizeof(valA)); control_nextline ((void *)line, 100, fcontrol); ident = extract_ident(line); if (!strcmp(ident, "begin") && (line[0] == '{')) { @@ -937,9 +1077,18 @@ int control2dtaus (char *ccontrol, char *cdtaus, char *cbeleg, char *ccheck) while (strlen(line) && line[0] != '}') { ident = extract_ident(line); if ((recindex = rec_index(ident, REC_A)) != -1) +#ifndef DEFAULT_EURO + { +#endif if (recA[recindex].type != IGN) if ((valA[recindex] = (char *)malloc (strlen(line)+1))) strcpy(valA[recindex], line); +#ifndef DEFAULT_EURO + } else { + if (! strcasecmp (ident, "euro")) + use_euro = 1; + } +#endif control_nextline ((void *)line, 100, fcontrol); } if (((recindex = rec_index("art", REC_A)) != -1) && valA[recindex] && strlen(valA[recindex])) { @@ -954,7 +1103,17 @@ int control2dtaus (char *ccontrol, char *cdtaus, char *cbeleg, char *ccheck) fprintf(fbeleg, "\n Sammelauftrag\n\n"); fprintf(fbeleg, "\n VOL ........................:\n"); fprintf(fbeleg, "\n Erstellungsdatum ...........: %s\n", get_date()); - fprintf(fbeleg, "\n Waehrung ...................: DM\n"); + if (valA[A_TODO]) { + fprintf(fbeleg, "\n Ausfuehrugsdatum ...........: %s\n", valA[A_TODO]); + } +#ifndef DEFAULT_EURO + if (use_euro) + fprintf(fbeleg, "\n Waehrung ...................: Euro\n"); + else + fprintf(fbeleg, "\n Waehrung ...................: DM\n"); +#else + fprintf(fbeleg, "\n Waehrung ...................: Euro\n"); +#endif } if (!dtaus_writeA(fdtaus, valA)) { fprintf (stderr, "Konnte den Anfangsdatensatz nicht schreiben.\n"); @@ -963,13 +1122,20 @@ int control2dtaus (char *ccontrol, char *cdtaus, char *cbeleg, char *ccheck) fprintf (fcheck, "\n\n\n"); if (valA[recindex][0] == 'L') - fprintf (fcheck, " Sammeleinzeiehungsauftrag\n\n"); + fprintf (fcheck, " Sammeleinziehungsauftrag\n\n"); else if (valA[recindex][0] == 'G') fprintf (fcheck, " Sammelueberweisungsauftrag\n\n"); else fprintf (fcheck, " Sammelauftrag\n\n"); fprintf (fcheck, " Erstellungsdatum : %s\n\n", get_date()); - fprintf (fcheck, " Waehrung : DM\n\n\n"); +#ifndef DEFAULT_EURO + if (use_euro) + fprintf (fcheck, " Waehrung : Euro\n\n\n"); + else + fprintf (fcheck, " Waehrung : DM\n\n\n"); +#else + fprintf (fcheck, " Waehrung : Euro\n\n\n"); +#endif fprintf (fcheck, " %-10s %-8s %-30s %12s\n", "Kontonr.", "BLZ", "Name", "Betrag"); fprintf (fcheck, " --------------------------------------------------------------------\n"); } else { @@ -984,7 +1150,7 @@ int control2dtaus (char *ccontrol, char *cdtaus, char *cbeleg, char *ccheck) sum_val = bigint_int(0); sum_blz = bigint_int(0); sum_kto = bigint_int(0); - bzero(valC, sizeof(valC)); + memset (valC, 0, sizeof(valC)); control_nextline ((void *)line, 100, fcontrol); if (line[0] == '{') { while (strlen(line) && line[0] == '{') { @@ -1040,7 +1206,7 @@ int control2dtaus (char *ccontrol, char *cdtaus, char *cbeleg, char *ccheck) for (recindex=0; recindex