void gt_desc_buffer_show(GtDescBuffer *db) { printf("str: %s\n", db->buf); printf("queue: "); gt_queue_iterate(db->startqueue, queueprinter, NULL, NULL); printf("\n"); }
static int snp_annotator_stream_process_current_gene(GtSNPAnnotatorStream *sas, GtError *err) { int had_err = 0; GtUword i; GtUword nof_genes = gt_array_size(sas->cur_gene_set); gt_error_check(err); if (gt_queue_size(sas->snps) > 0) { /* we need to process SNPs for a gene cluster*/ gt_assert(gt_queue_size(sas->outqueue) == 0); for (i = 0; !had_err && i < nof_genes; i++) { GtNodeVisitor *sav; GtFeatureNode *gene; gene = *(GtFeatureNode**) gt_array_get(sas->cur_gene_set, i); sav = gt_snp_annotator_visitor_new(gene, sas->tt, sas->rmap, err); if (!sav) had_err = -1; if (!had_err) { if (i < nof_genes-1) { had_err = gt_queue_iterate(sas->snps, snp_annotator_stream_process_snp, sav, err); } else { while (!had_err && gt_queue_size(sas->snps) > 0) { GtFeatureNode *snp = (GtFeatureNode*) gt_queue_get(sas->snps); had_err = gt_genome_node_accept((GtGenomeNode*) snp, sav, err); gt_queue_add(sas->outqueue, snp); gt_genome_node_delete((GtGenomeNode*) snp); } } gt_node_visitor_delete(sav); } gt_genome_node_delete((GtGenomeNode*) gene); } } else { /* no SNPs for this gene cluster, delete it */ for (i = 0; !had_err && i < nof_genes; i++) { gt_genome_node_delete(*(GtGenomeNode**) gt_array_get(sas->cur_gene_set, i)); } } gt_assert(gt_queue_size(sas->snps) == 0); gt_array_reset(sas->cur_gene_set); return had_err; }
int gt_queue_unit_test(GtError *err) { long check_counter = 0, check_counter_reverse = 1023; unsigned long i; int had_err = 0; GtQueue *q; gt_error_check(err); /* without wraparound */ q = gt_queue_new(); gt_ensure(had_err, !gt_queue_size(q)); for (i = 0; !had_err && i < 1024; i++) { gt_queue_add(q, (void*) i); gt_ensure(had_err, gt_queue_size(q) == i + 1); } if (!had_err) had_err = gt_queue_iterate(q, check_queue, &check_counter, err); if (!had_err) { had_err = gt_queue_iterate_reverse(q, check_queue_reverse, &check_counter_reverse, err); } gt_ensure(had_err, gt_queue_iterate(q, fail_func, NULL, NULL)); gt_ensure(had_err, gt_queue_iterate_reverse(q, fail_func, NULL, NULL)); if (!had_err) { gt_queue_remove(q, (void*) 0); gt_ensure(had_err, gt_queue_size(q) == 1023); } for (i = 1; !had_err && i < 1024; i++) { gt_ensure(had_err, gt_queue_head(q) == (void*) i); gt_ensure(had_err, gt_queue_get(q) == (void*) i); gt_ensure(had_err, gt_queue_size(q) == 1024 - i - 1); } gt_ensure(had_err, !gt_queue_size(q)); gt_queue_delete(q); /* with wraparound (without full queue) */ if (!had_err) { q = gt_queue_new(); gt_ensure(had_err, !gt_queue_size(q)); for (i = 0; !had_err && i < 1024; i++) { gt_queue_add(q, (void*) i); gt_ensure(had_err, gt_queue_size(q) == i + 1); } check_counter = 0; check_counter_reverse = 1023; if (!had_err) had_err = gt_queue_iterate(q, check_queue, &check_counter, err); gt_ensure(had_err, gt_queue_iterate(q, fail_func, NULL, NULL)); gt_ensure(had_err, gt_queue_iterate_reverse(q, fail_func, NULL, NULL)); if (!had_err) { had_err = gt_queue_iterate_reverse(q, check_queue_reverse, &check_counter_reverse, err); } for (i = 0; !had_err && i < 512; i++) { gt_ensure(had_err, gt_queue_head(q) == (void*) i); gt_ensure(had_err, gt_queue_get(q) == (void*) i); gt_ensure(had_err, gt_queue_size(q) == 1024 - i - 1); } for (i = 0; !had_err && i < 512; i++) { gt_queue_add(q, (void*) (i + 1024)); gt_ensure(had_err, gt_queue_size(q) == 512 + i + 1); } check_counter = 512; check_counter_reverse = 1535; if (!had_err) had_err = gt_queue_iterate(q, check_queue, &check_counter, err); if (!had_err) { had_err = gt_queue_iterate_reverse(q, check_queue_reverse, &check_counter_reverse, err); } gt_ensure(had_err, gt_queue_iterate(q, fail_func, NULL, NULL)); gt_ensure(had_err, gt_queue_iterate_reverse(q, fail_func, NULL, NULL)); if (!had_err) { gt_queue_remove(q, (void*) 512); gt_ensure(had_err, gt_queue_size(q) == 1023); } for (i = 1; !had_err && i < 1024; i++) { gt_ensure(had_err, gt_queue_head(q) == (void*) (512 + i)); gt_ensure(had_err, gt_queue_get(q) == (void*) (512 + i)); gt_ensure(had_err, gt_queue_size(q) == 1024 - i - 1); } gt_ensure(had_err, !gt_queue_size(q)); gt_queue_delete(q); } /* with wraparound (with full queue) */ if (!had_err) { q = gt_queue_new(); gt_ensure(had_err, !gt_queue_size(q)); for (i = 0; !had_err && i < 1024; i++) { gt_queue_add(q, (void*) i); gt_ensure(had_err, gt_queue_size(q) == i + 1); } check_counter = 0; check_counter_reverse = 1023; if (!had_err) had_err = gt_queue_iterate(q, check_queue, &check_counter, err); if (!had_err) { had_err = gt_queue_iterate_reverse(q, check_queue_reverse, &check_counter_reverse, err); } gt_ensure(had_err, gt_queue_iterate(q, fail_func, NULL, NULL)); gt_ensure(had_err, gt_queue_iterate_reverse(q, fail_func, NULL, NULL)); for (i = 0; !had_err && i < 512; i++) { gt_ensure(had_err, gt_queue_head(q) == (void*) i); gt_ensure(had_err, gt_queue_get(q) == (void*) i); gt_ensure(had_err, gt_queue_size(q) == 1024 - i - 1); } for (i = 0; !had_err && i < 1024; i++) { gt_queue_add(q, (void*) (i + 1024)); gt_ensure(had_err, gt_queue_size(q) == 512 + i + 1); } check_counter = 512; check_counter_reverse = 2047; if (!had_err) had_err = gt_queue_iterate(q, check_queue, &check_counter, err); if (!had_err) { had_err = gt_queue_iterate_reverse(q, check_queue_reverse, &check_counter_reverse, err); } gt_ensure(had_err, gt_queue_iterate(q, fail_func, NULL, NULL)); gt_ensure(had_err, gt_queue_iterate_reverse(q, fail_func, NULL, NULL)); if (!had_err) { gt_queue_remove(q, (void*) 512); gt_ensure(had_err, gt_queue_size(q) == 1535); } for (i = 1; !had_err && i < 1536; i++) { gt_ensure(had_err, gt_queue_head(q) == (void*) (512 + i)); gt_ensure(had_err, gt_queue_get(q) == (void*) (512 + i)); gt_ensure(had_err, gt_queue_size(q) == 1536 - i - 1); } gt_ensure(had_err, !gt_queue_size(q)); gt_queue_delete(q); } /* test a corner case */ if (!had_err) { q = gt_queue_new(); gt_queue_add(q, (void*) 1); gt_ensure(had_err, gt_queue_size(q) == 1); if (!had_err) gt_queue_add(q, (void*) 1); gt_ensure(had_err, gt_queue_size(q) == 2); gt_ensure(had_err, gt_queue_get(q)); gt_ensure(had_err, gt_queue_size(q) == 1); if (!had_err) gt_queue_add(q, (void*) 1); gt_ensure(had_err, gt_queue_size(q) == 2); gt_ensure(had_err, gt_queue_get(q)); gt_ensure(had_err, gt_queue_size(q) == 1); if (!had_err) gt_queue_add(q, (void*) 1); gt_ensure(had_err, gt_queue_size(q) == 2); gt_ensure(had_err, gt_queue_get(q)); gt_ensure(had_err, gt_queue_size(q) == 1); gt_ensure(had_err, gt_queue_get(q)); gt_ensure(had_err, gt_queue_size(q) == 0); if (!had_err) gt_queue_add(q, (void*) 1); gt_ensure(had_err, gt_queue_size(q) == 1); gt_ensure(had_err, gt_queue_get(q)); gt_ensure(had_err, gt_queue_size(q) == 0); gt_queue_delete(q); } /* gt_queue_remove() corner case */ if (!had_err) { q = gt_queue_new(); gt_queue_add(q, (void*) 1); gt_ensure(had_err, gt_queue_size(q) == 1); gt_queue_remove(q, (void*) 1); gt_ensure(had_err, gt_queue_size(q) == 0); gt_queue_delete(q); } /* gt_queue_remove() corner case */ if (!had_err) { q = gt_queue_new(); gt_queue_add(q, (void*) 0); gt_queue_add(q, (void*) 1); gt_queue_add(q, (void*) 2); gt_queue_add(q, (void*) 3); gt_ensure(had_err, gt_queue_get(q) == (void*) 0); gt_ensure(had_err, gt_queue_get(q) == (void*) 1); gt_queue_add(q, (void*) 4); gt_queue_add(q, (void*) 5); gt_queue_remove(q, (void*) 4); gt_queue_remove(q, (void*) 2); gt_queue_remove(q, (void*) 5); gt_queue_remove(q, (void*) 3); gt_ensure(had_err, gt_queue_size(q) == 0); gt_queue_delete(q); } /* delete with contents */ if (!had_err) { q = gt_queue_new(); gt_ensure(had_err, !gt_queue_size(q)); if (!had_err) gt_queue_add(q, gt_calloc(1, 16)); gt_ensure(had_err, gt_queue_size(q) == 1); if (!had_err) gt_queue_add(q, gt_calloc(1, 32)); gt_ensure(had_err, gt_queue_size(q) == 2); gt_queue_delete_with_contents(q); } return had_err; }
static int gff3_in_stream_plain_next(GtNodeStream *ns, GtGenomeNode **gn, GtError *err) { GtGFF3InStreamPlain *is = gff3_in_stream_plain_cast(ns); GtStr *filenamestr; int had_err = 0, status_code; gt_error_check(err); if (gt_queue_size(is->genome_node_buffer) > 1) { /* we still have at least two nodes in the buffer -> serve from there */ *gn = gt_queue_get(is->genome_node_buffer); return 0; } /* the buffer is empty or has one element */ gt_assert(gt_queue_size(is->genome_node_buffer) <= 1); for (;;) { /* open file if necessary */ if (!is->file_is_open) { if (gt_str_array_size(is->files) && is->next_file == gt_str_array_size(is->files)) { break; } if (gt_str_array_size(is->files)) { if (strcmp(gt_str_array_get(is->files, is->next_file), "-") == 0) { if (is->stdin_argument) { gt_error_set(err, "multiple specification of argument file \"-\""); had_err = -1; break; } is->fpin = gt_file_xopen(NULL, "r"); is->file_is_open = true; is->stdin_argument = true; } else { is->fpin = gt_file_xopen(gt_str_array_get(is->files, is->next_file), "r"); is->file_is_open = true; } is->next_file++; } else { if (is->stdin_processed) break; is->fpin = NULL; is->file_is_open = true; } is->line_number = 0; if (!had_err && is->progress_bar) { printf("processing file \"%s\"\n", gt_str_array_size(is->files) ? gt_str_array_get(is->files, is->next_file-1) : "stdin"); } if (!had_err && is->fpin && is->progress_bar) { gt_progressbar_start(&is->line_number, gt_file_number_of_lines(gt_str_array_get(is->files, is->next_file-1))); } } gt_assert(is->file_is_open); filenamestr = gt_str_array_size(is->files) ? gt_str_array_get_str(is->files, is->next_file-1) : is->stdinstr; /* read two nodes */ had_err = gt_gff3_parser_parse_genome_nodes(is->gff3_parser, &status_code, is->genome_node_buffer, is->used_types, filenamestr, &is->line_number, is->fpin, err); if (had_err) break; if (status_code != EOF) { had_err = gt_gff3_parser_parse_genome_nodes(is->gff3_parser, &status_code, is->genome_node_buffer, is->used_types, filenamestr, &is->line_number, is->fpin, err); if (had_err) break; } if (status_code == EOF) { /* end of current file */ if (is->progress_bar) gt_progressbar_stop(); gt_file_delete(is->fpin); is->fpin = NULL; is->file_is_open = false; gt_gff3_parser_reset(is->gff3_parser); if (!gt_str_array_size(is->files)) { is->stdin_processed = true; break; } continue; } gt_assert(gt_queue_size(is->genome_node_buffer)); /* make sure the parsed nodes are sorted */ if (is->ensure_sorting && gt_queue_size(is->genome_node_buffer) > 1) { GtGenomeNode *last_node = NULL; /* a sorted stream can have at most one input file */ gt_assert(gt_str_array_size(is->files) == 0 || gt_str_array_size(is->files) == 1); had_err = gt_queue_iterate(is->genome_node_buffer, buffer_is_sorted, &last_node, err); } if (!had_err) { *gn = gt_queue_get(is->genome_node_buffer); } return had_err; } gt_assert(!gt_queue_size(is->genome_node_buffer)); *gn = NULL; return had_err; }