summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--perlio.c5
-rw-r--r--t/io/crlf.t14
2 files changed, 17 insertions, 2 deletions
diff --git a/perlio.c b/perlio.c
index 11f600fc5f..ea36d8027e 100644
--- a/perlio.c
+++ b/perlio.c
@@ -3839,13 +3839,16 @@ PerlIOCrlf_get_cnt(pTHX_ PerlIO *f)
b->ptr++; /* say we have read it as far as
* flush() is concerned */
b->buf++; /* Leave space in front of buffer */
+ /* Note as we have moved buf up flush's
+ posn += ptr-buf
+ will naturally make posn point at CR
+ */
b->bufsiz--; /* Buffer is thus smaller */
code = PerlIO_fill(f); /* Fetch some more */
b->bufsiz++; /* Restore size for next time */
b->buf--; /* Point at space */
b->ptr = nl = b->buf; /* Which is what we hand
* off */
- b->posn--; /* Buffer starts here */
*nl = 0xd; /* Fill in the CR */
if (code == 0)
goto test; /* fill() call worked */
diff --git a/t/io/crlf.t b/t/io/crlf.t
index 08ab4fe3b0..484596bd47 100644
--- a/t/io/crlf.t
+++ b/t/io/crlf.t
@@ -15,7 +15,7 @@ END {
}
if (find PerlIO::Layer 'perlio') {
- plan(tests => 7);
+ plan(tests => 8);
ok(open(FOO,">:crlf",$file));
ok(print FOO 'a'.((('a' x 14).qq{\n}) x 2000) || close(FOO));
ok(open(FOO,"<:crlf",$file));
@@ -30,6 +30,18 @@ if (find PerlIO::Layer 'perlio') {
{ local $/; $text = <FOO> }
is(count_chars($text, "\015\012"), 2000);
+ {
+ my $fcontents = join "", map {"$_\r\n"} "a".."zzz";
+ open my $fh, "<:crlf", \$fcontents;
+ local $/ = "xxx";
+ local $_ = <$fh>;
+ my $pos = tell $fh; # pos must be behind "xxx", before "\nyyy\n"
+ seek $fh, $pos, 0;
+ $/ = "\n";
+ $s = <$fh>.<$fh>;
+ ok($s eq "\nxxy\n");
+ }
+
ok(close(FOO));
}
else {