?? language.cpp
字號:
#include "stdafx.h"
#include <stdio.h>
#include "Language.h"
#include "hong_sub.h"
/*////////////////////////////////////////////////////////////////////////////////////////////
// 備己 : CLan.cpp,CLan.h 拳老. //
// 格利 : txt拳老肺 何磐 膠飄傅闌 佬絹輯 皋葛府俊 歷厘. 寇何俊 力傍竅綽 OutputMessage竊薦甫 //
// 烹秦輯 秦寸 膠飄傅闌 力傍. //
// 備泅 : txt拳老闌 擴檔快俊 嘎霸 秦寸 攫絹狼 txt甫 茫酒輯 肺爹. txt拳老闌 茄鍋 盒籍竅咯 //
// 鞘夸茄 皋葛府甫 拌魂, new甫 茄鍋父 齲免竅咯 牢鄲膠儈 拋撈喉苞 膠飄傅闌 竊膊 歷厘. //
// 漂隆 : 抗傈俊綽 膠飄傅喊肺 new甫 齲免竅絆 牢鄲膠狼 積己俊檔 new甫 葷儈竅咯 皋葛府狼 竄祈 //
// 拳 棺 memory leak闌 蠟慣竅看欄哥, 3竄 器牢磐狼 葷儈欄肺, 蠟瘤焊薦狼 絹妨框 慣積. //
// 泅力綽 new甫 茄鍋父 齲免竊欄肺輯 memory leak狼 規瘤 棺 皋葛府 竄祈拳甫 規瘤茄促. //
// All code is made by zoung. zoung@esofnet.com ICQ : 66924157 Written at 2002/4/12 //
*/////////////////////////////////////////////////////////////////////////////////////////////
LanguagePack* lan = NULL;
char LanguageInt[6][3]={ "en", "kr", "ch", "en", "jp","th"};
char header[10][20]={ "[melee]","[magic]","[skill]","[notice]","[item]","[etc]","[justmsg]","[sprintf]","[yesorno]","[temp]"};
int CLanguage::CheckArea() //絹恫 攫絹甫 靜綽瘤 眉農竅綽 竊薦
{
AreaCode=1; // KR
#ifdef JAPAN_LOCALIZING_
AreaCode=4; // JP
#endif
#if defined TAIWAN_LOCALIZING_ || defined CHINA_LOCALIZING_ || defined HONGKONG_LOCALIZING_
AreaCode=2; // TH
#endif
#ifdef USA_LOCALIZING_
AreaCode=0; // EN
/*#ifndef MALAYSIA_LOCALIZING_ // 031013 kyo
#ifndef THAI_LOCALIZING_ // BBD 040114
const short WinAreaCode=GetUserDefaultLangID();
switch(WinAreaCode)
{
case 0x0404:// Chinese (Taiwan Region)
case 0x0804:// Chinese (PRC)
case 0x0c04:// Chinese (Hong Kong SAR, PRC)
case 0x1004:// Chinese (Singapore)
case 0x0411:// Japanese
{
::ExitApplication(EA_LANGUAGE_ERROR);
return 0;
}break;
}
#endif // BBD 040114
#endif*/ // 031013 kyo
#endif
return(1);
}
int CLanguage::LoadingByAreaCode() //AreaCode俊 狼秦輯 秦寸竅綽 拳老闌 佬絹 甸牢促.
{
char path[MAX_FILE_LENGTH];
wsprintf(LoadedFileName,"%s_lan.txt",LanguageInt[AreaCode]);
wsprintf(path, "./data/%s", LoadedFileName );
wsprintf(this->LoadedFileName,"%s",path);
FILE * fp=Fopen(path,"rt");
if(fp==NULL) { MessageBox(NULL,"Can't Find Language Text","Language Error",NULL); return -1;}
fclose(fp);
return(1);
}
char* CLanguage::OutputMessage(int NumOfSentence) //秦寸竅綽 皋矯瘤甫 Sentence俊促 持絆 絕欄擱 Sentence俊綽 酒公藹檔 絕促.
{
int kind=0,number=0;
kind=NumOfSentence/100000;
number=NumOfSentence%100000;
return this->OutputMessage(kind,number);
}
char* CLanguage::OutputMessage(int Kind,int Num) //秦寸竅綽 皋矯瘤甫 Sentence俊促 持絆 絕欄擱 Sentence俊綽 酒公藹檔 絕促.
{
if (Kind == 1 && Num == 25)
{
int k = 0;
}
if( Kind < 0 || Kind >=MAX_KIND )
return this->szNullString;
if( Num <=0 || Num > this->m_dwMaxLineNumberOfKind[Kind])
return this->szNullString;
DWORD MaxNumber = 0;
if( Kind == 0 )
MaxNumber = 0;
else
{
for( int i=0;i<Kind;i++)
MaxNumber += this->m_dwMaxLineNumberOfKind[i];
}
DWORD Number = MaxNumber*4 + Num*4;
DWORD ReturnAddress = 0;
memcpy(&ReturnAddress,(this->IndexAddress + Number),4);
if( ReturnAddress!=NULL)//020501 lsw
{
return (char*)ReturnAddress;
}
else
{
return this->szNullString;
}
return this->szNullString;
}
CLanguage::CLanguage()
{
memset(this,0,sizeof( *this ) );
this->Init();
}
CLanguage::~CLanguage()
{
SAFE_DELETE(this->IndexAddress);
}
int CLanguage::Init()
{
if( this->CheckArea() < 0 ) return -1;
if( this->LoadingByAreaCode() < 0 ) return -2;
if( this->Preloading() < 0 ) return -3;
if( this->Loading() < 0 ) return -4;
return 1;
}
int CLanguage::Preloading()
{
FILE* fp=NULL;
fp = Fopen(this->LoadedFileName,"rt");
if( fp == NULL)
return -1;
DWORD Header=0,Number=0;
while(!feof(fp)) //拳老狼 場撈 唱棵錠 鱉瘤 拌加 館汗
{
int i=0;
char Original_Sentence[MAX_ONE_LINE_CHAR_NUM]={0,},Temp_Sentence[MAX_ONE_LINE_CHAR_NUM]={0,},Sentence[MAX_ONE_LINE_CHAR_NUM]={0,};
if( GetOneLine(Original_Sentence,fp) <0)
continue;
//咯扁鱉瘤 吭促綽 巴籃 ;撈 絕綽 扼牢撈扼綽 舵
strcpy(Temp_Sentence,Original_Sentence); //老竄 盔夯闌 歸訣秦 敵促
//老竄 秦歹甫 犬牢茄促. //秦歹撈擱 付撈呈膠. 慶歹啊 酒聰擱 敲礬膠
if( CheckHeader(Header,Temp_Sentence) < 0 )
continue;
//鍋齲甫 犬牢茄促.//鍋齲啊 何利例竅芭唱 絕欄擱 付撈呈膠
if( CheckNumber(Number,Temp_Sentence) < 0 )
continue;
//郴儈拱闌 犬牢茄促.//郴儈拱狼 郴儈撈 絕啊唱 "啊 2俺啊 酒聰擱 付撈呈膠
if( CheckSentence(Sentence,Temp_Sentence) < 0 )
continue;
this->m_dwMaxLineNumberOfKind[Header] =
this->m_dwMaxLineNumberOfKind[Header] > Number ? this->m_dwMaxLineNumberOfKind[Header] : Number;
this->m_dwTotalLineOfKind[Header]++;
this->m_dwSumOfTotalLine++;
this->m_dwTotalLength = this->m_dwTotalLength + strlen(Sentence) + 1;
}
for( int i=0;i<MAX_KIND;i++)
this->m_dwSumOfMaxLineNumber += this->m_dwMaxLineNumberOfKind[i];
fclose(fp);
return 1;
}
// 020620 YGI
void ConvertSpecialWord(char *txt,const char *delTarget,const char AfterConvert)
{
char *pdest = txt;
while( pdest = strstr(pdest,delTarget) )
{
*pdest = ' '; pdest++;
*pdest = AfterConvert;
}
}
int CLanguage::Loading()
{
FILE* fp=NULL;
fp = Fopen(this->LoadedFileName,"rt");
if( fp == NULL)
return -1;
DWORD Header=0,Number=0;
DWORD DataPos=0;
this->IndexAddress = new char [this->m_dwSumOfMaxLineNumber*4 + this->m_dwTotalLength + 4];
if( IndexAddress == NULL)
return -1;
this->DataAddress = this->IndexAddress + this->m_dwSumOfMaxLineNumber*4 + 4;
memset(this->IndexAddress , 0 ,this->m_dwSumOfMaxLineNumber*4 + this->m_dwTotalLength + 4);
while(!feof(fp)) //拳老狼 場撈 唱棵錠 鱉瘤 拌加 館汗
{
int i=0;
char Original_Sentence[MAX_ONE_LINE_CHAR_NUM]={0,},Temp_Sentence[MAX_ONE_LINE_CHAR_NUM]={0,},Sentence[MAX_ONE_LINE_CHAR_NUM]={0,};
if( GetOneLine(Original_Sentence,fp) <0)
continue;
//咯扁鱉瘤 吭促綽 巴籃 ;撈 絕綽 扼牢撈扼綽 舵
strcpy(Temp_Sentence,Original_Sentence); //老竄 盔夯闌 歸訣秦 敵促
//老竄 秦歹甫 犬牢茄促. //秦歹撈擱 付撈呈膠. 慶歹啊 酒聰擱 敲礬膠
if( CheckHeader(Header,Temp_Sentence) < 0 )
continue;
//鍋齲甫 犬牢茄促.//鍋齲啊 何利例竅芭唱 絕欄擱 付撈呈膠
if( CheckNumber(Number,Temp_Sentence) < 0 )
continue;
//郴儈拱闌 犬牢茄促.//郴儈拱狼 郴儈撈 絕啊唱 "啊 2俺啊 酒聰擱 付撈呈膠
if( CheckSentence(Sentence,Temp_Sentence) < 0 )
continue;
//咯扁鱉瘤 吭促綽 巴籃 力措肺 等 皋矯瘤扼綽 巴. 蝶扼輯 錠妨 冠綽促.^^
// ConvertSpecialWord(Sentence,"%%s",'%s');
// ConvertSpecialWord(Sentence,"%%s",'%d');
// ConvertSpecialWord(Sentence,"%%s",'%u');
ConvertSpecialWord(Sentence,"\\n",'\n');
ConvertSpecialWord(Sentence,"\\r",'\r');
ConvertSpecialWord(Sentence,"\\t",'\t');
DWORD Sentence_Length = strlen(Sentence);
DWORD BaseAddress = 0;
if( Header > 0 )
for( int i=0;i<Header;i++)
BaseAddress += this->m_dwMaxLineNumberOfKind[i];
else
BaseAddress = 0;
strcpy(this->DataAddress + DataPos , Sentence);
DWORD TempDataAddress = (DWORD)((this->DataAddress + DataPos));
memcpy(this->IndexAddress + Number*4 + BaseAddress*4 ,&TempDataAddress,4);
DataPos+=Sentence_Length+1;
}
fclose(fp);
return 0;
}
int CLanguage::GetOneLine(void * data,FILE* fp)
{
int i=0,ret=1;
bool loop=true;
while(loop)
{
if( feof(fp) )
break;
char chardata = fgetc(fp);
((char*)(data))[i++] = chardata;
switch(chardata)
{
case 10: //青撈 官差擱
loop=false;
break;
case 59: //;撈 唱坷擱
ret=-1;
break;
default:
break;
}
}
return ret;
}
int CLanguage::CheckHeader(DWORD &Header,char* data) //輛幅牢啊甫 魄竄 .割鍋擄 鍋齲牢瘤 館券
{
for(int i=0;i<MAX_KIND;i++)
{
if( strlen(header[i]) > strlen(data) )
continue;
if( memicmp(header[i],data,strlen(header[i])) ) //父距 老摹竅綽 header啊 樂欄擱
continue;
Header = i;
return -1; //慶歹甫 茫欄擱 -甫 館券
}
return 1;
}
int CLanguage::CheckNumber(DWORD &Number,char* data) //鍋齲啊 割鍋牢瘤 犬牢茄促.鍋齲 館券
{
char *semi = NULL;
semi = strchr(data,':');
if( semi == NULL) //:啊 絕欄擱
return -1;
char temp[MAX_ONE_LINE_CHAR_NUM]={0,};
memcpy(temp,data,( (DWORD)(semi-data) ) );
Number = atoi(temp);
return 1;
}
int CLanguage::CheckSentence(void * sentence,char* data) //鞏厘撈 倔付唱 變啊甫 犬牢茄促.鞏厘狼 辨撈 館券
{
DWORD length = strlen(data);
char *start = NULL,*end=NULL;
start = strchr(data,'"');
if( start == NULL) //"啊 絕欄擱
return -1;
//彌家茄 場俊輯 2鍋擄 撈絹具 茄促.
if( start-data+1 >= length )
return -2;
end = strchr(start+1,'"');
if( end == NULL)
return -3;
//彌家茄 場俊輯 霉鍋擄 撈絹具 茄促
if( end-data >= length )
return -4;
if( start+1 > end -1 )
return -5;
//咯扁鱉瘤 吭促綽 巴籃 "欄肺 焊齲登綽 鞏厘撈 樂促綽 撈具扁啊 等促. 矯累籃 start, 場籃 end撈促
memset(sentence,0,end-start+2);
memcpy(sentence,start+1,end-start-1);
return 1;
}
void CLanguage::DisplayAllData()
{
int count=0;
for( int i=0;i<MAX_KIND;i++)
{
for( int j=0;j<this->m_dwMaxLineNumberOfKind[i]+1;j++)
{
char* data = (char*)this->OutputMessage(i,j);
if( data[0] != 0 ) printf("[%2d:%6d] %s\n",i,j,data );
// if( count++%100 == 0 )
// getchar();
}
}
printf("\nTotal Summary\n");
for( i=0;i<MAX_KIND;i++)
{
printf("Line 1 : Max Line Number : %d , Total Line Number : %d\n",this->m_dwMaxLineNumberOfKind[i],this->m_dwTotalLineOfKind[i]);
}
printf("\nSum of Max Line Number : %d Sum of Total Line : %d , Total Length : %d" , this->m_dwSumOfMaxLineNumber,
this->m_dwSumOfTotalLine,
this->m_dwTotalLength);
}
// 020428 YGI acer
extern int CheckSumError;
int LoadLanguageText()
{
lan = new LanguagePack;
if(lan==NULL) return 0;
else return 1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -