From: Zeev Suraski Date: Sat, 4 Jun 2005 16:16:19 +0000 (+0000) Subject: Thought I committed it ages ago... Anyway, without further delays, the final X-Git-Tag: php-5.0.1b1~92 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d33500ee20f08a72a2ca6327abed232d422ee03a;p=php Thought I committed it ages ago... Anyway, without further delays, the final __halt_compiler() patch --- diff --git a/Zend/tests/halt01.phpt b/Zend/tests/halt01.phpt new file mode 100644 index 0000000000..3af80d07a8 --- /dev/null +++ b/Zend/tests/halt01.phpt @@ -0,0 +1,12 @@ +--TEST-- +__HALT_COMPILER() basic test +--FILE-- +yy_ch_buf); + int read_bytes = (YY_CURRENT_BUFFER)->yy_n_chars; + int offset_from_the_end = read_bytes - offset_in_buffer; + + return zend_stream_ftell(yyin TSRMLS_CC) - offset_from_the_end; + } else { + return -1; + } +} + + zend_op_array *compile_string(zval *source_string, char *filename TSRMLS_DC) { zend_lex_state original_lex_state; @@ -1015,6 +1029,10 @@ NEWLINE ("\r"|"\n"|"\r\n") return T_EMPTY; } +"__halt_compiler" { + return T_HALT_COMPILER; +} + "static" { return T_STATIC; } diff --git a/Zend/zend_stream.c b/Zend/zend_stream.c index bf68081b46..95050d3d26 100644 --- a/Zend/zend_stream.c +++ b/Zend/zend_stream.c @@ -35,6 +35,12 @@ static void zend_stream_stdio_closer(void *handle TSRMLS_DC) fclose((FILE*)handle); } +static long zend_stream_stdio_fteller(void *handle TSRMLS_DC) +{ + return ftell((FILE*) handle); +} + + ZEND_API int zend_stream_open(const char *filename, zend_file_handle *handle TSRMLS_DC) { if (zend_stream_open_function) { @@ -83,6 +89,7 @@ ZEND_API int zend_stream_fixup(zend_file_handle *file_handle TSRMLS_DC) file_handle->handle.stream.handle = file_handle->handle.fp; file_handle->handle.stream.reader = zend_stream_stdio_reader; file_handle->handle.stream.closer = zend_stream_stdio_closer; + file_handle->handle.stream.fteller = zend_stream_stdio_fteller; file_handle->handle.stream.interactive = isatty(fileno((FILE *)file_handle->handle.stream.handle)); } @@ -120,4 +127,7 @@ ZEND_API int zend_stream_ferror(zend_file_handle *file_handle TSRMLS_DC) return 0; } - +ZEND_API long zend_stream_ftell(zend_file_handle *file_handle TSRMLS_DC) +{ + return file_handle->handle.stream.fteller(file_handle->handle.stream.handle TSRMLS_CC); +} diff --git a/Zend/zend_stream.h b/Zend/zend_stream.h index c3d0ee1281..6633f5923d 100644 --- a/Zend/zend_stream.h +++ b/Zend/zend_stream.h @@ -27,11 +27,13 @@ typedef size_t (*zend_stream_reader_t)(void *handle, char *buf, size_t len TSRMLS_DC); typedef void (*zend_stream_closer_t)(void *handle TSRMLS_DC); +typedef long (*zend_stream_fteller_t)(void *handle TSRMLS_DC); typedef struct _zend_stream { void *handle; zend_stream_reader_t reader; zend_stream_closer_t closer; + zend_stream_fteller_t fteller; int interactive; } zend_stream; @@ -52,6 +54,7 @@ ZEND_API int zend_stream_open(const char *filename, zend_file_handle *handle TSR ZEND_API int zend_stream_ferror(zend_file_handle *file_handle TSRMLS_DC); ZEND_API int zend_stream_getc(zend_file_handle *file_handle TSRMLS_DC); ZEND_API size_t zend_stream_read(zend_file_handle *file_handle, char *buf, size_t len TSRMLS_DC); +ZEND_API long zend_stream_ftell(zend_file_handle *file_handle TSRMLS_DC); ZEND_API int zend_stream_fixup(zend_file_handle *file_handle TSRMLS_DC); END_EXTERN_C()