X-Git-Url: https://git.infodrom.org/?p=infodrom%2Fdtaus;a=blobdiff_plain;f=dtaus.c;h=cac2bdd1d27c7a90db15b801b37cc4bae2c4f3f3;hp=8e1bcf88faf624d65fdf572b9ae41f6cd4a10ae0;hb=ffe8c418a06153b8e423a4d2a1738cfc1026c2d7;hpb=7a4a4dbca7f9d0108357b944a26fe6668cc722c6 diff --git a/dtaus.c b/dtaus.c index 8e1bcf8..cac2bdd 100644 --- a/dtaus.c +++ b/dtaus.c @@ -1,6 +1,6 @@ /* dtaus.c - Datenträgeraustausch mit einer Bank - Copyright (c) 1996 Martin Schulze + Copyright (c) 1996,8,2001 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 @@ -14,7 +14,7 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. $Id$ */ @@ -22,6 +22,7 @@ #include "dtaus.h" #include "bigint.h" #include +#include #include #include #include @@ -54,6 +55,7 @@ dtaus_record recA[] = { {"BLZ", 7, 8, REQ}, {"Referenz", 70, 10, OPT}, {"Datum", 50, 6, IGN}, + {"Euro", 127, 1, OPT}, {NULL, 0, 0} }; @@ -63,7 +65,8 @@ dtaus_record recA[] = { #define A_BLZ 3 #define A_REF 4 #define A_DATE 5 -#define A_LEN 6 +#define A_EURO 6 +#define A_LEN 7 dtaus_record recC[] = { {"Name", 93, 27, REQ}, @@ -75,6 +78,7 @@ dtaus_record recC[] = { {"myName", 128, 27, OPT}, {"myKonto", 69, 10, OPT}, {"myBLZ", 61, 8, OPT}, + {"Euro", 182, 1, IGN}, {"Text", 187, 29, OPT}, {"Extension", 216, 29, OPT}, {NULL, 0, 0} @@ -89,9 +93,12 @@ dtaus_record recC[] = { #define C_MYNAM 6 #define C_MYKTO 7 #define C_MYBLZ 8 -#define C_TEXT 9 -#define C_EXT 10 -#define C_LEN 11 +#define C_EURO 9 +#define C_TEXT 10 +#define C_EXT 11 +#define C_LEN 12 + +#define MAX_TEXT 60 dtaus_record recE[] = { {"Anzahl", 10, 7, IGN}, @@ -139,6 +146,10 @@ char *upcase(char *s) case 'ß': *(xp++) = 'S'; *xp='S'; break; } } else + /* + * Filter out all other characters since credit institutes won't + * accept the file otherwise. + */ *xp = ' '; } *xp = '\0'; @@ -151,7 +162,8 @@ char *downcase(char *s) static char x[100]; char *cp; - strcpy (x, s); + memset (x, 0, sizeof (x)); + strncpy (x, s, 99); for (cp=x;*cp;cp++) if (isupper(*cp)) @@ -178,7 +190,20 @@ char *strip_zeros (char *s) return p; } -char dtaus_char(void *buf, unsigned int pos) +char *strip_nondigits (char *s) +{ + char *p; + char *x; + + for (x=s,p=s;*x;x++) + if (isdigit (*x)) + *(p++) = *x; + *(p++) = '\0'; + + return s; +} + +char dtaus_char (void *buf, unsigned int pos) { static char res; char *bufp = buf; @@ -268,7 +293,7 @@ char *string2ext (char *s) res[0] = '\0'; if (!strcmp(s, "01")) - sprintf (res, "Klient"); + sprintf (res, "Kunde"); else if (!strcmp(s, "02")) sprintf (res, "Text"); else if (!strcmp(s, "03")) @@ -281,7 +306,7 @@ char *ext2string (char *s) static char res[3]; res[0] = '\0'; - if (!strcmp(s, "Klient")) + if (!strcmp(s, "Kunde")) sprintf (res, "01"); else if (!strcmp(s, "Text")) sprintf (res, "02"); @@ -339,6 +364,28 @@ char *extract_ident (char *line) return line; } +/* + * Pads a string with zero's on the left side. + */ +char *padzeroclip (char *s, int len) +{ + char *p, *q; + + if (strlen(s) == len) return s; + if (strlen(s) > len) { + q=s+len; + *(q--) = '\0'; + return s; + } + + q=s+len; + *(q--) = '\0'; + for (p=s+strlen(s)-1;p>=s;p--) + *(q--)=*p; + for (;q>=s;) *(q--)='0'; + return s; +} + int rec_index(char *ident, int type) { int i; @@ -404,11 +451,11 @@ char *get_date() timer = time ( NULL ); loctime = localtime(&timer); - sprintf(res, "%02d.%02d.%02d", loctime->tm_mday, loctime->tm_mon+1, loctime->tm_year); + sprintf(res, "%02d.%02d.%02d", loctime->tm_mday, loctime->tm_mon+1, loctime->tm_year % 100); return res; } -void dtaus_prepareA(char *buf) +void dtaus_prepareA (char *buf) { int i; time_t timer; @@ -425,23 +472,40 @@ void dtaus_prepareA(char *buf) buf[3] = '8'; buf[4] = 'A'; for (i=15;i<15+8; i++) buf[i] = '0'; - sprintf(tmp, "%02d%02d%2d", loctime->tm_mday, loctime->tm_mon+1, loctime->tm_year); + 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] = ' '; } -void dtaus_prepareC(char *buf) +void dtaus_prepareC (char *buf, int normaltext, int maxtext) { int i; + int appendix = 0; + div_t res; bzero (buf, 257); buf[0] = '0'; - buf[1] = '2'; - buf[2] = '1'; - buf[3] = '6'; + + if (normaltext) + appendix = 1; + if (maxtext) { + res = div (maxtext, 4); + appendix += res.quot; + if (res.rem) appendix++; + } + i = 187 + (appendix * 29); + + /* Bail out if the number is too large, shouldn't be possible though */ + if (i>1000) + exit (1); + + 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'; @@ -453,7 +517,7 @@ void dtaus_prepareC(char *buf) for (i=245;i<245+11; i++) buf[i] = ' '; } -void dtaus_prepareE(char *buf) +void dtaus_prepareE (char *buf) { int i; @@ -481,35 +545,45 @@ int dtaus_writeA(FILE *f, char **values) } if (!(((values[A_TRANS][0] == 'L')||(values[A_TRANS][0] == 'G')) &&((values[A_TRANS][1] == 'B')||(values[A_TRANS][1] == 'K')))) { - fprintf (stderr, "Ungueltiger Typ, nur LK, GK, LB oder GB erlaubt.\n"); + fprintf (stderr, "Ungültiger Typ, nur LK, GK, LB oder GB erlaubt.\n"); return 0; } + i=A_NAME;if (values[i] && strlen(values[i]) > recA[i].len) + values[i][recA[i].len] = '\0'; + dtaus_prepareA(buf); buf[5] = values[A_TRANS][0]; buf[6] = values[A_TRANS][1]; - sprintf (tmp, "%08s", values[A_BLZ]); + 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])); for (i=0; i<27; i++) buf[recA[A_NAME].pos+i] = tmp[i]; - sprintf (tmp, "%010s", values[A_KTO]); + sprintf (tmp, "%s", padzeroclip (strip_nondigits (values[A_KTO]),10)); for (i=0; i<10; i++) buf[recA[A_KTO].pos+i] = tmp[i]; fputs(buf, f); return 1; } -int dtaus_writeC(FILE *f, char **valuesA, char **values) +int dtaus_writeC(FILE *f, char **valuesA, char **values, char **text) { char buf[257]; + char appendix[129]; char tmp[30]; - int i; + int i, k; + int maxtext = 0; + int fieldnr; + div_t res; - /* + if (text) + for (maxtext=0;text[maxtext];maxtext++); + +#if DEBUG for (i=0; (recC[i].name); i++) if (values[i]) printf ("%s: %s\n", recC[i].name, values[i]); - */ +#endif for (i=0; (recC[i].name); i++) if ((recC[i].type == REQ) && !values[i]) { @@ -522,29 +596,35 @@ int dtaus_writeC(FILE *f, char **valuesA, char **values) return 0; } - dtaus_prepareC(buf); - if (!values[C_TEXT]) { - buf[1] = '1'; - buf[2] = '8'; - buf[3] = '7'; - } + i=C_TEXT;if (values[i] && strlen(values[i]) > recC[i].len) + values[i][recC[i].len] = '\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]; if (values[C_MYBLZ]) - sprintf (tmp, "%08s", values[C_MYBLZ]); + sprintf (tmp, "%s", padzeroclip (strip_nondigits (values[C_MYBLZ]),8)); else - sprintf (tmp, "%08s", valuesA[A_BLZ]); + sprintf (tmp, "%s", padzeroclip (strip_nondigits (valuesA[A_BLZ]),8)); for (i=0; i