int gt_callenumselfmatches(const char *indexname, GtReadmode queryreadmode, unsigned int userdefinedleastlength, GtProcessquerymatch processquerymatch, void *processquerymatchinfo, GtLogger *logger, GtError *err) { Suffixarray suffixarray; bool haserr = false; gt_assert(queryreadmode != GT_READMODE_FORWARD); if (gt_mapsuffixarray(&suffixarray, SARR_ESQTAB | SARR_SUFTAB | SARR_SSPTAB, indexname, logger, err) != 0) { haserr = true; } else { unsigned long seqnum, numofsequences, seqlength, seqstartpos; GtQuerymatch *querymatchspaceptr = gt_querymatch_new(); GtQueryrep queryrep; numofsequences = gt_encseq_num_of_sequences(suffixarray.encseq); queryrep.sequence = NULL; queryrep.reversecopy = false; queryrep.encseq = suffixarray.encseq; queryrep.readmode = queryreadmode; for (seqnum = 0; seqnum < numofsequences; seqnum++) { seqstartpos = gt_encseq_seqstartpos(suffixarray.encseq, seqnum); seqlength = gt_encseq_seqlength(suffixarray.encseq, seqnum); if (seqlength >= (unsigned long) userdefinedleastlength) { queryrep.startpos = seqstartpos; queryrep.length = seqlength; if (gt_querysubstringmatch(true, &suffixarray, (uint64_t) seqnum, &queryrep, (unsigned long) userdefinedleastlength, processquerymatch, processquerymatchinfo, querymatchspaceptr, err) != 0) { haserr = true; break; } } } gt_querymatch_delete(querymatchspaceptr); } gt_freesuffixarray(&suffixarray); return haserr ? -1 : 0; }
static int gt_constructsarrandrunmmsearch( const GtEncseq *dbencseq, GtReadmode readmode, unsigned int prefixlength, unsigned int numofparts, GtUword maximumspace, const GtUchar *query, GtUword querylen, unsigned int minlength, GtProcessquerymatch processquerymatch, void *processquerymatchinfo, GtTimer *sfxprogress, bool withprogressbar, GtLogger *logger, GtError *err) { bool haserr = false; Sfxiterator *sfi; Sfxstrategy sfxstrategy; defaultsfxstrategy(&sfxstrategy, gt_encseq_bitwise_cmp_ok(dbencseq) ? false : true); sfxstrategy.outsuftabonfile = false; sfi = gt_Sfxiterator_new(dbencseq, readmode, prefixlength, numofparts, maximumspace, &sfxstrategy, /* sfxstrategy */ sfxprogress, withprogressbar, logger, /* logger */ err); if (sfi == NULL) { haserr = true; } else { const GtSuffixsortspace *suffixsortspace; GtUword numberofsuffixes; GtQuerymatch *querymatchspaceptr = gt_querymatch_new(); GtQueryrepresentation queryrep; queryrep.sequence = query; queryrep.encseq = NULL; queryrep.readmode = GT_READMODE_FORWARD; queryrep.startpos = 0; queryrep.seqlen = querylen; while (true) { suffixsortspace = gt_Sfxiterator_next(&numberofsuffixes,NULL,sfi); if (suffixsortspace == NULL) { break; } gt_querysubstringmatch(false, dbencseq, (const ESASuffixptr *) gt_suffixsortspace_ulong_get(suffixsortspace), readmode, numberofsuffixes, 0, &queryrep, (GtUword) minlength, processquerymatch, processquerymatchinfo, querymatchspaceptr); } gt_querymatch_delete(querymatchspaceptr); } if (gt_Sfxiterator_delete(sfi,err) != 0) { haserr = true; } return haserr ? -1 : 0; }