51 std::vector<TextElement> commands_and_chars = TextCommands;
52 commands_and_chars.insert(commands_and_chars.end(), SpecialChars.begin(),
54 for (
auto &text_element : commands_and_chars) {
55 match = text_element.MatchMe(str);
56 if (match.size() > 0) {
57 if (text_element.HasArgument) {
58 std::string arg = match[1].str().substr(1);
59 return ParsedElement(text_element, std::stoi(arg,
nullptr, 16));
66 const auto dictionary_element =
69 match = dictionary_element.MatchMe(str);
70 if (match.size() > 0) {
72 DICTOFF + std::stoi(match[1].str(),
nullptr, 16));
78 if (CharEncoder.contains(value)) {
79 char c = CharEncoder.at(value);
87 if (text_element != std::nullopt) {
88 return text_element->GenericToken;
93 if (special_element != std::nullopt) {
94 return text_element->GenericToken;
99 if (dictionary >= 0) {
107 std::vector<uint8_t> bytes;
108 std::string temp_string = str;
110 while (pos < temp_string.size()) {
112 if (temp_string[pos] ==
'[') {
113 int next = temp_string.find(
']', pos);
121 const auto dictionary_element =
124 if (!parsedElement.
Active) {
125 util::logf(
"Error parsing message: %s", temp_string);
127 }
else if (parsedElement.
Parent == dictionary_element) {
128 bytes.push_back(parsedElement.
Value);
130 bytes.push_back(parsedElement.
Parent.
ID);
133 bytes.push_back(parsedElement.
Value);
152 std::vector<DictionaryEntry> AllDictionaries;
154 std::vector<uint8_t> bytes;
155 std::stringstream stringBuilder;
161 int temppush_backress =
166 while (address < temppush_backress) {
167 uint8_t uint8_tDictionary = rom->
data()[address++];
168 bytes.push_back(uint8_tDictionary);
172 AllDictionaries.push_back(
DictionaryEntry{(uint8_t)i, stringBuilder.str()});
175 std::sort(AllDictionaries.begin(), AllDictionaries.end(),
177 return a.Contents.size() > b.Contents.size();
180 return AllDictionaries;
205 const std::vector<uint8_t> &rom_data,
int *current_pos) {
207 int pos = *current_pos;
208 uint8_t current_byte;
209 std::vector<uint8_t> temp_bytes_raw;
210 std::vector<uint8_t> temp_bytes_parsed;
211 std::string current_message_raw;
212 std::string current_message_parsed;
216 current_byte = rom_data[pos++];
219 message_data.
ID = message_data.
ID + 1;
221 message_data.
RawString = current_message_raw;
222 message_data.
Data = temp_bytes_raw;
226 temp_bytes_raw.clear();
227 temp_bytes_parsed.clear();
228 current_message_raw.clear();
229 current_message_parsed.clear();
232 }
else if (current_byte == 0xFF) {
236 temp_bytes_raw.push_back(current_byte);
240 if (text_element != std::nullopt) {
241 current_message_raw.append(text_element->GetParamToken());
242 current_message_parsed.append(text_element->GetParamToken());
243 temp_bytes_parsed.push_back(current_byte);
249 if (dictionary >= 0) {
250 current_message_raw.append(
"[");
252 current_message_raw.append(
":");
254 current_message_raw.append(
"]");
256 auto mutable_rom_data =
const_cast<uint8_t *
>(rom_data.data());
262 for (uint32_t i = address; i < address_end; i++) {
263 temp_bytes_parsed.push_back(rom_data[i]);
271 if (CharEncoder.contains(current_byte)) {
272 std::string str =
"";
273 str.push_back(CharEncoder.at(current_byte));
274 current_message_raw.append(str);
275 current_message_parsed.append(str);
276 temp_bytes_parsed.push_back(current_byte);
285 std::vector<MessageData> &message_data,
286 const std::vector<DictionaryEntry> &dictionary_entries) {
287 std::vector<std::string> parsed_messages;
289 for (
auto &message : message_data) {
290 std::string parsed_message =
"";
292 for (
const uint8_t &
byte : message.Data) {
293 if (CharEncoder.contains(
byte)) {
294 parsed_message.push_back(CharEncoder.at(
byte));
298 for (
const auto &entry : dictionary_entries) {
299 if (entry.ID ==
byte -
DICTOFF) {
304 parsed_message.append(dic_entry.
Contents);
307 if (text_element != std::nullopt) {
309 text_element->ID ==
kLine2 || text_element->ID ==
kLine3) {
310 parsed_message.append(
"\n");
313 if (text_element->HasArgument) {
315 parsed_message.append(
316 text_element->GetParamToken(message.Data[pos + 1]));
319 parsed_message.append(text_element->GetParamToken());
326 parsed_messages.push_back(parsed_message);
329 return parsed_messages;
333 std::vector<MessageData> list_of_texts;
336 std::vector<uint8_t> raw_message;
337 std::vector<uint8_t> parsed_message;
338 std::string current_raw_message;
339 std::string current_parsed_message;
341 uint8_t current_byte = 0;
342 while (current_byte != 0xFF) {
343 current_byte = rom[pos++];
345 list_of_texts.push_back(
346 MessageData(message_id++, pos, current_raw_message, raw_message,
347 current_parsed_message, parsed_message));
349 parsed_message.clear();
350 current_raw_message.clear();
351 current_parsed_message.clear();
353 }
else if (current_byte == 0xFF) {
357 raw_message.push_back(current_byte);
360 if (text_element != std::nullopt) {
361 parsed_message.push_back(current_byte);
362 if (text_element->HasArgument) {
363 current_byte = rom[pos++];
364 raw_message.push_back(current_byte);
365 parsed_message.push_back(current_byte);
368 current_raw_message.append(text_element->GetParamToken(current_byte));
369 current_parsed_message.append(text_element->GetParamToken(current_byte));
380 if (special_element != std::nullopt) {
381 current_raw_message.append(special_element->GetParamToken());
382 current_parsed_message.append(special_element->GetParamToken());
383 parsed_message.push_back(current_byte);
389 if (dictionary >= 0) {
395 uint32_t address_end =
398 for (uint32_t i = address; i < address_end; i++) {
399 parsed_message.push_back(rom[i]);
407 if (CharEncoder.contains(current_byte)) {
408 std::string str =
"";
409 str.push_back(CharEncoder.at(current_byte));
410 current_raw_message.append(str);
411 current_parsed_message.append(str);
412 parsed_message.push_back(current_byte);
416 return list_of_texts;