Принимаются любые коментарии к след. коду. Просто что вы думаете взглянув на него
void CGIParamsBase::Parse(const char *cstr, int iLen)
{
char *str = const_cast<char*>(cstr);
char *pNameBegin = str, *pNameEnd, *pValueBegin, *pValueEnd;
while (pNameBegin - str < iLen)
{
if (*pNameBegin == '&')
pNameBegin++;
pNameEnd = pNameBegin;
while (pNameEnd - str < iLen && *pNameEnd != '=' && *pNameEnd != '&')
pNameEnd++;
if (pNameEnd - str == iLen)
break;
if (*pNameEnd == '&')
{
pNameBegin = pNameEnd + 1;
continue;
}
pValueEnd = pValueBegin = pNameEnd + 1;
while (pValueEnd - str < iLen && *pValueEnd != '&')
pValueEnd++;
if (pNameEnd - pNameBegin > 2)
{
int iSrcLen = pValueEnd - pValueBegin;
int iNewLen = 0;
const char *pSrc = pValueBegin;
char *pConverted = (char *)_alloca(iSrcLen);
char *pDest = pConverted;
for (; iSrcLen-- > 0; iNewLen++, pDest++, pSrc++)
{
if ((BYTE)*pSrc <= 0x1f || (BYTE)*pSrc >= 0x7f)
goto Cont;
if (*pSrc == '+')
*pDest = ' ';
else
if (*pSrc == '%')
{
*pDest = (char)(C2D(pSrc[1]) * 16 + C2D(pSrc[2]));
pSrc += 2;
iSrcLen -= 2;
}
else
*pDest = *pSrc;
}
ProcessParam(pNameBegin, pNameEnd - pNameBegin, pConverted, iNewLen);
}
Cont:
pNameBegin = pValueEnd;
}
}
... << RSDN@Home 1.1.4 beta 4 rev. 303>>