ext/PerlIO/scalar/Makefile.PL PerlIO layer for scalars
ext/PerlIO/scalar/scalar.pm PerlIO layer for scalars
ext/PerlIO/scalar/scalar.xs PerlIO layer for scalars
+ext/PerlIO/scalar/t/scalar_ungetc.t Tests for PerlIO layer for scalars
ext/PerlIO/t/encoding.t See if PerlIO encoding conversion works
ext/PerlIO/t/fail.t See if bad layers fail
ext/PerlIO/t/fallback.t See if PerlIO fallbacks work
}
SSize_t
-PerlIOScalar_unread(pTHX_ PerlIO * f, const void *vbuf, Size_t count)
-{
- PerlIOScalar *s = PerlIOSelf(f, PerlIOScalar);
- char *dst = SvGROW(s->var, (STRLEN)s->posn + count);
- s->posn -= count;
- Move(vbuf, dst + s->posn, count, char);
- SvPOK_on(s->var);
- return count;
-}
-
-SSize_t
PerlIOScalar_write(pTHX_ PerlIO * f, const void *vbuf, Size_t count)
{
if (PerlIOBase(f)->flags & PERLIO_F_CANWRITE) {
PerlIOScalar_fileno,
PerlIOScalar_dup,
PerlIOBase_read,
- PerlIOScalar_unread,
+ NULL, /* unread */
PerlIOScalar_write,
PerlIOScalar_seek,
PerlIOScalar_tell,
--- /dev/null
+#!perl -w\r
+use strict;\r
+use IO::Handle; # ungetc()\r
+\r
+use Test::More tests => 20;\r
+\r
+require_ok q{PerlIO::scalar};\r
+\r
+my $s = 'foo';\r
+Internals::SvREADONLY($s, 1);\r
+eval{\r
+ $s = 'bar';\r
+};\r
+like $@, qr/Modification of a read-only value/, '$s is readonly';\r
+\r
+ok open(my $io, '<', \$s), 'open';\r
+\r
+getc $io;\r
+\r
+my $a = ord 'A';\r
+\r
+diag "buffer[$s]";\r
+is $io->ungetc($a), $a, 'ungetc';\r
+diag "buffer[$s]";\r
+\r
+is getc($io), chr($a), 'getc';\r
+\r
+is $s, 'foo', '$s remains "foo"';\r
+\r
+is getc($io), 'o', 'getc/2';\r
+is getc($io), 'o', 'getc/3';\r
+is getc($io), undef, 'getc/4';\r
+\r
+for my $c($a .. ($a+10)){\r
+ is $io->ungetc($c), $c, "ungetc($c)";\r
+}
\ No newline at end of file