int gt_desc_buffer_unit_test(GtError *err) { GtDescBuffer *s; static char *strs[] = { "foo", "bar", "baz"}; const char *ret; int had_err = 0; GtUword i, j; gt_error_check(err); s = gt_desc_buffer_new(); ret = gt_desc_buffer_get_next(s); gt_ensure(strcmp(ret, "") == 0); gt_ensure(ret == s->buf); gt_ensure(gt_desc_buffer_length(s) == 0); gt_desc_buffer_delete(s); s = gt_desc_buffer_new(); for (i = 0; i < strlen(strs[0]); i++) { gt_desc_buffer_append_char(s, strs[0][i]); } gt_desc_buffer_finish(s); ret = gt_desc_buffer_get_next(s); gt_ensure(strcmp(ret, strs[0]) == 0); gt_ensure(ret == s->buf); gt_ensure(gt_desc_buffer_length(s) == 4); gt_desc_buffer_delete(s); s = gt_desc_buffer_new(); for (j = 0; j < 2; j++) { for (i = 0; i < strlen(strs[j]); i++) { gt_desc_buffer_append_char(s, strs[j][i]); } gt_desc_buffer_finish(s); } ret = gt_desc_buffer_get_next(s); gt_ensure(strcmp(ret, strs[0]) == 0); gt_ensure(ret == s->buf); ret = gt_desc_buffer_get_next(s); gt_ensure(strcmp(ret, strs[1]) == 0); gt_ensure(ret == s->buf+4); gt_ensure(gt_desc_buffer_length(s) == 8); gt_desc_buffer_delete(s); s = gt_desc_buffer_new(); for (j = 0; j < 3; j++) { for (i = 0; i < strlen(strs[j]); i++) { gt_desc_buffer_append_char(s, strs[j][i]); } gt_desc_buffer_finish(s); } ret = gt_desc_buffer_get_next(s); gt_ensure(strcmp(ret, strs[0]) == 0); gt_ensure(ret == s->buf); ret = gt_desc_buffer_get_next(s); gt_ensure(strcmp(ret, strs[1]) == 0); gt_ensure(ret == s->buf+4); ret = gt_desc_buffer_get_next(s); gt_ensure(strcmp(ret, strs[2]) == 0); gt_ensure(ret == s->buf+8); gt_ensure(gt_desc_buffer_length(s) == 12); gt_desc_buffer_delete(s); return had_err; }
static int gt_seq_iterator_sequence_buffer_next(GtSeqIterator *si, const GtUchar **sequence, unsigned long *len, char **desc, GtError *err) { GtSeqIteratorSequenceBuffer *seqit; GtUchar charcode; int retval; bool haserr = false, foundseq = false; gt_assert(si); gt_assert(len && desc); seqit = gt_seq_iterator_sequence_buffer_cast(si); gt_assert((sequence && seqit->withsequence) || !seqit->withsequence); if (seqit->exhausted) { return 0; } while (true) { retval = gt_sequence_buffer_next(seqit->fb,&charcode,err); if (retval < 0) { haserr = true; break; } if (retval == 0) { seqit->exhausted = true; break; } if (seqit->currentread < seqit->maxread) { seqit->currentread++; } if (charcode == (GtUchar) SEPARATOR) { if (seqit->sequencebuffer.nextfreeGtUchar == 0 && seqit->withsequence) { gt_error_set(err,"sequence %llu is empty", seqit->unitnum); haserr = true; break; } *desc = (char*) gt_desc_buffer_get_next(seqit->descptr); *len = seqit->sequencebuffer.nextfreeGtUchar; if (seqit->withsequence) { /* make sure the outgoing sequence is '\0' terminated */ seqit->sequencebuffer.spaceGtUchar [seqit->sequencebuffer.nextfreeGtUchar] = (GtUchar) '\0'; *sequence = seqit->sequencebuffer.spaceGtUchar; } seqit->sequencebuffer.nextfreeGtUchar = 0; foundseq = true; seqit->unitnum++; break; } if (seqit->withsequence) { GT_STOREINARRAY(&seqit->sequencebuffer, GtUchar, MAX(1024UL, seqit->sequencebuffer.nextfreeGtUchar * 0.5), charcode); } else { seqit->sequencebuffer.nextfreeGtUchar++; } } if (!haserr && seqit->sequencebuffer.nextfreeGtUchar > 0) { *desc = (char*) gt_desc_buffer_get_next(seqit->descptr); if (seqit->withsequence) { /* make sure the outgoing sequence is '\0' terminated */ seqit->sequencebuffer.spaceGtUchar [seqit->sequencebuffer.nextfreeGtUchar] = (GtUchar) '\0'; *sequence = seqit->sequencebuffer.spaceGtUchar; } *len = seqit->sequencebuffer.nextfreeGtUchar; foundseq = true; seqit->sequencebuffer.nextfreeGtUchar = 0; } if (haserr) { return -1; } if (foundseq) { return 1; } return 0; }