void bcf_enc_vint(kstring_t *s, int n, int32_t *a, int wsize) { int32_t max = INT32_MIN + 1, min = INT32_MAX; int i; if (n == 0) bcf_enc_size(s, 0, BCF_BT_NULL); else if (n == 1) bcf_enc_int1(s, a[0]); else { if (wsize <= 0) wsize = n; for (i = 0; i < n; ++i) { if (a[i] == INT32_MIN) continue; if (max < a[i]) max = a[i]; if (min > a[i]) min = a[i]; } if (max <= INT8_MAX && min > INT8_MIN) { bcf_enc_size(s, wsize, BCF_BT_INT8); for (i = 0; i < n; ++i) kputc(a[i] == INT32_MIN? INT8_MIN : a[i], s); } else if (max <= INT16_MAX && min > INT16_MIN) { bcf_enc_size(s, wsize, BCF_BT_INT16); for (i = 0; i < n; ++i) { int16_t x = a[i] == INT32_MIN? INT16_MIN : a[i]; kputsn((char*)&x, 2, s); } } else { bcf_enc_size(s, wsize, BCF_BT_INT32); for (i = 0; i < n; ++i) { int32_t x = a[i] == INT32_MIN? INT32_MIN : a[i]; kputsn((char*)&x, 4, s); } } } }
static bcf1_t *rec_set_format(args_t *args, bcf1_t *src, int ismpl, bcf1_t *dst) { dst->n_fmt = 0; kstring_t tmp = dst->indiv; tmp.l = 0; int i; for (i=0; i<src->n_fmt; i++) { bcf_fmt_t *fmt = &src->d.fmt[i]; int id = fmt->id; if ( !args->keep_fmt && !args->fmt_tags[id] ) continue; bcf_enc_int1(&tmp, id); bcf_enc_size(&tmp, fmt->n, fmt->type); kputsn_(fmt->p + ismpl*fmt->size, fmt->size, &tmp); dst->n_fmt++; } dst->indiv = tmp; return dst; }