windows-nt/Source/XPSP1/NT/shell/ext/ratings/common/upr.cpp

41 lines
1.3 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
#include "npcommon.h"
/* In a DBCS build, the Win32 CharUpper API will uppercase double-byte
* Romanji characters, but many low-level network components such as
* IFSMGR (and NetWare servers!) do not uppercase any double-byte
* characters. So we have to have our own function which avoids them.
*
* This could be implemented by just calling CharUpper on each character,
* but the NLS APIs have a fair amount of overhead to them, so calling
* into the NLS subsystem as few times as possible is desirable.
*/
LPSTR WINAPI struprf(LPSTR lpString)
{
if (!::fDBCSEnabled)
return CharUpper(lpString);
LPSTR pchStart = lpString;
while (*pchStart != '\0') {
// Skip any double-byte characters that may be here.
// Don't need to check for end of string in the loop because
// the null terminator is not a DBCS lead byte.
while (IsDBCSLeadByte(*pchStart))
pchStart += 2; /* skip double-byte chars */
if (*pchStart == '\0')
break; /* no more SBCs to uppercase */
// Find the end of this range of single-byte characters, and
// uppercase them.
LPSTR pchEnd = pchStart + 1;
while (*pchEnd && !IsDBCSLeadByte(*pchEnd))
pchEnd++; /* count single-byte chars */
CharUpperBuff(pchStart, (int)(pchEnd-pchStart));
pchStart = pchEnd;
}
return lpString;
}