From 281a4b6cc97b42185915491f2f661b33d8ccd461 Mon Sep 17 00:00:00 2001 From: Daniel Jones Date: Thu, 17 Mar 2011 06:05:30 -0700 Subject: [PATCH] (limited) support for fasta --- src/fastq-grep.c | 12 +----------- src/parse.c | 34 ++++++++++++++++++++++++++++++---- src/parse.h | 3 +++ 3 files changed, 34 insertions(+), 15 deletions(-) diff --git a/src/fastq-grep.c b/src/fastq-grep.c index 67c9190..3eaffb7 100644 --- a/src/fastq-grep.c +++ b/src/fastq-grep.c @@ -47,16 +47,6 @@ static int count_flag; -void print_fastq_entry(FILE* fout, seq_t* seq) -{ - fprintf(fout, "@%s\n%s\n+%s\n%s\n", - seq->id1.s, - seq->seq.s, - seq->id2.s, - seq->qual.s ); -} - - void fastq_grep(FILE* fin, FILE* fout, pcre* re) { int rc; @@ -78,7 +68,7 @@ void fastq_grep(FILE* fin, FILE* fout, pcre* re) if ((invert_flag && rc == PCRE_ERROR_NOMATCH) || rc >= 0) { if (count_flag) count++; - else print_fastq_entry(fout, seq); + else fastq_print(fout, seq); } } diff --git a/src/parse.c b/src/parse.c index bec5ac3..9a7774d 100644 --- a/src/parse.c +++ b/src/parse.c @@ -176,7 +176,7 @@ int fastq_next(fastq_t* f, seq_t* seq) /* read id1 */ else if (f->state == STATE_ID1) { - if (*f->c == '@') { + if (*f->c == '@' || *f->c == '>') { f->c++; fastq_get_line(f, &seq->id1); if (f->state == STATE_EOF) return 0; @@ -184,7 +184,9 @@ int fastq_next(fastq_t* f, seq_t* seq) f->state = STATE_SEQ; } else { - fprintf(stderr, "Malformed FASTQ file: expecting an '@', saw a '%c'\n", *f->c); + fprintf(stderr, + "Malformed FASTQ file: expecting an '@' or '>', saw a '%c'\n", + *f->c); exit(1); } } @@ -207,8 +209,12 @@ int fastq_next(fastq_t* f, seq_t* seq) f->state = STATE_QUAL; } else { - fprintf(stderr, "Malformed FASTQ file: expecting an '+', saw a '%c'\n", *f->c); - exit(1); + /* fasta style entry */ + seq->id2.s[0] = '\0'; + seq->qual.s[0] = '\0'; + + f->state = STATE_ID1; + break; } } @@ -233,3 +239,23 @@ int fastq_next(fastq_t* f, seq_t* seq) } +void fastq_print(FILE* fout, seq_t* seq) +{ + /* FASTQ */ + if (seq->qual.n > 0) { + fprintf(fout, "@%s\n%s\n+%s\n%s\n", + seq->id1.s, + seq->seq.s, + seq->id2.s, + seq->qual.s ); + } + + /* FASTA */ + else { + fprintf(fout, ">%s\n%s\n", + seq->id1.s, + seq->seq.s ); + } +} + + diff --git a/src/parse.h b/src/parse.h index 56a074a..64d3726 100644 --- a/src/parse.h +++ b/src/parse.h @@ -53,5 +53,8 @@ fastq_t* fastq_open(FILE*); void fastq_close(fastq_t*); int fastq_next(fastq_t*, seq_t*); +void fastq_print(FILE* fout, seq_t* seq); + + #endif -- 2.39.2