From 92894225a8ebed8fbf1cc2a1f402b4c9e39056fa Mon Sep 17 00:00:00 2001 From: Heng Li Date: Thu, 25 Jun 2009 20:03:10 +0000 Subject: [PATCH] * samtools-0.1.4-17 (r361) * if a file is given on FTP, search locally for the BAM index --- bam_index.c | 63 ++++++++++++++++++++++++++++++++++++----------------- bamtk.c | 2 +- 2 files changed, 44 insertions(+), 21 deletions(-) diff --git a/bam_index.c b/bam_index.c index 347189d..1c0b29b 100644 --- a/bam_index.c +++ b/bam_index.c @@ -260,30 +260,15 @@ void bam_index_save(const bam_index_t *idx, FILE *fp) fflush(fp); } -bam_index_t *bam_index_load(const char *fn) +static bam_index_t *bam_index_load_core(FILE *fp) { - bam_index_t *idx; - FILE *fp; int i; - char *fnidx, magic[4]; - - fnidx = (char*)calloc(strlen(fn) + 5, 1); - strcpy(fnidx, fn); strcat(fnidx, ".bai"); - fp = fopen(fnidx, "r"); - if (fp == 0) { // try "{base}.bai" - char *s = strstr(fn, "bam"); - if (s == fn + strlen(fn) - 3) { - strcpy(fnidx, fn); - fnidx[strlen(fn)-1] = 'i'; - fp = fopen(fnidx, "r"); - } - } + char magic[4]; + bam_index_t *idx; if (fp == 0) { - fprintf(stderr, "[bam_index_load] the alignment is not indexed. Please run `index' command first. Abort!\n"); - exit(1); + fprintf(stderr, "[bam_index_load_core] fail to load index.\n"); + return 0; } - free(fnidx); - fread(magic, 1, 4, fp); if (strncmp(magic, "BAI\1", 4)) { fprintf(stderr, "[bam_index_load] wrong magic number.\n"); @@ -333,6 +318,44 @@ bam_index_t *bam_index_load(const char *fn) if (bam_is_be) for (j = 0; j < index2->n; ++j) bam_swap_endian_8p(&index2->offset[j]); } + return idx; +} + +bam_index_t *bam_index_load2(const char *fnidx) +{ + bam_index_t *idx; + FILE *fp = fopen(fnidx, "r"); + idx = bam_index_load_core(fp); + fclose(fp); + return idx; +} + +bam_index_t *bam_index_load(const char *_fn) +{ + bam_index_t *idx; + FILE *fp; + char *fnidx, *fn; + + if (strstr(_fn, "ftp://") == _fn) { + const char *p; + int l = strlen(_fn); + for (p = _fn + l - 1; p >= _fn; --p) + if (*p == '/') break; + fn = strdup(p + 1); + } else fn = strdup(_fn); + fnidx = (char*)calloc(strlen(fn) + 5, 1); + strcpy(fnidx, fn); strcat(fnidx, ".bai"); + fp = fopen(fnidx, "r"); + if (fp == 0) { // try "{base}.bai" + char *s = strstr(fn, "bam"); + if (s == fn + strlen(fn) - 3) { + strcpy(fnidx, fn); + fnidx[strlen(fn)-1] = 'i'; + fp = fopen(fnidx, "r"); + } + } + free(fnidx); free(fn); + idx = bam_index_load_core(fp); fclose(fp); return idx; } diff --git a/bamtk.c b/bamtk.c index a1e87c2..9474e83 100644 --- a/bamtk.c +++ b/bamtk.c @@ -3,7 +3,7 @@ #include "bam.h" #ifndef PACKAGE_VERSION -#define PACKAGE_VERSION "0.1.4-16 (r360)" +#define PACKAGE_VERSION "0.1.4-17 (r361)" #endif int bam_taf2baf(int argc, char *argv[]); -- 2.39.2