]> git.donarmstrong.com Git - samtools.git/blob - bcftools/bcfutils.c
* a numerically stable method to calculate z_{jk}
[samtools.git] / bcftools / bcfutils.c
1 #include "bcf.h"
2 #include "khash.h"
3 KHASH_MAP_INIT_STR(str2id, int)
4
5 void *bcf_build_refhash(bcf_hdr_t *h)
6 {
7         khash_t(str2id) *hash;
8         int i, ret;
9         hash = kh_init(str2id);
10         for (i = 0; i < h->n_ref; ++i) {
11                 khint_t k;
12                 k = kh_put(str2id, hash, h->ns[i], &ret); // FIXME: check ret
13                 kh_val(hash, k) = i;
14         }
15         return hash;
16 }
17
18 void *bcf_str2id_init()
19 {
20         return kh_init(str2id);
21 }
22
23 void bcf_str2id_destroy(void *_hash)
24 {
25         khash_t(str2id) *hash = (khash_t(str2id)*)_hash;
26         if (hash) kh_destroy(str2id, hash); // Note that strings are not freed.
27 }
28
29 int bcf_str2id(void *_hash, const char *str)
30 {
31         khash_t(str2id) *hash = (khash_t(str2id)*)_hash;
32         khint_t k;
33         if (!hash) return -1;
34         k = kh_get(str2id, hash, str);
35         return k == kh_end(hash)? -1 : kh_val(hash, k);
36 }
37
38 int bcf_str2id_add(void *_hash, const char *str)
39 {
40         khint_t k;
41         int ret;
42         khash_t(str2id) *hash = (khash_t(str2id)*)_hash;
43         if (!hash) return -1;
44         k = kh_put(str2id, hash, str, &ret);
45         if (ret == 0) return kh_val(hash, k);
46         kh_val(hash, k) = kh_size(hash) - 1;
47         return kh_val(hash, k);
48 }