/* * POST: Closes the gt_input_file * RETURN VALUE: Returns zero on success and error code */ gt_status gt_input_file_close(gt_input_file* const input_file) { GT_INPUT_FILE_CHECK(input_file); gt_status status = GT_INPUT_FILE_OK; #ifdef HAVE_BZLIB int bzerr; #endif switch (input_file->file_type) { case REGULAR_FILE: gt_free(input_file->file_buffer); if (fclose(input_file->file)) status = GT_INPUT_FILE_CLOSE_ERR; break; case GZIPPED_FILE: gt_free(input_file->file_buffer); #ifdef HAVE_ZLIB if (gzclose((gzFile)input_file->file)) status = GT_INPUT_FILE_CLOSE_ERR; #endif break; case BZIPPED_FILE: gt_free(input_file->file_buffer); #ifdef HAVE_BZLIB BZ2_bzReadClose(&bzerr,input_file->file); if (bzerr!=BZ_OK) status = GT_INPUT_FILE_CLOSE_ERR; #endif break; case MAPPED_FILE: gt_cond_error(munmap(input_file->file,input_file->file_size)==-1,SYS_UNMAP); if (close(input_file->fildes)) status = GT_INPUT_FILE_CLOSE_ERR; break; case STREAM: gt_free(input_file->file_buffer); break; } gt_free(input_file); return status; }
GT_INLINE void gt_sam_header_add_sequence_record(gt_sam_headers* const sam_headers,gt_sam_header_record* const header_record) { GT_SAM_HEADERS_CHECK(sam_headers); gt_string *sn_tag=gt_sam_header_record_get_tag(header_record,"SN"); gt_cond_error(!sn_tag,PARSE_SAM_HEADER_MISSING_TAG,"SQ","SN"); gt_cond_error(!gt_sam_header_record_get_tag(header_record,"LN"),PARSE_SAM_HEADER_MISSING_TAG,"SQ","LN"); if(sn_tag) { if(!sam_headers->sequence_dictionary_sn_hash) sam_headers->sequence_dictionary_sn_hash=gt_shash_new(); char *sn_str=gt_string_get_string(sn_tag); size_t* ix=gt_shash_get_element(sam_headers->sequence_dictionary_sn_hash,sn_str); // If SN Tag already exists, overwrite. if(ix) { gt_sam_header_record_delete(*(gt_sam_header_record **)gt_vector_get_elm(sam_headers->sequence_dictionary,*ix,gt_sam_header_record*)); gt_vector_set_elm(sam_headers->sequence_dictionary,*ix,gt_sam_header_record*,header_record); gt_error(PARSE_SAM_HEADER_DUPLICATE_TAG,"SQ","SN",sn_str); } else { ix=gt_alloc(size_t); *ix=gt_vector_get_used(sam_headers->sequence_dictionary); gt_shash_insert(sam_headers->sequence_dictionary_sn_hash,sn_str,ix,size_t*); gt_vector_insert(sam_headers->sequence_dictionary,header_record,gt_sam_header_record*); } }