Business-KontoCheck
view release on metacpan or search on metacpan
konto_check.c view on Meta::CPAN
/* ###########################################################################
* # Die Funktion create_lutfile() ist die externe Schnittstelle für die #
* # Funktion create_lutfile_int() (ohne den FILE-Pointer). Die generierte #
* # Datei wird nach dem Aufruf geschlossen. #
* # #
* # Copyright (C) 2007 Michael Plugge <konto_check@yahoo.com> #
* ###########################################################################
*/
DLL_EXPORT int create_lutfile(char *filename, char *prolog, int slots)
{
int retval;
FILE *lut;
retval=create_lutfile_int(filename,prolog,slots,&lut);
fclose(lut);
RETURN(retval);
}
/* Funktion create_lutfile_int() +§§§1 */
/* ###########################################################################
* # Die Funktion create_lutfile_int() legt eine leere LUT-Datei mit einer #
* # vorgegebenen Anzahl Slots sowie Prolog an und initialisiert die Felder #
* # des Inhaltsverzeichnisses mit 0-Bytes. Diese Datei kann dann mit der #
* # Funktion write_lut_block() (bzw. write_lut_block_int()) gefüllt werden. #
* # #
* # Copyright (C) 2007 Michael Plugge <konto_check@yahoo.com> #
* ###########################################################################
*/
static int create_lutfile_int(char *name, char *prolog, int slots,FILE **lut)
{
char buffer[SLOT_BUFFER],*ptr;
int len,cnt;
FILE *out;
if(!init_status&1)init_atoi_table();
*lut=NULL;
if(slots>MAX_SLOTS)RETURN(TOO_MANY_SLOTS);
if(!(out=fopen(name,"wb+"))){
PRINT_VERBOSE_DEBUG_FILE("fopen(wb+)");
RETURN(FILE_WRITE_ERROR);
}
fprintf(out,"%s\nDATA\n",prolog);
ptr=buffer;
UI2C(slots,ptr); /* Anzahl Slots der LUT-Datei schreiben */
for(len=slots*12;len>0;len--)*ptr++=0; /* Inhaltsverzeichnis: alle Felder mit 0 initialisieren */
if((cnt=fwrite(buffer,1,(ptr-buffer),out))<(ptr-buffer)){
PRINT_VERBOSE_DEBUG_FILE("fwrite");
RETURN(FILE_WRITE_ERROR);
}
*lut=out;
return OK;
}
/* Funktion write_lut_block() +§§§1 */
/* ###########################################################################
* # Diese Funktion gehört zum Mid-Level-Interface der LUT2-Routinen. Sie #
* # schreibt einen Datenblock in eine LUT-Datei. Die Datei wird zum #
* # Schreiben geöffnet und nachher wieder geschlossen. Vorher werden noch #
* # einige grundlegende Tests gemacht, um sicherzustellen, daß es sich auch #
* # um eine LUT2-Datei handelt (hier und später in write_block_int()). #
* # #
* # Copyright (C) 2007 Michael Plugge <konto_check@yahoo.com> #
* ###########################################################################
*/
#line 1494 "konto_check.lxx"
DLL_EXPORT int write_lut_block(char *lutname,UINT4 typ,UINT4 len,char *data)
{
char buffer[SLOT_BUFFER],*ptr;
int retval;
FILE *lut;
if(typ<=500)RETURN(LUT2_NO_USER_BLOCK);
if(!(lut=fopen(lutname,"rb+"))){
PRINT_VERBOSE_DEBUG_FILE("fopen(rb+)");
RETURN(FILE_WRITE_ERROR);
}
/* zunächst mal testen ob es auch eine LUT2 Datei ist */
if(!(ptr=fgets(buffer,SLOT_BUFFER,lut)))RETURN(FILE_READ_ERROR);
while(*ptr && *ptr!='\n')ptr++;
*--ptr=0;
if(!strcmp(buffer,"BLZ Lookup Table/Format 1."))RETURN(LUT1_FILE_USED); /* alte LUT-Datei */
if(strcmp(buffer,"BLZ Lookup Table/Format 2."))RETURN(INVALID_LUT_FILE); /* keine LUT-Datei */
/* nun den Block schreiben */
rewind(lut);
retval=write_lut_block_int(lut,typ,len,data);
fclose(lut);
RETURN(retval);
}
/* Funktion write_lut_block_int() +§§§1 */
/* #############################################################################
* # Die Funktion write_lut_block_int() schreibt einen Block in die LUT-Datei. #
* # Falls kein Slot im Inhaltsverzeichnis mehr frei ist, wird die Fehler- #
* # meldung LUT2_NO_SLOT_FREE zurückgegeben, aber nichts geschrieben. #
* # Vor dem Schreiben wird der Block mittels der ZLIB komprimiert. #
* # #
* # Copyright (C) 2007 Michael Plugge <konto_check@yahoo.com> #
* #############################################################################
*/
#line 1532 "konto_check.lxx"
static int write_lut_block_int(FILE *lut,UINT4 typ,UINT4 len,char *data)
{
char buffer[SLOT_BUFFER],*ptr,*cptr;
int cnt,slots,i,id,compression_mode;
UINT4 *lptr;
unsigned long adler,dir_pos,write_pos;
#if USE_BZIP2>0
unsigned int compressed_len_bz;
#endif
#if USE_LZO>0
lzo_uint compressed_len_lzo;
#endif
#if USE_LZMA>0
size_t compressed_len_lzma=0;
int retval;
( run in 1.761 second using v1.01-cache-2.11-cpan-c966e8aa7e8 )