PSTR を PWSTR に変換すると同時に特定の文字をエスケープする関数をまとめようとしています。入力 PSTR が含まれていることを制御できません。任意の Web ページのコンテンツにすることができます。
私はすでに次のコードを持っていますが、より良い/より効率的な方法があるかどうか、または私が持っているものが機能するかどうか疑問に思っていました.
__inline PCWSTR ToEscape(CHAR c)
{
switch (c)
{
case '"': return L"\"";
case '\\': return L"\\";
case '\b': return L"\b";
case '\f': return L"\f";
case '\n': return L"\n";
case '\r': return L"\r";
case '\t': return L"\t";
default: return NULL;
}
}
// Helper for mbstowcs_s that does not return NULL terminator included in size
__inline DWORD CharToWChar(__out_ecount_opt(cchBuffer) WCHAR* pszBuffer, __in DWORD cchBuffer, __in_ecount(valueLen) PCSTR value, __in DWORD valueLen)
{
if (valueLen == 0) return 0;
size_t dwSize = 0;
mbstowcs_s(&dwSize, pszBuffer, cchBuffer, value, valueLen);
return dwSize - 1;
}
// Writes the input value to pszBuffer, or if pszBuffer is NULL, returns the length necessary to write value
__inline DWORD WriteJsonValue(__out_ecount_opt(cchBuffer) WCHAR* pszBuffer, __in DWORD cchBuffer, __in PCSTR value)
{
if (pszBuffer == NULL)
{
DWORD offset = 2;
PCSTR start = value;
DWORD index = 0;
while (value[index] != '\0')
{
PCWSTR Escape = ToEscape(value[index]);
if (Escape)
{
offset += CharToWChar(NULL, 0, start, (value + index) - start);
start = value + index + 1;
offset += 2;
}
index++;
}
// Any more left to write?
offset += CharToWChar(NULL, 0, start, (value + index) - start);
return offset;
}
else
{
DWORD offset = 0;
if (cchBuffer < 1) return 0;
pszBuffer[offset++] = L'"';
PCSTR start = value;
DWORD index = 0;
while (value[index] != '\0')
{
PCWSTR Escape = ToEscape(value[index]);
if (Escape)
{
DWORD dwLen = (value + index) - start;
offset += CharToWChar(pszBuffer+offset, cchBuffer-offset, start, dwLen);
start = value + index + 1;
if (cchBuffer < offset + 2) return offset;
pszBuffer[offset++] = Escape[0];
pszBuffer[offset++] = Escape[1];
}
index++;
}
// Any more left to write?
DWORD dwLen = (value + index) - start;
offset += CharToWChar(pszBuffer+offset, cchBuffer-offset, start, dwLen);
if (cchBuffer < offset + 1) return offset;
pszBuffer[offset++] = L'"';
return offset;
}
}