private
inline do |builder|
- builder.add_static "id_seq", 'rb_intern("@seq")', "ID"
-
# Macro for matching nucleotides including ambiguity codes.
builder.prefix %{
#define MATCH(A,B) ((bitmap[A] & bitmap[B]) != 0)
# reporting the match endpoints.
builder.prefix %{
unsigned int backtrack(
- char *ss, // Sequence start
- char *s, // Sequence
- char *p, // Pattern
- int mis, // Max mismatches
- int ins, // Max insertions
- int del // Max deletions
+ char *ss, // Sequence start
+ char *s, // Sequence
+ char *p, // Pattern
+ unsigned int mis, // Max mismatches
+ unsigned int ins, // Max insertions
+ unsigned int del, // Max deletions
+ int state // Last event: mis, ins or del
)
{
unsigned int r = 0;
return (unsigned int) (s - ss);
else
{
- if (mis && *s && *p && (r = backtrack(ss, s + 1, p + 1, mis - 1, ins, del))) return r;
- if (ins && *p && (r = backtrack(ss, s, p + 1, mis, ins - 1, del))) return r;
- if (del && *s && (r = backtrack(ss, s + 1, p, mis, ins, del - 1))) return r;
+ if (mis && *s && *p && (r = backtrack(ss, s + 1, p + 1, mis - 1, ins, del, 0))) return r;
+ if (ins && *p && (state != -1) && (r = backtrack(ss, s, p + 1, mis, ins - 1, del, 1))) return r;
+ if (del && *s && (state != 1) && (r = backtrack(ss, s + 1, p, mis, ins, del - 1, -1))) return r;
}
return 0;
unsigned int ins = FIX2UINT(_ins);
unsigned int del = FIX2UINT(_del);
- char *ss = s;
- unsigned int e = 0;
+ char *ss = s;
+ int state = 0;
+ unsigned int e = 0;
VALUE tuple;
if (pos < len)
while (*s)
{
- if ((e = backtrack(ss, s, p, mis, ins, del)))
+ if ((e = backtrack(ss, s, p, mis, ins, del, state)))
{
tuple = rb_ary_new();
rb_ary_push(tuple, INT2FIX((int) (s - ss)));