133 lines
3.1 KiB
C++
133 lines
3.1 KiB
C++
|
#include "stdafx.h"
|
|||
|
#include "filemap.h"
|
|||
|
#include "mymfile.h"
|
|||
|
#include "myinf.h"
|
|||
|
|
|||
|
CMyInf::CMyInf()
|
|||
|
{
|
|||
|
m_SectionStart = NULL;
|
|||
|
m_SectionEnd = NULL;
|
|||
|
m_Locale[0] = L'\0';
|
|||
|
}
|
|||
|
|
|||
|
CMyInf::~CMyInf()
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
BOOL CMyInf::bOpen(LPCSTR FileName, LPCTSTR Locale)
|
|||
|
{
|
|||
|
if (! CFileMap::bOpen(FileName)) {
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
if (! FindStringSection()) {
|
|||
|
fprintf(stderr,"No string section inside this file !\n");
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
if (! _GenerateStringName(Locale)) {
|
|||
|
fprintf(stderr,"No string section inside this file !\n");
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
BOOL CMyInf::FindStringSection()
|
|||
|
{
|
|||
|
BOOL bInSection = FALSE;
|
|||
|
|
|||
|
for (DWORD i=0; i<m_FileSize; i += sizeof(WCHAR)) {
|
|||
|
|
|||
|
if (*(WCHAR *) (m_Memory +i) == TEXT('[')) {
|
|||
|
|
|||
|
if (i+8 >= m_FileSize) {
|
|||
|
//
|
|||
|
// over boundary, not a candinate
|
|||
|
//
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
WCHAR * TmpBuf = (WCHAR *) (m_Memory +i);
|
|||
|
|
|||
|
if ( ((TmpBuf[1] == TEXT('s')) || (TmpBuf[1] == TEXT('S'))) &&
|
|||
|
((TmpBuf[2] == TEXT('t')) || (TmpBuf[2] == TEXT('T'))) &&
|
|||
|
((TmpBuf[3] == TEXT('r')) || (TmpBuf[3] == TEXT('R'))) &&
|
|||
|
((TmpBuf[4] == TEXT('i')) || (TmpBuf[4] == TEXT('I'))) &&
|
|||
|
((TmpBuf[5] == TEXT('n')) || (TmpBuf[5] == TEXT('N'))) &&
|
|||
|
((TmpBuf[6] == TEXT('g')) || (TmpBuf[6] == TEXT('G'))) &&
|
|||
|
((TmpBuf[7] == TEXT('s')) || (TmpBuf[7] == TEXT('S'))) &&
|
|||
|
(TmpBuf[8] == TEXT(']') ) ) {
|
|||
|
|
|||
|
bInSection = TRUE;
|
|||
|
m_SectionStart = m_Memory+i;
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
if (bInSection && (*(WCHAR *) (m_Memory +i) == TEXT('['))) {
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (bInSection) {
|
|||
|
m_SectionEnd = m_Memory +i;
|
|||
|
return TRUE;
|
|||
|
} else {
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
BOOL CMyInf::AppendNonStringSectionPart(CMemFile& MemFile)
|
|||
|
{
|
|||
|
MemFile.Write(m_Memory, (UINT)GetOffset(m_SectionStart));
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
BOOL CMyInf::AppendStringSectionPart(CMemFile& MemFile)
|
|||
|
{
|
|||
|
MemFile.Write(m_Locale,lstrlenW(m_Locale)*sizeof(WCHAR));
|
|||
|
MemFile.Write(m_SectionStart+lstrlenW(L"[Strings]")*sizeof(WCHAR), (UINT)(m_SectionEnd - m_SectionStart - lstrlenW(L"[Strings]")*sizeof(WCHAR)));
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
BOOL CMyInf::Duplicate(CMemFile& MemFile)
|
|||
|
{
|
|||
|
MemFile.Write(m_Memory,m_FileSize);
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
BOOL CMyInf::_GenerateStringName(LPCSTR Locale)
|
|||
|
{
|
|||
|
WCHAR szTmpBuf[MAX_PATH];
|
|||
|
|
|||
|
if (lstrlen(Locale) == 0) {
|
|||
|
lstrcpyW(m_Locale,L"[Strings]");
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
if (lstrlen(Locale)*2+10 > sizeof(m_Locale)) {
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
//
|
|||
|
// this string contains number only, so it's safe to use ACP
|
|||
|
//
|
|||
|
MultiByteToWideChar(CP_ACP,
|
|||
|
0,
|
|||
|
Locale,
|
|||
|
-1,
|
|||
|
szTmpBuf,
|
|||
|
MAX_PATH);
|
|||
|
|
|||
|
lstrcpyW(m_Locale,L"[Strings");
|
|||
|
|
|||
|
lstrcatW(m_Locale,L".");
|
|||
|
lstrcatW(m_Locale,szTmpBuf);
|
|||
|
|
|||
|
lstrcatW(m_Locale,L"]");
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
|