void qes_seqfile_set_format (struct qes_seqfile *seqfile, enum qes_seqfile_format format) { if (!qes_seqfile_ok(seqfile)) return; seqfile->format = format; }
ssize_t qes_seqfile_write (struct qes_seqfile *seqfile, struct qes_seq *seq) { #define sf_putc_check(c) ret = QES_ZFPUTC(seqfile->qf->fp, c); \ if (ret != c) {return -2;} \ else res_len += 1; \ ret = 0 #define sf_puts_check(s) ret = QES_ZFPUTS(seqfile->qf->fp, s); \ if (ret < 0) {return -2;} \ else res_len += ret; \ ret = 0 int ret = 0; ssize_t res_len = 0; if (!qes_seqfile_ok(seqfile) || !qes_seq_ok(seq)) { return -2; } switch (seqfile->format) { case FASTA_FMT: sf_putc_check(FASTA_DELIM); sf_puts_check(seq->name.str); if (qes_seq_has_comment(seq)) { sf_putc_check(' '); sf_puts_check(seq->comment.str); } sf_putc_check('\n'); sf_puts_check(seq->seq.str); sf_putc_check('\n'); break; case FASTQ_FMT: sf_putc_check(FASTQ_DELIM); sf_puts_check(seq->name.str); if (qes_seq_has_comment(seq)) { sf_putc_check(' '); sf_puts_check(seq->comment.str); } sf_putc_check('\n'); sf_puts_check(seq->seq.str); sf_putc_check('\n'); if (qes_seq_has_qual(seq)) { sf_putc_check('+'); sf_putc_check('\n'); sf_puts_check(seq->qual.str); sf_putc_check('\n'); } break; case UNKNOWN_FMT: default: return -2; break; } return res_len; #undef sf_putc_check #undef sf_puts_check }
static void test_qes_seqfile_destroy (void *ptr) { struct qes_seqfile *sf = NULL; char *fname = NULL; (void) ptr; /* Test file opening for reading */ fname = find_data_file("test.fastq"); tt_assert(fname != NULL); sf = qes_seqfile_create(fname, "r"); tt_ptr_op(sf, !=, NULL); tt_assert(qes_seqfile_ok(sf)); qes_seqfile_destroy(sf); tt_ptr_op(sf, ==, NULL); tt_assert(!qes_seqfile_ok(sf)); end: qes_seqfile_destroy(sf); if (fname != NULL) free(fname); }
enum qes_seqfile_format qes_seqfile_guess_format (struct qes_seqfile *seqfile) { int first_char = '\0'; if (!qes_seqfile_ok(seqfile)) return UNKNOWN_FMT; if (!qes_file_readable(seqfile->qf)) return UNKNOWN_FMT; first_char = qes_file_peek(seqfile->qf); switch (first_char) { case FASTQ_DELIM: seqfile->format = FASTQ_FMT; return FASTQ_FMT; break; case FASTA_DELIM: seqfile->format = FASTA_FMT; return FASTA_FMT; break; default: seqfile->format = UNKNOWN_FMT; return UNKNOWN_FMT; } }
ssize_t qes_seqfile_read (struct qes_seqfile *seqfile, struct qes_seq *seq) { if (!qes_seqfile_ok(seqfile) || !qes_seq_ok(seq)) { return -2; } if (seqfile->qf->eof) { return EOF; } if (seqfile->format == FASTQ_FMT) { return read_fastq_seqfile(seqfile, seq); } else if (seqfile->format == FASTA_FMT) { return read_fasta_seqfile(seqfile, seq); } /* If we reach here, bail out with an error */ qes_str_nullify(&seq->name); qes_str_nullify(&seq->comment); qes_str_nullify(&seq->seq); qes_str_nullify(&seq->qual); return -2; }