| line | stmt | bran | cond | sub | pod | time | code | 
| 1 |  |  |  |  |  |  | # | 
| 2 |  |  |  |  |  |  |  | 
| 3 |  |  |  |  |  |  | package IO::File; | 
| 4 |  |  |  |  |  |  |  | 
| 5 |  |  |  |  |  |  | =head1 NAME | 
| 6 |  |  |  |  |  |  |  | 
| 7 |  |  |  |  |  |  | IO::File - supply object methods for filehandles | 
| 8 |  |  |  |  |  |  |  | 
| 9 |  |  |  |  |  |  | =head1 SYNOPSIS | 
| 10 |  |  |  |  |  |  |  | 
| 11 |  |  |  |  |  |  | use IO::File; | 
| 12 |  |  |  |  |  |  |  | 
| 13 |  |  |  |  |  |  | $fh = IO::File->new(); | 
| 14 |  |  |  |  |  |  | if ($fh->open("< file")) { | 
| 15 |  |  |  |  |  |  | print <$fh>; | 
| 16 |  |  |  |  |  |  | $fh->close; | 
| 17 |  |  |  |  |  |  | } | 
| 18 |  |  |  |  |  |  |  | 
| 19 |  |  |  |  |  |  | $fh = IO::File->new("> file"); | 
| 20 |  |  |  |  |  |  | if (defined $fh) { | 
| 21 |  |  |  |  |  |  | print $fh "bar\n"; | 
| 22 |  |  |  |  |  |  | $fh->close; | 
| 23 |  |  |  |  |  |  | } | 
| 24 |  |  |  |  |  |  |  | 
| 25 |  |  |  |  |  |  | $fh = IO::File->new("file", "r"); | 
| 26 |  |  |  |  |  |  | if (defined $fh) { | 
| 27 |  |  |  |  |  |  | print <$fh>; | 
| 28 |  |  |  |  |  |  | undef $fh;       # automatically closes the file | 
| 29 |  |  |  |  |  |  | } | 
| 30 |  |  |  |  |  |  |  | 
| 31 |  |  |  |  |  |  | $fh = IO::File->new("file", O_WRONLY|O_APPEND); | 
| 32 |  |  |  |  |  |  | if (defined $fh) { | 
| 33 |  |  |  |  |  |  | print $fh "corge\n"; | 
| 34 |  |  |  |  |  |  |  | 
| 35 |  |  |  |  |  |  | $pos = $fh->getpos; | 
| 36 |  |  |  |  |  |  | $fh->setpos($pos); | 
| 37 |  |  |  |  |  |  |  | 
| 38 |  |  |  |  |  |  | undef $fh;       # automatically closes the file | 
| 39 |  |  |  |  |  |  | } | 
| 40 |  |  |  |  |  |  |  | 
| 41 |  |  |  |  |  |  | autoflush STDOUT 1; | 
| 42 |  |  |  |  |  |  |  | 
| 43 |  |  |  |  |  |  | =head1 DESCRIPTION | 
| 44 |  |  |  |  |  |  |  | 
| 45 |  |  |  |  |  |  | C inherits from C and C. It extends | 
| 46 |  |  |  |  |  |  | these classes with methods that are specific to file handles. | 
| 47 |  |  |  |  |  |  |  | 
| 48 |  |  |  |  |  |  | =head1 CONSTRUCTOR | 
| 49 |  |  |  |  |  |  |  | 
| 50 |  |  |  |  |  |  | =over 4 | 
| 51 |  |  |  |  |  |  |  | 
| 52 |  |  |  |  |  |  | =item new ( FILENAME [,MODE [,PERMS]] ) | 
| 53 |  |  |  |  |  |  |  | 
| 54 |  |  |  |  |  |  | Creates an C.  If it receives any parameters, they are passed to | 
| 55 |  |  |  |  |  |  | the method C; if the open fails, the object is destroyed.  Otherwise, | 
| 56 |  |  |  |  |  |  | it is returned to the caller. | 
| 57 |  |  |  |  |  |  |  | 
| 58 |  |  |  |  |  |  | =item new_tmpfile | 
| 59 |  |  |  |  |  |  |  | 
| 60 |  |  |  |  |  |  | Creates an C opened for read/write on a newly created temporary | 
| 61 |  |  |  |  |  |  | file.  On systems where this is possible, the temporary file is anonymous | 
| 62 |  |  |  |  |  |  | (i.e. it is unlinked after creation, but held open).  If the temporary | 
| 63 |  |  |  |  |  |  | file cannot be created or opened, the C object is destroyed. | 
| 64 |  |  |  |  |  |  | Otherwise, it is returned to the caller. | 
| 65 |  |  |  |  |  |  |  | 
| 66 |  |  |  |  |  |  | =back | 
| 67 |  |  |  |  |  |  |  | 
| 68 |  |  |  |  |  |  | =head1 METHODS | 
| 69 |  |  |  |  |  |  |  | 
| 70 |  |  |  |  |  |  | =over 4 | 
| 71 |  |  |  |  |  |  |  | 
| 72 |  |  |  |  |  |  | =item open( FILENAME [,MODE [,PERMS]] ) | 
| 73 |  |  |  |  |  |  |  | 
| 74 |  |  |  |  |  |  | =item open( FILENAME, IOLAYERS ) | 
| 75 |  |  |  |  |  |  |  | 
| 76 |  |  |  |  |  |  | C accepts one, two or three parameters.  With one parameter, | 
| 77 |  |  |  |  |  |  | it is just a front end for the built-in C function.  With two or three | 
| 78 |  |  |  |  |  |  | parameters, the first parameter is a filename that may include | 
| 79 |  |  |  |  |  |  | whitespace or other special characters, and the second parameter is | 
| 80 |  |  |  |  |  |  | the open mode, optionally followed by a file permission value. | 
| 81 |  |  |  |  |  |  |  | 
| 82 |  |  |  |  |  |  | If C receives a Perl mode string ("E", "+E", etc.) | 
| 83 |  |  |  |  |  |  | or an ANSI C fopen() mode string ("w", "r+", etc.), it uses the basic | 
| 84 |  |  |  |  |  |  | Perl C operator (but protects any special characters). | 
| 85 |  |  |  |  |  |  |  | 
| 86 |  |  |  |  |  |  | If C is given a numeric mode, it passes that mode | 
| 87 |  |  |  |  |  |  | and the optional permissions value to the Perl C operator. | 
| 88 |  |  |  |  |  |  | The permissions default to 0666. | 
| 89 |  |  |  |  |  |  |  | 
| 90 |  |  |  |  |  |  | If C is given a mode that includes the C<:> character, | 
| 91 |  |  |  |  |  |  | it passes all the three arguments to the three-argument C operator. | 
| 92 |  |  |  |  |  |  |  | 
| 93 |  |  |  |  |  |  | For convenience, C exports the O_XXX constants from the | 
| 94 |  |  |  |  |  |  | Fcntl module, if this module is available. | 
| 95 |  |  |  |  |  |  |  | 
| 96 |  |  |  |  |  |  | =item binmode( [LAYER] ) | 
| 97 |  |  |  |  |  |  |  | 
| 98 |  |  |  |  |  |  | C sets C on the underlying C object, as documented | 
| 99 |  |  |  |  |  |  | in C. | 
| 100 |  |  |  |  |  |  |  | 
| 101 |  |  |  |  |  |  | C accepts one optional parameter, which is the layer to be | 
| 102 |  |  |  |  |  |  | passed on to the C call. | 
| 103 |  |  |  |  |  |  |  | 
| 104 |  |  |  |  |  |  | =back | 
| 105 |  |  |  |  |  |  |  | 
| 106 |  |  |  |  |  |  | =head1 NOTE | 
| 107 |  |  |  |  |  |  |  | 
| 108 |  |  |  |  |  |  | Some operating systems may perform  C or C | 
| 109 |  |  |  |  |  |  | on a directory without errors.  This behavior is not portable and not | 
| 110 |  |  |  |  |  |  | suggested for use.  Using C and C or C are | 
| 111 |  |  |  |  |  |  | suggested instead. | 
| 112 |  |  |  |  |  |  |  | 
| 113 |  |  |  |  |  |  | =head1 SEE ALSO | 
| 114 |  |  |  |  |  |  |  | 
| 115 |  |  |  |  |  |  | L, | 
| 116 |  |  |  |  |  |  | L, | 
| 117 |  |  |  |  |  |  | L, | 
| 118 |  |  |  |  |  |  | L, | 
| 119 |  |  |  |  |  |  | L | 
| 120 |  |  |  |  |  |  |  | 
| 121 |  |  |  |  |  |  | =head1 HISTORY | 
| 122 |  |  |  |  |  |  |  | 
| 123 |  |  |  |  |  |  | Derived from FileHandle.pm by Graham Barr EFE. | 
| 124 |  |  |  |  |  |  |  | 
| 125 |  |  |  |  |  |  | =cut | 
| 126 |  |  |  |  |  |  |  | 
| 127 | 11 |  |  | 11 |  | 187271 | use 5.008_001; | 
|  | 11 |  |  |  |  | 65 |  | 
| 128 | 11 |  |  | 11 |  | 52 | use strict; | 
|  | 11 |  |  |  |  | 19 |  | 
|  | 11 |  |  |  |  | 230 |  | 
| 129 | 11 |  |  | 11 |  | 43 | use Carp; | 
|  | 11 |  |  |  |  | 14 |  | 
|  | 11 |  |  |  |  | 538 |  | 
| 130 | 11 |  |  | 11 |  | 2739 | use Symbol; | 
|  | 11 |  |  |  |  | 5136 |  | 
|  | 11 |  |  |  |  | 522 |  | 
| 131 | 11 |  |  | 11 |  | 2552 | use SelectSaver; | 
|  | 11 |  |  |  |  | 1428 |  | 
|  | 11 |  |  |  |  | 260 |  | 
| 132 | 11 |  |  | 11 |  | 3067 | use IO::Seekable; | 
|  | 11 |  |  |  |  | 21 |  | 
|  | 11 |  |  |  |  | 4871 |  | 
| 133 |  |  |  |  |  |  |  | 
| 134 |  |  |  |  |  |  | require Exporter; | 
| 135 |  |  |  |  |  |  |  | 
| 136 |  |  |  |  |  |  | our @ISA = qw(IO::Handle IO::Seekable Exporter); | 
| 137 |  |  |  |  |  |  |  | 
| 138 |  |  |  |  |  |  | our $VERSION = "1.48"; | 
| 139 |  |  |  |  |  |  |  | 
| 140 |  |  |  |  |  |  | our @EXPORT = @IO::Seekable::EXPORT; | 
| 141 |  |  |  |  |  |  |  | 
| 142 |  |  |  |  |  |  | eval { | 
| 143 |  |  |  |  |  |  | # Make all Fcntl O_XXX constants available for importing | 
| 144 |  |  |  |  |  |  | require Fcntl; | 
| 145 |  |  |  |  |  |  | my @O = grep /^O_/, @Fcntl::EXPORT; | 
| 146 |  |  |  |  |  |  | Fcntl->import(@O);  # first we import what we want to export | 
| 147 |  |  |  |  |  |  | push(@EXPORT, @O); | 
| 148 |  |  |  |  |  |  | }; | 
| 149 |  |  |  |  |  |  |  | 
| 150 |  |  |  |  |  |  | ################################################ | 
| 151 |  |  |  |  |  |  | ## Constructor | 
| 152 |  |  |  |  |  |  | ## | 
| 153 |  |  |  |  |  |  |  | 
| 154 |  |  |  |  |  |  | sub new { | 
| 155 | 10 |  |  | 10 | 1 | 10959 | my $type = shift; | 
| 156 | 10 |  | 50 |  |  | 63 | my $class = ref($type) || $type || "IO::File"; | 
| 157 | 10 | 50 | 33 |  |  | 46 | @_ >= 0 && @_ <= 3 | 
| 158 |  |  |  |  |  |  | or croak "usage: $class->new([FILENAME [,MODE [,PERMS]]])"; | 
| 159 | 10 |  |  |  |  | 58 | my $fh = $class->SUPER::new(); | 
| 160 | 10 | 100 |  |  |  | 25 | if (@_) { | 
| 161 | 7 | 50 |  |  |  | 21 | $fh->open(@_) | 
| 162 |  |  |  |  |  |  | or return undef; | 
| 163 |  |  |  |  |  |  | } | 
| 164 | 10 |  |  |  |  | 41 | $fh; | 
| 165 |  |  |  |  |  |  | } | 
| 166 |  |  |  |  |  |  |  | 
| 167 |  |  |  |  |  |  | ################################################ | 
| 168 |  |  |  |  |  |  | ## Open | 
| 169 |  |  |  |  |  |  | ## | 
| 170 |  |  |  |  |  |  |  | 
| 171 |  |  |  |  |  |  | sub open { | 
| 172 | 11 | 50 | 33 | 11 | 1 | 123 | @_ >= 2 && @_ <= 4 or croak 'usage: $fh->open(FILENAME [,MODE [,PERMS]])'; | 
| 173 | 11 |  |  |  |  | 25 | my ($fh, $file) = @_; | 
| 174 | 11 | 100 |  |  |  | 25 | if (@_ > 2) { | 
| 175 | 4 |  |  |  |  | 18 | my ($mode, $perms) = @_[2, 3]; | 
| 176 | 4 | 50 |  |  |  | 22 | if ($mode =~ /^\d+$/) { | 
|  |  | 100 |  |  |  |  |  | 
| 177 | 0 | 0 |  |  |  | 0 | defined $perms or $perms = 0666; | 
| 178 | 0 |  |  |  |  | 0 | return sysopen($fh, $file, $mode, $perms); | 
| 179 |  |  |  |  |  |  | } elsif ($mode =~ /:/) { | 
| 180 | 2 | 50 |  |  |  | 172 | return open($fh, $mode, $file) if @_ == 3; | 
| 181 | 0 |  |  |  |  | 0 | croak 'usage: $fh->open(FILENAME, IOLAYERS)'; | 
| 182 |  |  |  |  |  |  | } else { | 
| 183 | 2 |  |  |  |  | 15 | return open($fh, IO::Handle::_open_mode_string($mode), $file); | 
| 184 |  |  |  |  |  |  | } | 
| 185 |  |  |  |  |  |  | } | 
| 186 | 7 |  |  |  |  | 300 | open($fh, $file); | 
| 187 |  |  |  |  |  |  | } | 
| 188 |  |  |  |  |  |  |  | 
| 189 |  |  |  |  |  |  | ################################################ | 
| 190 |  |  |  |  |  |  | ## Binmode | 
| 191 |  |  |  |  |  |  | ## | 
| 192 |  |  |  |  |  |  |  | 
| 193 |  |  |  |  |  |  | sub binmode { | 
| 194 | 1 | 50 | 33 | 1 | 1 | 4 | ( @_ == 1 or @_ == 2 ) or croak 'usage $fh->binmode([LAYER])'; | 
| 195 |  |  |  |  |  |  |  | 
| 196 | 1 |  |  |  |  | 1 | my($fh, $layer) = @_; | 
| 197 |  |  |  |  |  |  |  | 
| 198 | 1 | 50 |  |  |  | 5 | return binmode $$fh unless $layer; | 
| 199 | 0 |  |  |  |  |  | return binmode $$fh, $layer; | 
| 200 |  |  |  |  |  |  | } | 
| 201 |  |  |  |  |  |  |  | 
| 202 |  |  |  |  |  |  | 1; |