diff --git a/hash/bbcb_cass.xml b/hash/bbcb_cass.xml index a9f223fc315..d7cd2c11f68 100644 --- a/hash/bbcb_cass.xml +++ b/hash/bbcb_cass.xml @@ -15256,7 +15256,7 @@ - + Fun School 2 (For 6-8 year olds) 1989 Database Educational Software @@ -15267,7 +15267,7 @@ - + Fun School 2 (For the Over-8s) 1989 Database Educational Software @@ -15278,7 +15278,7 @@ - + Fun School 2 (For Under 6s) 1989 Database Educational Software diff --git a/hash/bbcb_flop_orig.xml b/hash/bbcb_flop_orig.xml index afd684b0e17..482f43af366 100644 --- a/hash/bbcb_flop_orig.xml +++ b/hash/bbcb_flop_orig.xml @@ -3730,7 +3730,7 @@ - + Fun School 2 (For 6-8 year olds) 1989 Database Educational Software @@ -3741,7 +3741,7 @@ - + Fun School 2 (For the Over-8s) 1989 Database Educational Software diff --git a/hash/electron_cass.xml b/hash/electron_cass.xml index 07640fde2f7..5148240ac97 100644 --- a/hash/electron_cass.xml +++ b/hash/electron_cass.xml @@ -3991,7 +3991,7 @@ - + Fun School 2 (For 6-8 year olds) 1989 Database Educational Software @@ -4002,7 +4002,7 @@ - + Fun School 2 (For the Over-8s) 1989 Database Educational Software @@ -4013,7 +4013,7 @@ - + Fun School 2 (For Under 6s) 1989 Database Educational Software diff --git a/hash/m5_cart.xml b/hash/m5_cart.xml index e4c828aaee2..15c9c882048 100644 --- a/hash/m5_cart.xml +++ b/hash/m5_cart.xml @@ -621,7 +621,7 @@ come from... they might be eventually removed --> - + EM-5 Expansion memory 32Kb 198? Sord diff --git a/hash/tvc_flop.xml b/hash/tvc_flop.xml index 62528de7e68..4644a07cb3b 100644 --- a/hash/tvc_flop.xml +++ b/hash/tvc_flop.xml @@ -9178,7 +9178,7 @@ If the program doesn't automatically start, start it with RUN - + TVC-Assembler v1.0 198? <unknown> diff --git a/hash/unichamp.xml b/hash/unichamp.xml index c4aae48a0db..a6d104c20d6 100644 --- a/hash/unichamp.xml +++ b/hash/unichamp.xml @@ -3,7 +3,7 @@ - + Professional Poker Games 1977 Unisonic @@ -15,7 +15,7 @@ - + Assorted Family Fun 1977 Unisonic @@ -27,7 +27,7 @@ - + Family Card Games 1977 Unisonic @@ -39,7 +39,7 @@ - + Math 1977 Unisonic diff --git a/src/emu/softlist_dev.cpp b/src/emu/softlist_dev.cpp index 013dd7898e4..8532b611e5a 100644 --- a/src/emu/softlist_dev.cpp +++ b/src/emu/softlist_dev.cpp @@ -419,6 +419,8 @@ void software_list_device::internal_validity_check(validity_checker &valid) softlist_map descriptions; for (const software_info &swinfo : get_info()) { + std::string const &shortname(swinfo.shortname()); + // first parse and output core errors if any if (m_errors.length() > 0) { @@ -431,52 +433,51 @@ void software_list_device::internal_validity_check(validity_checker &valid) // Did we lost any description? if (swinfo.longname().empty()) { - osd_printf_error("%s: %s has no description\n", filename(), swinfo.shortname().c_str()); + osd_printf_error("%s: %s has no description\n", filename(), shortname.c_str()); break; } // Did we lost any year? if (swinfo.year().empty()) { - osd_printf_error("%s: %s has no year\n", filename(), swinfo.shortname().c_str()); + osd_printf_error("%s: %s has no year\n", filename(), shortname.c_str()); break; } // Did we lost any publisher? if (swinfo.publisher().empty()) { - osd_printf_error("%s: %s has no publisher\n", filename(), swinfo.shortname().c_str()); + osd_printf_error("%s: %s has no publisher\n", filename(), shortname.c_str()); break; } // Did we lost the software parts? if (swinfo.parts().empty()) { - osd_printf_error("%s: %s has no part\n", filename(), swinfo.shortname().c_str()); + osd_printf_error("%s: %s has no part\n", filename(), shortname.c_str()); break; } // Second, since the xml is fine, run additional checks: // check for duplicate names - if (!names.insert(std::make_pair(swinfo.shortname(), &swinfo)).second) + if (!names.insert(std::make_pair(shortname, &swinfo)).second) { - const software_info *match = names.find(swinfo.shortname())->second; - osd_printf_error("%s: %s is a duplicate name (%s)\n", filename(), swinfo.shortname().c_str(), match->shortname().c_str()); + const software_info *match = names.find(shortname)->second; + osd_printf_error("%s: %s is a duplicate name (%s)\n", filename(), shortname.c_str(), match->shortname().c_str()); } // check for duplicate descriptions - std::string longname = std::string(swinfo.longname()); + std::string longname(swinfo.longname()); if (!descriptions.insert(std::make_pair(strmakelower(longname), &swinfo)).second) - osd_printf_error("%s: %s is a duplicate description (%s)\n", filename(), swinfo.longname().c_str(), swinfo.shortname().c_str()); + osd_printf_error("%s: %s is a duplicate description (%s)\n", filename(), swinfo.longname().c_str(), shortname.c_str()); - bool is_clone = false; - if (!swinfo.parentname().empty()) + bool const is_clone(!swinfo.parentname().empty()); + if (is_clone) { - is_clone = true; - if (swinfo.parentname() == swinfo.shortname()) + if (swinfo.parentname() == shortname) { - osd_printf_error("%s: %s is set as a clone of itself\n", filename(), swinfo.shortname().c_str()); + osd_printf_error("%s: %s is set as a clone of itself\n", filename(), shortname.c_str()); break; } @@ -484,21 +485,29 @@ void software_list_device::internal_validity_check(validity_checker &valid) const software_info *swinfo2 = find(swinfo.parentname().c_str()); if (swinfo2 == nullptr) - osd_printf_error("%s: parent '%s' software for '%s' not found\n", filename(), swinfo.parentname().c_str(), swinfo.shortname().c_str()); + osd_printf_error("%s: parent '%s' software for '%s' not found\n", filename(), swinfo.parentname().c_str(), shortname.c_str()); else if (!swinfo2->parentname().empty()) - osd_printf_error("%s: %s is a clone of a clone\n", filename(), swinfo.shortname().c_str()); + osd_printf_error("%s: %s is a clone of a clone\n", filename(), shortname.c_str()); } - // make sure the driver name is 8 chars or less - if ((is_clone && swinfo.shortname().length() > NAME_LEN_CLONE) || (!is_clone && swinfo.shortname().length() > NAME_LEN_PARENT)) - osd_printf_error("%s: %s %s driver name must be %d characters or less\n", filename(), swinfo.shortname().c_str(), - is_clone ? "clone" : "parent", is_clone ? NAME_LEN_CLONE : NAME_LEN_PARENT); + // make sure the driver name isn't too long + if (shortname.length() > (is_clone ? NAME_LEN_CLONE : NAME_LEN_PARENT)) + osd_printf_error("%s: %s %s software name must be %d characters or less\n", filename(), shortname.c_str(), + is_clone ? "clone" : "parent", is_clone ? NAME_LEN_CLONE : NAME_LEN_PARENT); + + // make sure the driver name doesn't contain invalid characters + for (char ch : shortname) + if (((ch < '0') || (ch > '9')) && ((ch < 'a') || (ch > 'z')) && (ch != '_')) + { + osd_printf_error("%s: %s contains invalid characters\n", filename(), shortname.c_str()); + break; + } // make sure the year is only digits, '?' or '+' - for (const char *s = swinfo.year().c_str(); *s != 0; s++) - if (!isdigit((UINT8)*s) && *s != '?' && *s != '+') + for (char ch : swinfo.year()) + if (!isdigit(UINT8(ch)) && (ch != '?') && (ch != '+')) { - osd_printf_error("%s: %s has an invalid year '%s'\n", filename(), swinfo.shortname().c_str(), swinfo.year().c_str()); + osd_printf_error("%s: %s has an invalid year '%s'\n", filename(), shortname.c_str(), swinfo.year().c_str()); break; } @@ -506,18 +515,16 @@ void software_list_device::internal_validity_check(validity_checker &valid) for (const software_part &part : swinfo.parts()) { if (part.interface().empty()) - osd_printf_error("%s: %s has a part (%s) without interface\n", filename(), swinfo.shortname().c_str(), part.name().c_str()); + osd_printf_error("%s: %s has a part (%s) without interface\n", filename(), shortname.c_str(), part.name().c_str()); if (part.romdata().empty()) - osd_printf_error("%s: %s has a part (%s) with no data\n", filename(), swinfo.shortname().c_str(), part.name().c_str()); + osd_printf_error("%s: %s has a part (%s) with no data\n", filename(), shortname.c_str(), part.name().c_str()); if (!part_names.insert(std::make_pair(part.name(), &swinfo)).second) - osd_printf_error("%s: %s has a part (%s) whose name is duplicate\n", filename(), swinfo.shortname().c_str(), part.name().c_str()); + osd_printf_error("%s: %s has a part (%s) whose name is duplicate\n", filename(), shortname.c_str(), part.name().c_str()); } } // release all the memory release(); } - -