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.
217 lines
3.8 KiB
217 lines
3.8 KiB
/*++
|
|
|
|
Copyright (c) 1996-1997 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
cpinfo.c
|
|
|
|
Abstract:
|
|
|
|
Copepage information handling.
|
|
Extract codepage information from codepage text file.
|
|
|
|
Environment:
|
|
|
|
Windows NT PostScript driver
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
|
|
//
|
|
// Macros
|
|
//
|
|
|
|
#define IS_COMMENT(c) ((c) == (BYTE)';')
|
|
#define EOL '\n'
|
|
|
|
//
|
|
// Local function prototypes
|
|
//
|
|
|
|
PBYTE PubSkipComment( PBYTE );
|
|
INT IGetCommand(PBYTE, PBYTE);
|
|
|
|
|
|
//
|
|
// Main function
|
|
//
|
|
|
|
BOOL
|
|
BGetInfo(
|
|
PBYTE pData,
|
|
DWORD dwSize,
|
|
DWORD *pdwCodePage,
|
|
PBYTE pSelectCmd,
|
|
PBYTE pUnSelectCmd)
|
|
{
|
|
|
|
BYTE aubType[32];
|
|
PBYTE pstrType;
|
|
PBYTE pTextData;
|
|
INT iRet;
|
|
|
|
ASSERT(pData != NULL &&
|
|
pdwCodePage != NULL &&
|
|
pSelectCmd != NULL &&
|
|
pUnSelectCmd != NULL );
|
|
|
|
pstrType = aubType;
|
|
pTextData = pData;
|
|
|
|
|
|
do
|
|
{
|
|
pTextData = PubSkipComment(pTextData);
|
|
|
|
if (pTextData == NULL)
|
|
{
|
|
iRet = EOF;
|
|
break;
|
|
}
|
|
|
|
iRet = sscanf( pTextData, "%s:", pstrType);
|
|
|
|
if (iRet != 0 && iRet != EOF)
|
|
{
|
|
pTextData += strlen(pstrType);
|
|
}
|
|
|
|
pTextData = PubSkipComment(pTextData);
|
|
|
|
switch(*pstrType)
|
|
{
|
|
case 'c':
|
|
case 'C':
|
|
if(!_stricmp(pstrType, "codepage:"))
|
|
{
|
|
iRet = sscanf(pTextData, "%d", pdwCodePage);
|
|
|
|
if (iRet != 0 && iRet != EOF)
|
|
{
|
|
while (*pTextData != EOL)
|
|
pTextData ++;
|
|
pTextData ++;
|
|
}
|
|
|
|
}
|
|
break;
|
|
|
|
case 's':
|
|
case 'S':
|
|
if(!_stricmp(pstrType, "selectcmd:"))
|
|
{
|
|
iRet = IGetCommand(pTextData, pSelectCmd);
|
|
|
|
if (iRet != 0 && iRet != EOF)
|
|
{
|
|
while (*pTextData != EOL)
|
|
pTextData ++;
|
|
pTextData ++;
|
|
}
|
|
}
|
|
break;
|
|
case 'u':
|
|
case 'U':
|
|
if(!_stricmp(pstrType, "unselectcmd:"))
|
|
{
|
|
iRet = IGetCommand(pTextData, pUnSelectCmd);
|
|
|
|
if (iRet != 0 && iRet != EOF)
|
|
{
|
|
while (*pTextData != EOL)
|
|
pTextData ++;
|
|
pTextData ++;
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
pTextData++;
|
|
}
|
|
}
|
|
while(*pTextData != EOF && dwSize > (DWORD)(pTextData - pData));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
PBYTE
|
|
PubSkipComment(
|
|
PBYTE pData)
|
|
{
|
|
ASSERT(pData != NULL);
|
|
|
|
do
|
|
{
|
|
if (IS_COMMENT(*pData))
|
|
{
|
|
while (*pData != EOL)
|
|
pData++;
|
|
pData++;
|
|
}
|
|
else if (*pData == ' ')
|
|
{
|
|
pData++;
|
|
}
|
|
else if (*pData == 0x0d)
|
|
{
|
|
pData++;
|
|
}
|
|
else if (*pData == EOL)
|
|
{
|
|
pData++;
|
|
}
|
|
else if (*pData == EOF)
|
|
{
|
|
pData = NULL;
|
|
break;
|
|
}
|
|
else
|
|
break;
|
|
|
|
} while (TRUE);
|
|
|
|
return pData;
|
|
}
|
|
|
|
INT
|
|
IGetCommand(
|
|
PBYTE pData,
|
|
PBYTE pDestBuf)
|
|
{
|
|
|
|
INT iCount;
|
|
|
|
if (*pData == EOF)
|
|
{
|
|
return EOF;
|
|
}
|
|
|
|
if (*pData == '"')
|
|
{
|
|
pData ++;
|
|
}
|
|
else
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
iCount = 0;
|
|
|
|
while (*pData != '"')
|
|
{
|
|
*pDestBuf = *pData;
|
|
pDestBuf ++;
|
|
pData++;
|
|
iCount++;
|
|
}
|
|
|
|
*pDestBuf = (BYTE)NULL;
|
|
iCount++;
|
|
|
|
return iCount;
|
|
}
|
|
|