| 75 | #define CharNextW MyCharNext |
| 76 | |
| 77 | static void TruncateStringUTF16LE(LPWSTR Buffer, SIZE_T Length, LPCWSTR Overflow, SIZE_T lenOver) { |
| 78 | if (Length) { |
| 79 | LPWSTR p = &Buffer[Length - 1]; |
| 80 | UINT stripBaseCharIfCuttingCombining = TRUE; |
| 81 | |
| 82 | // CharNextW is buggy on XP&2003 but we don't care enough to call GetStringTypeW (http://archives.miloush.net/michkap/archive/2005/01/30/363420.html) |
| 83 | if (stripBaseCharIfCuttingCombining && lenOver) { |
| 84 | WCHAR buf[] = { *p, Overflow[0], lenOver > 1 ? Overflow[1] : L' ', L'\0' }; |
| 85 | for (;;) { |
| 86 | BOOL comb = CharNextW(buf) > buf + 1; |
| 87 | if (!comb || p < Buffer) break; |
| 88 | *((WORD*)((BYTE*)&buf[1])) = *((WORD*)((BYTE*)&buf[0])); |
| 89 | buf[0] = *p; |
| 90 | *p-- = L'\0'; |
| 91 | } |
| 92 | } |
| 93 | |
| 94 | if (IsLeadSurrogateUTF16(*p)) { |
| 95 | *p = L'\0'; // Avoid incomplete pair |
| 96 | } |
| 97 | } |
| 98 | } |
| 99 | |
| 100 | static void TruncateStringMB(UINT Codepage, LPSTR Buffer, SIZE_T Length, unsigned short OverflowCh) { |
| 101 | if (Length) { |
no test coverage detected