- else if (cat == ID_UNKNOWN) /* Nested entries in RFU blocks are skipped */
- continue;
- else if (nest == 1) /* Nesting level 1 */
- switch (cat)
- {
- case ID_VENDOR:
- case ID_DEVICE:
- case ID_SUBSYSTEM:
- if ((id2 = id_hex(p, 4)) < 0 || !id_white_p(p[4]))
- return parse_error;
- p += 5;
- cat = ID_DEVICE;
- id3 = id4 = 0;
- break;
- case ID_GEN_SUBSYSTEM:
- if ((id2 = id_hex(p, 4)) < 0 || !id_white_p(p[4]))
- return parse_error;
- p += 5;
- id3 = id4 = 0;
- break;
- case ID_CLASS:
- case ID_SUBCLASS:
- case ID_PROGIF:
- if ((id2 = id_hex(p, 2)) < 0 || !id_white_p(p[2]))
- return parse_error;
- p += 3;
- cat = ID_SUBCLASS;
- id3 = id4 = 0;
- break;
- default:
- return parse_error;
- }
- else if (nest == 2) /* Nesting level 2 */
- switch (cat)
- {
- case ID_DEVICE:
- case ID_SUBSYSTEM:
- if ((id3 = id_hex(p, 4)) < 0 || !id_white_p(p[4]) || (id4 = id_hex(p+5, 4)) < 0 || !id_white_p(p[9]))
- return parse_error;
- p += 10;
- cat = ID_SUBSYSTEM;
- break;
- case ID_CLASS:
- case ID_SUBCLASS:
- case ID_PROGIF:
- if ((id3 = id_hex(p, 2)) < 0 || !id_white_p(p[2]))
- return parse_error;
- p += 3;
- cat = ID_PROGIF;
- id4 = 0;
- break;
- default:
- return parse_error;
- }
- else /* Nesting level 3 or more */
- return parse_error;
- while (id_white_p(*p))
- p++;
- if (!*p)
- return parse_error;
- if (id_insert(a, cat, id1, id2, id3, id4, p))
- return "Duplicate entry";
- }
- return NULL;
-}
-
-int
-pci_load_name_list(struct pci_access *a)
-{
- FILE *f;
- int lino;
- const char *err;
-
- pci_free_name_list(a);
- a->hash_load_failed = 1;
- if (!(f = fopen(a->id_file_name, "r")))
- return 0;
- a->id_hash = pci_malloc(a, sizeof(struct id_entry *) * HASH_SIZE);
- bzero(a->id_hash, sizeof(struct id_entry *) * HASH_SIZE);
- err = id_parse_list(a, f, &lino);
- if (!err && ferror(f))
- err = "I/O error";
- fclose(f);
- if (err)
- a->error("%s at %s, line %d\n", err, a->id_file_name, lino);
- a->hash_load_failed = 0;
- return 1;
-}
-
-void
-pci_free_name_list(struct pci_access *a)
-{
- pci_mfree(a->id_hash);
- a->id_hash = NULL;
- while (a->current_id_bucket)
- {
- struct id_bucket *buck = a->current_id_bucket;
- a->current_id_bucket = buck->next;
- pci_mfree(buck);