sff_t * sff_init1() { sff_t *sff = NULL; sff = ion_calloc(1, sizeof(sff_t), __func__, "sff"); sff->gheader = NULL; sff->rheader = sff_read_header_init(); sff->read = sff_read_init(); return sff; }
sff_read_t * sff_read_read(FILE *fp, sff_header_t *gh, sff_read_header_t *rh) { sff_read_t *r = NULL; uint32_t i, n = 0; r = sff_read_init(); r->flowgram = ion_malloc(sizeof(uint16_t)*gh->flow_length, __func__, "r->flowgram"); r->flow_index = ion_malloc(sizeof(uint8_t)*rh->n_bases, __func__, "r->flow_index"); r->bases = ion_string_init(rh->n_bases+1); r->quality = ion_string_init(rh->n_bases+1); if(gh->flow_length != fread(r->flowgram, sizeof(uint16_t), gh->flow_length, fp) || rh->n_bases != fread(r->flow_index, sizeof(uint8_t), rh->n_bases, fp) || rh->n_bases != fread(r->bases->s, sizeof(char), rh->n_bases, fp) || rh->n_bases != fread(r->quality->s, sizeof(char), rh->n_bases, fp)) { // truncated file, error ion_error(__func__, "fread", Exit, ReadFileError); } n += sizeof(uint16_t)*gh->flow_length + 3*sizeof(uint8_t)*rh->n_bases; // set length and null-terminators r->bases->l = rh->n_bases; r->quality->l = rh->n_bases; r->bases->s[r->bases->l]='\0'; r->quality->s[r->quality->l]='\0'; // convert flowgram to host order for(i=0;i<gh->flow_length;i++) { r->flowgram[i] = ntohs(r->flowgram[i]); } n += ion_read_padding(fp, n); #ifdef ION_SFF_DEBUG sff_read_print(stderr, r, gh, rh); #endif return r; }