X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=inline;f=bam_sort.c;h=76ab793196ca76fc5a63d619e230cf0fb5f59f1e;hb=543a65c4e127aa3d6c143a6bd50e128201f25784;hp=4745be6cbf003c6a46a7882762c740c25493f932;hpb=be38544a72499e002328fdf72dc7e30598306366;p=samtools.git diff --git a/bam_sort.c b/bam_sort.c index 4745be6..76ab793 100644 --- a/bam_sort.c +++ b/bam_sort.c @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -89,11 +90,12 @@ int bam_merge_core(int by_qname, const char *out, const char *headers, int n, ch if (headers) { tamFile fpheaders = sam_open(headers); if (fpheaders == 0) { - fprintf(stderr, "[bam_merge_core] Cannot open file `%s'. Continue anyway.\n", headers); - } else { - hheaders = sam_header_read(fpheaders); - sam_close(fpheaders); + const char *message = strerror(errno); + fprintf(stderr, "[bam_merge_core] cannot open '%s': %s\n", headers, message); + return -1; } + hheaders = sam_header_read(fpheaders); + sam_close(fpheaders); } g_is_by_qname = by_qname; @@ -135,11 +137,15 @@ int bam_merge_core(int by_qname, const char *out, const char *headers, int n, ch // check that they are consistent with the existing binary list // of reference information. if (hheaders->n_targets > 0) { - if (hout->n_targets != hheaders->n_targets) + if (hout->n_targets != hheaders->n_targets) { fprintf(stderr, "[bam_merge_core] number of @SQ headers in `%s' differs from number of target sequences", headers); + if (!reg) return -1; + } for (j = 0; j < hout->n_targets; ++j) - if (strcmp(hout->target_name[j], hheaders->target_name[j]) != 0) + if (strcmp(hout->target_name[j], hheaders->target_name[j]) != 0) { fprintf(stderr, "[bam_merge_core] @SQ header '%s' in '%s' differs from target sequence", hheaders->target_name[j], headers); + if (!reg) return -1; + } } swap_header_text(hout, hheaders); bam_header_destroy(hheaders); @@ -147,14 +153,13 @@ int bam_merge_core(int by_qname, const char *out, const char *headers, int n, ch } } else { // validate multiple baf if (hout->n_targets != hin->n_targets) { - fprintf(stderr, "[bam_merge_core] file '%s' has different number of target sequences. Abort!\n", fn[i]); - exit(1); - } - for (j = 0; j < hout->n_targets; ++j) { - if (strcmp(hout->target_name[j], hin->target_name[j])) { - fprintf(stderr, "[bam_merge_core] different target sequence name: '%s' != '%s' in file '%s'. Abort!\n", - hout->target_name[j], hin->target_name[j], fn[i]); - exit(1); + fprintf(stderr, "[bam_merge_core] file '%s' has different number of target sequences. Continue anyway!\n", fn[i]); + } else { + for (j = 0; j < hout->n_targets; ++j) { + if (strcmp(hout->target_name[j], hin->target_name[j])) { + fprintf(stderr, "[bam_merge_core] different target sequence name: '%s' != '%s' in file '%s'. Continue anyway!\n", + hout->target_name[j], hin->target_name[j], fn[i]); + } } } bam_header_destroy(hin); @@ -229,7 +234,7 @@ int bam_merge_core(int by_qname, const char *out, const char *headers, int n, ch int bam_merge(int argc, char *argv[]) { - int c, is_by_qname = 0, flag = 0; + int c, is_by_qname = 0, flag = 0, ret = 0; char *fn_headers = NULL, *reg = 0; while ((c = getopt(argc, argv, "h:nruR:")) >= 0) { @@ -254,10 +259,10 @@ int bam_merge(int argc, char *argv[]) fprintf(stderr, " the header dictionary in merging.\n\n"); return 1; } - bam_merge_core(is_by_qname, argv[optind], fn_headers, argc - optind - 1, argv + optind + 1, flag, reg); + if (bam_merge_core(is_by_qname, argv[optind], fn_headers, argc - optind - 1, argv + optind + 1, flag, reg) < 0) ret = 1; free(reg); free(fn_headers); - return 0; + return ret; } typedef bam1_t *bam1_p;