225 lines
3.8 KiB
C
225 lines
3.8 KiB
C
|
/*
|
||
|
* 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));
|
||
|
}
|