@@ -1098,34 +1098,39 @@ static constexpr char HASHDB_YAML_FILE_NAME[] = "RedumpDatabase.yaml";
10981098std::unordered_map<GameDatabase::TrackHash, u32 , TrackHashHasher> s_track_hash_to_entry_map;
10991099std::vector<GameDatabase::HashDatabaseEntry> s_hash_database;
11001100
1101- static bool parseHashDatabaseEntry (const ryml::NodeRef& node )
1101+ static bool parseHashDatabaseEntry (const ryml::ConstNodeRef& entry_node )
11021102{
1103- if (!node.has_child (" name" ) || !node.has_child (" hashes" ))
1103+ const ryml::ConstNodeRef name_node = entry_node.find_child (" name" );
1104+ const ryml::ConstNodeRef hashes_node = entry_node.find_child (" hashes" );
1105+ if (!name_node.readable () || !name_node.has_val () || !hashes_node.readable () || !hashes_node.has_children ())
11041106 {
11051107 Console.Warning (" [HashDatabase] Incomplete entry found." );
11061108 return false ;
11071109 }
11081110
11091111 GameDatabase::HashDatabaseEntry entry;
1110- node[" name" ] >> entry.name ;
1111- if (node.has_child (" version" ))
1112- node[" version" ] >> entry.version ;
1113- if (node.has_child (" serial" ))
1114- node[" serial" ] >> entry.serial ;
1112+ ryml::from_chars (name_node.val (), &entry.name );
1113+
1114+ if (const ryml::ConstNodeRef node = entry_node.find_child (" version" ); node.readable () && node.has_val ())
1115+ ryml::from_chars (node.val (), &entry.version );
1116+ if (const ryml::ConstNodeRef node = entry_node.find_child (" serial" ); node.readable () && node.has_val ())
1117+ ryml::from_chars (node.val (), &entry.serial );
11151118
11161119 const u32 index = static_cast <u32 >(s_hash_database.size ());
1117- for (const ryml::ConstNodeRef& n : node[ " hashes " ] .children ())
1120+ for (const ryml::ConstNodeRef& hash_node : hashes_node .children ())
11181121 {
1119- if (!n.is_map () || !n.has_child (" size" ) || !n.has_child (" md5" ))
1122+ const ryml::ConstNodeRef size_node = hash_node.find_child (" size" );
1123+ const ryml::ConstNodeRef md5_node = hash_node.find_child (" md5" );
1124+ if (!hash_node.is_map () || !size_node.readable () || !size_node.has_val () || !size_node.val ().is_integer () || !md5_node.readable ())
11201125 {
11211126 Console.ErrorFmt (" [HashDatabase] Incomplete hash definition in {}" , entry.name );
11221127 return false ;
11231128 }
11241129
11251130 GameDatabase::TrackHash th;
11261131 std::string md5;
1127- n[ " md5 " ] >> md5;
1128- n[ " size " ] >> th.size ;
1132+ ryml::from_chars (md5_node. val (), & md5) ;
1133+ ryml::from_chars (size_node. val (), & th.size ) ;
11291134
11301135 if (!th.parseHash (md5))
11311136 {
@@ -1164,20 +1169,20 @@ bool GameDatabase::loadHashDatabase()
11641169 ryml::csubstr yaml = ryml::to_csubstr (*buffer);
11651170
11661171 Error error;
1167- std::optional<ryml::Tree> tree = ParseYAMLFromString (yaml, ryml::to_csubstr (name), &error);
1172+ const std::optional<ryml::Tree> tree = ParseYAMLFromString (yaml, ryml::to_csubstr (name), &error);
11681173 if (!tree.has_value ())
11691174 {
11701175 Console.ErrorFmt (" [HashDatabase] Failed to parse hash database file {}:" , path);
11711176 Console.Error (error.GetDescription ());
11721177 return false ;
11731178 }
11741179
1175- ryml::NodeRef root = tree->rootref ();
1180+ ryml::ConstNodeRef root = tree->crootref ();
11761181
11771182 bool okay = true ;
1178- for (const ryml::NodeRef& n : root.children ())
1183+ for (const ryml::ConstNodeRef& entry_node : root.children ())
11791184 {
1180- if (!parseHashDatabaseEntry (n ))
1185+ if (!parseHashDatabaseEntry (entry_node ))
11811186 {
11821187 okay = false ;
11831188 break ;
0 commit comments