Update RDB building to ignore missing keys

This change makes it so that when building the RDB files, the entries that are missing `serial` keys will simply be ignored and the RDB file will still build. When it's missing the key, it also logs which line it's processing so that we can easily fix the broken entry in libretro-database.
This commit is contained in:
Rob Loach 2017-06-07 10:43:56 -04:00 committed by GitHub
parent 0dd2304e7c
commit 11f8938f7e

View File

@ -192,7 +192,7 @@ static dat_converter_bt_node_t* dat_converter_bt_node_insert(
{
int i;
retro_assert(list->values[(*node)->index].map.value.list->type
retro_assert(list->values[(*node)->index].map.value.list->type
== map->value.list->type);
for (i = 0; i < map->value.list->count; i++)
@ -241,7 +241,7 @@ static void dat_converter_list_append(dat_converter_list_t* dst, void* item)
else
{
map->hash = djb2_calculate(map->key);
dat_converter_bt_node_t* new_node =
dat_converter_bt_node_t* new_node =
dat_converter_bt_node_insert(dst, &dst->bt_root, map);
if (!new_node)
@ -268,7 +268,7 @@ static void dat_converter_list_append(dat_converter_list_t* dst, void* item)
static dat_converter_list_t* dat_converter_lexer(
char* src, const char* dat_path)
{
dat_converter_list_t* token_list =
dat_converter_list_t* token_list =
dat_converter_list_create(DAT_CONVERTER_TOKEN_LIST);
dat_converter_token_t token = {NULL, 1, 1, dat_path};
bool quoted_token = false;
@ -332,7 +332,7 @@ static dat_converter_list_t* dat_converter_lexer(
static dat_converter_list_t* dat_parser_table(
dat_converter_list_item_t** start_token)
{
dat_converter_list_t* parsed_table =
dat_converter_list_t* parsed_table =
dat_converter_list_create(DAT_CONVERTER_MAP_LIST);
dat_converter_map_t map = {0};
dat_converter_list_item_t* current = *start_token;
@ -527,23 +527,27 @@ static dat_converter_list_t* dat_converter_parser(
if (match_key)
{
map.key = dat_converter_get_match(map.value.list, match_key);
// If the key is not found, report, and mark it to be skipped.
if (!map.key)
{
printf("missing match key '");
printf("Missing match key '");
while (match_key->next)
{
printf("%s.", match_key->value);
match_key = match_key->next;
}
printf("%s' in one of the entries\n", match_key->value);
dat_converter_exit(1);
printf("%s' on line %d\n", match_key->value, current->token.line_no);
skip = true;
}
}
else
map.key = NULL;
dat_converter_list_append(target, &map);
skip = true;
// If we are still not to skip the entry, append it to the list.
if (!skip) {
dat_converter_list_append(target, &map);
skip = true;
}
}
else
dat_converter_list_free(map.value.list);
@ -619,7 +623,7 @@ dat_converter_rdb_mappings_t rdb_mappings[] =
{"rom.serial", "serial", DAT_CONVERTER_RDB_TYPE_BINARY}
};
dat_converter_match_key_t* rdb_mappings_mk[(sizeof(rdb_mappings)
dat_converter_match_key_t* rdb_mappings_mk[(sizeof(rdb_mappings)
/ sizeof(*rdb_mappings))] = {0};
static void dat_converter_value_provider_init(void)
@ -695,7 +699,7 @@ static int dat_converter_value_provider(
case DAT_CONVERTER_RDB_TYPE_HEX:
current->value.type = RDT_BINARY;
current->value.val.binary.len = strlen(value) / 2;
current->value.val.binary.buff =
current->value.val.binary.buff =
malloc(current->value.val.binary.len);
{
const char* hex_char = value;
@ -812,11 +816,11 @@ int main(int argc, char** argv)
dat_converter_exit(1);
}
dat_converter_list_item_t* current_item =
dat_converter_list_item_t* current_item =
&dat_parser_list->values[dat_parser_list->count];
dat_converter_value_provider_init();
libretrodb_create(rdb_file,
libretrodb_create(rdb_file,
(libretrodb_value_provider)&dat_converter_value_provider,
&current_item);
dat_converter_value_provider_free();
@ -833,4 +837,3 @@ int main(int argc, char** argv)
return 0;
}