예제 #1
0
void
qes_seqfile_set_format (struct qes_seqfile *seqfile,
                        enum qes_seqfile_format format)
{
    if (!qes_seqfile_ok(seqfile)) return;
    seqfile->format = format;
}
예제 #2
0
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
}
예제 #3
0
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);
}
예제 #4
0
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;
    }
}
예제 #5
0
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;
}