private unsafe static void UnescapeOnly(char* pch, int start, ref int end, char ch1, char ch2, char ch3)
{
if (end - start < 3)
{
//no chance that something is escaped
return;
}
char* pend = pch + end - 2;
pch += start;
char* pnew = null;
over:
// Just looking for a interested escaped char
if (pch >= pend) goto done;
if (*pch++ != '%') goto over;
char ch = UriHelper.EscapedAscii(*pch++, *pch++);
if (!(ch == ch1 || ch == ch2 || ch == ch3)) goto over;
// Here we found something and now start copying the scanned chars
pnew = pch - 2;
*(pnew - 1) = ch;
over_new:
if (pch >= pend) goto done;
if ((*pnew++ = *pch++) != '%') goto over_new;
ch = UriHelper.EscapedAscii((*pnew++ = *pch++), (*pnew++ = *pch++));
if (!(ch == ch1 || ch == ch2 || ch == ch3))
{
goto over_new;
}
pnew -= 2;
*(pnew - 1) = ch;
goto over_new;
done:
pend += 2;
if (pnew == null)
{
//nothing was found
return;
}
//the tail may be already processed
if (pch == pend)
{
end -= (int)(pch - pnew);
return;
}
*pnew++ = *pch++;
if (pch == pend)
{
end -= (int)(pch - pnew);
return;
}
*pnew++ = *pch++;
end -= (int)(pch - pnew);
}