From 243e735431a0348f5764958ae913014c4e971f33 Mon Sep 17 00:00:00 2001 From: Heng Li Date: Wed, 4 May 2011 09:46:50 -0400 Subject: [PATCH] applied patches from Alec Wysoker --- bwase.c | 68 ++++++++++++++++++++++++++++---------------------------- bwtaln.c | 6 ++--- main.c | 5 ++++- utils.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ utils.h | 16 +++++++++++++ 5 files changed, 123 insertions(+), 38 deletions(-) diff --git a/bwase.c b/bwase.c index e9e164d..7ef4bec 100644 --- a/bwase.c +++ b/bwase.c @@ -437,15 +437,15 @@ void bwa_print_sam1(const bntseq_t *bns, bwa_seq_t *p, const bwa_seq_t *mate, in if (mate->strand) flag |= SAM_FMR; } else flag |= SAM_FMU; } - printf("%s\t%d\t%s\t", p->name, flag, bns->anns[seqid].name); - printf("%d\t%d\t", (int)(p->pos - bns->anns[seqid].offset + 1), p->mapQ); + err_printf("%s\t%d\t%s\t", p->name, flag, bns->anns[seqid].name); + err_printf("%d\t%d\t", (int)(p->pos - bns->anns[seqid].offset + 1), p->mapQ); // print CIGAR if (p->cigar) { for (j = 0; j != p->n_cigar; ++j) - printf("%d%c", __cigar_len(p->cigar[j]), "MIDS"[__cigar_op(p->cigar[j])]); - } else if (p->type == BWA_TYPE_NO_MATCH) printf("*"); - else printf("%dM", p->len); + err_printf("%d%c", __cigar_len(p->cigar[j]), "MIDS"[__cigar_op(p->cigar[j])]); + } else if (p->type == BWA_TYPE_NO_MATCH) err_printf("*"); + else err_printf("%dM", p->len); // print mate coordinate if (mate && mate->type != BWA_TYPE_NO_MATCH) { @@ -454,12 +454,12 @@ void bwa_print_sam1(const bntseq_t *bns, bwa_seq_t *p, const bwa_seq_t *mate, in am = mate->seQ < p->seQ? mate->seQ : p->seQ; // smaller single-end mapping quality // redundant calculation here, but should not matter too much m_is_N = bns_coor_pac2real(bns, mate->pos, mate->len, &m_seqid); - printf("\t%s\t", (seqid == m_seqid)? "=" : bns->anns[m_seqid].name); + err_printf("\t%s\t", (seqid == m_seqid)? "=" : bns->anns[m_seqid].name); isize = (seqid == m_seqid)? pos_5(mate) - pos_5(p) : 0; if (p->type == BWA_TYPE_NO_MATCH) isize = 0; - printf("%d\t%lld\t", (int)(mate->pos - bns->anns[m_seqid].offset + 1), isize); - } else if (mate) printf("\t=\t%d\t0\t", (int)(p->pos - bns->anns[seqid].offset + 1)); - else printf("\t*\t0\t0\t"); + err_printf("%d\t%lld\t", (int)(mate->pos - bns->anns[m_seqid].offset + 1), isize); + } else if (mate) err_printf("\t=\t%d\t0\t", (int)(p->pos - bns->anns[seqid].offset + 1)); + else err_printf("\t*\t0\t0\t"); // print sequence and quality if (p->strand == 0) @@ -468,42 +468,42 @@ void bwa_print_sam1(const bntseq_t *bns, bwa_seq_t *p, const bwa_seq_t *mate, in putchar('\t'); if (p->qual) { if (p->strand) seq_reverse(p->len, p->qual, 0); // reverse quality - printf("%s", p->qual); - } else printf("*"); + err_printf("%s", p->qual); + } else err_printf("*"); - if (bwa_rg_id) printf("\tRG:Z:%s", bwa_rg_id); - if (p->bc[0]) printf("\tBC:Z:%s", p->bc); - if (p->clip_len < p->full_len) printf("\tXC:i:%d", p->clip_len); + if (bwa_rg_id) err_printf("\tRG:Z:%s", bwa_rg_id); + if (p->bc[0]) err_printf("\tBC:Z:%s", p->bc); + if (p->clip_len < p->full_len) err_printf("\tXC:i:%d", p->clip_len); if (p->type != BWA_TYPE_NO_MATCH) { int i; // calculate XT tag XT = "NURM"[p->type]; if (nn > 10) XT = 'N'; // print tags - printf("\tXT:A:%c\t%s:i:%d", XT, (mode & BWA_MODE_COMPREAD)? "NM" : "CM", p->nm); - if (nn) printf("\tXN:i:%d", nn); - if (mate) printf("\tSM:i:%d\tAM:i:%d", p->seQ, am); + err_printf("\tXT:A:%c\t%s:i:%d", XT, (mode & BWA_MODE_COMPREAD)? "NM" : "CM", p->nm); + if (nn) err_printf("\tXN:i:%d", nn); + if (mate) err_printf("\tSM:i:%d\tAM:i:%d", p->seQ, am); if (p->type != BWA_TYPE_MATESW) { // X0 and X1 are not available for this type of alignment - printf("\tX0:i:%d", p->c1); - if (p->c1 <= max_top2) printf("\tX1:i:%d", p->c2); + err_printf("\tX0:i:%d", p->c1); + if (p->c1 <= max_top2) err_printf("\tX1:i:%d", p->c2); } - printf("\tXM:i:%d\tXO:i:%d\tXG:i:%d", p->n_mm, p->n_gapo, p->n_gapo+p->n_gape); - if (p->md) printf("\tMD:Z:%s", p->md); + err_printf("\tXM:i:%d\tXO:i:%d\tXG:i:%d", p->n_mm, p->n_gapo, p->n_gapo+p->n_gape); + if (p->md) err_printf("\tMD:Z:%s", p->md); // print multiple hits if (p->n_multi) { - printf("\tXA:Z:"); + err_printf("\tXA:Z:"); for (i = 0; i < p->n_multi; ++i) { bwt_multi1_t *q = p->multi + i; int k; j = pos_end_multi(q, p->len) - q->pos; nn = bns_coor_pac2real(bns, q->pos, j, &seqid); - printf("%s,%c%d,", bns->anns[seqid].name, q->strand? '-' : '+', + err_printf("%s,%c%d,", bns->anns[seqid].name, q->strand? '-' : '+', (int)(q->pos - bns->anns[seqid].offset + 1)); if (q->cigar) { for (k = 0; k < q->n_cigar; ++k) - printf("%d%c", __cigar_len(q->cigar[k]), "MIDS"[__cigar_op(q->cigar[k])]); - } else printf("%dM", p->len); - printf(",%d;", q->gap + q->mm); + err_printf("%d%c", __cigar_len(q->cigar[k]), "MIDS"[__cigar_op(q->cigar[k])]); + } else err_printf("%dM", p->len); + err_printf(",%d;", q->gap + q->mm); } } } @@ -512,16 +512,16 @@ void bwa_print_sam1(const bntseq_t *bns, bwa_seq_t *p, const bwa_seq_t *mate, in ubyte_t *s = p->strand? p->rseq : p->seq; int flag = p->extra_flag | SAM_FSU; if (mate && mate->type == BWA_TYPE_NO_MATCH) flag |= SAM_FMU; - printf("%s\t%d\t*\t0\t0\t*\t*\t0\t0\t", p->name, flag); + err_printf("%s\t%d\t*\t0\t0\t*\t*\t0\t0\t", p->name, flag); for (j = 0; j != p->len; ++j) putchar("ACGTN"[(int)s[j]]); putchar('\t'); if (p->qual) { if (p->strand) seq_reverse(p->len, p->qual, 0); // reverse quality - printf("%s", p->qual); - } else printf("*"); - if (bwa_rg_id) printf("\tRG:Z:%s", bwa_rg_id); - if (p->bc[0]) printf("\tBC:Z:%s", p->bc); - if (p->clip_len < p->full_len) printf("\tXC:i:%d", p->clip_len); + err_printf("%s", p->qual); + } else err_printf("*"); + if (bwa_rg_id) err_printf("\tRG:Z:%s", bwa_rg_id); + if (p->bc[0]) err_printf("\tBC:Z:%s", p->bc); + if (p->clip_len < p->full_len) err_printf("\tXC:i:%d", p->clip_len); putchar('\n'); } } @@ -541,8 +541,8 @@ void bwa_print_sam_SQ(const bntseq_t *bns) { int i; for (i = 0; i < bns->n_seqs; ++i) - printf("@SQ\tSN:%s\tLN:%d\n", bns->anns[i].name, bns->anns[i].len); - if (bwa_rg_line) printf("%s\n", bwa_rg_line); + err_printf("@SQ\tSN:%s\tLN:%d\n", bns->anns[i].name, bns->anns[i].len); + if (bwa_rg_line) err_printf("%s\n", bwa_rg_line); } void bwase_initialize() diff --git a/bwtaln.c b/bwtaln.c index 66310d3..905c2d2 100644 --- a/bwtaln.c +++ b/bwtaln.c @@ -176,7 +176,7 @@ void bwa_aln_core(const char *prefix, const char *fn_fa, const gap_opt_t *opt) } // core loop - fwrite(opt, sizeof(gap_opt_t), 1, stdout); + err_fwrite(opt, sizeof(gap_opt_t), 1, stdout); while ((seqs = bwa_read_seq(ks, 0x40000, &n_seqs, opt->mode, opt->trim_qual)) != 0) { tot_seqs += n_seqs; t = clock(); @@ -213,8 +213,8 @@ void bwa_aln_core(const char *prefix, const char *fn_fa, const gap_opt_t *opt) fprintf(stderr, "[bwa_aln_core] write to the disk... "); for (i = 0; i < n_seqs; ++i) { bwa_seq_t *p = seqs + i; - fwrite(&p->n_aln, 4, 1, stdout); - if (p->n_aln) fwrite(p->aln, sizeof(bwt_aln1_t), p->n_aln, stdout); + err_fwrite(&p->n_aln, 4, 1, stdout); + if (p->n_aln) err_fwrite(p->aln, sizeof(bwt_aln1_t), p->n_aln, stdout); } fprintf(stderr, "%.2f sec\n", (float)(clock() - t) / CLOCKS_PER_SEC); t = clock(); diff --git a/main.c b/main.c index 3990296..4f70bb5 100644 --- a/main.c +++ b/main.c @@ -1,9 +1,10 @@ #include #include #include "main.h" +#include "utils.h" #ifndef PACKAGE_VERSION -#define PACKAGE_VERSION "0.5.9-r16" +#define PACKAGE_VERSION "0.5.9-r18-dev" #endif static int usage() @@ -59,5 +60,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "[main] unrecognized command '%s'\n", argv[1]); return 1; } + err_fflush(stdout); + err_fclose(stdout); return 0; } diff --git a/utils.c b/utils.c index 89693e0..d47ec5c 100644 --- a/utils.c +++ b/utils.c @@ -30,6 +30,7 @@ #include #include #include +#include #include "utils.h" FILE *err_xopen_core(const char *func, const char *fn, const char *mode) @@ -80,3 +81,68 @@ void err_fatal_simple_core(const char *func, const char *msg) fprintf(stderr, "[%s] %s Abort!\n", func, msg); abort(); } + +size_t err_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) +{ + size_t ret = fwrite(ptr, size, nmemb, stream); + if (ret != nmemb) + { + err_fatal_simple_core("fwrite", strerror(errno)); + } + return ret; +} + +int err_printf(const char *format, ...) +{ + va_list arg; + int done; + + va_start(arg, format); + done = vfprintf(stdout, format, arg); + int saveErrno = errno; + va_end(arg); + + if (done < 0) + { + err_fatal_simple_core("vfprintf(stdout)", strerror(saveErrno)); + } + return done; +} + +int err_fprintf(FILE *stream, const char *format, ...) +{ + va_list arg; + int done; + + va_start(arg, format); + done = vfprintf(stream, format, arg); + int saveErrno = errno; + va_end(arg); + + if (done < 0) + { + err_fatal_simple_core("vfprintf", strerror(saveErrno)); + } + return done; +} + +int err_fflush(FILE *stream) +{ + int ret = fflush(stream); + if (ret != 0) + { + err_fatal_simple_core("fflush", strerror(errno)); + } + return ret; +} + +int err_fclose(FILE *stream) +{ + int ret = fclose(stream); + if (ret != 0) + { + err_fatal_simple_core("fclose", strerror(errno)); + } + return ret; +} + diff --git a/utils.h b/utils.h index 31d6086..a7fecbc 100644 --- a/utils.h +++ b/utils.h @@ -31,6 +31,15 @@ #include #include +#ifdef __GNUC__ +// Tell GCC to validate printf format string and args +#define ATTRIBUTE(list) __attribute__ (list) +#else +#define ATTRIBUTE(list) +#endif + + + #define err_fatal_simple(msg) err_fatal_simple_core(__func__, msg) #define xopen(fn, mode) err_xopen_core(__func__, fn, mode) #define xreopen(fn, mode, fp) err_xreopen_core(__func__, fn, mode, fp) @@ -46,6 +55,13 @@ extern "C" { FILE *err_xopen_core(const char *func, const char *fn, const char *mode); FILE *err_xreopen_core(const char *func, const char *fn, const char *mode, FILE *fp); gzFile err_xzopen_core(const char *func, const char *fn, const char *mode); + size_t err_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); + int err_fprintf(FILE *stream, const char *format, ...) + ATTRIBUTE((format(printf, 2, 3))); + int err_printf(const char *format, ...) + ATTRIBUTE((format(printf, 1, 2))); + int err_fflush(FILE *stream); + int err_fclose(FILE *stream); #ifdef __cplusplus }