summaryrefslogtreecommitdiff
path: root/sapi/cli/php_cli.c
diff options
context:
space:
mode:
Diffstat (limited to 'sapi/cli/php_cli.c')
-rw-r--r--sapi/cli/php_cli.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/sapi/cli/php_cli.c b/sapi/cli/php_cli.c
index 3b72f9469f..373c39f2c9 100644
--- a/sapi/cli/php_cli.c
+++ b/sapi/cli/php_cli.c
@@ -570,6 +570,8 @@ static const char *param_mode_conflict = "Either execute direct code, process st
*/
static int cli_seek_file_begin(zend_file_handle *file_handle, char *script_file, int *lineno TSRMLS_DC)
{
+ char c;
+
*lineno = 1;
file_handle->type = ZEND_HANDLE_FP;
@@ -580,6 +582,25 @@ static int cli_seek_file_begin(zend_file_handle *file_handle, char *script_file,
return FAILURE;
}
file_handle->filename = script_file;
+
+ /* #!php support */
+ c = fgetc(file_handle->handle.fp);
+ if (c == '#' && (c = fgetc(file_handle->handle.fp)) == '!') {
+ while (c != '\n' && c != '\r' && c != EOF) {
+ c = fgetc(file_handle->handle.fp); /* skip to end of line */
+ }
+ /* handle situations where line is terminated by \r\n */
+ if (c == '\r') {
+ if (fgetc(file_handle->handle.fp) != '\n') {
+ long pos = ftell(file_handle->handle.fp);
+ fseek(file_handle->handle.fp, pos - 1, SEEK_SET);
+ }
+ }
+ *lineno = 2;
+ } else {
+ rewind(file_handle->handle.fp);
+ }
+
return SUCCESS;
}
/* }}} */