char *p, // Pattern
unsigned int mis, // Max mismatches
unsigned int ins, // Max insertions
- unsigned int del // Max deletions
+ unsigned int del, // Max deletions
+ int state // 1 deletion, -1 insertion, 0 match or mismatch
)
{
match found = {0, 0, 0, 0};
}
else
{
- if (mis && *s && *p && (f = backtrack(ss, s + 1, p + 1, mis - 1, ins, del))) return f;
- if (ins && *p && (f = backtrack(ss, s, p + 1, mis, ins - 1, del))) return f;
- if (del && *s && (f = backtrack(ss, s + 1, p, mis, ins, del - 1))) return f;
+ if (mis && *s && *p && (f = backtrack(ss, s + 1, p + 1, mis - 1, ins, del, 0))) return f;
+ if (ins && *p && (state != 1) && (f = backtrack(ss, s, p + 1, mis, ins - 1, del, -1))) return f;
+ if (del && *s && (state != -1) && (f = backtrack(ss, s + 1, p, mis, ins, del - 1, 1))) return f;
}
return NULL;
unsigned int mmis = 0;
unsigned int mins = 0;
unsigned int mdel = 0;
+ int state = 0;
VALUE ary = 0;
- if (pos < len)
+ if (pos < len) // FIXME: pos < len - plen + 1
{
s += pos;
while (*s)
{
- if ((f = backtrack(ss, s, p, max_mis, max_ins, max_del)))
+ if ((f = backtrack(ss, s, p, max_mis, max_ins, max_del, state)))
{
mbeg = (s - ss);
mlen = f->end - mbeg;