Files
2022-10-26 12:25:11 +08:00

197 lines
3.9 KiB
C++

// WZScriptEncode.cpp: implementation of the CWZScriptEncode class.
//
//////////////////////////////////////////////////////////////////////
#include "../stdafx.h"
#include "WZScriptEncode.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CWZScriptEncode::CWZScriptEncode()
{
m_pBuffer = NULL;
m_iBufferSize = 0;
m_iBufferCount = 0;
m_hFile = INVALID_HANDLE_VALUE;
m_btFileType = ENCRYPT; // ÀÏ¹Ý °ÔÀÓÆÄÀÏ
m_XorTable[0] = 0xA1;
m_XorTable[1] = 0xB2;
m_XorTable[2] = 0xAA;
m_XorTable[3] = 0x12;
m_XorTable[4] = 0x23;
m_XorTable[5] = 0xF1;
m_XorTable[6] = 0xF3;
m_XorTable[7] = 0xD3;
m_XorTable[8] = 0x78;
m_XorTable[9] = 0x02;
m_EtcXorTable[0] = 0xF3;
m_EtcXorTable[1] = 0xC2;
m_EtcXorTable[2] = 0x3A;
m_EtcXorTable[3] = 0xF2;
m_EtcXorTable[4] = 0x23;
}
CWZScriptEncode::~CWZScriptEncode()
{
Close();
}
int CWZScriptEncode::Open(char* filename, BYTE btFileType)
{
m_btFileType = btFileType;
if( m_hFile != INVALID_HANDLE_VALUE)
{
CloseHandle(m_hFile);
}
m_hFile = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if( m_hFile == INVALID_HANDLE_VALUE )
return 0;
int filesize = GetFileSize(m_hFile, NULL);
char* pBuffer = (char*)malloc(filesize);
DWORD iReadFileSize;
ReadFile(m_hFile, pBuffer, filesize, &iReadFileSize, NULL);
if( iReadFileSize == 0 )
{
Close();
return 0;
}
Encode(pBuffer, iReadFileSize);
SetScriptParsingBuffer(pBuffer, iReadFileSize);
CloseHandle(m_hFile);
return 1;
}
void CWZScriptEncode::Close()
{
if( m_pBuffer )
free(m_pBuffer);
}
void CWZScriptEncode::Encode(char* buffer, int size )
{
if( m_btFileType == ETC_ENCRYPT )
{
for( int i = 0; i < size; i++ )
{
buffer[i] = buffer[i]^m_EtcXorTable[i%5];
}
} else {
for( int i = 0; i < size; i++ )
{
buffer[i] = buffer[i]^m_XorTable[i%MAX_XORCODE_TABLE_COUNT];
}
}
}
int CWZScriptEncode::GetC()
{
if( m_iBufferCount >= m_iBufferSize )
return EOF;
return m_pBuffer[m_iBufferCount++];
}
void CWZScriptEncode::UnGetC(int ch)
{
if( m_iBufferCount <= 0 )
return;
m_iBufferCount--;
m_pBuffer[m_iBufferCount] = ch;
}
void CWZScriptEncode::SetScriptParsingBuffer(char* buffer, int size)
{
m_pBuffer = buffer;
m_iBufferSize = size;
m_iBufferCount = 0;
}
int CWZScriptEncode::GetNumber()
{
return (int)TokenNumber;
}
char* CWZScriptEncode::GetString()
{
return TokenString;
}
WZSMDToken CWZScriptEncode::GetToken()
{
char ch;
TokenString[0] = '\0';
do
{
if ( (ch =(char) GetC()) == EOF) return T_END;
if (ch=='/' && (ch =(char) GetC() )=='/')
{
while( (ch = (char) GetC()) != '\n' );
}
} while( isspace(ch) );
char *p, TempString[100];
switch(ch)
{
case '#':
return CurrentToken = T_COMMAND;
case ';':
return CurrentToken = T_SEMICOLON;
case ',':
return CurrentToken = T_COMMA;
case '{':
return CurrentToken = T_LP;
case '}':
return CurrentToken = T_RP;
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
case '.': case '-':
UnGetC(ch);
p = TempString;
while ( ( (ch = GetC() ) !=EOF) && (ch=='.' || isdigit(ch) || ch=='-') )
*p++ = ch;
*p = 0;
TokenNumber = (float)atof(TempString);
// sscanf(TempString," %f ",&TokenNumber);
return CurrentToken = T_NUMBER;
case '"':
p = TokenString;
while ( ( (ch = GetC() ) !=EOF) && (ch!='"'))// || isalnum(ch)) )
*p++ = ch;
if (ch!='"')
UnGetC(ch);
*p = 0;
return CurrentToken = T_NAME;
default:
if (isalpha(ch))
{
p = TokenString;
*p++ = ch;
while ( ( (ch = GetC() ) !=EOF) && (ch=='.' || ch=='_' || isalnum(ch)) )
*p++ = ch;
UnGetC(ch);
*p = 0;
return CurrentToken = T_NAME;
}
return CurrentToken = T_SMD_ERROR;
}
}