52 std::vector<TextElement> commands_and_chars = TextCommands;
53 commands_and_chars.insert(commands_and_chars.end(), SpecialChars.begin(),
55 for (
auto& text_element : commands_and_chars) {
56 match = text_element.MatchMe(str);
57 if (match.size() > 0) {
58 if (text_element.HasArgument) {
59 std::string arg = match[1].str().substr(1);
61 return ParsedElement(text_element, std::stoi(arg,
nullptr, 16));
62 }
catch (
const std::invalid_argument& e) {
63 util::logf(
"Error parsing argument for %s: %s",
64 text_element.GenericToken.c_str(), arg.c_str());
66 }
catch (
const std::out_of_range& e) {
68 text_element.GenericToken.c_str(), arg.c_str());
77 const auto dictionary_element =
80 match = dictionary_element.MatchMe(str);
81 if (match.size() > 0) {
84 DICTOFF + std::stoi(match[1].str(),
nullptr, 16));
85 }
catch (
const std::exception& e) {
86 util::logf(
"Error parsing dictionary token: %s", match[1].str().c_str());
94 if (CharEncoder.contains(value)) {
95 char c = CharEncoder.at(value);
103 text_element != std::nullopt) {
104 return text_element->GenericToken;
109 special_element != std::nullopt) {
110 return special_element->GenericToken;
115 if (dictionary >= 0) {
117 static_cast<unsigned char>(dictionary));
124 std::vector<uint8_t> bytes;
125 std::string temp_string = std::move(str);
127 while (pos < temp_string.size()) {
129 if (temp_string[pos] ==
'[') {
130 int next = temp_string.find(
']', pos);
138 const auto dictionary_element =
141 if (!parsedElement.
Active) {
142 util::logf(
"Error parsing message: %s", temp_string);
144 }
else if (parsedElement.
Parent == dictionary_element) {
145 bytes.push_back(parsedElement.
Value);
147 bytes.push_back(parsedElement.
Parent.
ID);
150 bytes.push_back(parsedElement.
Value);
169 std::vector<DictionaryEntry> AllDictionaries;
171 std::vector<uint8_t> bytes;
172 std::stringstream stringBuilder;
178 int temppush_backress =
183 while (address < temppush_backress) {
184 uint8_t uint8_tDictionary = rom->
data()[address++];
185 bytes.push_back(uint8_tDictionary);
189 AllDictionaries.push_back(
DictionaryEntry{(uint8_t)i, stringBuilder.str()});
192 std::ranges::sort(AllDictionaries,
197 return AllDictionaries;
222 const std::vector<uint8_t>& rom_data,
int* current_pos) {
223 if (current_pos ==
nullptr) {
224 return absl::InvalidArgumentError(
"current_pos is null");
226 if (*current_pos < 0 ||
227 static_cast<size_t>(*current_pos) >= rom_data.size()) {
228 return absl::OutOfRangeError(
"current_pos is out of range");
232 int pos = *current_pos;
233 uint8_t current_byte;
234 std::vector<uint8_t> temp_bytes_raw;
235 std::vector<uint8_t> temp_bytes_parsed;
236 std::string current_message_raw;
237 std::string current_message_parsed;
240 while (pos <
static_cast<int>(rom_data.size())) {
241 current_byte = rom_data[pos++];
244 message_data.
ID = message_data.
ID + 1;
246 message_data.
RawString = current_message_raw;
247 message_data.
Data = temp_bytes_raw;
251 temp_bytes_raw.clear();
252 temp_bytes_parsed.clear();
253 current_message_raw.clear();
254 current_message_parsed.clear();
258 }
else if (current_byte == 0xFF) {
259 return absl::InvalidArgumentError(
"message terminator not found");
262 temp_bytes_raw.push_back(current_byte);
266 if (text_element != std::nullopt) {
267 temp_bytes_parsed.push_back(current_byte);
268 if (text_element->HasArgument) {
269 if (pos >=
static_cast<int>(rom_data.size())) {
270 return absl::OutOfRangeError(
"message command argument out of range");
272 uint8_t arg_byte = rom_data[pos++];
273 temp_bytes_raw.push_back(arg_byte);
274 temp_bytes_parsed.push_back(arg_byte);
275 current_message_raw.append(text_element->GetParamToken(arg_byte));
276 current_message_parsed.append(text_element->GetParamToken(arg_byte));
278 current_message_raw.append(text_element->GetParamToken());
279 current_message_parsed.append(text_element->GetParamToken());
286 special_element != std::nullopt) {
287 current_message_raw.append(special_element->GetParamToken());
288 current_message_parsed.append(special_element->GetParamToken());
289 temp_bytes_parsed.push_back(current_byte);
295 if (dictionary >= 0) {
296 std::string token = absl::StrFormat(
298 current_message_raw.append(token);
299 current_message_parsed.append(token);
300 temp_bytes_parsed.push_back(current_byte);
305 if (CharEncoder.contains(current_byte)) {
306 std::string str =
"";
307 str.push_back(CharEncoder.at(current_byte));
308 current_message_raw.append(str);
309 current_message_parsed.append(str);
310 temp_bytes_parsed.push_back(current_byte);
315 return absl::InvalidArgumentError(
"message terminator not found");
319 std::vector<MessageData>& message_data,
320 const std::vector<DictionaryEntry>& dictionary_entries) {
321 std::vector<std::string> parsed_messages;
323 for (
auto& message : message_data) {
324 std::string parsed_message =
"";
326 for (
size_t pos = 0; pos < message.Data.size(); ++pos) {
327 uint8_t
byte = message.Data[pos];
331 if (text_element != std::nullopt) {
334 text_element->ID ==
kLine3) {
335 parsed_message.append(
"\n");
338 if (text_element->HasArgument && pos + 1 < message.Data.size()) {
339 uint8_t arg_byte = message.Data[pos + 1];
340 parsed_message.append(text_element->GetParamToken(arg_byte));
343 parsed_message.append(text_element->GetParamToken());
350 if (special_element != std::nullopt) {
351 parsed_message.append(special_element->GetParamToken());
358 for (
const auto& entry : dictionary_entries) {
359 if (entry.ID ==
byte -
DICTOFF) {
364 parsed_message.append(dic_entry.
Contents);
369 if (CharEncoder.contains(
byte)) {
370 parsed_message.push_back(CharEncoder.at(
byte));
373 parsed_messages.push_back(parsed_message);
376 return parsed_messages;
380 std::vector<MessageData> list_of_texts;
383 std::vector<uint8_t> raw_message;
384 std::vector<uint8_t> parsed_message;
385 std::string current_raw_message;
386 std::string current_parsed_message;
388 uint8_t current_byte = 0;
389 while (current_byte != 0xFF) {
390 current_byte = rom[pos++];
392 list_of_texts.push_back(
393 MessageData(message_id++, pos, current_raw_message, raw_message,
394 current_parsed_message, parsed_message));
396 parsed_message.clear();
397 current_raw_message.clear();
398 current_parsed_message.clear();
400 }
else if (current_byte == 0xFF) {
404 raw_message.push_back(current_byte);
407 if (text_element != std::nullopt) {
408 parsed_message.push_back(current_byte);
409 if (text_element->HasArgument) {
410 current_byte = rom[pos++];
411 raw_message.push_back(current_byte);
412 parsed_message.push_back(current_byte);
415 current_raw_message.append(text_element->GetParamToken(current_byte));
416 current_parsed_message.append(text_element->GetParamToken(current_byte));
427 if (special_element != std::nullopt) {
428 current_raw_message.append(special_element->GetParamToken());
429 current_parsed_message.append(special_element->GetParamToken());
430 parsed_message.push_back(current_byte);
436 if (dictionary >= 0) {
437 current_raw_message.append(absl::StrFormat(
443 uint32_t address_end =
446 for (uint32_t i = address; i < address_end; i++) {
447 parsed_message.push_back(rom[i]);
455 if (CharEncoder.contains(current_byte)) {
456 std::string str =
"";
457 str.push_back(CharEncoder.at(current_byte));
458 current_raw_message.append(str);
459 current_parsed_message.append(str);
460 parsed_message.push_back(current_byte);
464 return list_of_texts;
468 std::vector<std::string>& parsed_messages,
469 std::vector<MessageData>& expanded_messages,
470 std::vector<DictionaryEntry>& dictionary) {
471 static Rom expanded_message_rom;
472 if (!expanded_message_rom.
LoadFromFile(expanded_message_path).ok()) {
473 return absl::InternalError(
"Failed to load expanded message ROM");
476 auto parsed_expanded_messages =
479 for (
const auto& expanded_message : expanded_messages) {
480 parsed_messages.push_back(parsed_expanded_messages[expanded_message.ID]);
482 return absl::OkStatus();