+void psi_data_dump(int fd, struct psi_data *D)
+{
+ if (D->file.fn) {
+ dprintf(fd, "// filename=%s (%u errors)\n", D->file.fn, D->errors);
+ if (D->file.ln) {
+ dprintf(fd, "lib \"%s\";\n", D->file.ln);
+ }
+ } else {
+ dprintf(fd, "// builtin predef\n");
+ }
+ if (psi_plist_count(D->types)) {
+ size_t i = 0;
+ struct psi_decl_arg *def;
+
+ while (psi_plist_get(D->types, i++, &def)) {
+ dprintf(fd, "typedef ");
+ psi_decl_arg_dump(fd, def, 0);
+ dprintf(fd, ";\n");
+ }
+ dprintf(fd, "\n");
+ }
+ if (psi_plist_count(D->unions)) {
+ size_t i = 0;
+ struct psi_decl_union *unn;
+
+ while (psi_plist_get(D->unions, i++, &unn)) {
+ if (!psi_decl_type_is_anon(unn->name, "union")) {
+ psi_decl_union_dump(fd, unn);
+ dprintf(fd, "\n");
+ }
+ }
+ dprintf(fd, "\n");
+ }
+ if (psi_plist_count(D->structs)) {
+ size_t i = 0;
+ struct psi_decl_struct *strct;
+
+ while (psi_plist_get(D->structs, i++, &strct)) {
+ if (!psi_decl_type_is_anon(strct->name, "struct")) {
+ psi_decl_struct_dump(fd, strct);
+ dprintf(fd, "\n");
+ }
+ }
+ dprintf(fd, "\n");
+ }
+ if (psi_plist_count(D->enums)) {
+ size_t i = 0;
+ struct psi_decl_enum *enm;
+
+ while (psi_plist_get(D->enums, i++, &enm)) {
+ if (!psi_decl_type_is_anon(enm->name, "enum")) {
+ psi_decl_enum_dump(fd, enm, 0);
+ dprintf(fd, "\n");
+ }
+ }
+ dprintf(fd, "\n");
+ }
+ if (psi_plist_count(D->consts)) {
+ size_t i = 0;
+ struct psi_const *c;
+
+ while (psi_plist_get(D->consts, i++, &c)) {
+ psi_const_dump(fd, c);
+ dprintf(fd, "\n");
+ }
+ dprintf(fd, "\n");
+ }
+ if (psi_plist_count(D->decls)) {
+ size_t i = 0;
+ struct psi_decl *decl;
+
+ while (psi_plist_get(D->decls, i++, &decl)) {
+ psi_decl_dump(fd, decl);
+ dprintf(fd, "\n");
+ }
+ dprintf(fd, "\n");
+ }
+ if (psi_plist_count(D->vars)) {
+ size_t i = 0;
+ struct psi_decl_extvar *evar;
+
+ while (psi_plist_get(D->vars, i++, &evar)) {
+ psi_decl_extvar_dump(fd, evar);
+ }
+ dprintf(fd, "\n");
+ }
+ if (psi_plist_count(D->impls)) {
+ size_t i = 0;
+ struct psi_impl *impl;
+
+ while (psi_plist_get(D->impls, i++, &impl)) {
+ psi_impl_dump(fd, impl);
+ dprintf(fd, "\n");
+ }
+ dprintf(fd, "\n");
+ }
+}