diff options
-rw-r--r-- | MANIFEST | 1 | ||||
-rw-r--r-- | t/io/bom.t | 14 | ||||
-rw-r--r-- | toke.c | 8 |
3 files changed, 22 insertions, 1 deletions
@@ -4683,6 +4683,7 @@ time64_config.h 64 bit clean time.h (configuration) time64.h 64 bit clean time.h (header) t/io/argv.t See if ARGV stuff works t/io/binmode.t See if binmode() works +t/io/bom.t See if scripts can start with a byte order mark t/io/crlf.t See if :crlf works t/io/crlf_through.t See if pipe passes data intact with :crlf t/io/data.t See if DATA works diff --git a/t/io/bom.t b/t/io/bom.t new file mode 100644 index 0000000000..dd1be6541e --- /dev/null +++ b/t/io/bom.t @@ -0,0 +1,14 @@ +#!./perl + +BEGIN { + chdir 't' if -d 't'; + @INC = '../lib'; +} + +BEGIN { require "./test.pl"; } + +plan(tests => 1); + +# It is important that the script contains at least one newline character +# that can be expanded to \r\n on DOSish systems. +fresh_perl_is("\xEF\xBB\xBFprint 1;\nprint 2", "12", {}, "script starts with a BOM" ); @@ -4792,7 +4792,13 @@ Perl_yylex(pTHX) *(U8*)s == 0xEF || *(U8*)s >= 0xFE || s[1] == 0)) { - bof = PerlIO_tell(PL_rsfp) == (Off_t)SvCUR(PL_linestr); + IV offset = (IV)PerlIO_tell(PL_rsfp); + bof = (offset == SvCUR(PL_linestr)); +#if defined(PERLIO_USING_CRLF) && defined(PERL_TEXTMODE_SCRIPTS) + /* offset may include swallowed CR */ + if (!bof) + bof = (offset == SvCUR(PL_linestr)+1); +#endif if (bof) { PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr); s = swallow_bom((U8*)s); |