]> git.donarmstrong.com Git - samtools.git/commitdiff
unfinished vcf parser
authorHeng Li <lh3@live.co.uk>
Thu, 5 Aug 2010 20:03:08 +0000 (20:03 +0000)
committerHeng Li <lh3@live.co.uk>
Thu, 5 Aug 2010 20:03:08 +0000 (20:03 +0000)
bcftools/vcf.c

index 647ee1f7fe50f0bc6f16b3c008e279ffa519f6af..81a5777af035aabe045ff74de751b9e13dfb576a 100644 (file)
@@ -13,6 +13,7 @@ typedef struct {
        kstream_t *ks;
        void *refhash;
        kstring_t line;
        kstream_t *ks;
        void *refhash;
        kstring_t line;
+       int max_ref;
 } vcf_t;
 
 bcf_hdr_t *vcf_hdr_read(bcf_t *bp)
 } vcf_t;
 
 bcf_hdr_t *vcf_hdr_read(bcf_t *bp)
@@ -104,12 +105,32 @@ int vcf_hdr_write(bcf_t *bp, const bcf_hdr_t *h)
        return 0;
 }
 
        return 0;
 }
 
-int vcf_read(bcf_t *bp, bcf1_t *b)
+int vcf_read(bcf_t *bp, bcf_hdr_t *h, bcf1_t *b)
 {
 {
-       int dret;
+       int dret, k;
        vcf_t *v = (vcf_t*)bp->v;
        vcf_t *v = (vcf_t*)bp->v;
+       char *p, *q, *r;
+       kstring_t str;
        v->line.l = 0;
        v->line.l = 0;
+       str.l = 0; str.m = b->m_str; str.s = b->str;
        if (ks_getuntil(v->ks, '\n', &v->line, &dret) < 0) return -1;
        if (ks_getuntil(v->ks, '\n', &v->line, &dret) < 0) return -1;
+       for (q = v->line.s, p = q + 1, k = 0; *p; ++p) {
+               if (*p == '\t' || *(p+1) == '\0') {
+                       ++k;
+                       r = *(p+1)? p : p + 1;
+                       *r = '\0';
+                       if (k == 1) { // ref
+                       } else if (k == 2) {
+                               b->pos = atoi(q);
+                       } else if (k == 3 || k == 4 || k == 5 || k == 7 || k == 8 || k == 9) {
+                               kputsn(q, r - q + 1, &str);
+                               if (k == 9) bcf_sync(h->n_smpl, b);
+                       } else if (k == 6) {
+                               b->qual = (q[0] >= '0' && q[0] <= '9')? atoi(q) : 0;
+                       }
+                       q = p + 1;
+               }
+       }
        return v->line.l + 1;
 }
 
        return v->line.l + 1;
 }