X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Fdata.c;h=9bcd493d711b9eca7a2449cfcbac380a5f117b9f;hp=193f49c94fbf68f1b67650dd7e04323b9126f1e2;hb=2d34b0c215608bc3eae007ce5f4e80eae3c1e147;hpb=02e801eabbe26a129ea05e6723c94e10bb653dab diff --git a/src/data.c b/src/data.c index 193f49c..9bcd493 100644 --- a/src/data.c +++ b/src/data.c @@ -24,6 +24,7 @@ *******************************************************************************/ #include "php_psi_stdinc.h" +#include "php_psi.h" #include "data.h" #include "php_globals.h" @@ -31,15 +32,32 @@ #include #include +static void psi_data_ctor_internal(struct psi_data *data, + psi_error_cb error, unsigned flags) +{ + data->error = error; + data->flags = flags; + + if (data->flags & PSI_DEBUG) { + int fd = psi_fdopen(getenv("PSI_DEBUG")); + + if (fd > 0) { + data->debug_fd = fd; + } else { + data->debug_fd = STDERR_FILENO; + } + } +} + struct psi_data *psi_data_ctor_with_dtors(struct psi_data *data, psi_error_cb error, unsigned flags) { if (!data) { - data = calloc(1, sizeof(*data)); + data = pecalloc(1, sizeof(*data), 1); } - data->error = error; - data->flags = flags; + psi_data_ctor_internal(data, error, flags); + if (!data->file.libnames) { data->file.libnames = psi_plist_init((psi_plist_dtor) psi_names_free); } @@ -78,11 +96,10 @@ struct psi_data *psi_data_ctor(struct psi_data *data, psi_error_cb error, unsigned flags) { if (!data) { - data = calloc(1, sizeof(*data)); + data = pecalloc(1, sizeof(*data), 1); } - data->error = error; - data->flags = flags; + psi_data_ctor_internal(data, error, flags); if (!data->file.libnames) { data->file.libnames = psi_plist_init(NULL); @@ -121,7 +138,7 @@ struct psi_data *psi_data_ctor(struct psi_data *data, psi_error_cb error, struct psi_data *psi_data_exchange(struct psi_data *dest, struct psi_data *src) { if (!dest) { - dest = malloc(sizeof(*dest)); + dest = pemalloc(sizeof(*dest), 1); } *dest = *src; memset(src, 0, sizeof(*src)); @@ -130,6 +147,9 @@ struct psi_data *psi_data_exchange(struct psi_data *dest, struct psi_data *src) void psi_data_dtor(struct psi_data *data) { + if (data->debug_fd) { + close(data->debug_fd); + } if (data->consts) { psi_plist_free(data->consts); } @@ -158,29 +178,27 @@ void psi_data_dtor(struct psi_data *data) psi_decl_file_dtor(&data->file); } -void psi_data_dump(int fd, struct psi_data *D) +void psi_data_dump(struct psi_dump *dump, struct psi_data *D) { - if (D->file.filename) { - size_t i = 0; - char *libname; + size_t i = 0; + char *libname; - dprintf(fd, "// filename=%s (%u errors)\n", D->file.filename, D->errors); - while (psi_plist_get(D->file.libnames, i++, &libname)) { - dprintf(fd, "lib \"%s\";\n", libname); - } - } else { - dprintf(fd, "// builtin predef\n"); + if (D->file.filename) { + PSI_DUMP(dump, "// filename=%s (%u errors)\n", D->file.filename->val, D->errors); + } + while (psi_plist_get(D->file.libnames, i++, &libname)) { + PSI_DUMP(dump, "lib \"%s\";\n", libname); } 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"); + PSI_DUMP(dump, "typedef "); + psi_decl_arg_dump(dump, def, 0); + PSI_DUMP(dump, ";\n"); } - dprintf(fd, "\n"); + PSI_DUMP(dump, "\n"); } if (psi_plist_count(D->unions)) { size_t i = 0; @@ -188,11 +206,11 @@ void psi_data_dump(int fd, struct psi_data *D) 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"); + psi_decl_union_dump(dump, unn); + PSI_DUMP(dump, "\n"); } } - dprintf(fd, "\n"); + PSI_DUMP(dump, "\n"); } if (psi_plist_count(D->structs)) { size_t i = 0; @@ -200,11 +218,11 @@ void psi_data_dump(int fd, struct psi_data *D) 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"); + psi_decl_struct_dump(dump, strct); + PSI_DUMP(dump, "\n"); } } - dprintf(fd, "\n"); + PSI_DUMP(dump, "\n"); } if (psi_plist_count(D->enums)) { size_t i = 0; @@ -212,49 +230,55 @@ void psi_data_dump(int fd, struct psi_data *D) 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"); + psi_decl_enum_dump(dump, enm, 0); + PSI_DUMP(dump, "\n"); } } - dprintf(fd, "\n"); + PSI_DUMP(dump, "\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"); + psi_const_dump(dump, c); + PSI_DUMP(dump, "\n"); } - dprintf(fd, "\n"); + PSI_DUMP(dump, "\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"); + if (decl->extvar) { + PSI_DUMP(dump, "/* extvar accessor\n"); + } + psi_decl_dump(dump, decl); + PSI_DUMP(dump, "\n"); + if (decl->extvar) { + PSI_DUMP(dump, " extvar accessor */\n"); + } } - dprintf(fd, "\n"); + PSI_DUMP(dump, "\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); + psi_decl_extvar_dump(dump, evar); } - dprintf(fd, "\n"); + PSI_DUMP(dump, "\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"); + psi_impl_dump(dump, impl); + PSI_DUMP(dump, "\n"); } - dprintf(fd, "\n"); + PSI_DUMP(dump, "\n"); } }