diff --git a/src/include/wxml.h b/src/include/wxml.h index 19d4bde..caef1fd 100644 --- a/src/include/wxml.h +++ b/src/include/wxml.h @@ -99,11 +99,12 @@ namespace WXML bool offset_84; // hasCache attrContent std::string offset_88; // chcheData attrContent public: - Token(/* args */); + Token(); + Token(std::string &); Token(WXML::DOMLib::Token&&); Token(WXML::DOMLib::Token const&); ~Token(); - + void SetContent(std::string &content); std::string ToString(); /** @@ -141,13 +142,13 @@ namespace WXML static int TT[0x101000u]; //类型不确定 static int STT[0x80]; 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_5 = 0; // offset + 5 - int offset_6 = 0; // offset + 6 - std::string filePath; // 文件路径 offset + 7 this+28 + int lineCount = 0;// 当前处理的行数 offset + 8 + int lineLength = 0; // 正在处理行的长度 offset + 12 + int offset_16 = 0; // offset + 16 + int offset_20 = 0; // offset + 20 + int offset_24 = 0; // offset + 24 + std::string filePath; // 文件路径 offset + 28 public: Machine(/* args */); @@ -163,8 +164,7 @@ namespace WXML { private: /* data */ - const char* fileContent; - int contentLength; + std::string fileContent; std::string fileName; WXML::DOMLib::Machine machine; // this + 2 public: diff --git a/src/wxml/dom_lib/machine.cpp b/src/wxml/dom_lib/machine.cpp index b3ccab2..4ca8d64 100644 --- a/src/wxml/dom_lib/machine.cpp +++ b/src/wxml/dom_lib/machine.cpp @@ -293,6 +293,7 @@ namespace WXML } } int dword_567960[1000] = {0}; + void Machine::Feed( char inputChar, std::vector & a3, @@ -313,8 +314,8 @@ namespace WXML int v46; int v45; do{ - v46 = this->TT[257 * this->offset_6 + inputChar]; - v45 = this->offset_6; + v46 = this->TT[257 * this->offset_24 + inputChar]; + v45 = this->offset_24; if (!v46) { v46 = dword_567960[257 * v45]; @@ -322,7 +323,7 @@ namespace WXML { std::stringstream ss; ss << "BAD STATE MACHINE! AT INPUT "; - ss << this->offset_6 << " " << inputChar; + ss << this->offset_24 << " " << inputChar; errorMessage = ss.str(); return; } @@ -344,14 +345,14 @@ namespace WXML errorMessage = ss.str(); return; } - this->offset_6 = v46; + this->offset_24 = v46; if (bittest(&v46, 0x15u)) { // TODO: - if (this->fileLength > this->offset_1) + if (this->fileLength > this->offset_4) { - this->offset_1++; - this->offset_5++; + this->offset_4++; + this->offset_20++; WXML::DOMLib::Token token; a3.push_back(token); @@ -372,11 +373,11 @@ namespace WXML if (bittest(&v46, 0x11u)) { - if (this->offset_1 < this->fileLength) + if (this->offset_4 < this->fileLength) { - this->offset_1 = this->fileLength; - this->offset_5 = this->lineLength; - this->offset_4 = this->lineCount; + this->offset_4 = this->fileLength; + this->offset_20 = this->lineLength; + this->offset_16 = this->lineCount; if(WXML::DOMLib::Machine::STT[v45] == 3) { @@ -396,9 +397,9 @@ namespace WXML this->lineLength++; if (bittest(&v46, 0x12u)) { - this->offset_1 = this->fileLength; - this->offset_5 = this->lineLength; - this->offset_4 = this->lineCount; + this->offset_4 = this->fileLength; + this->offset_20 = this->lineLength; + this->offset_16 = this->lineCount; if (WXML::DOMLib::Machine::STT[v45] == 3) { WXML::DOMLib::Token v49; @@ -413,8 +414,8 @@ namespace WXML v46 &= 0x80000u; if (v46) { - offset_1 = fileLength; - offset_5 = lineLength; + offset_4 = fileLength; + offset_20 = lineLength; } return; } @@ -427,12 +428,12 @@ namespace WXML void Machine::Reset() { this->fileLength = 0; - this->offset_1 = 0; + this->offset_4 = 0; this->lineCount = 1; this->lineLength = 1; - this->offset_4 = 1; - this->offset_5 = 1; - this->offset_6 = 1; + this->offset_16 = 1; + this->offset_20 = 1; + this->offset_24 = 1; } } diff --git a/src/wxml/dom_lib/token.cpp b/src/wxml/dom_lib/token.cpp index 2c57fbe..0210dda 100644 --- a/src/wxml/dom_lib/token.cpp +++ b/src/wxml/dom_lib/token.cpp @@ -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 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) @@ -30,6 +34,10 @@ namespace WXML Token::~Token() { } + void Token::SetContent(std::string &content) + { + this->offset_0 = content; + } int Token::GetTemplateContent(std::string const& templateStr, std::string& result) { diff --git a/src/wxml/dom_lib/tokenizer.cpp b/src/wxml/dom_lib/tokenizer.cpp index 36cd32b..9ae1d6a 100644 --- a/src/wxml/dom_lib/tokenizer.cpp +++ b/src/wxml/dom_lib/tokenizer.cpp @@ -7,8 +7,7 @@ namespace WXML Tokenizer::Tokenizer(char const* fileContent, std::string const& filePath) { - this->fileContent = fileContent; - this->contentLength = strlen(fileContent); + this->fileContent = std::string(fileContent); this->fileName = filePath; WXML::DOMLib::Machine m(filePath); this->machine = m; @@ -20,24 +19,36 @@ namespace WXML int Tokenizer::GetTokens( std::vector &a2, - std::string &a3, + std::string &errorMessage, std::vector &a4 ) { 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: 少了 + // 猜测:将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 { - 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 0;