|
@@ -138,9 +138,50 @@ static TypeImpl *type_new(const TypeInfo *info)
|
|
|
return ti;
|
|
|
}
|
|
|
|
|
|
+static bool type_name_is_valid(const char *name)
|
|
|
+{
|
|
|
+ const int slen = strlen(name);
|
|
|
+ int plen;
|
|
|
+
|
|
|
+ g_assert(slen > 1);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Ideally, the name should start with a letter - however, we've got
|
|
|
+ * too many names starting with a digit already, so allow digits here,
|
|
|
+ * too (except '0' which is not used yet)
|
|
|
+ */
|
|
|
+ if (!g_ascii_isalnum(name[0]) || name[0] == '0') {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ plen = strspn(name, "abcdefghijklmnopqrstuvwxyz"
|
|
|
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
|
+ "0123456789-_.");
|
|
|
+
|
|
|
+ /* Allow some legacy names with '+' in it for compatibility reasons */
|
|
|
+ if (name[plen] == '+') {
|
|
|
+ if (plen == 6 && g_str_has_prefix(name, "power")) {
|
|
|
+ /* Allow "power5+" and "power7+" CPU names*/
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ if (plen >= 17 && g_str_has_prefix(name, "Sun-UltraSparc-I")) {
|
|
|
+ /* Allow "Sun-UltraSparc-IV+" and "Sun-UltraSparc-IIIi+" */
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return plen == slen;
|
|
|
+}
|
|
|
+
|
|
|
static TypeImpl *type_register_internal(const TypeInfo *info)
|
|
|
{
|
|
|
TypeImpl *ti;
|
|
|
+
|
|
|
+ if (!type_name_is_valid(info->name)) {
|
|
|
+ fprintf(stderr, "Registering '%s' with illegal type name\n", info->name);
|
|
|
+ abort();
|
|
|
+ }
|
|
|
+
|
|
|
ti = type_new(info);
|
|
|
|
|
|
type_table_add(ti);
|