-bam_header_t *bam_header_parse(const char *text)
-{
- bam_header_t *h;
- int i;
- char *s, *p, *q, *r;
-
- i = strlen(text);
- if (i < 3) return 0; // headerless
- h = bam_header_init();
- h->l_text = i;
- h->text = strdup(text);
- s = h->text;
- while ((s = strstr(s, "@SQ")) != 0) {
- ++h->n_targets;
- s += 3;
- }
- h->target_len = (uint32_t*)calloc(h->n_targets, 4);
- h->target_name = (char**)calloc(h->n_targets, sizeof(void*));
- i = 0;
- s = h->text;
- while ((s = strstr(s, "@SQ")) != 0) {
- s += 3;
- r = s;
- if ((p = strstr(s, "SN:")) != 0) {
- q = p + 3;
- for (p = q; *p && *p != '\t'; ++p);
- h->target_name[i] = (char*)calloc(p - q + 1, 1);
- strncpy(h->target_name[i], q, p - q);
- } else goto header_err_ret;
- if (r < p) r = p;
- if ((p = strstr(s, "LN:")) != 0) h->target_len[i] = strtol(p + 3, 0, 10);
- else goto header_err_ret;
- if (r < p) r = p;
- s = r + 3;
- ++i;
- }
- if (h->n_targets == 0) {
- bam_header_destroy(h);
- return 0;
- } else return h;
-
-header_err_ret:
- fprintf(stderr, "[bam_header_parse] missing SN tag in a @SQ line.\n");
- bam_header_destroy(h);
- return 0;
-}
-