reman3/Rayman_X/cpa/tempgrp/TIA/Src/EdIRDict.cpp

415 lines
11 KiB
C++

// EdIRDict.cpp : implementation file
//
#include "stdafx.h"
#include "Defines.hpp"
#ifdef D_ED_IR_ACTIVE
#include "EdIRDict.hpp"
//////////////////////////////////////////////////////////////////
// class CPA_EdIR_WordEntry
//////////////////////////////////////////////////////////////////
/****************************************************************************/
CPA_EdIR_WordEntry::CPA_EdIR_WordEntry()
{
m_csLanguage=C_INVALID_WORD;
m_csWord=C_INVALID_LANGUAGE;
}
/****************************************************************************/
CPA_EdIR_WordEntry::CPA_EdIR_WordEntry(CString csWord,CString csLanguage)
{
m_csWord=csWord;
m_csLanguage=csLanguage;
}
/****************************************************************************/
CString CPA_EdIR_WordEntry::m_fn_csGetLanguage()
{
ASSERT(M_LANGUAGE_IS_VALID(m_csLanguage));
return m_csLanguage;
}
/****************************************************************************/
CString CPA_EdIR_WordEntry::m_fn_csGetWord()
{
ASSERT(M_WORD_IS_VALID(m_csWord));
return m_csWord;
}
/****************************************************************************/
void CPA_EdIR_WordEntry::m_fn_vSetLanguage(CString csLanguage)
{
ASSERT(M_LANGUAGE_IS_VALID(csLanguage));
ASSERT(M_LANGUAGE_IS_INVALID(m_csLanguage));
m_csLanguage=csLanguage;
}
/****************************************************************************/
void CPA_EdIR_WordEntry::m_fn_vSetWord(CString csWord)
{
ASSERT(M_WORD_IS_VALID(csWord));
ASSERT(M_WORD_IS_INVALID(m_csWord));
m_csWord=csWord;
}
//////////////////////////////////////////////////////////////////
// class CPA_EdIR_DictionnaryEntry
//////////////////////////////////////////////////////////////////
/****************************************************************************/
CPA_EdIR_DictionnaryEntry::CPA_EdIR_DictionnaryEntry(long lNbEntries)
{
m_pclWordEntries=new CPA_EdIR_WordEntry[lNbEntries];
m_csScriptName=C_INVALID_SCRIPTNAME;
m_lId=C_INVALID_ID;
m_lNbEntries=lNbEntries;
m_lCurrentEntry=0;
//ANNECY CB
memset(m_acFirstLetter, 0, 256 * sizeof(char));
memset(m_acSecondLetter, 0, 256 * sizeof(char));
//END ANNECY
}
/****************************************************************************/
CPA_EdIR_DictionnaryEntry::~CPA_EdIR_DictionnaryEntry()
{
delete[] m_pclWordEntries;
}
/****************************************************************************/
void CPA_EdIR_DictionnaryEntry::m_fn_vAddEntry(CString csWord,CString csLanguage)
{
ASSERT(m_lCurrentEntry<m_lNbEntries);
//ANNECY CB
m_acFirstLetter[toupper(((LPCSTR) csWord)[0])] = 1;
m_acFirstLetter[tolower(((LPCSTR) csWord)[0])] = 1;
m_acSecondLetter[toupper(((LPCSTR) csWord)[1])] = 1;
m_acSecondLetter[tolower(((LPCSTR) csWord)[1])] = 1;
//END
m_pclWordEntries[m_lCurrentEntry].m_fn_vSetWord(csWord);
m_pclWordEntries[m_lCurrentEntry].m_fn_vSetLanguage(csLanguage);
m_lCurrentEntry++;
}
/****************************************************************************/
CString CPA_EdIR_DictionnaryEntry::m_fn_csGetScriptName()
{
ASSERT(M_SCRIPTNAME_IS_VALID(m_csScriptName));
return m_csScriptName;
}
/****************************************************************************/
long CPA_EdIR_DictionnaryEntry::m_fn_lGetId()
{
ASSERT(M_ID_IS_VALID(m_lId));
return m_lId;
}
/****************************************************************************/
void CPA_EdIR_DictionnaryEntry::m_fn_vSetScriptName(CString csScriptName)
{
ASSERT(M_SCRIPTNAME_IS_VALID(csScriptName));
ASSERT(M_SCRIPTNAME_IS_INVALID(m_csScriptName));
m_csScriptName=csScriptName;
}
/****************************************************************************/
void CPA_EdIR_DictionnaryEntry::m_fn_vSetId(long lId)
{
ASSERT(M_ID_IS_VALID(lId));
ASSERT(M_ID_IS_INVALID(m_lId));
m_lId=lId;
}
/****************************************************************************/
CString CPA_EdIR_DictionnaryEntry::m_fn_csGetName(CString csLanguage)
{
long lIndex=0;
BOOL bFound=FALSE;
while(lIndex<m_lCurrentEntry && !bFound)
{
bFound=(csLanguage.CompareNoCase(m_pclWordEntries[lIndex].m_fn_csGetLanguage())==0);
lIndex++;
}
if(bFound)
return m_pclWordEntries[lIndex-1].m_fn_csGetWord();
else
return C_INVALID_WORD;
}
/****************************************************************************/
CString CPA_EdIR_DictionnaryEntry::m_fn_csTranslate(CString csWord,CString csLanguage)
{
//Looks for this word in this dictionnary entry
BOOL bWordFound=(csWord==C_INVALID_WORD);
long lIndex=0;
while(lIndex<m_lCurrentEntry && !bWordFound)
{
bWordFound=(csWord.CompareNoCase(m_pclWordEntries[lIndex].m_fn_csGetWord())==0);
lIndex++;
}
//Gets the corresponding word in the "csLanguage"
if(bWordFound)
{
long lIndex=0;
BOOL bFound=FALSE;
while(lIndex<m_lCurrentEntry && !bFound)
{
bFound=(csLanguage.CompareNoCase(m_pclWordEntries[lIndex].m_fn_csGetLanguage())==0);
lIndex++;
}
if(bFound)
return m_pclWordEntries[lIndex-1].m_fn_csGetWord();
else
return C_INVALID_WORD;
}
else
return C_INVALID_WORD;
}
/****************************************************************************/
//ANNECY CB
BOOL CPA_EdIR_DictionnaryEntry::m_fn_bEntryExists(CString &csWord,CString &csLanguage)
//BOOL CPA_EdIR_DictionnaryEntry::m_fn_bEntryExists(CString csWord,CString csLanguage)
//END
{
//ANNECY CB
LPCSTR pszWord = (LPCSTR) csWord, pszLanguage = (LPCSTR) csLanguage;
//END
//Looks for this (word,language) in this dictionnary entry
BOOL bFound=(csWord=="");
long lIndex=0;
//ANNECY CB
while(lIndex<m_lCurrentEntry && !bFound)
{
if(!strcmpi(pszWord, (LPCSTR) m_pclWordEntries[lIndex].m_csWord))
if(!strcmpi(pszLanguage, (LPCSTR) m_pclWordEntries[lIndex].m_csLanguage))
return TRUE;
// bFound=(csWord.CompareNoCase(m_pclWordEntries[lIndex].m_fn_csGetWord())==0) &&
// (csLanguage.CompareNoCase(m_pclWordEntries[lIndex].m_fn_csGetLanguage())==0);
lIndex++;
}
//END
return bFound;
}
//////////////////////////////////////////////////////////////////
// class CPA_EdIR_Dictionary
//////////////////////////////////////////////////////////////////
typedef CPA_EdIR_DictionnaryEntry *CPA_EdIR_DictionnaryEntryPointer;
/****************************************************************************/
CPA_EdIR_Dictionary::CPA_EdIR_Dictionary(long lNbDictionnaryEntries,long lNbLanguages)
{
m_ppclDictionnaryEntry=new CPA_EdIR_DictionnaryEntryPointer[lNbDictionnaryEntries];
for(long lIndex=0;lIndex<lNbDictionnaryEntries;lIndex++)
m_ppclDictionnaryEntry[lIndex]=new CPA_EdIR_DictionnaryEntry(lNbLanguages);
m_lNbEntries=lNbDictionnaryEntries;
m_lCurrentEntry=0;
m_pstCouple=NULL;
m_csOldLanguage1="";
m_csOldLanguage2="";
//ANNECY CB
memset(m_acFirstLetter, 0, 256 * sizeof(char));
memset(m_acSecondLetter, 0, 256 * sizeof(char));
//END ANNECY
}
/****************************************************************************/
CPA_EdIR_Dictionary::~CPA_EdIR_Dictionary()
{
for(long lIndex=0;lIndex<m_lNbEntries;lIndex++)
delete[] m_ppclDictionnaryEntry[lIndex];
delete[] m_ppclDictionnaryEntry;
if(m_pstCouple)
delete[] m_pstCouple;
}
/****************************************************************************/
long CPA_EdIR_Dictionary::m_fn_lGetNbEntries()
{
return m_lNbEntries;
}
/****************************************************************************/
void CPA_EdIR_Dictionary::m_fn_vAddEntry(CString csScriptName,long lId,CString csWord,CString csLanguage)
{
//Looks for this word (with this lId) in the dictionnary
long lIndex=0;
BOOL bFound=FALSE;
//ANNECY CB
m_acFirstLetter[toupper(((LPCSTR) csWord)[0])] = 1;
m_acFirstLetter[tolower(((LPCSTR) csWord)[0])] = 1;
m_acSecondLetter[toupper(((LPCSTR) csWord)[1])] = 1;
m_acSecondLetter[tolower(((LPCSTR) csWord)[1])] = 1;
//END
while(lIndex<m_lCurrentEntry && !bFound)
{
bFound=(lId==m_ppclDictionnaryEntry[lIndex]->m_fn_lGetId());
lIndex++;
}
//Adds the entry
if(bFound)
{
m_ppclDictionnaryEntry[lIndex-1]->m_fn_vAddEntry(csWord,csLanguage);
}
else
{
ASSERT(m_lCurrentEntry<m_lNbEntries);
m_ppclDictionnaryEntry[m_lCurrentEntry]->m_fn_vAddEntry(csWord,csLanguage);
m_ppclDictionnaryEntry[m_lCurrentEntry]->m_fn_vSetId(lId);
m_ppclDictionnaryEntry[m_lCurrentEntry]->m_fn_vSetScriptName(csScriptName);
m_lCurrentEntry++;
}
}
/****************************************************************************/
//ANNECY CB
long CPA_EdIR_Dictionary::m_fn_lGetId(CString &csWord,CString &csLanguage)
//long CPA_EdIR_Dictionary::m_fn_lGetId(CString csWord,CString csLanguage)
//END
{
//Looks for this (word,language) in the dictionnary
long lIndex=0;
BOOL bFound=FALSE;
//ANNECY CB
LPCSTR pcsWord = (LPCSTR) csWord;
if(m_acFirstLetter[pcsWord[0]] == 0)
return C_INVALID_ID;
if(m_acSecondLetter[pcsWord[1]] == 0)
return C_INVALID_ID;
//END
while(lIndex<m_lCurrentEntry && !bFound)
{
//ANNECY CB
if((m_ppclDictionnaryEntry[lIndex]->m_acFirstLetter[pcsWord[0]])
&& (m_ppclDictionnaryEntry[lIndex]->m_acSecondLetter[pcsWord[1]]))
//END
bFound=m_ppclDictionnaryEntry[lIndex]->m_fn_bEntryExists(csWord,csLanguage);
lIndex++;
}
if(bFound)
return m_ppclDictionnaryEntry[lIndex-1]->m_fn_lGetId();
else
return C_INVALID_ID;
}
/****************************************************************************/
//ANNECY CB
CString CPA_EdIR_Dictionary::m_fn_csGetWord(long lId,CString &csLanguage)
//CString CPA_EdIR_Dictionary::m_fn_csGetWord(long lId,CString csLanguage)
//END
{
//Looks for this "lId" in the dictionnary
long lIndex=0;
BOOL bFound=FALSE;
while(lIndex<m_lCurrentEntry && !bFound)
{
bFound=(lId==m_ppclDictionnaryEntry[lIndex]->m_fn_lGetId());
lIndex++;
}
if(bFound)
return m_ppclDictionnaryEntry[lIndex-1]->m_fn_csGetName(csLanguage);
else
return C_INVALID_WORD;
}
/****************************************************************************/
CString CPA_EdIR_Dictionary::m_fn_csTranslate(CString csWord,CString csLanguage)
{
CString csTranslation=C_INVALID_WORD;
long lIndex=0;
while((lIndex<m_lCurrentEntry) && M_WORD_IS_INVALID(csTranslation))
{
csTranslation=m_ppclDictionnaryEntry[lIndex]->m_fn_csTranslate(csWord,csLanguage);
lIndex++;
}
return csTranslation;
}
/****************************************************************************/
int CPA_EdIR_Dictionary::m_fn_iCompareNoCase(const void *pcsWord1,const void *pcsWord2)
{
return ((CString *)pcsWord1)->CompareNoCase(*((CString *)pcsWord2));
}
/****************************************************************************/
void CPA_EdIR_Dictionary::m_fn_vInitFastTranslation(CString csLanguage1,CString csLanguage2)
{
if((m_csOldLanguage1.CompareNoCase(csLanguage1)!=0) ||
(m_csOldLanguage2.CompareNoCase(csLanguage2)!=0))
{
m_csOldLanguage1=csLanguage1;
m_csOldLanguage2=csLanguage2;
if(m_pstCouple)
delete[] m_pstCouple;
m_pstCouple=new CPA_EdIR_stCouple[m_lNbEntries];
for(long lIndex=0;lIndex<m_lNbEntries;lIndex++)
{
m_pstCouple[lIndex].csWord=m_ppclDictionnaryEntry[lIndex]->m_fn_csGetName(csLanguage1);
m_pstCouple[lIndex].csTranslatedWord=m_ppclDictionnaryEntry[lIndex]->m_fn_csGetName(csLanguage2);
}
qsort(m_pstCouple,m_lNbEntries,sizeof(CPA_EdIR_stCouple),m_fn_iCompareNoCase);
}
}
/****************************************************************************/
CString CPA_EdIR_Dictionary::m_fn_csFastTranslate(CString csWord)
{
CPA_EdIR_stCouple *pstCouple;
pstCouple=(CPA_EdIR_stCouple *)bsearch((void *)(&csWord),m_pstCouple,m_lNbEntries,sizeof(CPA_EdIR_stCouple),m_fn_iCompareNoCase);
if(pstCouple!=NULL)
return pstCouple->csTranslatedWord;
else
return C_INVALID_WORD;
}
#endif //D_ED_IR_ACTIVE