Windows NT 4.0 source code leak
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.
 
 
 
 
 
 

207 lines
4.1 KiB

#include "stdafx.h"
#include "cfontmap.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
static BOOL ParseFont(PSTR pszLine, PSTR pszFace, PSTR& rpszSize, int& nCharset);
CFontMap* g_pFirst;
static CFontMap* g_pLast;
/***************************************************************************
FUNCTION: CFontMap::CFontMap
PURPOSE:
PARAMETERS:
pszLine
RETURNS:
COMMENTS:
Syntax (with all items optional) is:
fontname,pt size,charset=fontname,pt size,charset
MODIFICATION DATES:
02-Sep-1995 [ralphw]
Added code comments
***************************************************************************/
CFontMap::CFontMap(PSTR pszLine)
{
m_fInitialized = FALSE;
// Ignore comments and leading and trailing spaces.
pszLine = FirstNonSpace(pszLine);
PSTR psz = StrChr(pszLine, ';', _fDBCSSystem);
if (psz)
*psz = '\0';
RemoveTrailingSpaces(pszLine);
// Look for equal sign.
psz = StrChr(pszLine, '=', _fDBCSSystem);
if (!psz) {
VReportError(HCERR_INVALID_FONTMAP, &errHpj);
return;
}
*psz = '\0';
// First partse the original font attributes
PSTR pszSize;
if (!ParseFont(pszLine, m_szFace1, pszSize, m_nCharset1))
return;
if (pszSize) {
PSTR pszMinus = StrChr(pszSize, '-', _fDBCSSystem);
if (pszMinus)
*pszMinus = '\0';
m_nMin1 = atoi(pszSize);
if (m_nMin1 < 1 || m_nMin1 > 255) {
VReportError(HCERR_INVALID_FONTMAP, &errHpj);
return;
}
if (pszMinus) {
m_nMax1 = atoi(pszMinus + 1);
if (m_nMax1 < 1 || m_nMax1 > 255) {
VReportError(HCERR_INVALID_FONTMAP, &errHpj);
return;
}
}
else
m_nMax1 = m_nMin1;
}
else
m_nMin1 = -1;
// Now parse the replacement attributes
ASSERT(psz);
if (!ParseFont(psz + 1, m_szFace2, pszSize, m_nCharset2))
return;
if (pszSize) {
if (*pszSize == '+' || *pszSize == '-') {
m_fRelative = TRUE;
m_nSize2 = atoi(pszSize + 1);
if (m_nSize2 < 1 || m_nSize2 > 255) {
VReportError(HCERR_INVALID_FONTMAP, &errHpj);
return;
}
if (*pszSize == '-')
m_nSize2 = -m_nSize2;
}
else {
m_fRelative = FALSE;
m_nSize2 = atoi(pszSize);
if (m_nSize2 < 1 || m_nSize2 > 255) {
VReportError(HCERR_INVALID_FONTMAP, &errHpj);
return;
}
}
}
else {
m_fRelative = FALSE;
m_nSize2 = -1;
}
// We initialized successfully.
m_fInitialized = TRUE;
// Add this fontmap to the linked list.
if (g_pLast)
g_pLast->m_pNext = this;
else
g_pFirst = this;
g_pLast = this;
g_pLast->m_pNext = NULL;
}
static BOOL ParseFont(PSTR pszLine, PSTR pszFace, PSTR& rpszSize, int& nCharset)
{
*pszFace = '\0';
rpszSize = NULL;
nCharset = -1;
PSTR pszComma = StrChr(pszLine, ',', _fDBCSSystem);
if (pszComma)
*pszComma = '\0';
// Typeface.
if (*pszLine) {
if (lstrlen(pszLine) >= MAX4_FONTNAME) {
VReportError(HCERR_FONTNAME_TOO_LONG, &errHpj);
return FALSE;
}
lstrcpy(pszFace, pszLine);
SzTrimSz(pszFace);
}
// Comma followed by point size.
if (pszComma) {
pszLine = pszComma + 1;
pszComma = StrChr(pszLine, ',', _fDBCSSystem);
if (pszComma)
*pszComma = '\0';
if (*pszLine)
rpszSize = pszLine;
// Comma followed by character set.
if (pszComma) {
pszLine = pszComma + 1;
if (*pszLine) {
nCharset = atoi(pszLine);
if (nCharset < 0 || nCharset > 255) {
VReportError(HCERR_INVALID_FONTMAP, &errHpj);
return FALSE;
}
}
}
}
return TRUE;
}
BOOL CFontMap::Replace(PSTR pszFace, int* pSize, int* pCharset)
{
if (*m_szFace1 && strcmp(m_szFace1, pszFace))
return FALSE;
if (pSize && m_nMin1 != -1 && *pSize >= m_nMin1 && *pSize <= m_nMax1)
return FALSE;
if (m_nCharset1 != -1 && m_nCharset1 != *pCharset)
return FALSE;
if (*m_szFace2)
lstrcpy(pszFace, m_szFace2);
if (m_fRelative && pSize)
*pSize += m_nSize2;
else if (m_nSize2 != -1 && pSize)
*pSize = m_nSize2;
if (m_nCharset2 != -1)
*pCharset = m_nCharset2;
return TRUE;
}
BOOL ReplaceFont(PSTR pszTypeface, int* pSize, int* pCharset)
{
if (!g_pFirst)
return FALSE;
BOOL fResult = FALSE;
for (CFontMap* pMap = g_pFirst; pMap; pMap = pMap->m_pNext)
fResult |= pMap->Replace(pszTypeface, pSize, pCharset);
return fResult;
}