windows-nt/Source/XPSP1/NT/shell/osshell/accesory/newpad/npcss.c

225 lines
3.8 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*
* CSS support functions
* Copyright (C) 2000 Microsoft Corporation
*/
#include "precomp.h"
BOOL FIsCssWhitespaceW(WCHAR wch)
{
return((wch == L' ') || (wch == L'\x9') || (wch == L'\xA') || (wch == L'\xC') || (wch == L'\xD'));
}
BOOL FIsCssWhitespaceA(char ch)
{
return(FIsCssWhitespaceW((WCHAR) (BYTE) ch));
}
BOOL FIsCssA(LPCSTR rgch, UINT cch)
{
if (memcmp(rgch, "@charset", 8) != 0)
{
// Not XML
return(FALSE);
}
return(TRUE);
UNREFERENCED_PARAMETER( cch );
}
BOOL FIsCssW(LPCWSTR rgwch, UINT cch)
{
if (memcmp(rgwch, L"@charset", 8 * sizeof(WCHAR)) != 0)
{
// Not XML
return(FALSE);
}
return(TRUE);
UNREFERENCED_PARAMETER( cch );
}
BOOL FDetectCssEncodingA(LPCSTR rgch, UINT cch, UINT *pcp)
{
const char *pchMax;
const char *pch;
char chQuote;
const char *pchCharset;
// Check for file begining with @charset
if (cch < 13)
{
// File is too small
return(FALSE);
}
if (!FIsCssA(rgch, cch))
{
// Not XML
return(FALSE);
}
// Don't scan more than 4K looking for encoding even if it is valid XML
cch = __min(cch, 4096);
pchMax = rgch + cch;
pch = rgch + 8;
while ((pch < pchMax) && FIsCssWhitespaceA(*pch))
{
pch++;
}
if ((pch == pchMax) || ((*pch != '\'') && (*pch != '"')))
{
// No @charset specification
return(FALSE);
}
chQuote = *pch++;
pchCharset = pch;
while ((pch < pchMax) && (*pch != chQuote))
{
pch++;
}
if (pch == pchMax)
{
// No @charset specification
return(FALSE);
}
// We have an CSS encoding declaration from pchCharset to (pch - 1)
if (pch == pchCharset)
{
// No @charset specification
return(FALSE);
}
// To be strict a CSS charset declaration should have optional whitespace then a semicolon here
if (!FLookupCodepageNameA((LPCSTR) pchCharset, (UINT) (pch - pchCharset), pcp))
{
// Encoding is not recognized
return(FALSE);
}
if ((*pcp == CP_UTF16) || (*pcp == CP_UTF16BE))
{
// These are bogus since we know the file is MBCS
return(FALSE);
}
return(FValidateCodepage(hwndNP, *pcp));
}
BOOL FDetectCssEncodingW(LPCWSTR rgch, UINT cch, UINT *pcp)
{
const WCHAR *pchMax;
const WCHAR *pch;
WCHAR chQuote;
const WCHAR *pchCharset;
// Check for file begining with @charset
if (cch < 13)
{
// File is too small
return(FALSE);
}
if (!FIsCssW(rgch, cch))
{
// No @charset specification
return(FALSE);
}
// Don't scan more than 4K looking for encoding even if it is valid XML
cch = __min(cch, 4096);
pchMax = rgch + cch;
pch = rgch + 8;
while ((pch < pchMax) && FIsCssWhitespaceW(*pch))
{
pch++;
}
if ((pch == pchMax) || ((*pch != L'\'') && (*pch != L'"')))
{
// No @charset specification
return(FALSE);
}
chQuote = *pch++;
pchCharset = pch;
while ((pch < pchMax) && (*pch != chQuote))
{
pch++;
}
if (pch == pchMax)
{
// No @charset specification
return(FALSE);
}
// We have an CSS encoding declaration from pchCharset to (pch - 1)
if (pch == pchCharset)
{
// No @charset specification
return(FALSE);
}
// To be strict a CSS charset declaration should have optional whitespace then a semicolon here
if (!FLookupCodepageNameW(pchCharset, (UINT) (pch - pchCharset), pcp))
{
// Encoding is not recognized
return(FALSE);
}
#if 0
if ((*pcp == CP_UTF16) || (*pcp == CP_UTF16BE))
{
// These are bogus since we know the file is MBCS
return(FALSE);
}
#endif
return(FValidateCodepage(hwndNP, *pcp));
}