Decompile fn_17631 (MatchLexicon)
Batch #842 by ragnarok-clanker: 0 byte-identical, 1 confirmed by peer review. - fn_17631 MatchLexicon: logic confirmed by peer review Reviewed-by: ragnarok-clanker Adds to the build: Source/Utility/LexiconMatcher.cpp
This commit is contained in:
parent
3897c27241
commit
e5031b68a9
3 changed files with 75 additions and 0 deletions
68
Source/Utility/LexiconMatcher.cpp
Normal file
68
Source/Utility/LexiconMatcher.cpp
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
#include "Utility/LexiconMatcher.h"
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
// FUNCTION: fn_17631
|
||||
int __stdcall MatchLexicon(const unsigned char* data, int, const unsigned char* text, const unsigned char* end, int) {
|
||||
if (*text == 0) {
|
||||
return 1000;
|
||||
}
|
||||
|
||||
int accepted = 0;
|
||||
int matched = 0;
|
||||
bool failed = false;
|
||||
const unsigned char* entry = data;
|
||||
while (text < end && !failed) {
|
||||
if ((*entry & 0x40) != 0) {
|
||||
return matched;
|
||||
}
|
||||
|
||||
std::uint32_t offset = (static_cast<std::uint32_t>(entry[0] & 0x3F) << 16) |
|
||||
(static_cast<std::uint32_t>(entry[1]) << 8) | entry[2];
|
||||
entry += 3;
|
||||
const unsigned char* candidate = data + offset;
|
||||
const unsigned int count = *candidate;
|
||||
if (count < 0x20 && candidate[1] == *text) {
|
||||
++offset;
|
||||
for (unsigned int index = 0; index < count; ++index) {
|
||||
if (data[offset++] != *text) {
|
||||
failed = true;
|
||||
break;
|
||||
}
|
||||
|
||||
++matched;
|
||||
++text;
|
||||
const unsigned char marker = data[offset];
|
||||
if (marker < 0x20) {
|
||||
if ((marker & 2) != 0) {
|
||||
accepted = matched;
|
||||
}
|
||||
|
||||
if ((marker & 4) != 0) {
|
||||
entry = data + offset + 1;
|
||||
break;
|
||||
}
|
||||
|
||||
++offset;
|
||||
}
|
||||
}
|
||||
} else if (count >= *text) {
|
||||
if (count != *text) {
|
||||
return accepted;
|
||||
}
|
||||
|
||||
++matched;
|
||||
entry = candidate + 1;
|
||||
++text;
|
||||
if (static_cast<signed char>(*entry) < 0) {
|
||||
accepted = matched;
|
||||
}
|
||||
}
|
||||
|
||||
if (*text == 0) {
|
||||
return accepted;
|
||||
}
|
||||
}
|
||||
|
||||
return accepted;
|
||||
}
|
||||
6
Source/Utility/LexiconMatcher.h
Normal file
6
Source/Utility/LexiconMatcher.h
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
#ifndef RAGNAROK_SOURCE_UTILITY_LEXICONMATCHER_H
|
||||
#define RAGNAROK_SOURCE_UTILITY_LEXICONMATCHER_H
|
||||
|
||||
int __stdcall MatchLexicon(const unsigned char* data, int mode, const unsigned char* text, const unsigned char* end, int options);
|
||||
|
||||
#endif
|
||||
|
|
@ -585,6 +585,7 @@
|
|||
"Source/Utility/Base64.cpp": 0,
|
||||
"Source/Utility/GuidParse.cpp": 0,
|
||||
"Source/Utility/LexiconBoundary.cpp": 0,
|
||||
"Source/Utility/LexiconMatcher.cpp": 0,
|
||||
"Source/Utility/LexiconSerializer.cpp": 0,
|
||||
"Source/Utility/MD5.cpp": 0,
|
||||
"Source/Utility/Math/AffineLookAt.cpp": 0,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue