+ if (!(predef = psi_parser_open_string(&parser, psi_cpp_predef, sizeof(psi_cpp_predef) - 1))) {
+ psi_parser_dtor(&parser);
+ return FAILURE;
+ }
+
+ if (!psi_parser_parse(&parser, predef)) {
+ psi_parser_input_free(&predef);
+ psi_parser_dtor(&parser);
+ return FAILURE;
+ }
+ psi_parser_input_free(&predef);
+
+ zend_hash_init(&psi_cpp_defaults, 0, NULL, NULL, 1);
+ zend_hash_copy(&psi_cpp_defaults, &parser.preproc->defs, NULL);
+
+ psi_parser_dtor(&parser);
+
+#define PSI_CPP_PRAGMA(name) \
+ zend_hash_str_add_ptr(&psi_cpp_pragmas, #name, strlen(#name), psi_cpp_pragma_ ## name)
+ zend_hash_init(&psi_cpp_pragmas, 0, NULL, NULL, 1);
+ PSI_CPP_PRAGMA(once);
+ PSI_CPP_PRAGMA(lib);
+ PSI_CPP_PRAGMA(blacklist_decl);
+ PSI_CPP_PRAGMA(blacklist_var);
+
+ return SUCCESS;
+}
+
+PHP_MSHUTDOWN_FUNCTION(psi_cpp);
+PHP_MSHUTDOWN_FUNCTION(psi_cpp)
+{
+ struct psi_cpp_macro_decl *macro;
+
+ ZEND_HASH_FOREACH_PTR(&psi_cpp_defaults, macro)
+ {
+ psi_cpp_macro_decl_free(¯o);
+ }
+ ZEND_HASH_FOREACH_END();
+
+ zend_hash_destroy(&psi_cpp_defaults);
+
+ return SUCCESS;