summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--debian/changelog9
-rw-r--r--debian/patches/fix-bus-error-armhf.patch523
-rw-r--r--debian/patches/series1
-rw-r--r--debian/patches/skip_new_test_failing_on_32bit.patch6
-rw-r--r--debian/patches/tests-pluginpath.patch6
-rw-r--r--vcfmerge.c210
7 files changed, 660 insertions, 97 deletions
diff --git a/Makefile b/Makefile
index 7013cd5..024dc1d 100644
--- a/Makefile
+++ b/Makefile
@@ -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; }
diff --git a/vcfmerge.c b/vcfmerge.c
index 87b6b8a..2eaa99f 100644
--- a/vcfmerge.c
+++ b/vcfmerge.c
@@ -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