8 KSTREAM_INIT(gzFile, gzread, 4096)
19 bcf_hdr_t *vcf_hdr_read(bcf_t *bp)
25 if (!bp->is_vcf) return 0;
26 h = calloc(1, sizeof(bcf_hdr_t));
29 memset(&meta, 0, sizeof(kstring_t));
30 memset(&smpl, 0, sizeof(kstring_t));
31 while (ks_getuntil(v->ks, '\n', &v->line, &dret) >= 0) {
32 if (v->line.l < 2) continue;
33 if (v->line.s[0] != '#') return 0; // no sample line
34 if (v->line.s[0] == '#' && v->line.s[1] == '#') {
35 kputsn(v->line.s, v->line.l, &meta); kputc('\n', &meta);
36 } else if (v->line.s[0] == '#') {
39 for (q = v->line.s, p = q + 1, k = 0; *p; ++p) {
40 if (*p == '\t' || *(p+1) == 0) {
41 r = *(p+1) == 0? p+1 : p;
43 kputsn(q, r - q, &smpl);
54 h->sname = smpl.s; h->l_smpl = smpl.l;
55 h->txt = meta.s; h->l_txt = meta.l;
60 bcf_t *vcf_open(const char *fn, const char *mode)
64 bp = calloc(1, sizeof(bcf_t));
65 v = calloc(1, sizeof(vcf_t));
68 if (strchr(mode, 'r')) {
69 v->fp = strcmp(fn, "-")? gzopen(fn, "r") : gzdopen(fileno(stdin), "r");
70 v->ks = ks_init(v->fp);
71 } else if (strchr(mode, 'w'))
72 v->fpout = strcmp(fn, "-")? fopen(fn, "w") : fdopen(fileno(stdout), "w");
76 void bcf_hdr_clear(bcf_hdr_t *b);
78 int vcf_close(bcf_t *bp)
81 if (bp == 0) return -1;
82 if (bp->v == 0) return -1;
88 if (v->fpout) fclose(v->fpout);
95 int vcf_hdr_write(bcf_t *bp, const bcf_hdr_t *h)
97 vcf_t *v = (vcf_t*)bp->v;
99 if (v == 0 || v->fpout == 0) return -1;
100 fwrite(h->txt, 1, h->l_txt, v->fpout);
101 fprintf(v->fpout, "#CHROM\tPOS\tREF\tALT\tQUAL\tFILTER\tINFO\tFORMAT");
102 for (i = 0; i < h->n_smpl; ++i)
103 fprintf(v->fpout, "\t%s", h->sns[i]);
104 fputc('\n', v->fpout);
108 int vcf_read(bcf_t *bp, bcf_hdr_t *h, bcf1_t *b)
111 vcf_t *v = (vcf_t*)bp->v;
115 str.l = 0; str.m = b->m_str; str.s = b->str;
116 if (ks_getuntil(v->ks, '\n', &v->line, &dret) < 0) return -1;
117 for (q = v->line.s, p = q + 1, k = 0; *p; ++p) {
118 if (*p == '\t' || *(p+1) == '\0') {
120 r = *(p+1)? p : p + 1;
125 } else if (k == 3 || k == 4 || k == 5 || k == 7 || k == 8 || k == 9) {
126 kputsn(q, r - q + 1, &str);
127 if (k == 9) bcf_sync(h->n_smpl, b);
129 b->qual = (q[0] >= '0' && q[0] <= '9')? atoi(q) : 0;
134 return v->line.l + 1;
137 int vcf_test(int argc, char *argv[])
141 bp = vcf_open(argv[1], "r");
142 bpout = vcf_open("-", "w");
143 h = vcf_hdr_read(bpout);
144 vcf_hdr_write(bpout, h);