protected SearchPatterns ( char word, int index, sbyte il ) : void | ||
word | char | null terminated word to match |
index | int | start index from word |
il | sbyte | interletter values array to update |
return | void |
protected internal virtual void SearchPatterns(char[] word, int index, sbyte[] il)
{
sbyte[] values;
int i = index;
char p, q;
char sp = word[i];
p = root;
while (p > 0 && p < sc.Length)
{
if (sc[p] == 0xFFFF)
{
if (HStrCmp(word, i, kv.Array, lo[p]) == 0)
{
values = GetValues(eq[p]); // data pointer is in eq[]
int j = index;
for (int k = 0; k < values.Length; k++)
{
if (j < il.Length && values[k] > il[j])
{
il[j] = values[k];
}
j++;
}
}
return;
}
int d = sp - sc[p];
if (d == 0)
{
if (sp == 0)
{
break;
}
sp = word[++i];
p = eq[p];
q = p;
// look for a pattern ending at this position by searching for
// the null char ( splitchar == 0 )
while (q > 0 && q < sc.Length)
{
if (sc[q] == 0xFFFF) // stop at compressed branch
{
break;
}
if (sc[q] == 0)
{
values = GetValues(eq[q]);
int j = index;
for (int k = 0; k < values.Length; k++)
{
if (j < il.Length && values[k] > il[j])
{
il[j] = values[k];
}
j++;
}
break;
}
else
{
q = lo[q];
/// <summary>
/// actually the code should be: q = sc[q] < 0 ? hi[q] : lo[q]; but
/// java chars are unsigned
/// </summary>
}
}
}
else
{
p = d < 0 ? lo[p] : hi[p];
}
}
}