BEGIN_EXTERN_C()
-ZEND_API void zend_close_file_handle(zend_file_handle *file_handle)
+
+
+ZEND_API void zend_open_file_dtor(void *f)
{
- switch (file_handle->type) {
- case ZEND_HANDLE_FILENAME:
- break;
- case ZEND_HANDLE_FD:
- close(file_handle->handle.fd);
- break;
- case ZEND_HANDLE_FP:
- if (file_handle->handle.fp != stdin) {
- fclose(file_handle->handle.fp);
- }
- break;
#ifdef ZTS
- case ZEND_HANDLE_ISTREAM:
- if (file_handle->handle.is != &cin) {
- delete file_handle->handle.is;
- }
- break;
+ delete *((ifstream **) f);
+#else
+ fclose(*((FILE **) f));
#endif
- }
}
+
+ZEND_API void zend_close_file_handle(zend_file_handle *file_handle CLS_DC)
+{
+#ifdef ZTS
+ zend_llist_del_element(&CG(open_files), &file_handle->handle.is);
+#else
+ zend_llist_del_element(&CG(open_files), &file_handle->handle.fp);
+#endif
+}
+
+
ZEND_API inline int open_file_for_scanning(zend_file_handle *file_handle CLS_DC)
{
#ifndef ZTS
if (!file_handle->handle.fp) {
return FAILURE;
}
- file_handle->type = ZEND_HANDLE_FP;
-
+ if (file_handle->handle.fp != stdin) {
+ zend_llist_add_element(&CG(open_files), &file_handle->handle.fp);
+ }
+ file_handle->type = ZEND_HANDLE_FP;
/* Reset the scanner for scanning the new file */
yyin = file_handle->handle.fp;
yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
delete file_handle->handle.is;
return FAILURE;
}
+ if (file_handle->handle.is != &cin) {
+ zend_llist_add_element(&CG(open_files), &file_handle->handle.is);
+ }
file_handle->type = ZEND_HANDLE_ISTREAM;
CG(ZFL) = new ZendFlexLexer;
} else {
CG(active_op_array) = op_array;
compiler_result = zendparse(CLS_C);
- zend_close_file_handle(file_handle);
+ zend_close_file_handle(file_handle CLS_CC);
restore_lexical_state(&original_lex_state CLS_CC);
CG(active_op_array) = original_active_op_array;
if (compiler_result==1) { /* parser error */
return FAILURE;
}
compiler_result = zendparse(CLS_C);
- zend_close_file_handle(file_handle);
+ zend_close_file_handle(file_handle CLS_CC);
restore_lexical_state(&original_lex_state CLS_CC);
if (compiler_result==1) {
zend_bailout();
return FAILURE;
}
zend_highlight(syntax_highlighter_ini);
- zend_close_file_handle(&file_handle);
+ zend_close_file_handle(&file_handle CLS_CC);
restore_lexical_state(&original_lex_state CLS_CC);
return SUCCESS;
}
zend_hash_apply(&module_registry, (int (*)(void *)) module_registry_request_startup);
init_resource_list(ELS_C);
CG(unclean_shutdown) = 0;
+ zend_llist_init(&CG(open_files), sizeof(void *), zend_open_file_dtor, 0);
}
zend_hash_apply(CG(function_table), (int (*)(void *)) is_not_internal_function);
zend_hash_apply(CG(class_table), (int (*)(void *)) is_not_internal_class);
zend_hash_apply(&module_registry, (int (*)(void *)) module_registry_cleanup);
+ zend_llist_destroy(&CG(open_files));
}
zend_llist_element *traverse_ptr;
} zend_llist;
+BEGIN_EXTERN_C()
ZEND_API void zend_llist_init(zend_llist *l, size_t size, void (*dtor)(void *data), unsigned char persistent);
ZEND_API void zend_llist_add_element(zend_llist *l, void *element);
ZEND_API void zend_llist_prepend_element(zend_llist *l, void *element);
ZEND_API void *zend_llist_get_last(zend_llist *l);
ZEND_API void *zend_llist_get_next(zend_llist *l);
ZEND_API void *zend_llist_get_prev(zend_llist *l);
+END_EXTERN_C()
#endif /* _ZEND_LLIST_H */