diff options
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | debian/changelog | 9 | ||||
-rw-r--r-- | debian/patches/fix-bus-error-armhf.patch | 523 | ||||
-rw-r--r-- | debian/patches/series | 1 | ||||
-rw-r--r-- | debian/patches/skip_new_test_failing_on_32bit.patch | 6 | ||||
-rw-r--r-- | debian/patches/tests-pluginpath.patch | 6 | ||||
-rw-r--r-- | vcfmerge.c | 210 |
7 files changed, 660 insertions, 97 deletions
@@ -245,7 +245,7 @@ vcffilter.o: vcffilter.c $(htslib_vcf_h) $(htslib_synced_bcf_reader_h) $(htslib_ vcfgtcheck.o: vcfgtcheck.c $(htslib_vcf_h) $(htslib_synced_bcf_reader_h) $(htslib_vcfutils_h) $(htslib_kbitset_h) $(htslib_hts_os_h) $(bcftools_h) extsort.h vcfindex.o: vcfindex.c $(htslib_vcf_h) $(htslib_tbx_h) $(htslib_kstring_h) $(htslib_bgzf_h) $(bcftools_h) vcfisec.o: vcfisec.c $(htslib_vcf_h) $(htslib_synced_bcf_reader_h) $(htslib_vcfutils_h) $(htslib_hts_os_h) $(bcftools_h) $(filter_h) -vcfmerge.o: vcfmerge.c $(htslib_vcf_h) $(htslib_synced_bcf_reader_h) $(htslib_vcfutils_h) $(htslib_faidx_h) regidx.h $(bcftools_h) vcmp.h $(htslib_khash_h) +vcfmerge.o: vcfmerge.c $(htslib_vcf_h) $(htslib_synced_bcf_reader_h) $(htslib_vcfutils_h) $(htslib_faidx_h) $(htslib_kbitset_h) $(htslib_hts_endian_h) $(bcftools_h) regidx.h vcmp.h $(htslib_khash_h) $(htslib_kbitset_h) vcfnorm.o: vcfnorm.c $(htslib_vcf_h) $(htslib_synced_bcf_reader_h) $(htslib_faidx_h) $(htslib_khash_str2int_h) $(bcftools_h) rbuf.h abuf.h gff.h vcfquery.o: vcfquery.c $(htslib_vcf_h) $(htslib_synced_bcf_reader_h) $(htslib_khash_str2int_h) $(htslib_vcfutils_h) $(bcftools_h) $(filter_h) $(convert_h) $(smpl_ilist_h) vcfroh.o: vcfroh.c $(htslib_vcf_h) $(htslib_synced_bcf_reader_h) $(htslib_kstring_h) $(htslib_kseq_h) $(htslib_bgzf_h) $(bcftools_h) HMM.h $(smpl_ilist_h) $(filter_h) diff --git a/debian/changelog b/debian/changelog index 6327454..326a80f 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,12 @@ +bcftools (1.18-2) unstable; urgency=medium + + * skip_new_test_failing_on_32bit.patch: refresh. + * tests-pluginpath.patch: refresh. + * fix-bus-error-armhf.patch: new: fix Bus errors. + Thanks to Rob Davies (Closes: #1055669) + + -- Étienne Mollier <emollier@debian.org> Thu, 23 Nov 2023 12:01:34 +0100 + bcftools (1.18-1) unstable; urgency=medium * Team upload. diff --git a/debian/patches/fix-bus-error-armhf.patch b/debian/patches/fix-bus-error-armhf.patch new file mode 100644 index 0000000..f4b57b8 --- /dev/null +++ b/debian/patches/fix-bus-error-armhf.patch @@ -0,0 +1,523 @@ +commit 752ce93f61aecbde5ef39750cc5fab9537af23cd +Author: Rob Davies <rmd+git@sanger.ac.uk> +Date: Mon Nov 20 15:06:39 2023 +0000 + + Fix bus error in bcftools merge on armhf (32-bit hard-float) + + While 32-bit ARM mostly allows unaligned access, under certain + conditions it can produce a bus error on unaligned access to + a float. To prevent this from happening in bcftools merge, + update code that accesses data via bcf_info_t::vptr and + bcf_fmt_t::p to use uint8_t pointers and the le_to_i* macros + in htslib/hts_endian.h. As a side-effect, this also makes bcftools + merge work on big-endian platforms should anyone attempt to run + it on one. + + Fixes #2036 (test_vcf_merge failures on arm 32-bit with FPU: Bus + error). + +Bug: https://github.com/samtools/bcftools/issues/2036 +Bug-Debian: https://bugs.debian.org/1055669 + +--- bcftools.orig/Makefile ++++ bcftools/Makefile +@@ -245,7 +245,7 @@ + vcfgtcheck.o: vcfgtcheck.c $(htslib_vcf_h) $(htslib_synced_bcf_reader_h) $(htslib_vcfutils_h) $(htslib_kbitset_h) $(htslib_hts_os_h) $(bcftools_h) extsort.h + vcfindex.o: vcfindex.c $(htslib_vcf_h) $(htslib_tbx_h) $(htslib_kstring_h) $(htslib_bgzf_h) $(bcftools_h) + vcfisec.o: vcfisec.c $(htslib_vcf_h) $(htslib_synced_bcf_reader_h) $(htslib_vcfutils_h) $(htslib_hts_os_h) $(bcftools_h) $(filter_h) +-vcfmerge.o: vcfmerge.c $(htslib_vcf_h) $(htslib_synced_bcf_reader_h) $(htslib_vcfutils_h) $(htslib_faidx_h) regidx.h $(bcftools_h) vcmp.h $(htslib_khash_h) ++vcfmerge.o: vcfmerge.c $(htslib_vcf_h) $(htslib_synced_bcf_reader_h) $(htslib_vcfutils_h) $(htslib_faidx_h) $(htslib_kbitset_h) $(htslib_hts_endian_h) $(bcftools_h) regidx.h vcmp.h $(htslib_khash_h) $(htslib_kbitset_h) + vcfnorm.o: vcfnorm.c $(htslib_vcf_h) $(htslib_synced_bcf_reader_h) $(htslib_faidx_h) $(htslib_khash_str2int_h) $(bcftools_h) rbuf.h abuf.h gff.h + vcfquery.o: vcfquery.c $(htslib_vcf_h) $(htslib_synced_bcf_reader_h) $(htslib_khash_str2int_h) $(htslib_vcfutils_h) $(bcftools_h) $(filter_h) $(convert_h) $(smpl_ilist_h) + vcfroh.o: vcfroh.c $(htslib_vcf_h) $(htslib_synced_bcf_reader_h) $(htslib_kstring_h) $(htslib_kseq_h) $(htslib_bgzf_h) $(bcftools_h) HMM.h $(smpl_ilist_h) $(filter_h) +--- bcftools.orig/vcfmerge.c ++++ bcftools/vcfmerge.c +@@ -34,6 +34,7 @@ + #include <htslib/synced_bcf_reader.h> + #include <htslib/vcfutils.h> + #include <htslib/faidx.h> ++#include <htslib/hts_endian.h> + #include <math.h> + #include <ctype.h> + #include <time.h> +@@ -1272,32 +1273,32 @@ + if ( len==BCF_VL_A || len==BCF_VL_R ) + { + int ifrom = len==BCF_VL_A ? 1 : 0; +- #define BRANCH(type_t, is_missing, is_vector_end, out_type_t) { \ +- type_t *src = (type_t *) info->vptr; \ ++ #define BRANCH(type_t, convert, is_missing, is_vector_end, out_type_t) { \ ++ uint8_t *src = info->vptr; \ + out_type_t *tgt = (out_type_t *) agr->buf; \ + int iori, inew; \ +- for (iori=ifrom; iori<line->n_allele; iori++) \ ++ for (iori=ifrom; iori<line->n_allele; iori++, src += sizeof(type_t)) \ + { \ ++ type_t val = convert(src); \ + if ( is_vector_end ) break; \ + if ( is_missing ) continue; \ + inew = als->map[iori] - ifrom; \ +- tgt[inew] = *src; \ +- src++; \ ++ tgt[inew] = val; \ + } \ + } + switch (info->type) { +- case BCF_BT_INT8: BRANCH(int8_t, *src==bcf_int8_missing, *src==bcf_int8_vector_end, int); break; +- case BCF_BT_INT16: BRANCH(int16_t, *src==bcf_int16_missing, *src==bcf_int16_vector_end, int); break; +- case BCF_BT_INT32: BRANCH(int32_t, *src==bcf_int32_missing, *src==bcf_int32_vector_end, int); break; +- case BCF_BT_FLOAT: BRANCH(float, bcf_float_is_missing(*src), bcf_float_is_vector_end(*src), float); break; ++ case BCF_BT_INT8: BRANCH(int8_t, le_to_i8, val==bcf_int8_missing, val==bcf_int8_vector_end, int); break; ++ case BCF_BT_INT16: BRANCH(int16_t, le_to_i16, val==bcf_int16_missing, val==bcf_int16_vector_end, int); break; ++ case BCF_BT_INT32: BRANCH(int32_t, le_to_i32, val==bcf_int32_missing, val==bcf_int32_vector_end, int); break; ++ case BCF_BT_FLOAT: BRANCH(float, le_to_float, bcf_float_is_missing(val), bcf_float_is_vector_end(val), float); break; + default: fprintf(stderr,"TODO: %s:%d .. info->type=%d\n", __FILE__,__LINE__, info->type); exit(1); + } + #undef BRANCH + } + else + { +- #define BRANCH(type_t, is_missing, is_vector_end, out_type_t) { \ +- type_t *src = (type_t *) info->vptr; \ ++ #define BRANCH(type_t, convert, is_missing, is_vector_end, out_type_t) { \ ++ uint8_t *src = info->vptr; \ + out_type_t *tgt = (out_type_t *) agr->buf; \ + int iori,jori, inew,jnew; \ + for (iori=0; iori<line->n_allele; iori++) \ +@@ -1307,19 +1308,20 @@ + { \ + jnew = als->map[jori]; \ + int kori = iori*(iori+1)/2 + jori; \ ++ type_t val = convert(&src[kori * sizeof(type_t)]); \ + if ( is_vector_end ) break; \ + if ( is_missing ) continue; \ + int knew = inew>jnew ? inew*(inew+1)/2 + jnew : jnew*(jnew+1)/2 + inew; \ +- tgt[knew] = src[kori]; \ ++ tgt[knew] = val; \ + } \ + if ( jori<=iori ) break; \ + } \ + } + switch (info->type) { +- case BCF_BT_INT8: BRANCH(int8_t, src[kori]==bcf_int8_missing, src[kori]==bcf_int8_vector_end, int); break; +- case BCF_BT_INT16: BRANCH(int16_t, src[kori]==bcf_int16_missing, src[kori]==bcf_int16_vector_end, int); break; +- case BCF_BT_INT32: BRANCH(int32_t, src[kori]==bcf_int32_missing, src[kori]==bcf_int32_vector_end, int); break; +- case BCF_BT_FLOAT: BRANCH(float, bcf_float_is_missing(src[kori]), bcf_float_is_vector_end(src[kori]), float); break; ++ case BCF_BT_INT8: BRANCH(int8_t, le_to_i8, val==bcf_int8_missing, val==bcf_int8_vector_end, int); break; ++ case BCF_BT_INT16: BRANCH(int16_t, le_to_i16, val==bcf_int16_missing, val==bcf_int16_vector_end, int); break; ++ case BCF_BT_INT32: BRANCH(int32_t, le_to_i32, val==bcf_int32_missing, val==bcf_int32_vector_end, int); break; ++ case BCF_BT_FLOAT: BRANCH(float, le_to_float, bcf_float_is_missing(val), bcf_float_is_vector_end(val), float); break; + default: fprintf(stderr,"TODO: %s:%d .. info->type=%d\n", __FILE__,__LINE__, info->type); exit(1); + } + #undef BRANCH +@@ -1488,12 +1490,12 @@ + { + int i,j, max_ploidy = 0; + +- #define BRANCH(type_t, vector_end) { \ +- type_t *ptr = (type_t*) fmt->p; \ ++ #define BRANCH(type_t, convert, vector_end) { \ ++ uint8_t *ptr = fmt->p; \ + for (i=0; i<nsmpl; i++) \ + { \ + for (j=0; j<fmt->n; j++) \ +- if ( ptr[j]==vector_end ) break; \ ++ if ( convert(&ptr[j * sizeof(type_t)])==vector_end ) break; \ + if ( j==fmt->n ) \ + { \ + /* all fields were used */ \ +@@ -1501,14 +1503,14 @@ + break; \ + } \ + if ( max_ploidy < j ) max_ploidy = j; \ +- ptr += fmt->n; \ ++ ptr += fmt->n * sizeof(type_t); \ + } \ + } + switch (fmt->type) + { +- case BCF_BT_INT8: BRANCH(int8_t, bcf_int8_vector_end); break; +- case BCF_BT_INT16: BRANCH(int16_t, bcf_int16_vector_end); break; +- case BCF_BT_INT32: BRANCH(int32_t, bcf_int32_vector_end); break; ++ case BCF_BT_INT8: BRANCH(int8_t, le_to_i8, bcf_int8_vector_end); break; ++ case BCF_BT_INT16: BRANCH(int16_t, le_to_i16, bcf_int16_vector_end); break; ++ case BCF_BT_INT32: BRANCH(int32_t, le_to_i32, bcf_int32_vector_end); break; + default: error("Unexpected case: %d\n", fmt->type); + } + #undef BRANCH +@@ -1598,19 +1600,22 @@ + int *map = ma->buf[i].rec[ma->buf[i].cur].map; + double *allele_prob = ma->tmpd; + int *idx = ma->tmpi; +- #define BRANCH(src_type_t, src_is_missing, src_is_vector_end, pl2prob_idx) { \ +- src_type_t *src = (src_type_t*) fmt_ori->p; \ ++ #define BRANCH(src_type_t, convert, src_is_missing, src_is_vector_end, pl2prob_idx) { \ ++ uint8_t *src = fmt_ori->p; \ + for (j=0; j<nsmpl; j++) \ + { \ + for (k=0; k<line->n_allele; k++) allele_prob[k] = 0; \ + for (k=0; k<line->n_allele; k++) \ + for (l=0; l<=k; l++) \ + { \ +- if ( src_is_missing || src_is_vector_end ) { src++; continue; } \ +- double prob = ma->pl2prob[pl2prob_idx]; \ +- allele_prob[k] += prob; \ +- allele_prob[l] += prob; \ +- src++; \ ++ src_type_t val = convert(src); \ ++ if ( !(src_is_missing) && !(src_is_vector_end) ) \ ++ { \ ++ double prob = ma->pl2prob[pl2prob_idx]; \ ++ allele_prob[k] += prob; \ ++ allele_prob[l] += prob; \ ++ } \ ++ src += sizeof(src_type_t); \ + } \ + /* insertion sort by allele probability, descending order, with the twist that REF (idx=0) always comes first */ \ + allele_prob++; idx[0] = -1; idx++; /* keep REF first */ \ +@@ -1637,9 +1642,9 @@ + } + switch (fmt_ori->type) + { +- case BCF_BT_INT8: BRANCH( int8_t, *src==bcf_int8_missing, *src==bcf_int8_vector_end, *src); break; +- case BCF_BT_INT16: BRANCH(int16_t, *src==bcf_int16_missing, *src==bcf_int16_vector_end, *src>=0 && *src<PL2PROB_MAX ? *src : PL2PROB_MAX-1); break; +- case BCF_BT_INT32: BRANCH(int32_t, *src==bcf_int32_missing, *src==bcf_int32_vector_end, *src>=0 && *src<PL2PROB_MAX ? *src : PL2PROB_MAX-1); break; ++ case BCF_BT_INT8: BRANCH( int8_t, le_to_i8, val==bcf_int8_missing, val==bcf_int8_vector_end, val); break; ++ case BCF_BT_INT16: BRANCH(int16_t, le_to_i16, val==bcf_int16_missing, val==bcf_int16_vector_end, val>=0 && val<PL2PROB_MAX ? val : PL2PROB_MAX-1); break; ++ case BCF_BT_INT32: BRANCH(int32_t, le_to_i32, val==bcf_int32_missing, val==bcf_int32_vector_end, val>=0 && val<PL2PROB_MAX ? val : PL2PROB_MAX-1); break; + default: error("Unexpected case: %d, PL\n", fmt_ori->type); + } + #undef BRANCH +@@ -1735,8 +1740,8 @@ + continue; + } + +- #define BRANCH(type_t, vector_end) { \ +- type_t *p_ori = (type_t*) fmt_ori->p; \ ++ #define BRANCH(type_t, convert, vector_end) { \ ++ uint8_t *p_ori = fmt_ori->p; \ + if ( !ma->buf[i].rec[irec].als_differ ) \ + { \ + /* the allele numbering is unchanged */ \ +@@ -1744,14 +1749,15 @@ + { \ + for (k=0; k<fmt_ori->n; k++) \ + { \ +- if ( p_ori[k]==vector_end ) break; /* smaller ploidy */ \ ++ type_t val = convert(&p_ori[k * sizeof(type_t)]); \ ++ if ( val==vector_end ) break; /* smaller ploidy */ \ + ma->smpl_ploidy[ismpl+j]++; \ +- if ( bcf_gt_is_missing(p_ori[k]) ) tmp[k] = 0; /* missing allele */ \ +- else tmp[k] = p_ori[k]; \ ++ if ( bcf_gt_is_missing(val) ) tmp[k] = 0; /* missing allele */ \ ++ else tmp[k] = val; \ + } \ + for (; k<nsize; k++) tmp[k] = bcf_int32_vector_end; \ + tmp += nsize; \ +- p_ori += fmt_ori->n; \ ++ p_ori += fmt_ori->n * sizeof(type_t); \ + } \ + ismpl += bcf_hdr_nsamples(hdr); \ + continue; \ +@@ -1761,27 +1767,28 @@ + { \ + for (k=0; k<fmt_ori->n; k++) \ + { \ +- if ( p_ori[k]==vector_end ) break; /* smaller ploidy */ \ ++ type_t val = convert(&p_ori[k * sizeof(type_t)]); \ ++ if ( val==vector_end ) break; /* smaller ploidy */ \ + ma->smpl_ploidy[ismpl+j]++; \ +- if ( bcf_gt_is_missing(p_ori[k]) ) tmp[k] = 0; /* missing allele */ \ ++ if ( bcf_gt_is_missing(val) ) tmp[k] = 0; /* missing allele */ \ + else \ + { \ +- int al = (p_ori[k]>>1) - 1; \ ++ int al = (val>>1) - 1; \ + al = al<=0 ? al + 1 : ma->buf[i].rec[irec].map[al] + 1; \ +- tmp[k] = (al << 1) | ((p_ori[k])&1); \ ++ tmp[k] = (al << 1) | ((val)&1); \ + } \ + } \ + for (; k<nsize; k++) tmp[k] = bcf_int32_vector_end; \ + tmp += nsize; \ +- p_ori += fmt_ori->n; \ ++ p_ori += fmt_ori->n * sizeof(type_t); \ + } \ + ismpl += bcf_hdr_nsamples(hdr); \ + } + switch (fmt_ori->type) + { +- case BCF_BT_INT8: BRANCH(int8_t, bcf_int8_vector_end); break; +- case BCF_BT_INT16: BRANCH(int16_t, bcf_int16_vector_end); break; +- case BCF_BT_INT32: BRANCH(int32_t, bcf_int32_vector_end); break; ++ case BCF_BT_INT8: BRANCH(int8_t, le_to_i8, bcf_int8_vector_end); break; ++ case BCF_BT_INT16: BRANCH(int16_t, le_to_i16, bcf_int16_vector_end); break; ++ case BCF_BT_INT32: BRANCH(int32_t, le_to_i32, bcf_int32_vector_end); break; + default: error("Unexpected case: %d\n", fmt_ori->type); + } + #undef BRANCH +@@ -1959,10 +1966,10 @@ + if ( 2*fmt_ori->n!=line->n_allele*(line->n_allele+1) ) error("Todo: localization of missing or haploid Number=G tags\n"); + + // localize +- #define BRANCH(tgt_type_t, src_type_t, src_is_missing, src_is_vector_end, tgt_set_missing, tgt_set_vector_end) { \ ++ #define BRANCH(tgt_type_t, src_type_t, convert, src_is_missing, src_is_vector_end, tgt_set_missing, tgt_set_vector_end) { \ + for (j=0; j<nsmpl; j++) \ + { \ +- src_type_t *src = (src_type_t*) fmt_ori->p + j*fmt_ori->n; \ ++ uint8_t *src = fmt_ori->p + sizeof(src_type_t)*j*fmt_ori->n; \ + tgt_type_t *tgt = (tgt_type_t *) ma->tmp_arr + ismpl*nsize; \ + int *laa = ma->laa + (1+args->local_alleles)*ismpl; \ + int ii,ij,tgt_idx = 0; \ +@@ -1972,9 +1979,10 @@ + for (ij=0; ij<=ii; ij++) \ + { \ + int src_idx = bcf_alleles2gt(laa[ii],laa[ij]); \ ++ src_type_t val = convert(&src[src_idx * sizeof(src_type_t)]); \ + if ( src_is_missing ) tgt_set_missing; \ + else if ( src_is_vector_end ) break; \ +- else tgt[tgt_idx] = src[src_idx]; \ ++ else tgt[tgt_idx] = val; \ + tgt_idx++; \ + } \ + } \ +@@ -1985,10 +1993,10 @@ + } + switch (fmt_ori->type) + { +- case BCF_BT_INT8: BRANCH(int32_t, int8_t, src[src_idx]==bcf_int8_missing, src[src_idx]==bcf_int8_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break; +- case BCF_BT_INT16: BRANCH(int32_t, int16_t, src[src_idx]==bcf_int16_missing, src[src_idx]==bcf_int16_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break; +- case BCF_BT_INT32: BRANCH(int32_t, int32_t, src[src_idx]==bcf_int32_missing, src[src_idx]==bcf_int32_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break; +- case BCF_BT_FLOAT: BRANCH(float, float, bcf_float_is_missing(src[src_idx]), bcf_float_is_vector_end(src[src_idx]), bcf_float_set_missing(tgt[tgt_idx]), bcf_float_set_vector_end(tgt[tgt_idx])); break; ++ case BCF_BT_INT8: BRANCH(int32_t, int8_t, le_to_i8, val==bcf_int8_missing, val==bcf_int8_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break; ++ case BCF_BT_INT16: BRANCH(int32_t, int16_t, le_to_i16, val==bcf_int16_missing, val==bcf_int16_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break; ++ case BCF_BT_INT32: BRANCH(int32_t, int32_t, le_to_i16, val==bcf_int32_missing, val==bcf_int32_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break; ++ case BCF_BT_FLOAT: BRANCH(float, float, le_to_float, bcf_float_is_missing(val), bcf_float_is_vector_end(val), bcf_float_set_missing(tgt[tgt_idx]), bcf_float_set_vector_end(tgt[tgt_idx])); break; + default: error("Unexpected case: %d, %s\n", fmt_ori->type, key); + } + #undef BRANCH +@@ -2058,10 +2066,10 @@ + } + + // localize +- #define BRANCH(tgt_type_t, src_type_t, src_is_missing, src_is_vector_end, tgt_set_missing, tgt_set_vector_end) { \ ++ #define BRANCH(tgt_type_t, src_type_t, convert, src_is_missing, src_is_vector_end, tgt_set_missing, tgt_set_vector_end) { \ + for (j=0; j<nsmpl; j++) \ + { \ +- src_type_t *src = (src_type_t*) fmt_ori->p + j*fmt_ori->n; \ ++ uint8_t *src = fmt_ori->p + sizeof(src_type_t)*j*fmt_ori->n; \ + tgt_type_t *tgt = (tgt_type_t *) ma->tmp_arr + ismpl*nsize; \ + int *laa = ma->laa + (1+args->local_alleles)*ismpl; \ + int ii,tgt_idx = 0; \ +@@ -2069,9 +2077,10 @@ + { \ + if ( laa[ii]==bcf_int32_missing || laa[ii]==bcf_int32_vector_end ) break; \ + int src_idx = laa[ii] - ibeg; \ ++ src_type_t val = convert(&src[src_idx * sizeof(src_type_t)]); \ + if ( src_is_missing ) tgt_set_missing; \ + else if ( src_is_vector_end ) break; \ +- else tgt[tgt_idx] = src[src_idx]; \ ++ else tgt[tgt_idx] = val; \ + tgt_idx++; \ + } \ + if ( !tgt_idx ) { tgt_set_missing; tgt_idx++; } \ +@@ -2081,10 +2090,10 @@ + } + switch (fmt_ori->type) + { +- case BCF_BT_INT8: BRANCH(int32_t, int8_t, src[src_idx]==bcf_int8_missing, src[src_idx]==bcf_int8_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break; +- case BCF_BT_INT16: BRANCH(int32_t, int16_t, src[src_idx]==bcf_int16_missing, src[src_idx]==bcf_int16_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break; +- case BCF_BT_INT32: BRANCH(int32_t, int32_t, src[src_idx]==bcf_int32_missing, src[src_idx]==bcf_int32_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break; +- case BCF_BT_FLOAT: BRANCH(float, float, bcf_float_is_missing(src[src_idx]), bcf_float_is_vector_end(src[src_idx]), bcf_float_set_missing(tgt[tgt_idx]), bcf_float_set_vector_end(tgt[tgt_idx])); break; ++ case BCF_BT_INT8: BRANCH(int32_t, int8_t, le_to_i8, val==bcf_int8_missing, val==bcf_int8_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break; ++ case BCF_BT_INT16: BRANCH(int32_t, int16_t, le_to_i16, val==bcf_int16_missing, val==bcf_int16_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break; ++ case BCF_BT_INT32: BRANCH(int32_t, int32_t, le_to_i32, val==bcf_int32_missing, val==bcf_int32_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break; ++ case BCF_BT_FLOAT: BRANCH(float, float, le_to_float, bcf_float_is_missing(val), bcf_float_is_vector_end(val), bcf_float_set_missing(tgt[tgt_idx]), bcf_float_set_vector_end(tgt[tgt_idx])); break; + default: error("Unexpected case: %d, %s\n", fmt_ori->type, key); + } + #undef BRANCH +@@ -2201,7 +2210,7 @@ + } + + // set the values +- #define BRANCH(tgt_type_t, src_type_t, src_is_missing, src_is_vector_end, tgt_set_missing, tgt_set_vector_end) { \ ++ #define BRANCH(tgt_type_t, src_type_t, convert, src_is_missing, src_is_vector_end, tgt_set_missing, tgt_set_vector_end) { \ + int j, l, k; \ + tgt_type_t *tgt = (tgt_type_t *) ma->tmp_arr + ismpl*nsize; \ + if ( !fmt_ori ) \ +@@ -2214,7 +2223,7 @@ + ismpl += bcf_hdr_nsamples(hdr); \ + continue; \ + } \ +- src_type_t *src = (src_type_t*) fmt_ori->p; \ ++ uint8_t *src = fmt_ori->p; \ + if ( (length!=BCF_VL_G && length!=BCF_VL_A && length!=BCF_VL_R) || (line->n_allele==out->n_allele && !ma->buf[i].rec[irec].als_differ) ) \ + { \ + /* alleles unchanged, copy over */ \ +@@ -2224,11 +2233,11 @@ + { \ + if ( src_is_vector_end ) break; \ + else if ( src_is_missing ) tgt_set_missing; \ +- else *tgt = *src; \ +- tgt++; src++; \ ++ else *tgt = convert(src); \ ++ tgt++; src += sizeof(src_type_t); \ + } \ + for (k=l; k<nsize; k++) { tgt_set_vector_end; tgt++; } \ +- src += fmt_ori->n - l; \ ++ src += sizeof(src_type_t) * (fmt_ori->n - l); \ + } \ + ismpl += bcf_hdr_nsamples(hdr); \ + continue; \ +@@ -2240,8 +2249,14 @@ + for (j=0; j<bcf_hdr_nsamples(hdr); j++) \ + { \ + tgt = (tgt_type_t *) ma->tmp_arr + (ismpl+j)*nsize; \ +- src = (src_type_t*) fmt_ori->p + j*fmt_ori->n; \ +- if ( (src_is_missing && fmt_ori->n==1) || (++src && src_is_vector_end) ) \ ++ src = fmt_ori->p + sizeof(src_type_t) * j * fmt_ori->n; \ ++ int tag_missing = src_is_missing && fmt_ori->n==1; \ ++ if (!tag_missing) \ ++ { \ ++ src += sizeof(src_type_t); \ ++ tag_missing = src_is_vector_end ; \ ++ } \ ++ if ( tag_missing ) \ + { \ + /* tag with missing value "." */ \ + tgt_set_missing; \ +@@ -2252,9 +2267,10 @@ + int ngsize = haploid ? out->n_allele : out->n_allele*(out->n_allele + 1)/2; \ + if ( ma->buf[i].unkn_allele ) /* Use value from the unknown allele when available */ \ + { \ +- src = (src_type_t*) fmt_ori->p + j*fmt_ori->n; \ ++ src = fmt_ori->p + sizeof(src_type_t)*j*fmt_ori->n; \ + int iunkn = haploid ? ma->buf[i].unkn_allele : (ma->buf[i].unkn_allele+1)*(ma->buf[i].unkn_allele + 2)/2 - 1; \ +- for (l=0; l<ngsize; l++) { *tgt = src[iunkn]; tgt++; } \ ++ src_type_t val = convert(&src[iunkn * sizeof(src_type_t)]); \ ++ for (l=0; l<ngsize; l++) { *tgt = val; tgt++; } \ + } \ + else if ( mrule && mrule->type==MERGE_MISSING_CONST ) \ + { \ +@@ -2262,9 +2278,13 @@ + } \ + else if ( mrule && mrule->type==MERGE_MISSING_MAX ) \ + { \ +- src = (src_type_t*) fmt_ori->p + j*fmt_ori->n; \ +- src_type_t max = src[0]; \ +- for (l=1; l<fmt_ori->n; l++) if ( max < src[l] ) max = src[l]; \ ++ src = fmt_ori->p + sizeof(src_type_t)*j*fmt_ori->n; \ ++ src_type_t max = convert(src); \ ++ for (l=1; l<fmt_ori->n; l++) \ ++ { \ ++ src_type_t val = convert(&src[l * sizeof(src_type_t)]); \ ++ if ( max < val ) max = val; \ ++ } \ + for (l=0; l<ngsize; l++) { *tgt = max; tgt++; } \ + } \ + else \ +@@ -2278,11 +2298,11 @@ + for (iori=0; iori<line->n_allele; iori++) \ + { \ + inew = ma->buf[i].rec[irec].map[iori]; \ +- src = (src_type_t*) fmt_ori->p + j*fmt_ori->n + iori; \ ++ src = fmt_ori->p + (j*fmt_ori->n + iori) * sizeof(src_type_t); \ + tgt = (tgt_type_t *) ma->tmp_arr + (ismpl+j)*nsize + inew; \ + if ( src_is_vector_end ) break; \ + if ( src_is_missing ) tgt_set_missing; \ +- else *tgt = *src; \ ++ else *tgt = convert(src); \ + } \ + } \ + else \ +@@ -2297,7 +2317,7 @@ + jnew = ma->buf[i].rec[irec].map[jori]; \ + int kori = iori*(iori+1)/2 + jori; \ + int knew = inew>jnew ? inew*(inew+1)/2 + jnew : jnew*(jnew+1)/2 + inew; \ +- src = (src_type_t*) fmt_ori->p + j*fmt_ori->n + kori; \ ++ src = fmt_ori->p + (j*fmt_ori->n + kori) * sizeof(src_type_t); \ + tgt = (tgt_type_t *) ma->tmp_arr + (ismpl+j)*nsize + knew; \ + if ( src_is_vector_end ) \ + { \ +@@ -2305,7 +2325,7 @@ + break; \ + } \ + if ( src_is_missing ) tgt_set_missing; \ +- else *tgt = *src; \ ++ else *tgt = convert(src); \ + } \ + } \ + } \ +@@ -2318,19 +2338,25 @@ + for (j=0; j<bcf_hdr_nsamples(hdr); j++) \ + { \ + tgt = (tgt_type_t *) ma->tmp_arr + (ismpl+j)*nsize; \ +- src = (src_type_t*) (fmt_ori->p + j*fmt_ori->size); \ +- if ( (src_is_missing && fmt_ori->n==1) || (++src && src_is_vector_end) ) \ ++ src = fmt_ori->p + sizeof(src_type_t) * j * fmt_ori->size; \ ++ int tag_missing = src_is_missing && fmt_ori->n==1; \ ++ if (!tag_missing) { \ ++ src += sizeof(src_type_t); \ ++ tag_missing = src_is_vector_end ; \ ++ } \ ++ if ( tag_missing ) \ + { \ + /* tag with missing value "." */ \ + tgt_set_missing; \ + for (l=1; l<nsize; l++) { tgt++; tgt_set_vector_end; } \ + continue; \ + } \ +- src = (src_type_t*) (fmt_ori->p + j*fmt_ori->size); \ ++ src = fmt_ori->p + sizeof(src_type_t) * j *fmt_ori->size; \ + if ( ma->buf[i].unkn_allele ) /* Use value from the unknown allele when available */ \ + { \ + int iunkn = ma->buf[i].unkn_allele; \ +- for (l=0; l<nsize; l++) { *tgt = src[iunkn]; tgt++; } \ ++ src_type_t val = convert(&src[iunkn * sizeof(src_type_t)]); \ ++ for (l=0; l<nsize; l++) { *tgt = val; tgt++; } \ + } \ + else if ( mrule && mrule->type==MERGE_MISSING_CONST ) \ + { \ +@@ -2338,9 +2364,13 @@ + } \ + else if ( mrule && mrule->type==MERGE_MISSING_MAX ) \ + { \ +- src = (src_type_t*) fmt_ori->p + j*fmt_ori->n; \ +- src_type_t max = src[0]; \ +- for (l=1; l<fmt_ori->n; l++) if ( max < src[l] ) max = src[l]; \ ++ src = fmt_ori->p + sizeof(src_type_t)*j*fmt_ori->n; \ ++ src_type_t max = convert(src); \ ++ for (l=1; l<fmt_ori->n; l++) \ ++ { \ ++ src_type_t val = convert(&src[l * sizeof(src_type_t)]); \ ++ if ( max < val ) max = val; \ ++ } \ + for (l=0; l<nsize; l++) { *tgt = max; tgt++; } \ + } \ + else \ +@@ -2354,8 +2384,8 @@ + tgt = (tgt_type_t *) ma->tmp_arr + (ismpl+j)*nsize + inew; \ + if ( src_is_vector_end ) break; \ + if ( src_is_missing ) tgt_set_missing; \ +- else *tgt = *src; \ +- src++; \ ++ else *tgt = convert(src); \ ++ src += sizeof(src_type_t); \ + } \ + } \ + } \ +@@ -2363,10 +2393,10 @@ + } + switch (type) + { +- case BCF_BT_INT8: BRANCH(int32_t, int8_t, *src==bcf_int8_missing, *src==bcf_int8_vector_end, *tgt=bcf_int32_missing, *tgt=bcf_int32_vector_end); break; +- case BCF_BT_INT16: BRANCH(int32_t, int16_t, *src==bcf_int16_missing, *src==bcf_int16_vector_end, *tgt=bcf_int32_missing, *tgt=bcf_int32_vector_end); break; +- case BCF_BT_INT32: BRANCH(int32_t, int32_t, *src==bcf_int32_missing, *src==bcf_int32_vector_end, *tgt=bcf_int32_missing, *tgt=bcf_int32_vector_end); break; +- case BCF_BT_FLOAT: BRANCH(float, float, bcf_float_is_missing(*src), bcf_float_is_vector_end(*src), bcf_float_set_missing(*tgt), bcf_float_set_vector_end(*tgt)); break; ++ case BCF_BT_INT8: BRANCH(int32_t, int8_t, le_to_i8, le_to_i8(src)==bcf_int8_missing, le_to_i8(src)==bcf_int8_vector_end, *tgt=bcf_int32_missing, *tgt=bcf_int32_vector_end); break; ++ case BCF_BT_INT16: BRANCH(int32_t, int16_t, le_to_i16, le_to_i16(src)==bcf_int16_missing, le_to_i16(src)==bcf_int16_vector_end, *tgt=bcf_int32_missing, *tgt=bcf_int32_vector_end); break; ++ case BCF_BT_INT32: BRANCH(int32_t, int32_t, le_to_i32, le_to_i32(src)==bcf_int32_missing, le_to_i32(src)==bcf_int32_vector_end, *tgt=bcf_int32_missing, *tgt=bcf_int32_vector_end); break; ++ case BCF_BT_FLOAT: BRANCH(float, float, le_to_float, bcf_float_is_missing(le_to_float(src)), bcf_float_is_vector_end(le_to_float(src)), bcf_float_set_missing(*tgt), bcf_float_set_vector_end(*tgt)); break; + default: error("Unexpected case: %d, %s\n", type, key); + } + #undef BRANCH diff --git a/debian/patches/series b/debian/patches/series index a460711..d237580 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1,3 +1,4 @@ tests-pluginpath.patch skip_new_test_failing_on_32bit.patch 2to3.patch +fix-bus-error-armhf.patch diff --git a/debian/patches/skip_new_test_failing_on_32bit.patch b/debian/patches/skip_new_test_failing_on_32bit.patch index 16367f5..27ca558 100644 --- a/debian/patches/skip_new_test_failing_on_32bit.patch +++ b/debian/patches/skip_new_test_failing_on_32bit.patch @@ -9,9 +9,9 @@ Description: Skip single test causing new failures . FIXME: This workaround needs to be reconsidered in future versions ---- a/test/test.pl -+++ b/test/test.pl -@@ -194,7 +194,7 @@ run_test(\&test_vcf_query,$opts,in=>'que +--- bcftools.orig/test/test.pl ++++ bcftools/test/test.pl +@@ -202,7 +202,7 @@ run_test(\&test_vcf_query,$opts,in=>'query.filter.11',out=>'query.81.out',args=>q[-f'[%POS\\t%SAMPLE\\t%GT\\n]' -e'N_PASS(GT="alt")==1']); run_test(\&test_vcf_query,$opts,in=>'query.filter.11',out=>'query.80.out',args=>q[-f'[%POS\\t%SAMPLE\\t%GT\\n]' -e'N_PASS(GT="alt")!=1']); run_test(\&test_vcf_query,$opts,in=>'query',out=>'query.64.out',args=>q[-f'%CHROM\\t%POS\\t%INFO\\t%FORMAT\\n' -s D,C]); diff --git a/debian/patches/tests-pluginpath.patch b/debian/patches/tests-pluginpath.patch index 972dac6..215fa56 100644 --- a/debian/patches/tests-pluginpath.patch +++ b/debian/patches/tests-pluginpath.patch @@ -8,9 +8,9 @@ Description: Set the bcftools plugin path to search system directories Author: Afif Elghraoui <afif@ghraoui.name> Forwarded: not-needed Last-Update: 2015-11-09 ---- a/test/test.pl -+++ b/test/test.pl -@@ -1582,7 +1582,7 @@ sub test_vcf_plugin +--- bcftools.orig/test/test.pl ++++ bcftools/test/test.pl +@@ -1704,7 +1704,7 @@ { my ($opts,%args) = @_; if ( !$$opts{test_plugins} ) { return; } @@ -34,6 +34,7 @@ THE SOFTWARE. */ #include <htslib/synced_bcf_reader.h> #include <htslib/vcfutils.h> #include <htslib/faidx.h> +#include <htslib/hts_endian.h> #include <math.h> #include <ctype.h> #include <time.h> @@ -1272,32 +1273,32 @@ static void merge_AGR_info_tag(bcf_hdr_t *hdr, bcf1_t *line, bcf_info_t *info, i if ( len==BCF_VL_A || len==BCF_VL_R ) { int ifrom = len==BCF_VL_A ? 1 : 0; - #define BRANCH(type_t, is_missing, is_vector_end, out_type_t) { \ - type_t *src = (type_t *) info->vptr; \ + #define BRANCH(type_t, convert, is_missing, is_vector_end, out_type_t) { \ + uint8_t *src = info->vptr; \ out_type_t *tgt = (out_type_t *) agr->buf; \ int iori, inew; \ - for (iori=ifrom; iori<line->n_allele; iori++) \ + for (iori=ifrom; iori<line->n_allele; iori++, src += sizeof(type_t)) \ { \ + type_t val = convert(src); \ if ( is_vector_end ) break; \ if ( is_missing ) continue; \ inew = als->map[iori] - ifrom; \ - tgt[inew] = *src; \ - src++; \ + tgt[inew] = val; \ } \ } switch (info->type) { - case BCF_BT_INT8: BRANCH(int8_t, *src==bcf_int8_missing, *src==bcf_int8_vector_end, int); break; - case BCF_BT_INT16: BRANCH(int16_t, *src==bcf_int16_missing, *src==bcf_int16_vector_end, int); break; - case BCF_BT_INT32: BRANCH(int32_t, *src==bcf_int32_missing, *src==bcf_int32_vector_end, int); break; - case BCF_BT_FLOAT: BRANCH(float, bcf_float_is_missing(*src), bcf_float_is_vector_end(*src), float); break; + case BCF_BT_INT8: BRANCH(int8_t, le_to_i8, val==bcf_int8_missing, val==bcf_int8_vector_end, int); break; + case BCF_BT_INT16: BRANCH(int16_t, le_to_i16, val==bcf_int16_missing, val==bcf_int16_vector_end, int); break; + case BCF_BT_INT32: BRANCH(int32_t, le_to_i32, val==bcf_int32_missing, val==bcf_int32_vector_end, int); break; + case BCF_BT_FLOAT: BRANCH(float, le_to_float, bcf_float_is_missing(val), bcf_float_is_vector_end(val), float); break; default: fprintf(stderr,"TODO: %s:%d .. info->type=%d\n", __FILE__,__LINE__, info->type); exit(1); } #undef BRANCH } else { - #define BRANCH(type_t, is_missing, is_vector_end, out_type_t) { \ - type_t *src = (type_t *) info->vptr; \ + #define BRANCH(type_t, convert, is_missing, is_vector_end, out_type_t) { \ + uint8_t *src = info->vptr; \ out_type_t *tgt = (out_type_t *) agr->buf; \ int iori,jori, inew,jnew; \ for (iori=0; iori<line->n_allele; iori++) \ @@ -1307,19 +1308,20 @@ static void merge_AGR_info_tag(bcf_hdr_t *hdr, bcf1_t *line, bcf_info_t *info, i { \ jnew = als->map[jori]; \ int kori = iori*(iori+1)/2 + jori; \ + type_t val = convert(&src[kori * sizeof(type_t)]); \ if ( is_vector_end ) break; \ if ( is_missing ) continue; \ int knew = inew>jnew ? inew*(inew+1)/2 + jnew : jnew*(jnew+1)/2 + inew; \ - tgt[knew] = src[kori]; \ + tgt[knew] = val; \ } \ if ( jori<=iori ) break; \ } \ } switch (info->type) { - case BCF_BT_INT8: BRANCH(int8_t, src[kori]==bcf_int8_missing, src[kori]==bcf_int8_vector_end, int); break; - case BCF_BT_INT16: BRANCH(int16_t, src[kori]==bcf_int16_missing, src[kori]==bcf_int16_vector_end, int); break; - case BCF_BT_INT32: BRANCH(int32_t, src[kori]==bcf_int32_missing, src[kori]==bcf_int32_vector_end, int); break; - case BCF_BT_FLOAT: BRANCH(float, bcf_float_is_missing(src[kori]), bcf_float_is_vector_end(src[kori]), float); break; + case BCF_BT_INT8: BRANCH(int8_t, le_to_i8, val==bcf_int8_missing, val==bcf_int8_vector_end, int); break; + case BCF_BT_INT16: BRANCH(int16_t, le_to_i16, val==bcf_int16_missing, val==bcf_int16_vector_end, int); break; + case BCF_BT_INT32: BRANCH(int32_t, le_to_i32, val==bcf_int32_missing, val==bcf_int32_vector_end, int); break; + case BCF_BT_FLOAT: BRANCH(float, le_to_float, bcf_float_is_missing(val), bcf_float_is_vector_end(val), float); break; default: fprintf(stderr,"TODO: %s:%d .. info->type=%d\n", __FILE__,__LINE__, info->type); exit(1); } #undef BRANCH @@ -1488,12 +1490,12 @@ static inline int max_used_gt_ploidy(bcf_fmt_t *fmt, int nsmpl) { int i,j, max_ploidy = 0; - #define BRANCH(type_t, vector_end) { \ - type_t *ptr = (type_t*) fmt->p; \ + #define BRANCH(type_t, convert, vector_end) { \ + uint8_t *ptr = fmt->p; \ for (i=0; i<nsmpl; i++) \ { \ for (j=0; j<fmt->n; j++) \ - if ( ptr[j]==vector_end ) break; \ + if ( convert(&ptr[j * sizeof(type_t)])==vector_end ) break; \ if ( j==fmt->n ) \ { \ /* all fields were used */ \ @@ -1501,14 +1503,14 @@ static inline int max_used_gt_ploidy(bcf_fmt_t *fmt, int nsmpl) break; \ } \ if ( max_ploidy < j ) max_ploidy = j; \ - ptr += fmt->n; \ + ptr += fmt->n * sizeof(type_t); \ } \ } switch (fmt->type) { - case BCF_BT_INT8: BRANCH(int8_t, bcf_int8_vector_end); break; - case BCF_BT_INT16: BRANCH(int16_t, bcf_int16_vector_end); break; - case BCF_BT_INT32: BRANCH(int32_t, bcf_int32_vector_end); break; + case BCF_BT_INT8: BRANCH(int8_t, le_to_i8, bcf_int8_vector_end); break; + case BCF_BT_INT16: BRANCH(int16_t, le_to_i16, bcf_int16_vector_end); break; + case BCF_BT_INT32: BRANCH(int32_t, le_to_i32, bcf_int32_vector_end); break; default: error("Unexpected case: %d\n", fmt->type); } #undef BRANCH @@ -1598,19 +1600,22 @@ void init_local_alleles(args_t *args, bcf1_t *out, int ifmt_PL) int *map = ma->buf[i].rec[ma->buf[i].cur].map; double *allele_prob = ma->tmpd; int *idx = ma->tmpi; - #define BRANCH(src_type_t, src_is_missing, src_is_vector_end, pl2prob_idx) { \ - src_type_t *src = (src_type_t*) fmt_ori->p; \ + #define BRANCH(src_type_t, convert, src_is_missing, src_is_vector_end, pl2prob_idx) { \ + uint8_t *src = fmt_ori->p; \ for (j=0; j<nsmpl; j++) \ { \ for (k=0; k<line->n_allele; k++) allele_prob[k] = 0; \ for (k=0; k<line->n_allele; k++) \ for (l=0; l<=k; l++) \ { \ - if ( src_is_missing || src_is_vector_end ) { src++; continue; } \ - double prob = ma->pl2prob[pl2prob_idx]; \ - allele_prob[k] += prob; \ - allele_prob[l] += prob; \ - src++; \ + src_type_t val = convert(src); \ + if ( !(src_is_missing) && !(src_is_vector_end) ) \ + { \ + double prob = ma->pl2prob[pl2prob_idx]; \ + allele_prob[k] += prob; \ + allele_prob[l] += prob; \ + } \ + src += sizeof(src_type_t); \ } \ /* insertion sort by allele probability, descending order, with the twist that REF (idx=0) always comes first */ \ allele_prob++; idx[0] = -1; idx++; /* keep REF first */ \ @@ -1637,9 +1642,9 @@ void init_local_alleles(args_t *args, bcf1_t *out, int ifmt_PL) } switch (fmt_ori->type) { - case BCF_BT_INT8: BRANCH( int8_t, *src==bcf_int8_missing, *src==bcf_int8_vector_end, *src); break; - case BCF_BT_INT16: BRANCH(int16_t, *src==bcf_int16_missing, *src==bcf_int16_vector_end, *src>=0 && *src<PL2PROB_MAX ? *src : PL2PROB_MAX-1); break; - case BCF_BT_INT32: BRANCH(int32_t, *src==bcf_int32_missing, *src==bcf_int32_vector_end, *src>=0 && *src<PL2PROB_MAX ? *src : PL2PROB_MAX-1); break; + case BCF_BT_INT8: BRANCH( int8_t, le_to_i8, val==bcf_int8_missing, val==bcf_int8_vector_end, val); break; + case BCF_BT_INT16: BRANCH(int16_t, le_to_i16, val==bcf_int16_missing, val==bcf_int16_vector_end, val>=0 && val<PL2PROB_MAX ? val : PL2PROB_MAX-1); break; + case BCF_BT_INT32: BRANCH(int32_t, le_to_i32, val==bcf_int32_missing, val==bcf_int32_vector_end, val>=0 && val<PL2PROB_MAX ? val : PL2PROB_MAX-1); break; default: error("Unexpected case: %d, PL\n", fmt_ori->type); } #undef BRANCH @@ -1735,8 +1740,8 @@ void merge_GT(args_t *args, bcf_fmt_t **fmt_map, bcf1_t *out) continue; } - #define BRANCH(type_t, vector_end) { \ - type_t *p_ori = (type_t*) fmt_ori->p; \ + #define BRANCH(type_t, convert, vector_end) { \ + uint8_t *p_ori = fmt_ori->p; \ if ( !ma->buf[i].rec[irec].als_differ ) \ { \ /* the allele numbering is unchanged */ \ @@ -1744,14 +1749,15 @@ void merge_GT(args_t *args, bcf_fmt_t **fmt_map, bcf1_t *out) { \ for (k=0; k<fmt_ori->n; k++) \ { \ - if ( p_ori[k]==vector_end ) break; /* smaller ploidy */ \ + type_t val = convert(&p_ori[k * sizeof(type_t)]); \ + if ( val==vector_end ) break; /* smaller ploidy */ \ ma->smpl_ploidy[ismpl+j]++; \ - if ( bcf_gt_is_missing(p_ori[k]) ) tmp[k] = 0; /* missing allele */ \ - else tmp[k] = p_ori[k]; \ + if ( bcf_gt_is_missing(val) ) tmp[k] = 0; /* missing allele */ \ + else tmp[k] = val; \ } \ for (; k<nsize; k++) tmp[k] = bcf_int32_vector_end; \ tmp += nsize; \ - p_ori += fmt_ori->n; \ + p_ori += fmt_ori->n * sizeof(type_t); \ } \ ismpl += bcf_hdr_nsamples(hdr); \ continue; \ @@ -1761,27 +1767,28 @@ void merge_GT(args_t *args, bcf_fmt_t **fmt_map, bcf1_t *out) { \ for (k=0; k<fmt_ori->n; k++) \ { \ - if ( p_ori[k]==vector_end ) break; /* smaller ploidy */ \ + type_t val = convert(&p_ori[k * sizeof(type_t)]); \ + if ( val==vector_end ) break; /* smaller ploidy */ \ ma->smpl_ploidy[ismpl+j]++; \ - if ( bcf_gt_is_missing(p_ori[k]) ) tmp[k] = 0; /* missing allele */ \ + if ( bcf_gt_is_missing(val) ) tmp[k] = 0; /* missing allele */ \ else \ { \ - int al = (p_ori[k]>>1) - 1; \ + int al = (val>>1) - 1; \ al = al<=0 ? al + 1 : ma->buf[i].rec[irec].map[al] + 1; \ - tmp[k] = (al << 1) | ((p_ori[k])&1); \ + tmp[k] = (al << 1) | ((val)&1); \ } \ } \ for (; k<nsize; k++) tmp[k] = bcf_int32_vector_end; \ tmp += nsize; \ - p_ori += fmt_ori->n; \ + p_ori += fmt_ori->n * sizeof(type_t); \ } \ ismpl += bcf_hdr_nsamples(hdr); \ } switch (fmt_ori->type) { - case BCF_BT_INT8: BRANCH(int8_t, bcf_int8_vector_end); break; - case BCF_BT_INT16: BRANCH(int16_t, bcf_int16_vector_end); break; - case BCF_BT_INT32: BRANCH(int32_t, bcf_int32_vector_end); break; + case BCF_BT_INT8: BRANCH(int8_t, le_to_i8, bcf_int8_vector_end); break; + case BCF_BT_INT16: BRANCH(int16_t, le_to_i16, bcf_int16_vector_end); break; + case BCF_BT_INT32: BRANCH(int32_t, le_to_i32, bcf_int32_vector_end); break; default: error("Unexpected case: %d\n", fmt_ori->type); } #undef BRANCH @@ -1959,10 +1966,10 @@ void merge_localized_numberG_format_field(args_t *args, bcf_fmt_t **fmt_map, bcf if ( 2*fmt_ori->n!=line->n_allele*(line->n_allele+1) ) error("Todo: localization of missing or haploid Number=G tags\n"); // localize - #define BRANCH(tgt_type_t, src_type_t, src_is_missing, src_is_vector_end, tgt_set_missing, tgt_set_vector_end) { \ + #define BRANCH(tgt_type_t, src_type_t, convert, src_is_missing, src_is_vector_end, tgt_set_missing, tgt_set_vector_end) { \ for (j=0; j<nsmpl; j++) \ { \ - src_type_t *src = (src_type_t*) fmt_ori->p + j*fmt_ori->n; \ + uint8_t *src = fmt_ori->p + sizeof(src_type_t)*j*fmt_ori->n; \ tgt_type_t *tgt = (tgt_type_t *) ma->tmp_arr + ismpl*nsize; \ int *laa = ma->laa + (1+args->local_alleles)*ismpl; \ int ii,ij,tgt_idx = 0; \ @@ -1972,9 +1979,10 @@ void merge_localized_numberG_format_field(args_t *args, bcf_fmt_t **fmt_map, bcf for (ij=0; ij<=ii; ij++) \ { \ int src_idx = bcf_alleles2gt(laa[ii],laa[ij]); \ + src_type_t val = convert(&src[src_idx * sizeof(src_type_t)]); \ if ( src_is_missing ) tgt_set_missing; \ else if ( src_is_vector_end ) break; \ - else tgt[tgt_idx] = src[src_idx]; \ + else tgt[tgt_idx] = val; \ tgt_idx++; \ } \ } \ @@ -1985,10 +1993,10 @@ void merge_localized_numberG_format_field(args_t *args, bcf_fmt_t **fmt_map, bcf } switch (fmt_ori->type) { - case BCF_BT_INT8: BRANCH(int32_t, int8_t, src[src_idx]==bcf_int8_missing, src[src_idx]==bcf_int8_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break; - case BCF_BT_INT16: BRANCH(int32_t, int16_t, src[src_idx]==bcf_int16_missing, src[src_idx]==bcf_int16_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break; - case BCF_BT_INT32: BRANCH(int32_t, int32_t, src[src_idx]==bcf_int32_missing, src[src_idx]==bcf_int32_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break; - case BCF_BT_FLOAT: BRANCH(float, float, bcf_float_is_missing(src[src_idx]), bcf_float_is_vector_end(src[src_idx]), bcf_float_set_missing(tgt[tgt_idx]), bcf_float_set_vector_end(tgt[tgt_idx])); break; + case BCF_BT_INT8: BRANCH(int32_t, int8_t, le_to_i8, val==bcf_int8_missing, val==bcf_int8_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break; + case BCF_BT_INT16: BRANCH(int32_t, int16_t, le_to_i16, val==bcf_int16_missing, val==bcf_int16_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break; + case BCF_BT_INT32: BRANCH(int32_t, int32_t, le_to_i16, val==bcf_int32_missing, val==bcf_int32_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break; + case BCF_BT_FLOAT: BRANCH(float, float, le_to_float, bcf_float_is_missing(val), bcf_float_is_vector_end(val), bcf_float_set_missing(tgt[tgt_idx]), bcf_float_set_vector_end(tgt[tgt_idx])); break; default: error("Unexpected case: %d, %s\n", fmt_ori->type, key); } #undef BRANCH @@ -2058,10 +2066,10 @@ void merge_localized_numberAR_format_field(args_t *args, bcf_fmt_t **fmt_map, bc } // localize - #define BRANCH(tgt_type_t, src_type_t, src_is_missing, src_is_vector_end, tgt_set_missing, tgt_set_vector_end) { \ + #define BRANCH(tgt_type_t, src_type_t, convert, src_is_missing, src_is_vector_end, tgt_set_missing, tgt_set_vector_end) { \ for (j=0; j<nsmpl; j++) \ { \ - src_type_t *src = (src_type_t*) fmt_ori->p + j*fmt_ori->n; \ + uint8_t *src = fmt_ori->p + sizeof(src_type_t)*j*fmt_ori->n; \ tgt_type_t *tgt = (tgt_type_t *) ma->tmp_arr + ismpl*nsize; \ int *laa = ma->laa + (1+args->local_alleles)*ismpl; \ int ii,tgt_idx = 0; \ @@ -2069,9 +2077,10 @@ void merge_localized_numberAR_format_field(args_t *args, bcf_fmt_t **fmt_map, bc { \ if ( laa[ii]==bcf_int32_missing || laa[ii]==bcf_int32_vector_end ) break; \ int src_idx = laa[ii] - ibeg; \ + src_type_t val = convert(&src[src_idx * sizeof(src_type_t)]); \ if ( src_is_missing ) tgt_set_missing; \ else if ( src_is_vector_end ) break; \ - else tgt[tgt_idx] = src[src_idx]; \ + else tgt[tgt_idx] = val; \ tgt_idx++; \ } \ if ( !tgt_idx ) { tgt_set_missing; tgt_idx++; } \ @@ -2081,10 +2090,10 @@ void merge_localized_numberAR_format_field(args_t *args, bcf_fmt_t **fmt_map, bc } switch (fmt_ori->type) { - case BCF_BT_INT8: BRANCH(int32_t, int8_t, src[src_idx]==bcf_int8_missing, src[src_idx]==bcf_int8_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break; - case BCF_BT_INT16: BRANCH(int32_t, int16_t, src[src_idx]==bcf_int16_missing, src[src_idx]==bcf_int16_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break; - case BCF_BT_INT32: BRANCH(int32_t, int32_t, src[src_idx]==bcf_int32_missing, src[src_idx]==bcf_int32_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break; - case BCF_BT_FLOAT: BRANCH(float, float, bcf_float_is_missing(src[src_idx]), bcf_float_is_vector_end(src[src_idx]), bcf_float_set_missing(tgt[tgt_idx]), bcf_float_set_vector_end(tgt[tgt_idx])); break; + case BCF_BT_INT8: BRANCH(int32_t, int8_t, le_to_i8, val==bcf_int8_missing, val==bcf_int8_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break; + case BCF_BT_INT16: BRANCH(int32_t, int16_t, le_to_i16, val==bcf_int16_missing, val==bcf_int16_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break; + case BCF_BT_INT32: BRANCH(int32_t, int32_t, le_to_i32, val==bcf_int32_missing, val==bcf_int32_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break; + case BCF_BT_FLOAT: BRANCH(float, float, le_to_float, bcf_float_is_missing(val), bcf_float_is_vector_end(val), bcf_float_set_missing(tgt[tgt_idx]), bcf_float_set_vector_end(tgt[tgt_idx])); break; default: error("Unexpected case: %d, %s\n", fmt_ori->type, key); } #undef BRANCH @@ -2201,7 +2210,7 @@ void merge_format_field(args_t *args, bcf_fmt_t **fmt_map, missing_rule_t *mrule } // set the values - #define BRANCH(tgt_type_t, src_type_t, src_is_missing, src_is_vector_end, tgt_set_missing, tgt_set_vector_end) { \ + #define BRANCH(tgt_type_t, src_type_t, convert, src_is_missing, src_is_vector_end, tgt_set_missing, tgt_set_vector_end) { \ int j, l, k; \ tgt_type_t *tgt = (tgt_type_t *) ma->tmp_arr + ismpl*nsize; \ if ( !fmt_ori ) \ @@ -2214,7 +2223,7 @@ void merge_format_field(args_t *args, bcf_fmt_t **fmt_map, missing_rule_t *mrule ismpl += bcf_hdr_nsamples(hdr); \ continue; \ } \ - src_type_t *src = (src_type_t*) fmt_ori->p; \ + uint8_t *src = fmt_ori->p; \ if ( (length!=BCF_VL_G && length!=BCF_VL_A && length!=BCF_VL_R) || (line->n_allele==out->n_allele && !ma->buf[i].rec[irec].als_differ) ) \ { \ /* alleles unchanged, copy over */ \ @@ -2224,11 +2233,11 @@ void merge_format_field(args_t *args, bcf_fmt_t **fmt_map, missing_rule_t *mrule { \ if ( src_is_vector_end ) break; \ else if ( src_is_missing ) tgt_set_missing; \ - else *tgt = *src; \ - tgt++; src++; \ + else *tgt = convert(src); \ + tgt++; src += sizeof(src_type_t); \ } \ for (k=l; k<nsize; k++) { tgt_set_vector_end; tgt++; } \ - src += fmt_ori->n - l; \ + src += sizeof(src_type_t) * (fmt_ori->n - l); \ } \ ismpl += bcf_hdr_nsamples(hdr); \ continue; \ @@ -2240,8 +2249,14 @@ void merge_format_field(args_t *args, bcf_fmt_t **fmt_map, missing_rule_t *mrule for (j=0; j<bcf_hdr_nsamples(hdr); j++) \ { \ tgt = (tgt_type_t *) ma->tmp_arr + (ismpl+j)*nsize; \ - src = (src_type_t*) fmt_ori->p + j*fmt_ori->n; \ - if ( (src_is_missing && fmt_ori->n==1) || (++src && src_is_vector_end) ) \ + src = fmt_ori->p + sizeof(src_type_t) * j * fmt_ori->n; \ + int tag_missing = src_is_missing && fmt_ori->n==1; \ + if (!tag_missing) \ + { \ + src += sizeof(src_type_t); \ + tag_missing = src_is_vector_end ; \ + } \ + if ( tag_missing ) \ { \ /* tag with missing value "." */ \ tgt_set_missing; \ @@ -2252,9 +2267,10 @@ void merge_format_field(args_t *args, bcf_fmt_t **fmt_map, missing_rule_t *mrule int ngsize = haploid ? out->n_allele : out->n_allele*(out->n_allele + 1)/2; \ if ( ma->buf[i].unkn_allele ) /* Use value from the unknown allele when available */ \ { \ - src = (src_type_t*) fmt_ori->p + j*fmt_ori->n; \ + src = fmt_ori->p + sizeof(src_type_t)*j*fmt_ori->n; \ int iunkn = haploid ? ma->buf[i].unkn_allele : (ma->buf[i].unkn_allele+1)*(ma->buf[i].unkn_allele + 2)/2 - 1; \ - for (l=0; l<ngsize; l++) { *tgt = src[iunkn]; tgt++; } \ + src_type_t val = convert(&src[iunkn * sizeof(src_type_t)]); \ + for (l=0; l<ngsize; l++) { *tgt = val; tgt++; } \ } \ else if ( mrule && mrule->type==MERGE_MISSING_CONST ) \ { \ @@ -2262,9 +2278,13 @@ void merge_format_field(args_t *args, bcf_fmt_t **fmt_map, missing_rule_t *mrule } \ else if ( mrule && mrule->type==MERGE_MISSING_MAX ) \ { \ - src = (src_type_t*) fmt_ori->p + j*fmt_ori->n; \ - src_type_t max = src[0]; \ - for (l=1; l<fmt_ori->n; l++) if ( max < src[l] ) max = src[l]; \ + src = fmt_ori->p + sizeof(src_type_t)*j*fmt_ori->n; \ + src_type_t max = convert(src); \ + for (l=1; l<fmt_ori->n; l++) \ + { \ + src_type_t val = convert(&src[l * sizeof(src_type_t)]); \ + if ( max < val ) max = val; \ + } \ for (l=0; l<ngsize; l++) { *tgt = max; tgt++; } \ } \ else \ @@ -2278,11 +2298,11 @@ void merge_format_field(args_t *args, bcf_fmt_t **fmt_map, missing_rule_t *mrule for (iori=0; iori<line->n_allele; iori++) \ { \ inew = ma->buf[i].rec[irec].map[iori]; \ - src = (src_type_t*) fmt_ori->p + j*fmt_ori->n + iori; \ + src = fmt_ori->p + (j*fmt_ori->n + iori) * sizeof(src_type_t); \ tgt = (tgt_type_t *) ma->tmp_arr + (ismpl+j)*nsize + inew; \ if ( src_is_vector_end ) break; \ if ( src_is_missing ) tgt_set_missing; \ - else *tgt = *src; \ + else *tgt = convert(src); \ } \ } \ else \ @@ -2297,7 +2317,7 @@ void merge_format_field(args_t *args, bcf_fmt_t **fmt_map, missing_rule_t *mrule jnew = ma->buf[i].rec[irec].map[jori]; \ int kori = iori*(iori+1)/2 + jori; \ int knew = inew>jnew ? inew*(inew+1)/2 + jnew : jnew*(jnew+1)/2 + inew; \ - src = (src_type_t*) fmt_ori->p + j*fmt_ori->n + kori; \ + src = fmt_ori->p + (j*fmt_ori->n + kori) * sizeof(src_type_t); \ tgt = (tgt_type_t *) ma->tmp_arr + (ismpl+j)*nsize + knew; \ if ( src_is_vector_end ) \ { \ @@ -2305,7 +2325,7 @@ void merge_format_field(args_t *args, bcf_fmt_t **fmt_map, missing_rule_t *mrule break; \ } \ if ( src_is_missing ) tgt_set_missing; \ - else *tgt = *src; \ + else *tgt = convert(src); \ } \ } \ } \ @@ -2318,19 +2338,25 @@ void merge_format_field(args_t *args, bcf_fmt_t **fmt_map, missing_rule_t *mrule for (j=0; j<bcf_hdr_nsamples(hdr); j++) \ { \ tgt = (tgt_type_t *) ma->tmp_arr + (ismpl+j)*nsize; \ - src = (src_type_t*) (fmt_ori->p + j*fmt_ori->size); \ - if ( (src_is_missing && fmt_ori->n==1) || (++src && src_is_vector_end) ) \ + src = fmt_ori->p + sizeof(src_type_t) * j * fmt_ori->size; \ + int tag_missing = src_is_missing && fmt_ori->n==1; \ + if (!tag_missing) { \ + src += sizeof(src_type_t); \ + tag_missing = src_is_vector_end ; \ + } \ + if ( tag_missing ) \ { \ /* tag with missing value "." */ \ tgt_set_missing; \ for (l=1; l<nsize; l++) { tgt++; tgt_set_vector_end; } \ continue; \ } \ - src = (src_type_t*) (fmt_ori->p + j*fmt_ori->size); \ + src = fmt_ori->p + sizeof(src_type_t) * j *fmt_ori->size; \ if ( ma->buf[i].unkn_allele ) /* Use value from the unknown allele when available */ \ { \ int iunkn = ma->buf[i].unkn_allele; \ - for (l=0; l<nsize; l++) { *tgt = src[iunkn]; tgt++; } \ + src_type_t val = convert(&src[iunkn * sizeof(src_type_t)]); \ + for (l=0; l<nsize; l++) { *tgt = val; tgt++; } \ } \ else if ( mrule && mrule->type==MERGE_MISSING_CONST ) \ { \ @@ -2338,9 +2364,13 @@ void merge_format_field(args_t *args, bcf_fmt_t **fmt_map, missing_rule_t *mrule } \ else if ( mrule && mrule->type==MERGE_MISSING_MAX ) \ { \ - src = (src_type_t*) fmt_ori->p + j*fmt_ori->n; \ - src_type_t max = src[0]; \ - for (l=1; l<fmt_ori->n; l++) if ( max < src[l] ) max = src[l]; \ + src = fmt_ori->p + sizeof(src_type_t)*j*fmt_ori->n; \ + src_type_t max = convert(src); \ + for (l=1; l<fmt_ori->n; l++) \ + { \ + src_type_t val = convert(&src[l * sizeof(src_type_t)]); \ + if ( max < val ) max = val; \ + } \ for (l=0; l<nsize; l++) { *tgt = max; tgt++; } \ } \ else \ @@ -2354,8 +2384,8 @@ void merge_format_field(args_t *args, bcf_fmt_t **fmt_map, missing_rule_t *mrule tgt = (tgt_type_t *) ma->tmp_arr + (ismpl+j)*nsize + inew; \ if ( src_is_vector_end ) break; \ if ( src_is_missing ) tgt_set_missing; \ - else *tgt = *src; \ - src++; \ + else *tgt = convert(src); \ + src += sizeof(src_type_t); \ } \ } \ } \ @@ -2363,10 +2393,10 @@ void merge_format_field(args_t *args, bcf_fmt_t **fmt_map, missing_rule_t *mrule } switch (type) { - case BCF_BT_INT8: BRANCH(int32_t, int8_t, *src==bcf_int8_missing, *src==bcf_int8_vector_end, *tgt=bcf_int32_missing, *tgt=bcf_int32_vector_end); break; - case BCF_BT_INT16: BRANCH(int32_t, int16_t, *src==bcf_int16_missing, *src==bcf_int16_vector_end, *tgt=bcf_int32_missing, *tgt=bcf_int32_vector_end); break; - case BCF_BT_INT32: BRANCH(int32_t, int32_t, *src==bcf_int32_missing, *src==bcf_int32_vector_end, *tgt=bcf_int32_missing, *tgt=bcf_int32_vector_end); break; - case BCF_BT_FLOAT: BRANCH(float, float, bcf_float_is_missing(*src), bcf_float_is_vector_end(*src), bcf_float_set_missing(*tgt), bcf_float_set_vector_end(*tgt)); break; + case BCF_BT_INT8: BRANCH(int32_t, int8_t, le_to_i8, le_to_i8(src)==bcf_int8_missing, le_to_i8(src)==bcf_int8_vector_end, *tgt=bcf_int32_missing, *tgt=bcf_int32_vector_end); break; + case BCF_BT_INT16: BRANCH(int32_t, int16_t, le_to_i16, le_to_i16(src)==bcf_int16_missing, le_to_i16(src)==bcf_int16_vector_end, *tgt=bcf_int32_missing, *tgt=bcf_int32_vector_end); break; + case BCF_BT_INT32: BRANCH(int32_t, int32_t, le_to_i32, le_to_i32(src)==bcf_int32_missing, le_to_i32(src)==bcf_int32_vector_end, *tgt=bcf_int32_missing, *tgt=bcf_int32_vector_end); break; + case BCF_BT_FLOAT: BRANCH(float, float, le_to_float, bcf_float_is_missing(le_to_float(src)), bcf_float_is_vector_end(le_to_float(src)), bcf_float_set_missing(*tgt), bcf_float_set_vector_end(*tgt)); break; default: error("Unexpected case: %d, %s\n", type, key); } #undef BRANCH |