void bcf_hdr_destroy(bcf_hdr_t *h) { int i; khint_t k; for (i = 0; i < 3; ++i) { vdict_t *d = (vdict_t*)h->dict[i]; if (d == 0) continue; for (k = kh_begin(d); k != kh_end(d); ++k) if (kh_exist(d, k)) free((char*)kh_key(d, k)); kh_destroy(vdict, d); free(h->id[i]); } for (i=0; i<h->nhrec; i++) bcf_hrec_destroy(h->hrec[i]); if (h->nhrec) free(h->hrec); if (h->samples) free(h->samples); free(h->mem.s); free(h->text); free(h); }
static void remove_hdr_lines(bcf_hdr_t *hdr, int type) { int i = 0, nrm = 0; while ( i<hdr->nhrec ) { if ( hdr->hrec[i]->type!=type ) { i++; continue; } bcf_hrec_t *hrec = hdr->hrec[i]; if ( type==BCF_HL_FMT ) { // everything except FORMAT/GT int id = bcf_hrec_find_key(hrec, "ID"); if ( id>=0 && !strcmp(hrec->vals[id],"GT") ) { i++; continue; } } nrm++; hdr->nhrec--; if ( i < hdr->nhrec ) memmove(&hdr->hrec[i],&hdr->hrec[i+1],(hdr->nhrec-i)*sizeof(bcf_hrec_t*)); bcf_hrec_destroy(hrec); } if ( nrm ) bcf_hdr_sync(hdr); }