| T_ECHO echo_expr_list ';'
| T_INLINE_HTML { do_echo(&$1 CLS_CC); }
| expr ';' { do_free(&$1 CLS_CC); }
- | T_REQUIRE expr ';' { if ($2.op_type==IS_CONST && $2.u.constant.type==IS_STRING) { require_filename($2.u.constant.value.str.val, 0 CLS_CC); zval_dtor(&$2.u.constant); } else { do_include_or_eval(ZEND_INCLUDE, &$$, &$2 CLS_CC); } }
- | T_USE use_filename ';' { require_filename($2.u.constant.value.str.val, 1 CLS_CC); zval_dtor(&$2.u.constant); }
+ | T_REQUIRE expr ';' { if ($2.op_type==IS_CONST && $2.u.constant.type==IS_STRING) { require_filename($2.u.constant.value.str.val CLS_CC); zval_dtor(&$2.u.constant); } else { do_include_or_eval(ZEND_INCLUDE, &$$, &$2 CLS_CC); } }
+ | T_USE use_filename ';' { use_filename($2.u.constant.value.str.val, $2.u.constant.value.str.len CLS_CC); zval_dtor(&$2.u.constant); }
| T_UNSET '(' r_cvar ')' ';' { do_unset(&$3 CLS_CC); }
| T_FOREACH '(' expr T_AS { do_foreach_begin(&$1, &$3, &$2, &$4 CLS_CC); } w_cvar foreach_optional_arg ')' { do_foreach_cont(&$6, &$7, &$4 CLS_CC); } foreach_statement { do_foreach_end(&$1, &$2 CLS_CC); }
| ';' /* empty statement */
break;
#endif
}
+ if (fh->opened_path) {
+ free(fh->opened_path);
+ }
+ if (fh->free_filename && fh->filename) {
+ efree(fh->filename);
+ }
}
filename = &tmp;
}
file_handle.filename = filename->value.str.val;
+ file_handle.free_filename = 0;
file_handle.type = ZEND_HANDLE_FILENAME;
file_handle.opened_path = NULL;
retval = zend_compile_files(1 CLS_CC, 1, &file_handle);
BEGIN_EXTERN_C()
-int require_filename(char *filename, zend_bool unique CLS_DC)
+int require_filename(char *filename CLS_DC)
{
zend_file_handle file_handle;
file_handle.type = ZEND_HANDLE_FILENAME;
file_handle.filename = filename;
- if (require_file(&file_handle, unique CLS_CC)==FAILURE) {
+ file_handle.free_filename = 0;
+ if (require_file(&file_handle, 0 CLS_CC)==FAILURE) {
zend_bailout();
return FAILURE; /* will never get here */
}
}
-int use_filename(char *filename, zend_bool unique CLS_DC)
+int use_filename(char *filename, uint filename_length CLS_DC)
{
zend_file_handle file_handle;
- int filenamelen;
- char *newfile;
- filenamelen = strlen(filename);
- newfile = (char *) emalloc(filenamelen + 5);
- strcpy(newfile, filename);
- strcpy(newfile+filenamelen, ".php");
- newfile[filenamelen+4] = '\0';
+ file_handle.filename = (char *) emalloc(filename_length + zend_uv.import_use_extension_length);
+ memcpy(file_handle.filename, filename, filename_length);
+ memcpy(file_handle.filename+filename_length, zend_uv.import_use_extension, zend_uv.import_use_extension_length);
+ file_handle.filename[filename_length+zend_uv.import_use_extension_length] = 0;
+ file_handle.free_filename = 1;
file_handle.type = ZEND_HANDLE_FILENAME;
- file_handle.filename = newfile;
- if (require_file(&file_handle, unique CLS_CC)==FAILURE) {
+ if (require_file(&file_handle, 1 CLS_CC)==FAILURE) {
+ efree(file_handle.filename);
zend_bailout();
return FAILURE; /* will never get here */
}
}
if (file_handle->opened_path) {
if (unique) {
- zend_bool exists=1;
-
- if (zend_hash_add(&CG(used_files), file_handle->opened_path, strlen(file_handle->opened_path)+1, &exists, sizeof(zend_bool), NULL)==FAILURE) {
+ if (zend_hash_add(&CG(used_files), file_handle->opened_path, strlen(file_handle->opened_path)+1, file_handle, sizeof(zend_file_handle), NULL)==FAILURE) {
zend_close_file_handle(file_handle CLS_CC);
restore_lexical_state(&original_lex_state CLS_CC);
return SUCCESS;
}
}
- free(file_handle->opened_path);
}
compiler_result = zendparse(CLS_C);
zend_close_file_handle(file_handle CLS_CC);
file_handle.type = ZEND_HANDLE_FILENAME;
file_handle.filename = filename;
+ file_handle.free_filename = 0;
file_handle.opened_path = NULL;
save_lexical_state(&original_lex_state CLS_CC);
if (open_file_for_scanning(&file_handle CLS_CC)==FAILURE) {
typedef struct _zend_utility_values {
unsigned char short_tags;
unsigned char asp_tags;
+ char *import_use_extension;
+ uint import_use_extension_length;
} zend_utility_values;
extern ZEND_API void (*zend_unblock_interruptions)(void);
extern ZEND_API void (*zend_message_dispatcher)(long message, void *data);
extern ZEND_API int (*zend_get_ini_entry)(char *name, uint name_length, zval *contents);
-END_EXTERN_C()
-
-
+
void zenderror(char *error);
extern ZEND_API zend_class_entry zend_standard_class_def;
extern zend_utility_values zend_uv;
+END_EXTERN_C()
#define ZEND_UV(name) (zend_uv.name)
istream *is;
#endif
} handle;
+ zend_bool free_filename;
} zend_file_handle;
/* helper functions in zend-scanner.l */
BEGIN_EXTERN_C()
ZEND_API int require_file(zend_file_handle *file_handle, zend_bool unique CLS_DC);
-ZEND_API int require_filename(char *filename, zend_bool unique CLS_DC);
-ZEND_API int use_filename(char *filename, zend_bool unique CLS_DC);
+ZEND_API int require_filename(char *filename CLS_DC);
+ZEND_API int use_filename(char *filename, uint filename_length CLS_DC);
ZEND_API zend_op_array *compile_files(int mark_as_ref CLS_DC, int file_count, ...);
ZEND_API zend_op_array *v_compile_files(int mark_as_ref CLS_DC, int file_count, va_list files);
ZEND_API zend_op_array *compile_string(zval *source_string CLS_DC);