mirror of
https://github.com/metabarcoding/obitools4.git
synced 2025-06-29 16:20:46 +00:00
109 lines
2.0 KiB
C
109 lines
2.0 KiB
C
#include "fastseq_read.h"
|
|
|
|
|
|
static fast_kseq_t* _open_fast_sek(gzFile fp, int shift) {
|
|
fast_kseq_t* iterator;
|
|
|
|
iterator = (fast_kseq_t*)malloc(sizeof(fast_kseq_t));
|
|
|
|
|
|
if (iterator == NULL)
|
|
return NULL;
|
|
|
|
iterator->filez = fp;
|
|
iterator->finished = false;
|
|
iterator->shift = shift;
|
|
|
|
if (fp != Z_NULL) {
|
|
iterator->seq = kseq_init(fp);
|
|
|
|
if (iterator->seq == NULL) {
|
|
free(iterator);
|
|
iterator=NULL;
|
|
}
|
|
}
|
|
else {
|
|
free(iterator);
|
|
iterator=NULL;
|
|
}
|
|
|
|
return iterator;
|
|
}
|
|
|
|
/**
|
|
* @brief open a FastA or FastQ file gizzed or not
|
|
*
|
|
* @param filename a const char* indicating the path of the
|
|
* fast* file
|
|
* @return kseq_t* a pointer to a kseq_t structure or NULL on
|
|
* failing
|
|
*/
|
|
fast_kseq_t* open_fast_sek_file(const char* filename, int shift) {
|
|
gzFile fp;
|
|
|
|
fp = gzopen(filename, "r");
|
|
return _open_fast_sek(fp, shift);
|
|
}
|
|
|
|
fast_kseq_p open_fast_sek_fd(int fd, bool keep_open, int shift) {
|
|
gzFile fp;
|
|
|
|
if (keep_open)
|
|
fd = dup(fd);
|
|
|
|
fp = gzdopen(fd, "r");
|
|
|
|
return _open_fast_sek(fp, shift);
|
|
}
|
|
|
|
fast_kseq_p open_fast_sek_stdin(int shift) {
|
|
return open_fast_sek_fd(fileno(stdin), true, shift);
|
|
}
|
|
|
|
|
|
int64_t next_fast_sek(fast_kseq_t* iterator) {
|
|
int64_t l;
|
|
|
|
if (iterator == NULL || iterator->seq == NULL)
|
|
return -3;
|
|
|
|
l = kseq_read(iterator->seq);
|
|
if (l < 0) l = 0;
|
|
|
|
iterator->finished = l==0;
|
|
if (l>0) l = gzoffset(iterator->filez);
|
|
|
|
return l;
|
|
}
|
|
|
|
int rewind_fast_sek(fast_kseq_t* iterator) {
|
|
if (iterator == NULL || iterator->seq == NULL)
|
|
return -3;
|
|
|
|
kseq_rewind(iterator->seq);
|
|
return 0;
|
|
}
|
|
|
|
int close_fast_sek(fast_kseq_t* iterator) {
|
|
gzFile fp;
|
|
kseq_t *seq;
|
|
int rep = -3;
|
|
|
|
if (iterator == NULL)
|
|
return rep;
|
|
|
|
fp = iterator->filez;
|
|
seq = iterator->seq;
|
|
|
|
free(iterator);
|
|
|
|
if (seq != NULL)
|
|
kseq_destroy(iterator->seq);
|
|
|
|
if (fp != Z_NULL)
|
|
rep = gzclose(fp);
|
|
|
|
return rep;
|
|
}
|
|
|