From 31ed09982e25d7acdae349799023da68ee085f1d Mon Sep 17 00:00:00 2001 From: Gregor Weiss Date: Thu, 17 Oct 2024 19:18:44 +0200 Subject: [PATCH] manual aux buffer --- include/interfaces/reader/eas3.h | 4 ++ src/interfaces/reader/eas3.c | 82 ++++++++++++++++---------------- 2 files changed, 45 insertions(+), 41 deletions(-) diff --git a/include/interfaces/reader/eas3.h b/include/interfaces/reader/eas3.h index a346f0e..b2efca4 100644 --- a/include/interfaces/reader/eas3.h +++ b/include/interfaces/reader/eas3.h @@ -369,6 +369,10 @@ } field; span *aux; + + uchar *uchar_aux; + uint32 aux_pos; + uint32 aux_len; } eas3_data; /************************************************************************************************************\ diff --git a/src/interfaces/reader/eas3.c b/src/interfaces/reader/eas3.c index 28cf397..65e6db7 100644 --- a/src/interfaces/reader/eas3.c +++ b/src/interfaces/reader/eas3.c @@ -231,40 +231,28 @@ eas3_init_stream(uchar* memory, uint32 size, char instr) } /*----------------------------------------------------------------------------------------------------------*\ -! FUNCTION NAME: void eas3_emit_chunck(bitstream *const stream, const uchar* string, const uint64 length) ! -! -------------- ! ! ! ! DESCRIPTION: ! ! ------------ ! -! This function is used to write an additional chunck of size length to a bwc bitstream. ! -! ! -! ! -! PARAMETERS: ! -! ----------- ! -! Variable Type Description ! -! -------- ---- ----------- ! -! stream bitstream* - Structure used to assemble a bwc bit- ! -! bitstream. ! -! ! -! chunck unsigned char* - Memory handle for a data block that is ! -! to be written to the bwc bitstream. ! -! ! -! size unsigned int(64 bit) - Size of the data block. ! -! ! -! RETURN VALUE: ! -! ------------- ! -! Type Description ! -! ---- ----------- ! -! - - ! -! ! -! DEVELOPMENT HISTORY: ! -! -------------------- ! -! ! -! Date Author Change Id Release Description Of Change ! -! ---- ------ --------- ------- --------------------- ! -! 22.06.2019 Patrick Vogler B87D120 V 0.1.0 function created ! +! This macro is used to write an additional chunck of size length to the auxilliary ! +! information. ! ! ! \*----------------------------------------------------------------------------------------------------------*/ + +#define aux_push_back(aux, aux_pos, aux_len, chunck, chunck_len) \ +{ \ + if (aux_pos + chunck_len > aux_len) \ + { \ + while(aux_pos + chunck_len > aux_len) \ + { \ + aux_len += aux_len / 2; \ + } \ + aux = realloc(aux, aux_len); \ + } \ + memcpy(aux + aux_pos, chunck, chunck_len); \ + aux_pos += chunck_len; \ +} + void eas3_emit_chunck(span *const stream, const uchar* chunck, const uint64 size) { @@ -793,8 +781,10 @@ read_eas3_header(FILE *const fp, eas3_data *const data) ! block has been chosen arbitrarily and should be large ! ! enough to prevent excessive reallocation. ! \*--------------------------------------------------------*/ - aux = eas3_init_stream(NULL, AUX_SIZE, 'c'); - if(!aux) + data->uchar_aux = calloc(AUX_SIZE, sizeof(uchar)); + data->aux_pos = 0; + data->aux_len = AUX_SIZE; + if(!data->uchar_aux) { // memory allocation error fprintf(stderr, MEMERROR); @@ -832,7 +822,8 @@ read_eas3_header(FILE *const fp, eas3_data *const data) ! Emit the standard parameters to the auxiliary informa- ! ! tion information memory block. ! \*--------------------------------------------------------*/ - eas3_emit_chunck(aux, (uchar*)params, 176); + aux_push_back(data->uchar_aux, data->aux_pos, data->aux_len, + (uchar*)params, 176); /*--------------------------------------------------------*\ ! Convert the parameters required for the bwc compression ! @@ -896,7 +887,8 @@ read_eas3_header(FILE *const fp, eas3_data *const data) ! Emit the time step array to the auxiliary information ! ! memory block. ! \*--------------------------------------------------------*/ - eas3_emit_chunck(aux, buffer_char, params->nts * sizeof(uint64)); + aux_push_back(data->uchar_aux, data->aux_pos, data->aux_len, buffer_char, + params->nts * sizeof(uint64)); /*--------------------------------------------------------*\ ! Check if any attributes have been specified in the eas3 ! @@ -929,7 +921,8 @@ read_eas3_header(FILE *const fp, eas3_data *const data) ! Emit the timestep attribute array to the auxiliary infor-! ! mation memory block. ! \*--------------------------------------------------------*/ - eas3_emit_chunck(aux, buffer_char, params->nts * ATTRLEN * sizeof(char)); + aux_push_back(data->uchar_aux, data->aux_pos, data->aux_len, buffer_char, + params->nts * ATTRLEN * sizeof(char)); for(i = 0; i < params->npar; ++i) { @@ -1000,7 +993,8 @@ read_eas3_header(FILE *const fp, eas3_data *const data) ! Emit the remaining header information the the auxiliary ! ! information stream. ! \*--------------------------------------------------------*/ - eas3_emit_chunck(aux, buffer_char, Lread); + aux_push_back(data->uchar_aux, data->aux_pos, data->aux_len, + buffer_char, Lread); /*--------------------------------------------------------*\ ! Free the buffer character array. ! @@ -1012,12 +1006,18 @@ read_eas3_header(FILE *const fp, eas3_data *const data) ! ful, the address to the aux memory block stored is ! ! stored in the file structure alongside its size. ! \*--------------------------------------------------------*/ - if(eas3_terminate_stream(aux, data->aux)) - { - // memory allocation error - fprintf(stderr, MEMERROR); - return 1; - } + if(data->aux_pos != data->aux_len) + { + data->aux_len = data->aux_pos; + data->uchar_aux = realloc(data->uchar_aux, data->aux_len); + if(!data->uchar_aux) + { + // memory allocation error + fprintf(stderr, MEMERROR); + data->aux_len = 0; + return 1; + } + } return 0; }