Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*
* 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)); }
|