diff options
author | Magnus Lundborg <lundborg.magnus@gmail.com> | 2013-10-11 12:00:25 (GMT) |
---|---|---|
committer | Magnus Lundborg <lundborg.magnus@gmail.com> | 2013-10-11 12:00:25 (GMT) |
commit | df283e79475806a920e12bd0596210ba6ca54f74 (patch) | |
tree | 33fba240c92654ef0c03b633f2ded038c8443bcc /src/lib/tng_io.c | |
parent | b153817ef80eb8b94a117224c50edb3d28feb1fe (diff) |
Fix errors reading frames if frame set was already read.
If the current frame set was the last in the file and it had already
been read it would try to re-read the data past the end of the file.
Diffstat (limited to 'src/lib/tng_io.c')
-rw-r--r-- | src/lib/tng_io.c | 214 |
1 files changed, 132 insertions, 82 deletions
diff --git a/src/lib/tng_io.c b/src/lib/tng_io.c index 725e4b6..6a5d035 100644 --- a/src/lib/tng_io.c +++ b/src/lib/tng_io.c @@ -6400,7 +6400,6 @@ static tng_function_status tng_frame_set_pointers_update tng_md5_hash_update(tng_data, block, header_start_pos, contents_start_pos); } - fseek(tng_data->output_file, output_file_pos, SEEK_SET); } @@ -6503,9 +6502,9 @@ static tng_function_status tng_frame_set_pointers_update contents_start_pos); } } - + fseek(tng_data->output_file, output_file_pos, SEEK_SET); - + tng_data->input_file = temp; tng_block_destroy(&block); @@ -7254,7 +7253,7 @@ tng_function_status DECLSPECDLLEXPORT tng_chain_residue_w_id_add curr_index = molecule->n_residues; } - *residue = &new_residues[curr_index + chain->n_residues]; + *residue = &molecule->residues[curr_index + chain->n_residues]; if(!chain->n_residues) { @@ -7779,13 +7778,11 @@ tng_function_status DECLSPECDLLEXPORT tng_particle_mapping_add } frame_set->mappings = mapping; - mapping = &frame_set->mappings[frame_set->n_mapping_blocks - 1]; + frame_set->mappings[frame_set->n_mapping_blocks - 1].num_first_particle = num_first_particle; + frame_set->mappings[frame_set->n_mapping_blocks - 1].n_particles = n_particles; - mapping->num_first_particle = num_first_particle; - mapping->n_particles = n_particles; - - mapping->real_particle_numbers = malloc(sizeof(int64_t) * n_particles); - if(!mapping->real_particle_numbers) + frame_set->mappings[frame_set->n_mapping_blocks - 1].real_particle_numbers = malloc(sizeof(int64_t) * n_particles); + if(!frame_set->mappings[frame_set->n_mapping_blocks - 1].real_particle_numbers) { printf("Cannot allocate memory (%"PRId64" bytes). %s: %d\n", sizeof(int64_t) * n_particles, __FILE__, __LINE__); @@ -7794,7 +7791,7 @@ tng_function_status DECLSPECDLLEXPORT tng_particle_mapping_add for(i=0; i<n_particles; i++) { - mapping->real_particle_numbers[i] = mapping_table[i]; + frame_set->mappings[frame_set->n_mapping_blocks - 1].real_particle_numbers[i] = mapping_table[i]; } return(TNG_SUCCESS); @@ -12420,7 +12417,7 @@ tng_function_status DECLSPECDLLEXPORT tng_data_interval_get int64_t *n_values_per_frame, char *type) { - int64_t i, j, n_frames, file_pos, current_frame_pos; + int64_t i, j, n_frames, file_pos, current_frame_pos, first_frame; int block_index, len, size; tng_non_particle_data_t data; tng_trajectory_frame_set_t frame_set; @@ -12429,6 +12426,9 @@ tng_function_status DECLSPECDLLEXPORT tng_data_interval_get block_index = -1; + frame_set = &tng_data->current_trajectory_frame_set; + first_frame = frame_set->first_frame; + stat = tng_frame_set_of_frame_find(tng_data, start_frame_nr); if(stat != TNG_SUCCESS) { @@ -12436,34 +12436,38 @@ tng_function_status DECLSPECDLLEXPORT tng_data_interval_get } - tng_block_init(&block); - file_pos = ftell(tng_data->input_file); - /* Read all blocks until next frame set block */ - stat = tng_block_header_read(tng_data, block); - while(file_pos < tng_data->input_file_len && + /* Do not re-read the frame set. */ + if(first_frame != frame_set->first_frame || + frame_set->n_particle_data_blocks <= 0) + { + tng_block_init(&block); + file_pos = ftell(tng_data->input_file); + /* Read all blocks until next frame set block */ + stat = tng_block_header_read(tng_data, block); + while(file_pos < tng_data->input_file_len && stat != TNG_CRITICAL && block->id != TNG_TRAJECTORY_FRAME_SET) - { - stat = tng_block_read_next(tng_data, block, - hash_mode); - if(stat != TNG_CRITICAL) { - file_pos = ftell(tng_data->input_file); - if(file_pos < tng_data->input_file_len) + stat = tng_block_read_next(tng_data, block, + hash_mode); + if(stat != TNG_CRITICAL) { - stat = tng_block_header_read(tng_data, block); + file_pos = ftell(tng_data->input_file); + if(file_pos < tng_data->input_file_len) + { + stat = tng_block_header_read(tng_data, block); + } } } - } - tng_block_destroy(&block); - if(stat == TNG_CRITICAL) - { - printf("Cannot read block header at pos %"PRId64". %s: %d\n", - file_pos, __FILE__, __LINE__); - return(stat); + tng_block_destroy(&block); + if(stat == TNG_CRITICAL) + { + printf("Cannot read block header at pos %"PRId64". %s: %d\n", + file_pos, __FILE__, __LINE__); + return(stat); + } } - frame_set = &tng_data->current_trajectory_frame_set; /* See if there is a data block of this ID. * Start checking the last read frame set */ @@ -12607,22 +12611,55 @@ tng_function_status DECLSPECDLLEXPORT tng_data_vector_interval_get int64_t *n_values_per_frame, char *type) { - int64_t n_frames, tot_n_frames, n_frames_div, n_frames_div_2; - int64_t current_frame_pos, data_size, frame_size; + int64_t n_frames, tot_n_frames, n_frames_div, n_frames_div_2, first_frame; + int64_t file_pos, current_frame_pos, data_size, frame_size; int64_t last_frame_pos; int size; tng_trajectory_frame_set_t frame_set; + tng_gen_block_t block; tng_function_status stat; void *current_values = 0, *temp; + frame_set = &tng_data->current_trajectory_frame_set; + first_frame = frame_set->first_frame; + stat = tng_frame_set_of_frame_find(tng_data, start_frame_nr); if(stat != TNG_SUCCESS) { return(stat); } - - frame_set = &tng_data->current_trajectory_frame_set; + /* Do not re-read the frame set. */ + if(first_frame != frame_set->first_frame || + frame_set->n_data_blocks <= 0) + { + tng_block_init(&block); + file_pos = ftell(tng_data->input_file); + /* Read all blocks until next frame set block */ + stat = tng_block_header_read(tng_data, block); + while(file_pos < tng_data->input_file_len && + stat != TNG_CRITICAL && + block->id != TNG_TRAJECTORY_FRAME_SET) + { + stat = tng_block_read_next(tng_data, block, + hash_mode); + if(stat != TNG_CRITICAL) + { + file_pos = ftell(tng_data->input_file); + if(file_pos < tng_data->input_file_len) + { + stat = tng_block_header_read(tng_data, block); + } + } + } + tng_block_destroy(&block); + if(stat == TNG_CRITICAL) + { + printf("Cannot read block header at pos %"PRId64". %s: %d\n", + file_pos, __FILE__, __LINE__); + return(stat); + } + } stat = tng_data_vector_get(tng_data, block_id, ¤t_values, &n_frames, stride_length, @@ -13112,6 +13149,7 @@ tng_function_status DECLSPECDLLEXPORT tng_particle_data_interval_get char *type) { int64_t i, j, k, mapping, n_frames, file_pos, current_frame_pos, i_step; + int64_t first_frame; int block_index, len, size; tng_particle_data_t data; tng_trajectory_frame_set_t frame_set; @@ -13121,40 +13159,46 @@ tng_function_status DECLSPECDLLEXPORT tng_particle_data_interval_get block_index = -1; + frame_set = &tng_data->current_trajectory_frame_set; + first_frame = frame_set->first_frame; + stat = tng_frame_set_of_frame_find(tng_data, start_frame_nr); if(stat != TNG_SUCCESS) { return(stat); } - tng_block_init(&block); - file_pos = ftell(tng_data->input_file); - /* Read all blocks until next frame set block */ - stat = tng_block_header_read(tng_data, block); - while(file_pos < tng_data->input_file_len && - stat != TNG_CRITICAL && - block->id != TNG_TRAJECTORY_FRAME_SET) + /* Do not re-read the frame set. */ + if(first_frame != frame_set->first_frame || + frame_set->n_particle_data_blocks <= 0) { - stat = tng_block_read_next(tng_data, block, - hash_mode); - if(stat != TNG_CRITICAL) + tng_block_init(&block); + file_pos = ftell(tng_data->input_file); + /* Read all blocks until next frame set block */ + stat = tng_block_header_read(tng_data, block); + while(file_pos < tng_data->input_file_len && + stat != TNG_CRITICAL && + block->id != TNG_TRAJECTORY_FRAME_SET) { - file_pos = ftell(tng_data->input_file); - if(file_pos < tng_data->input_file_len) + stat = tng_block_read_next(tng_data, block, + hash_mode); + if(stat != TNG_CRITICAL) { - stat = tng_block_header_read(tng_data, block); + file_pos = ftell(tng_data->input_file); + if(file_pos < tng_data->input_file_len) + { + stat = tng_block_header_read(tng_data, block); + } } } + tng_block_destroy(&block); + if(stat == TNG_CRITICAL) + { + printf("Cannot read block header at pos %"PRId64". %s: %d\n", + file_pos, __FILE__, __LINE__); + return(stat); + } } - tng_block_destroy(&block); - if(stat == TNG_CRITICAL) - { - printf("Cannot read block header at pos %"PRId64". %s: %d\n", - file_pos, __FILE__, __LINE__); - return(stat); - } - - frame_set = &tng_data->current_trajectory_frame_set; /* See if there is already a data block of this ID. * Start checking the last read frame set */ @@ -13336,7 +13380,7 @@ tng_function_status DECLSPECDLLEXPORT tng_particle_data_vector_interval_get int64_t *n_values_per_frame, char *type) { - int64_t n_frames, tot_n_frames, n_frames_div, n_frames_div_2; + int64_t n_frames, tot_n_frames, n_frames_div, n_frames_div_2, first_frame; int64_t file_pos, current_frame_pos, last_frame_pos, data_size, frame_size; int size; tng_trajectory_frame_set_t frame_set; @@ -13344,40 +13388,46 @@ tng_function_status DECLSPECDLLEXPORT tng_particle_data_vector_interval_get tng_function_status stat; void *current_values = 0, *temp; + frame_set = &tng_data->current_trajectory_frame_set; + first_frame = frame_set->first_frame; + stat = tng_frame_set_of_frame_find(tng_data, start_frame_nr); if(stat != TNG_SUCCESS) { return(stat); } - - tng_block_init(&block); - file_pos = ftell(tng_data->input_file); - /* Read all blocks until next frame set block */ - stat = tng_block_header_read(tng_data, block); - while(file_pos < tng_data->input_file_len && + + /* Do not re-read the frame set. */ + if(first_frame != frame_set->first_frame || + frame_set->n_particle_data_blocks <= 0) + { + tng_block_init(&block); + file_pos = ftell(tng_data->input_file); + /* Read all blocks until next frame set block */ + stat = tng_block_header_read(tng_data, block); + while(file_pos < tng_data->input_file_len && stat != TNG_CRITICAL && block->id != TNG_TRAJECTORY_FRAME_SET) - { - stat = tng_block_read_next(tng_data, block, - hash_mode); - if(stat != TNG_CRITICAL) { - file_pos = ftell(tng_data->input_file); - if(file_pos < tng_data->input_file_len) + stat = tng_block_read_next(tng_data, block, + hash_mode); + if(stat != TNG_CRITICAL) { - stat = tng_block_header_read(tng_data, block); + file_pos = ftell(tng_data->input_file); + if(file_pos < tng_data->input_file_len) + { + stat = tng_block_header_read(tng_data, block); + } } } + tng_block_destroy(&block); + if(stat == TNG_CRITICAL) + { + printf("Cannot read block header at pos %"PRId64". %s: %d\n", + file_pos, __FILE__, __LINE__); + return(stat); + } } - tng_block_destroy(&block); - if(stat == TNG_CRITICAL) - { - printf("Cannot read block header at pos %"PRId64". %s: %d\n", - file_pos, __FILE__, __LINE__); - return(stat); - } - - frame_set = &tng_data->current_trajectory_frame_set; stat = tng_particle_data_vector_get(tng_data, block_id, ¤t_values, &n_frames, stride_length, n_particles, @@ -15073,7 +15123,7 @@ tng_function_status DECLSPECDLLEXPORT tng_frame_set_first_frame_time_set_ (tng_trajectory_t tng_data, const double *first_frame_time) { - return(tng_frame_set_first_frame_time_set(tng_data, *first_frame_time); + return(tng_frame_set_first_frame_time_set(tng_data, *first_frame_time)); } tng_function_status DECLSPECDLLEXPORT tng_data_block_add_ |