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 <assert.h>
#include "data.h"
#include "cpp.h"
+#include "debug.h"
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:
break;
case PSI_T_ENDIF:
case PSI_T_ELSE:
- case PSI_T_PRAGMA_ONCE:
break;
default:
assert(0);
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:
break;
case PSI_T_ENDIF:
case PSI_T_ELSE:
- case PSI_T_PRAGMA_ONCE:
break;
default:
assert(0);
}
}
-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->val);
+ PSI_DUMP(dump, "#%s ", exp->token->text->val);
switch (exp->type) {
case PSI_T_WARNING:
case PSI_T_ERROR:
case PSI_T_UNDEF:
case PSI_T_IFDEF:
case PSI_T_IFNDEF:
- dprintf(fd, "%s", exp->data.tok->text->val);
+ PSI_DUMP(dump, "%s", exp->data.tok->text->val);
break;
case PSI_T_IMPORT:
case PSI_T_INCLUDE:
case PSI_T_INCLUDE_NEXT:
if (exp->data.tok->type == PSI_T_CPP_HEADER) {
- dprintf(fd, "<%s>", exp->data.tok->text->val);
+ PSI_DUMP(dump, "<%s>", exp->data.tok->text->val);
} else {
- dprintf(fd, "\"%s\"", exp->data.tok->text->val);
+ 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_PRAGMA_ONCE:
break;
default:
assert(0);
break;
}
- dprintf(fd, "\n");
+ PSI_DUMP(dump, "\n");
}
exp->token->text->val, cpp->level, cpp->skip);
#if PSI_CPP_DEBUG
- fflush(stderr);
- dprintf(2, "PSI: CPP exec -> ");
- 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) {
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) {
case PSI_T_INCLUDE:
if (!cpp->skip) {
if (!psi_cpp_include(cpp, exp->data.tok, PSI_CPP_INCLUDE)) {
- D->error(D, exp->token, PSI_WARNING, "Failed to include %s", exp->data.tok->text->val);
+ 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, PSI_CPP_INCLUDE_NEXT)) {
- D->error(D, exp->token, PSI_WARNING, "Failed to include %s", exp->data.tok->text->val);
+ 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, PSI_CPP_INCLUDE_ONCE)) {
- D->error(D, exp->token, PSI_WARNING, "Failed to include %s", exp->data.tok->text->val);
+ D->error(D, exp->token, PSI_WARNING, "Failed to include once %s: %s",
+ exp->data.tok->text->val, strerror(errno));
}
}
break;
- case PSI_T_PRAGMA_ONCE:
- if (!cpp->skip) {
- zend_hash_add_empty_element(&cpp->once, exp->token->file);
- }
- break;
default:
assert(0);
break;