- if (count_structs) {
- size_t i = 0;
- struct psi_decl_struct *str;
-
- while (psi_plist_get(check_structs, i++, &str)) {
- *dst->last_error = 0;
- dst->structs = psi_plist_add(dst->structs, &str);
- PSI_DEBUG_PRINT(dst, "PSI: validate struct %s ", str->name);
- if (psi_decl_struct_validate(PSI_DATA(dst), str, &type_stack)) {
- PSI_DEBUG_PRINT(dst, "%s ::(%zu, %zu)\n", "✔", str->align, str->size);
- } else {
- PSI_DEBUG_PRINT(dst, "%s (%s)\n", "✘", dst->last_error);
- recheck_structs = psi_plist_add(recheck_structs, &str);
- psi_plist_pop(dst->structs, NULL);
- }
- }
- }
- if (count_unions) {
- size_t i = 0;
- struct psi_decl_union *unn;
-
- while (psi_plist_get(check_unions, i++, &unn)) {
- *dst->last_error = 0;
- dst->unions = psi_plist_add(dst->unions, &unn);
- PSI_DEBUG_PRINT(dst, "PSI: validate union %s ", unn->name);
- if (psi_decl_union_validate(PSI_DATA(dst), unn, &type_stack)) {
- PSI_DEBUG_PRINT(dst, "%s ::(%zu, %zu)\n", "✔", unn->align, unn->size);
- } else {
- PSI_DEBUG_PRINT(dst, "%s (%s)\n", "✘", dst->last_error);
- recheck_unions = psi_plist_add(recheck_unions, &unn);
- psi_plist_pop(dst->unions, NULL);
- }
- }
- }
- if (count_enums) {
- size_t i = 0;
- struct psi_decl_enum *enm;
-
- while (psi_plist_get(check_enums, i++, &enm)) {
- *dst->last_error = 0;
- PSI_DEBUG_PRINT(dst, "PSI: validate enum %s ", enm->name);
- if (psi_decl_enum_validate(PSI_DATA(dst), enm)) {
- PSI_DEBUG_PRINT(dst, "%s\n", "✔");
- dst->enums = psi_plist_add(dst->enums, &enm);
- } else {
- PSI_DEBUG_PRINT(dst, "%s (%s)\n", "✘", dst->last_error);
- recheck_enums = psi_plist_add(recheck_enums, &enm);
- }
- }
- }
- if (count_decls) {
- size_t i = 0;
- struct psi_decl *decl;
-
- while (psi_plist_get(check_decls, i++, &decl)) {
- *dst->last_error = 0;
- PSI_DEBUG_PRINT(dst, "PSI: validate decl %s ", decl->func->var->name);
- if (psi_decl_validate(PSI_DATA(dst), decl, dlopened, &type_stack)) {
- PSI_DEBUG_PRINT(dst, "%s\n", "✔");
- dst->decls = psi_plist_add(dst->decls, &decl);
- } else {
- PSI_DEBUG_PRINT(dst, "%s (%s)\n", "✘", dst->last_error);
- recheck_decls = psi_plist_add(recheck_decls, &decl);
- }
- }
- }
- }
-
- if (check_types && check_types != src->types) {
- psi_plist_free(check_types);
- }
- check_types = recheck_types;
- if (check_structs && check_structs != src->structs) {
- psi_plist_free(check_structs);
- }
- check_structs = recheck_structs;
- if (check_unions && check_unions != src->unions) {
- psi_plist_free(check_unions);
- }
- check_unions = recheck_unions;
- if (check_enums && check_enums != src->enums) {
- psi_plist_free(check_enums);
- }
- check_enums = recheck_enums;
- if (check_decls && check_decls != src->decls) {
- psi_plist_free(check_decls);
- }
- check_decls = recheck_decls;
- }
-
- /* reset original flags */
- dst->flags = flags;
-
- if (dst->structs) {
- size_t i = 0;
- struct psi_decl_struct *str;
-
- while (psi_plist_get(dst->structs, i++, &str)) {
- size_t nlen = strlen(str->name);
- size_t slen = sizeof("psi\\SIZEOF_STRUCT_");
- size_t alen = sizeof("psi\\ALIGNOF_STRUCT_");
- char *nptr = str->name, *sname, *aname;
- struct psi_const *cnst;
- struct psi_const_type *ctyp;
- struct psi_impl_def_val *cval;
-
- sname = malloc(slen + nlen + 1);
- strcpy(sname, "psi\\SIZEOF_STRUCT_");
- aname = malloc(alen + nlen + 1);
- strcpy(aname, "psi\\ALIGNOF_STRUCT_");
-
- nptr = str->name;
- while (*nptr) {
- size_t off = nptr - str->name;
- sname[slen - 1 + off] = aname[alen - 1 + off] = toupper(*nptr++);