private uint DecodeTree(uint prefix, int length)
{
uint bit = _bs.GetBit();
if (bit == 0)
{ // Leaf
uint lo = _loBytes.GetCode(_bs);
uint hi = _hiBytes.GetCode(_bs);
uint v = (hi << 8) | lo;
_tree[_treeSize] = v;
if (length <= 8)
{
for (uint i = 0; i < 256; i += (uint)(1 << length))
{
_prefixtree[prefix | i] = _treeSize;
_prefixlength[prefix | i] = (byte)length;
}
}
for (int i = 0; i < 3; ++i)
{
if (_markers[i] == v)
{
_last[i] = _treeSize;
_tree[_treeSize] = 0;
}
}
++_treeSize;
return 1;
}
uint t = _treeSize++;
if (length == 8)
{
_prefixtree[prefix] = t;
_prefixlength[prefix] = 8;
}
uint r1 = DecodeTree(prefix, length + 1);
_tree[t] = SMK_NODE | r1;
uint r2 = DecodeTree((uint)(prefix | (1 << length)), length + 1);
return r1 + r2 + 1;
}