public String MakeString()
{
uint hash;
char[] a = _outChars;
int l = _outIndex;
// if we have a stringbuilder then we have to append... slow case
if (_outStringBuilder != null)
{
_outStringBuilder.Append(_outChars, 0, _outIndex);
return _outStringBuilder.ToString();
}
// no stringbuilder, fast case, shareable string
if (cStringsUsed > (cStringsMax / 4) * 3)
{
// we need to rehash
uint cNewMax = cStringsMax * 2;
String [] aStringsNew = new String[cNewMax];
for (int i=0; i < cStringsMax;i++)
{
if (aStrings[i] != null)
{
hash = HashString(aStrings[i]) % cNewMax;
while (aStringsNew[hash] != null)
{
// slot full, skip
if (++hash >= cNewMax)
hash = 0;
}
aStringsNew[hash] = aStrings[i];
}
}
// all done, cutover to the new hash table
cStringsMax = cNewMax;
aStrings = aStringsNew;
}
hash = HashCharArray(a, l) % cStringsMax;
String str;
while ((str = aStrings[hash]) != null)
{
if (CompareStringAndChars(str, a, l))
return str;
if (++hash >= cStringsMax)
hash = 0;
}
str = new String(a,0,l);
aStrings[hash] = str;
cStringsUsed++;
return str;
}
}