rodecomp/Source/Utility/Lexicon/LexiconMatcher.cpp
ragnarok-clanker 77f1092cff Decompile fn_17631 (MatchLexicon)
Batch #11354 by cremane: 0 byte-identical, 1 confirmed by peer review.

- fn_17631 MatchLexicon: logic confirmed by peer review

Peer-reviewed-by: Yommy, dori, StrawberrysherbetIX
Accepted without human review: peers confirmed the logic ("same" ahead by at least 3, with 70% of the votes).
2026-11-05 00:43:03 +00:00

70 lines
1.6 KiB
C++

#include "Utility/Lexicon/LexiconMatcher.h"
// OFFSET: 0x00AC48E0
// FUNCTION: fn_17631
int __stdcall MatchLexicon(const unsigned char* data, int, const unsigned char* text, const unsigned char* end, int) {
bool failed = false;
int accepted = 0;
int matched = 0;
if (*text == 0) {
return 1000;
}
const unsigned char* entry = data;
int offset = 0;
unsigned char* offsetBytes = reinterpret_cast<unsigned char*>(&offset);
while (text < end && !failed) {
if ((*entry & 0x40) != 0) {
return matched;
}
offsetBytes[2] = entry[0] & 0x3F;
offsetBytes[1] = entry[1];
offsetBytes[0] = entry[2];
entry += 3;
const unsigned char* candidate = data + offset;
const int count = *candidate;
if (count < 0x20 && candidate[1] == *text) {
++offset;
for (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 (*candidate >= *text) {
if (*candidate != *text) {
return accepted;
}
++matched;
entry = candidate + 1;
++text;
if ((*entry & 0x80) != 0) {
accepted = matched;
}
}
if (*text == 0) {
return accepted;
}
}
return accepted;
}