perf: 处理一些数据存储

This commit is contained in:
msojocs 2023-06-22 09:18:55 +08:00
parent b52db55a22
commit 838a6c8937
4 changed files with 60 additions and 40 deletions

View File

@ -99,11 +99,12 @@ namespace WXML
bool offset_84; // hasCache attrContent bool offset_84; // hasCache attrContent
std::string offset_88; // chcheData attrContent std::string offset_88; // chcheData attrContent
public: public:
Token(/* args */); Token();
Token(std::string &);
Token(WXML::DOMLib::Token&&); Token(WXML::DOMLib::Token&&);
Token(WXML::DOMLib::Token const&); Token(WXML::DOMLib::Token const&);
~Token(); ~Token();
void SetContent(std::string &content);
std::string ToString(); std::string ToString();
/** /**
@ -141,13 +142,13 @@ namespace WXML
static int TT[0x101000u]; //类型不确定 static int TT[0x101000u]; //类型不确定
static int STT[0x80]; static int STT[0x80];
int fileLength = 0; // offset + 0 int fileLength = 0; // offset + 0
int offset_1 = 0; // offset + 1
int lineCount = 0;// 当前处理的行数 offset + 2
int lineLength = 0; // 正在处理行的长度 offset + 3
int offset_4 = 0; // offset + 4 int offset_4 = 0; // offset + 4
int offset_5 = 0; // offset + 5 int lineCount = 0;// 当前处理的行数 offset + 8
int offset_6 = 0; // offset + 6 int lineLength = 0; // 正在处理行的长度 offset + 12
std::string filePath; // 文件路径 offset + 7 this+28 int offset_16 = 0; // offset + 16
int offset_20 = 0; // offset + 20
int offset_24 = 0; // offset + 24
std::string filePath; // 文件路径 offset + 28
public: public:
Machine(/* args */); Machine(/* args */);
@ -163,8 +164,7 @@ namespace WXML
{ {
private: private:
/* data */ /* data */
const char* fileContent; std::string fileContent;
int contentLength;
std::string fileName; std::string fileName;
WXML::DOMLib::Machine machine; // this + 2 WXML::DOMLib::Machine machine; // this + 2
public: public:

View File

@ -293,6 +293,7 @@ namespace WXML
} }
} }
int dword_567960[1000] = {0}; int dword_567960[1000] = {0};
void Machine::Feed( void Machine::Feed(
char inputChar, char inputChar,
std::vector<WXML::DOMLib::Token> & a3, std::vector<WXML::DOMLib::Token> & a3,
@ -313,8 +314,8 @@ namespace WXML
int v46; int v46;
int v45; int v45;
do{ do{
v46 = this->TT[257 * this->offset_6 + inputChar]; v46 = this->TT[257 * this->offset_24 + inputChar];
v45 = this->offset_6; v45 = this->offset_24;
if (!v46) if (!v46)
{ {
v46 = dword_567960[257 * v45]; v46 = dword_567960[257 * v45];
@ -322,7 +323,7 @@ namespace WXML
{ {
std::stringstream ss; std::stringstream ss;
ss << "BAD STATE MACHINE! AT INPUT "; ss << "BAD STATE MACHINE! AT INPUT ";
ss << this->offset_6 << " " << inputChar; ss << this->offset_24 << " " << inputChar;
errorMessage = ss.str(); errorMessage = ss.str();
return; return;
} }
@ -344,14 +345,14 @@ namespace WXML
errorMessage = ss.str(); errorMessage = ss.str();
return; return;
} }
this->offset_6 = v46; this->offset_24 = v46;
if (bittest(&v46, 0x15u)) if (bittest(&v46, 0x15u))
{ {
// TODO: // TODO:
if (this->fileLength > this->offset_1) if (this->fileLength > this->offset_4)
{ {
this->offset_1++; this->offset_4++;
this->offset_5++; this->offset_20++;
WXML::DOMLib::Token token; WXML::DOMLib::Token token;
a3.push_back(token); a3.push_back(token);
@ -372,11 +373,11 @@ namespace WXML
if (bittest(&v46, 0x11u)) if (bittest(&v46, 0x11u))
{ {
if (this->offset_1 < this->fileLength) if (this->offset_4 < this->fileLength)
{ {
this->offset_1 = this->fileLength; this->offset_4 = this->fileLength;
this->offset_5 = this->lineLength; this->offset_20 = this->lineLength;
this->offset_4 = this->lineCount; this->offset_16 = this->lineCount;
if(WXML::DOMLib::Machine::STT[v45] == 3) if(WXML::DOMLib::Machine::STT[v45] == 3)
{ {
@ -396,9 +397,9 @@ namespace WXML
this->lineLength++; this->lineLength++;
if (bittest(&v46, 0x12u)) if (bittest(&v46, 0x12u))
{ {
this->offset_1 = this->fileLength; this->offset_4 = this->fileLength;
this->offset_5 = this->lineLength; this->offset_20 = this->lineLength;
this->offset_4 = this->lineCount; this->offset_16 = this->lineCount;
if (WXML::DOMLib::Machine::STT[v45] == 3) if (WXML::DOMLib::Machine::STT[v45] == 3)
{ {
WXML::DOMLib::Token v49; WXML::DOMLib::Token v49;
@ -413,8 +414,8 @@ namespace WXML
v46 &= 0x80000u; v46 &= 0x80000u;
if (v46) if (v46)
{ {
offset_1 = fileLength; offset_4 = fileLength;
offset_5 = lineLength; offset_20 = lineLength;
} }
return; return;
} }
@ -427,12 +428,12 @@ namespace WXML
void Machine::Reset() void Machine::Reset()
{ {
this->fileLength = 0; this->fileLength = 0;
this->offset_1 = 0; this->offset_4 = 0;
this->lineCount = 1; this->lineCount = 1;
this->lineLength = 1; this->lineLength = 1;
this->offset_4 = 1; this->offset_16 = 1;
this->offset_5 = 1; this->offset_20 = 1;
this->offset_6 = 1; this->offset_24 = 1;
} }
} }

View File

@ -15,9 +15,13 @@ namespace WXML
00 00 00 00 00(?) F2 97 00 70 F0 97 00 00 00 00 00 00 00 00 00 00(?) F2 97 00 70 F0 97 00 00 00 00 00
00 00 00 00 62 00 00 40 F8 F1 97 00 7A 15 46 00 00 00 00 00 62 00 00 40 F8 F1 97 00 7A 15 46 00
*/ */
Token::Token(/* args */) Token::Token()
{ {
}
Token::Token(std::string &content)
{
this->offset_0 = content;
} }
Token::Token(WXML::DOMLib::Token&& token) Token::Token(WXML::DOMLib::Token&& token)
@ -30,6 +34,10 @@ namespace WXML
Token::~Token() Token::~Token()
{ {
} }
void Token::SetContent(std::string &content)
{
this->offset_0 = content;
}
int Token::GetTemplateContent(std::string const& templateStr, std::string& result) int Token::GetTemplateContent(std::string const& templateStr, std::string& result)
{ {

View File

@ -7,8 +7,7 @@ namespace WXML
Tokenizer::Tokenizer(char const* fileContent, std::string const& filePath) Tokenizer::Tokenizer(char const* fileContent, std::string const& filePath)
{ {
this->fileContent = fileContent; this->fileContent = std::string(fileContent);
this->contentLength = strlen(fileContent);
this->fileName = filePath; this->fileName = filePath;
WXML::DOMLib::Machine m(filePath); WXML::DOMLib::Machine m(filePath);
this->machine = m; this->machine = m;
@ -20,24 +19,36 @@ namespace WXML
int Tokenizer::GetTokens( int Tokenizer::GetTokens(
std::vector<WXML::DOMLib::Token> &a2, std::vector<WXML::DOMLib::Token> &a2,
std::string &a3, std::string &errorMessage,
std::vector<WXML::DOMLib::Token> &a4 std::vector<WXML::DOMLib::Token> &a4
) )
{ {
this->machine.Reset(); this->machine.Reset();
if (this->fileContent) if (this->fileContent.length() > 0)
{ {
for (int i = 0; i < this->contentLength; i++) for (int i = 0; i < this->fileContent.length(); i++)
{ {
this->machine.Feed(this->fileContent[i], a2, a3, a4, 0); this->machine.Feed(this->fileContent[i], a2, errorMessage, a4, 0);
} }
this->machine.Feed(0, a2, a3, a4, 0); this->machine.Feed(0, a2, errorMessage, a4, 0);
// TODO: 少了 // TODO: 少了
// 猜测将fileContent地址赋值给a2,a4中所有的元素
for (int i = 0; i < a2.size(); i++)
{
/* code */
a2[i].SetContent(this->fileContent);
}
for (int i = 0; i < a4.size(); i++)
{
/* code */
a4[i].SetContent(this->fileContent);
}
} }
else else
{ {
a3.replace(a3.begin(), a3.end(), "FATAL: no source was set or failed to allocate space for input source"); errorMessage.replace(errorMessage.begin(), errorMessage.end(), "FATAL: no source was set or failed to allocate space for input source");
return -1; return -1;
} }
return 0; return 0;