| 1 | #!./perl
|
|---|
| 2 |
|
|---|
| 3 | # $RCSfile: read.t,v $$Revision: 4.1 $$Date: 92/08/07 18:28:17 $
|
|---|
| 4 |
|
|---|
| 5 | BEGIN {
|
|---|
| 6 | chdir 't';
|
|---|
| 7 | @INC = '../lib';
|
|---|
| 8 | require './test.pl';
|
|---|
| 9 | }
|
|---|
| 10 | use strict;
|
|---|
| 11 |
|
|---|
| 12 | plan tests => 2564;
|
|---|
| 13 |
|
|---|
| 14 | open(FOO,'op/read.t') || open(FOO,'t/op/read.t') || open(FOO,':op:read.t') || die "Can't open op.read";
|
|---|
| 15 | seek(FOO,4,0) or die "Seek failed: $!";
|
|---|
| 16 | my $buf;
|
|---|
| 17 | my $got = read(FOO,$buf,4);
|
|---|
| 18 |
|
|---|
| 19 | is ($got, 4);
|
|---|
| 20 | is ($buf, "perl");
|
|---|
| 21 |
|
|---|
| 22 | seek (FOO,0,2) || seek(FOO,20000,0);
|
|---|
| 23 | $got = read(FOO,$buf,4);
|
|---|
| 24 |
|
|---|
| 25 | is ($got, 0);
|
|---|
| 26 | is ($buf, "");
|
|---|
| 27 |
|
|---|
| 28 | # This is true if Config is not built, or if PerlIO is enabled
|
|---|
| 29 | # ie assume that PerlIO is present, unless we know for sure otherwise.
|
|---|
| 30 | my $has_perlio = !eval {
|
|---|
| 31 | no warnings;
|
|---|
| 32 | require Config;
|
|---|
| 33 | !$Config::Config{useperlio}
|
|---|
| 34 | };
|
|---|
| 35 |
|
|---|
| 36 | my $tmpfile = 'Op_read.tmp';
|
|---|
| 37 |
|
|---|
| 38 | END { 1 while unlink $tmpfile }
|
|---|
| 39 |
|
|---|
| 40 | my (@values, @buffers) = ('', '');
|
|---|
| 41 |
|
|---|
| 42 | foreach (65, 161, 253, 9786) {
|
|---|
| 43 | push @values, join "", map {chr $_} $_ .. $_ + 4;
|
|---|
| 44 | push @buffers, join "", map {chr $_} $_ + 5 .. $_ + 20;
|
|---|
| 45 | }
|
|---|
| 46 | my @offsets = (0, 3, 7, 22, -1, -3, -5, -7);
|
|---|
| 47 | my @lengths = (0, 2, 5, 10);
|
|---|
| 48 |
|
|---|
| 49 | foreach my $value (@values) {
|
|---|
| 50 | foreach my $initial_buffer (@buffers) {
|
|---|
| 51 | my @utf8 = 1;
|
|---|
| 52 | if ($value !~ tr/\0-\377//c) {
|
|---|
| 53 | # It's all 8 bit
|
|---|
| 54 | unshift @utf8, 0;
|
|---|
| 55 | }
|
|---|
| 56 | SKIP:
|
|---|
| 57 | foreach my $utf8 (@utf8) {
|
|---|
| 58 | skip "Needs :utf8 layer but no perlio", 2 * @offsets * @lengths
|
|---|
| 59 | if $utf8 and !$has_perlio;
|
|---|
| 60 |
|
|---|
| 61 | 1 while unlink $tmpfile;
|
|---|
| 62 | open FH, ">$tmpfile" or die "Can't open $tmpfile: $!";
|
|---|
| 63 | binmode FH, "utf8" if $utf8;
|
|---|
| 64 | print FH $value;
|
|---|
| 65 | close FH;
|
|---|
| 66 | foreach my $offset (@offsets) {
|
|---|
| 67 | foreach my $length (@lengths) {
|
|---|
| 68 | # Will read the lesser of the length of the file and the
|
|---|
| 69 | # read length
|
|---|
| 70 | my $will_read = $value;
|
|---|
| 71 | if ($length < length $will_read) {
|
|---|
| 72 | substr ($will_read, $length) = '';
|
|---|
| 73 | }
|
|---|
| 74 | # Going to trash this so need a copy
|
|---|
| 75 | my $buffer = $initial_buffer;
|
|---|
| 76 |
|
|---|
| 77 | my $expect = $buffer;
|
|---|
| 78 | if ($offset > 0) {
|
|---|
| 79 | # Right pad with NUL bytes
|
|---|
| 80 | $expect .= "\0" x $offset;
|
|---|
| 81 | substr ($expect, $offset) = '';
|
|---|
| 82 | }
|
|---|
| 83 | substr ($expect, $offset) = $will_read;
|
|---|
| 84 |
|
|---|
| 85 | open FH, $tmpfile or die "Can't open $tmpfile: $!";
|
|---|
| 86 | binmode FH, "utf8" if $utf8;
|
|---|
| 87 | my $what = sprintf "%d into %d l $length o $offset",
|
|---|
| 88 | ord $value, ord $buffer;
|
|---|
| 89 | $what .= ' u' if $utf8;
|
|---|
| 90 | $got = read (FH, $buffer, $length, $offset);
|
|---|
| 91 | is ($got, length $will_read, "got $what");
|
|---|
| 92 | is ($buffer, $expect, "buffer $what");
|
|---|
| 93 | close FH;
|
|---|
| 94 | }
|
|---|
| 95 | }
|
|---|
| 96 | }
|
|---|
| 97 | }
|
|---|
| 98 | }
|
|---|
| 99 |
|
|---|
| 100 |
|
|---|
| 101 |
|
|---|