示例#1
0
/*
 * 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*);
  	}
  }