- id = keys[key].name;
- switch (keys[key].type)
- {
- case REPOKEY_TYPE_IDARRAY:
- if (id != REPODATA_KEYS)
- {
- skip_item(maindata, REPOKEY_TYPE_IDARRAY, numid, numrel);
- break;
- }
- /* read_idarray writes a terminating 0, that's why the + 1 */
- ida = sat_calloc(keys[key].size + 1, sizeof(Id));
- ide = read_idarray(maindata, numid, idmap, ida, ida + keys[key].size + 1);
- n = ide - ida - 1;
- if (n & 1)
- {
- pool_debug (mypool, SAT_ERROR, "invalid attribute data\n");
- maindata->error = SOLV_ERROR_CORRUPT;
- return;
- }
- data->nkeys = 1 + (n >> 1);
- data->keys = sat_malloc2(data->nkeys, sizeof(data->keys[0]));
- memset(data->keys, 0, sizeof(Repokey));
- for (i = 1, ide = ida; i < data->nkeys; i++)
- {
- data->keys[i].name = *ide++;
- data->keys[i].type = *ide++;
- data->keys[i].size = 0;
- data->keys[i].storage = 0;
- }
- sat_free(ida);
- if (data->nkeys > 2)
- qsort(data->keys + 1, data->nkeys - 1, sizeof(data->keys[0]), key_cmp);
- break;
- case REPOKEY_TYPE_STR:
- if (id != REPODATA_LOCATION)
- skip_item(maindata, REPOKEY_TYPE_STR, numid, numrel);
- else
- {
- char buf[1024];
- unsigned len = sizeof(buf);
- char *filename = buf;
- read_str(maindata, &filename, &len);
- data->location = strdup(filename);
- if (filename != buf)
- free(filename);
- }
- break;
- default:
- skip_item(maindata, keys[key].type, numid, numrel);
- break;
- }