From 3c0d05d272b957289c5525790f718626131c2a96 Mon Sep 17 00:00:00 2001 From: Heng Li Date: Mon, 6 Jan 2020 21:53:21 -0500 Subject: [PATCH] r962: abort given wrong RG line; resolves #541 --- format.c | 12 ++++++++---- main.c | 12 +++++++++--- mmpriv.h | 2 +- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/format.c b/format.c index 6d9e7ab..0dd943a 100644 --- a/format.c +++ b/format.c @@ -79,11 +79,11 @@ static char *mm_escape(char *s) return s; } -static void sam_write_rg_line(kstring_t *str, const char *s) +static int sam_write_rg_line(kstring_t *str, const char *s) { char *p, *q, *r, *rg_line = 0; memset(mm_rg_id, 0, 256); - if (s == 0) return; + if (s == 0) return 0; if (strstr(s, "@RG") != s) { if (mm_verbose >= 1) fprintf(stderr, "[ERROR] the read group line is not started with @RG\n"); goto err_set_rg; @@ -108,20 +108,23 @@ static void sam_write_rg_line(kstring_t *str, const char *s) for (q = p, r = mm_rg_id; *q && *q != '\t' && *q != '\n'; ++q) *r++ = *q; mm_sprintf_lite(str, "%s\n", rg_line); + return 0; err_set_rg: free(rg_line); + return -1; } -void mm_write_sam_hdr(const mm_idx_t *idx, const char *rg, const char *ver, int argc, char *argv[]) +int mm_write_sam_hdr(const mm_idx_t *idx, const char *rg, const char *ver, int argc, char *argv[]) { kstring_t str = {0,0,0}; + int ret = 0; if (idx) { uint32_t i; for (i = 0; i < idx->n_seq; ++i) mm_sprintf_lite(&str, "@SQ\tSN:%s\tLN:%d\n", idx->seq[i].name, idx->seq[i].len); } - if (rg) sam_write_rg_line(&str, rg); + if (rg) ret = sam_write_rg_line(&str, rg); mm_sprintf_lite(&str, "@PG\tID:minimap2\tPN:minimap2"); if (ver) mm_sprintf_lite(&str, "\tVN:%s", ver); if (argc > 1) { @@ -132,6 +135,7 @@ void mm_write_sam_hdr(const mm_idx_t *idx, const char *rg, const char *ver, int } mm_err_puts(str.s); free(str.s); + return ret; } static void write_cs_core(kstring_t *s, const uint8_t *tseq, const uint8_t *qseq, const mm_reg1_t *r, char *tmp, int no_iden, int write_tag) diff --git a/main.c b/main.c index 1b1fa81..2d8726e 100644 --- a/main.c +++ b/main.c @@ -7,7 +7,7 @@ #include "mmpriv.h" #include "ketopt.h" -#define MM_VERSION "2.17-r961-dirty" +#define MM_VERSION "2.17-r962-dirty" #ifdef __linux__ #include @@ -356,13 +356,19 @@ int main(int argc, char *argv[]) return 1; } if ((opt.flag & MM_F_OUT_SAM) && idx_rdr->n_parts == 1) { + int ret; if (mm_idx_reader_eof(idx_rdr)) { - mm_write_sam_hdr(mi, rg, MM_VERSION, argc, argv); + ret = mm_write_sam_hdr(mi, rg, MM_VERSION, argc, argv); } else { - mm_write_sam_hdr(0, rg, MM_VERSION, argc, argv); + ret = mm_write_sam_hdr(0, rg, MM_VERSION, argc, argv); if (opt.split_prefix == 0 && mm_verbose >= 2) fprintf(stderr, "[WARNING]\033[1;31m For a multi-part index, no @SQ lines will be outputted. Please use --split-prefix.\033[0m\n"); } + if (ret != 0) { + mm_idx_destroy(mi); + mm_idx_reader_close(idx_rdr); + return 1; + } } if (mm_verbose >= 3) fprintf(stderr, "[M::%s::%.3f*%.2f] loaded/built the index for %d target sequence(s)\n", diff --git a/mmpriv.h b/mmpriv.h index c9b91cd..c1164e2 100644 --- a/mmpriv.h +++ b/mmpriv.h @@ -59,7 +59,7 @@ uint32_t ks_ksmall_uint32_t(size_t n, uint32_t arr[], size_t kk); void mm_sketch(void *km, const char *str, int len, int w, int k, uint32_t rid, int is_hpc, mm128_v *p); -void mm_write_sam_hdr(const mm_idx_t *mi, const char *rg, const char *ver, int argc, char *argv[]); +int mm_write_sam_hdr(const mm_idx_t *mi, const char *rg, const char *ver, int argc, char *argv[]); void mm_write_paf(kstring_t *s, const mm_idx_t *mi, const mm_bseq1_t *t, const mm_reg1_t *r, void *km, int opt_flag); void mm_write_paf3(kstring_t *s, const mm_idx_t *mi, const mm_bseq1_t *t, const mm_reg1_t *r, void *km, int opt_flag, int rep_len); void mm_write_sam(kstring_t *s, const mm_idx_t *mi, const mm_bseq1_t *t, const mm_reg1_t *r, int n_regs, const mm_reg1_t *regs);