X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Ftypes%2Fcpp_exp.c;h=6b21b75ec6f281e361d603cd64c8c9dbe3f48a02;hp=2371ae25f1047fabd6f260b97de3e522688ebc49;hb=93d6b7f962a82b725d1918684297d68221b0b733;hpb=ba906e039ffe9e57842ce5135aa43efa00b8a4c6 diff --git a/src/types/cpp_exp.c b/src/types/cpp_exp.c index 2371ae2..6b21b75 100644 --- a/src/types/cpp_exp.c +++ b/src/types/cpp_exp.c @@ -23,16 +23,21 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *******************************************************************************/ -#include "php_psi_stdinc.h" +#ifdef HAVE_CONFIG_H +# include "config.h" +#else +# include "php_config.h" +#endif #include #include "data.h" #include "cpp.h" +#include "debug.h" struct psi_cpp_exp *psi_cpp_exp_init(token_t type, void *data) { - struct psi_cpp_exp *exp = calloc(1, sizeof(*exp)); + struct psi_cpp_exp *exp = pecalloc(1, sizeof(*exp), 1); switch ((exp->type = type)) { case PSI_T_WARNING: @@ -46,6 +51,7 @@ struct psi_cpp_exp *psi_cpp_exp_init(token_t type, void *data) exp->data.tok = data; break; case PSI_T_DEFINE: + case PSI_T_PRAGMA: exp->data.decl = data; break; case PSI_T_IF: @@ -54,7 +60,6 @@ struct psi_cpp_exp *psi_cpp_exp_init(token_t type, void *data) break; case PSI_T_ENDIF: case PSI_T_ELSE: - case PSI_T_ONCE: break; default: assert(0); @@ -73,20 +78,16 @@ void psi_cpp_exp_free(struct psi_cpp_exp **exp_ptr) switch (exp->type) { case PSI_T_WARNING: case PSI_T_ERROR: - if (!exp->data.tok) { - break; - } - /* no break */ case PSI_T_UNDEF: case PSI_T_IFDEF: case PSI_T_IFNDEF: case PSI_T_IMPORT: case PSI_T_INCLUDE: case PSI_T_INCLUDE_NEXT: - free(exp->data.tok); - exp->data.tok = NULL; + psi_token_free(&exp->data.tok); break; case PSI_T_DEFINE: + case PSI_T_PRAGMA: psi_cpp_macro_decl_free(&exp->data.decl); break; case PSI_T_IF: @@ -95,22 +96,20 @@ void psi_cpp_exp_free(struct psi_cpp_exp **exp_ptr) break; case PSI_T_ENDIF: case PSI_T_ELSE: - case PSI_T_ONCE: + case PSI_T_PRAGMA_ONCE: break; default: assert(0); break; } - if (exp->token) { - free(exp->token); - } + psi_token_free(&exp->token); free(exp); } } -void psi_cpp_exp_dump(int fd, struct psi_cpp_exp *exp) +void psi_cpp_exp_dump(struct psi_dump *dump, struct psi_cpp_exp *exp) { - dprintf(fd, "#%s ", exp->token->text); + PSI_DUMP(dump, "#%s ", exp->token->text->val); switch (exp->type) { case PSI_T_WARNING: case PSI_T_ERROR: @@ -121,27 +120,34 @@ void psi_cpp_exp_dump(int fd, struct psi_cpp_exp *exp) case PSI_T_UNDEF: case PSI_T_IFDEF: case PSI_T_IFNDEF: + PSI_DUMP(dump, "%s", exp->data.tok->text->val); + break; case PSI_T_IMPORT: case PSI_T_INCLUDE: case PSI_T_INCLUDE_NEXT: - dprintf(fd, "%s", exp->data.tok->text); + if (exp->data.tok->type == PSI_T_CPP_HEADER) { + PSI_DUMP(dump, "<%s>", exp->data.tok->text->val); + } else { + PSI_DUMP(dump, "\"%s\"", exp->data.tok->text->val); + } break; case PSI_T_DEFINE: - psi_cpp_macro_decl_dump(fd, exp->data.decl); + case PSI_T_PRAGMA: + psi_cpp_macro_decl_dump(dump, exp->data.decl); break; case PSI_T_IF: case PSI_T_ELIF: - psi_num_exp_dump(fd, exp->data.num); + psi_num_exp_dump(dump, exp->data.num); break; case PSI_T_ENDIF: case PSI_T_ELSE: - case PSI_T_ONCE: + case PSI_T_PRAGMA_ONCE: break; default: assert(0); break; } - dprintf(fd, "\n"); + PSI_DUMP(dump, "\n"); } @@ -182,23 +188,24 @@ static inline void psi_cpp_level_unmask(struct psi_cpp *cpp) void psi_cpp_exp_exec(struct psi_cpp_exp *exp, struct psi_cpp *cpp, struct psi_data *D) { PSI_DEBUG_PRINT(D, "PSI: CPP EVAL < %s (level=%u, skip=%u)\n", - exp->token->text, cpp->level, cpp->skip); + exp->token->text->val, cpp->level, cpp->skip); #if PSI_CPP_DEBUG - psi_cpp_exp_dump(2, exp); + PSI_DEBUG_PRINT(cpp->parser, "PSI: CPP exec -> "); + PSI_DEBUG_DUMP(cpp->parser, psi_cpp_exp_dump, exp); #endif switch (exp->type) { case PSI_T_ERROR: if (!cpp->skip) { D->error(D, exp->token, PSI_ERROR, "%s", - exp->data.tok ? exp->data.tok->text : ""); + exp->data.tok ? exp->data.tok->text->val : ""); } break; case PSI_T_WARNING: if (!cpp->skip) { D->error(D, exp->token, PSI_WARNING, "%s", - exp->data.tok ? exp->data.tok->text : ""); + exp->data.tok ? exp->data.tok->text->val : ""); } break; case PSI_T_UNDEF: @@ -213,6 +220,11 @@ void psi_cpp_exp_exec(struct psi_cpp_exp *exp, struct psi_cpp *cpp, struct psi_d exp->data.decl = NULL; } break; + case PSI_T_PRAGMA: + if (!cpp->skip) { + psi_cpp_pragma(cpp, exp->data.decl); + } + break; case PSI_T_IFDEF: ++cpp->level; if (!cpp->skip) { @@ -296,27 +308,31 @@ void psi_cpp_exp_exec(struct psi_cpp_exp *exp, struct psi_cpp *cpp, struct psi_d break; case PSI_T_INCLUDE: if (!cpp->skip) { - if (!psi_cpp_include(cpp, exp->data.tok->text, PSI_CPP_INCLUDE)) { - D->error(D, exp->token, PSI_WARNING, "Failed to include %s", exp->data.tok->text); + if (!psi_cpp_include(cpp, exp->data.tok, PSI_CPP_INCLUDE)) { + D->error(D, exp->token, PSI_WARNING, "Failed to include %s: %s", + exp->data.tok->text->val, strerror(errno)); } } break; case PSI_T_INCLUDE_NEXT: if (!cpp->skip) { - if (!psi_cpp_include(cpp, exp->data.tok->text, PSI_CPP_INCLUDE_NEXT)) { - D->error(D, exp->token, PSI_WARNING, "Failed to include %s", exp->data.tok->text); + if (!psi_cpp_include(cpp, exp->data.tok, PSI_CPP_INCLUDE_NEXT)) { + D->error(D, exp->token, PSI_WARNING, "Failed to include next %s: %s", + exp->data.tok->text->val, strerror(errno)); } } break; case PSI_T_IMPORT: if (!cpp->skip) { - if (!psi_cpp_include(cpp, exp->data.tok->text, PSI_CPP_INCLUDE_ONCE)) { - D->error(D, exp->token, PSI_WARNING, "Failed to include %s", exp->data.tok->text); + if (!psi_cpp_include(cpp, exp->data.tok, PSI_CPP_INCLUDE_ONCE)) { + D->error(D, exp->token, PSI_WARNING, "Failed to include once %s: %s", + exp->data.tok->text->val, strerror(errno)); } } - case PSI_T_ONCE: + break; + case PSI_T_PRAGMA_ONCE: if (!cpp->skip) { - zend_hash_str_add_empty_element(&cpp->once, exp->token->file, strlen(exp->token->file)); + zend_hash_add_empty_element(&cpp->once, exp->token->file); } break; default: @@ -325,5 +341,5 @@ void psi_cpp_exp_exec(struct psi_cpp_exp *exp, struct psi_cpp *cpp, struct psi_d } PSI_DEBUG_PRINT(D, "PSI: CPP EVAL > %s (level=%u, skip=%u)\n", - exp->token->text, cpp->level, cpp->skip); + exp->token->text->val, cpp->level, cpp->skip); }