197 lines
3.9 KiB
C++
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;
|
|
}
|
|
} |