void RotateInStr(char* str, int amt, int iStrLen)
{
int iFromPos = 0;
int iTargetPos = amt;
while (true)
{
for (int i=iFromPos; i < amt; ++i)
{
int iToPos = (iTargetPos + i)%iStrLen;
char tmp = str[iToPos];
str[iToPos] = str[i];
str[i] = tmp;
}
iTargetPos += amt;
if (iStrLen < iTargetPos)
{
iTargetPos -= iStrLen;
if (amt == 2*iTargetPos)
;
else if (2*iTargetPos < amt)
{
RotateInStr(str+iTargetPos, iTargetPos, amt - iTargetPos);
}
else
{
int iBuf = amt - iTargetPos;
int iRemain = iTargetPos % iBuf;
if (iRemain == 0)
;
else
RotateInStr(str+iTargetPos, iRemain, iBuf);
}
break;
}
else if (iStrLen == iTargetPos)
break;
}
}
void Rotate(char* str, int amt)
{
if (!amt)
return;
int iStrLen = (int)strlen(str);
amt = amt % iStrLen;
RotateInStr(str, amt, iStrLen);
}