annotate variant_effect_predictor/Bio/Root/IO.pm @ 0:1f6dce3d34e0

Uploaded
author mahtabm
date Thu, 11 Apr 2013 02:01:53 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1 # $Id: IO.pm,v 1.37.2.3 2003/06/28 21:57:04 jason Exp $
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
3 # BioPerl module for Bio::Root::IO
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
4 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
5 # Cared for by Hilmar Lapp <hlapp@gmx.net>
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
6 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
7 # Copyright Hilmar Lapp
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
8 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
9 # You may distribute this module under the same terms as perl itself
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
10
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
11 # POD documentation - main docs before the code
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
12
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
13 =head1 NAME
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
14
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
15 Bio::Root::IO - module providing several methods often needed when dealing with file IO
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
16
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
17 =head1 SYNOPSIS
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
18
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
19 # utilize stream I/O in your module
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
20 $self->{'io'} = Bio::Root::IO->new(-file => "myfile");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
21 $self->{'io'}->_print("some stuff");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
22 $line = $self->{'io'}->_readline();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
23 $self->{'io'}->_pushback($line);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
24 $self->{'io'}->close();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
25
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
26 # obtain platform-compatible filenames
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
27 $path = Bio::Root::IO->catfile($dir, $subdir, $filename);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
28 # obtain a temporary file (created in $TEMPDIR)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
29 ($handle) = $io->tempfile();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
30
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
31 =head1 DESCRIPTION
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
32
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
33 This module provides methods that will usually be needed for any sort
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
34 of file- or stream-related input/output, e.g., keeping track of a file
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
35 handle, transient printing and reading from the file handle, a close
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
36 method, automatically closing the handle on garbage collection, etc.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
37
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
38 To use this for your own code you will either want to inherit from
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
39 this module, or instantiate an object for every file or stream you are
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
40 dealing with. In the first case this module will most likely not be
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
41 the first class off which your class inherits; therefore you need to
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
42 call _initialize_io() with the named parameters in order to set file
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
43 handle, open file, etc automatically.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
44
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
45 Most methods start with an underscore, indicating they are private. In
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
46 OO speak, they are not private but protected, that is, use them in
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
47 your module code, but a client code of your module will usually not
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
48 want to call them (except those not starting with an underscore).
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
49
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
50 In addition this module contains a couple of convenience methods for
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
51 cross-platform safe tempfile creation and similar tasks. There are
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
52 some CPAN modules related that may not be available on all
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
53 platforms. At present, File::Spec and File::Temp are attempted. This
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
54 module defines $PATHSEP, $TEMPDIR, and $ROOTDIR, which will always be set,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
55 and $OPENFLAGS, which will be set if either of File::Spec or File::Temp fails.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
56
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
57 The -noclose boolean (accessed via the noclose method) prevents a
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
58 filehandle from being closed when the IO object is cleaned up. This
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
59 is special behavior when a object like a parser might share a
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
60 filehandle with an object like an indexer where it is not proper to
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
61 close the filehandle as it will continue to be reused until the end of the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
62 stream is reached. In general you won't want to play with this flag.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
63
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
64 =head1 FEEDBACK
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
65
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
66 =head2 Mailing Lists
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
67
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
68 User feedback is an integral part of the evolution of this
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
69 and other Bioperl modules. Send your comments and suggestions preferably
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
70 to one of the Bioperl mailing lists.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
71 Your participation is much appreciated.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
72
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
73 bioperl-l@bioperl.org - General discussion
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
74 http://bio.perl.org/MailList.html - About the mailing lists
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
75
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
76 =head2 Reporting Bugs
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
77
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
78 Report bugs to the Bioperl bug tracking system to help us keep track
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
79 the bugs and their resolution.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
80 Bug reports can be submitted via email or the web:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
81
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
82 bioperl-bugs@bio.perl.org
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
83 http://bugzilla.bioperl.org/
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
84
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
85 =head1 AUTHOR - Hilmar Lapp
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
86
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
87 Email hlapp@gmx.net
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
88
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
89 Describe contact details here
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
90
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
91 =head1 APPENDIX
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
92
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
93 The rest of the documentation details each of the object methods. Internal methods are usually preceded with a _
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
94
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
95 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
96
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
97
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
98 # Let the code begin...
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
99
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
100
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
101 package Bio::Root::IO;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
102 use vars qw(@ISA $FILESPECLOADED $FILETEMPLOADED $FILEPATHLOADED
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
103 $TEMPDIR $PATHSEP $ROOTDIR $OPENFLAGS $VERBOSE);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
104 use strict;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
105
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
106 use Symbol;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
107 use POSIX qw(dup);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
108 use IO::Handle;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
109 use Bio::Root::Root;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
110
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
111 @ISA = qw(Bio::Root::Root);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
112
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
113 my $TEMPCOUNTER;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
114 my $HAS_WIN32 = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
115
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
116 BEGIN {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
117 $TEMPCOUNTER = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
118 $FILESPECLOADED = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
119 $FILETEMPLOADED = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
120 $FILEPATHLOADED = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
121 $VERBOSE = 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
122
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
123 # try to load those modules that may cause trouble on some systems
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
124 eval {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
125 require File::Path;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
126 $FILEPATHLOADED = 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
127 };
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
128 if( $@ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
129 print STDERR "Cannot load File::Path: $@" if( $VERBOSE > 0 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
130 # do nothing
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
131 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
132
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
133
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
134 # If on Win32, attempt to find Win32 package
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
135
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
136 if($^O =~ /mswin/i) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
137 eval {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
138 require Win32;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
139 $HAS_WIN32 = 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
140 };
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
141 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
142
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
143 # Try to provide a path separator. Why doesn't File::Spec export this,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
144 # or did I miss it?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
145 if($^O =~ /mswin/i) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
146 $PATHSEP = "\\";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
147 } elsif($^O =~ /macos/i) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
148 $PATHSEP = ":";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
149 } else { # unix
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
150 $PATHSEP = "/";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
151 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
152 eval {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
153 require File::Spec;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
154 $FILESPECLOADED = 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
155 $TEMPDIR = File::Spec->tmpdir();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
156 $ROOTDIR = File::Spec->rootdir();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
157 require File::Temp; # tempfile creation
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
158 $FILETEMPLOADED = 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
159 };
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
160 if( $@ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
161 if(! defined($TEMPDIR)) { # File::Spec failed
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
162 # determine tempdir
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
163 if (defined $ENV{'TEMPDIR'} && -d $ENV{'TEMPDIR'} ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
164 $TEMPDIR = $ENV{'TEMPDIR'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
165 } elsif( defined $ENV{'TMPDIR'} && -d $ENV{'TMPDIR'} ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
166 $TEMPDIR = $ENV{'TMPDIR'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
167 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
168 if($^O =~ /mswin/i) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
169 $TEMPDIR = 'C:\TEMP' unless $TEMPDIR;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
170 $ROOTDIR = 'C:';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
171 } elsif($^O =~ /macos/i) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
172 $TEMPDIR = "" unless $TEMPDIR; # what is a reasonable default on Macs?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
173 $ROOTDIR = ""; # what is reasonable??
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
174 } else { # unix
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
175 $TEMPDIR = "/tmp" unless $TEMPDIR;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
176 $ROOTDIR = "/";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
177 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
178 if (!( -d $TEMPDIR && -w $TEMPDIR )) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
179 $TEMPDIR = '.'; # last resort
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
180 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
181 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
182 # File::Temp failed (alone, or File::Spec already failed)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
183 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
184 # determine open flags for tempfile creation -- we'll have to do this
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
185 # ourselves
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
186 use Fcntl;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
187 use Symbol;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
188 $OPENFLAGS = O_CREAT | O_EXCL | O_RDWR;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
189 for my $oflag (qw/FOLLOW BINARY LARGEFILE EXLOCK NOINHERIT TEMPORARY/){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
190 my ($bit, $func) = (0, "Fcntl::O_" . $oflag);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
191 no strict 'refs';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
192 $OPENFLAGS |= $bit if eval { $bit = &$func(); 1 };
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
193 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
194 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
195 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
196
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
197 =head2 new
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
198
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
199 Title : new
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
200 Usage :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
201 Function: Overridden here to automatically call _initialize_io().
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
202 Example :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
203 Returns : new instance of this class
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
204 Args : named parameters
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
205
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
206
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
207 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
208
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
209 sub new {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
210 my ($caller, @args) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
211 my $self = $caller->SUPER::new(@args);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
212
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
213 $self->_initialize_io(@args);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
214 return $self;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
215 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
216
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
217 =head2 _initialize_io
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
218
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
219 Title : initialize_io
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
220 Usage : $self->_initialize_io(@params);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
221 Function: Initializes filehandle and other properties from the parameters.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
222
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
223 Currently recognizes the following named parameters:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
224 -file name of file to open
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
225 -input name of file, or GLOB, or IO::Handle object
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
226 -fh file handle (mutually exclusive with -file)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
227 -flush boolean flag to autoflush after each write
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
228 -noclose boolean flag, when set to true will not close a
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
229 filehandle (must explictly call close($io->_fh)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
230 Returns : TRUE
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
231 Args : named parameters
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
232
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
233
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
234 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
235
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
236 sub _initialize_io {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
237 my($self, @args) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
238
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
239 $self->_register_for_cleanup(\&_io_cleanup);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
240
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
241 my ($input, $noclose, $file, $fh, $flush) = $self->_rearrange([qw(INPUT
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
242 NOCLOSE
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
243 FILE FH
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
244 FLUSH)], @args);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
245
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
246 delete $self->{'_readbuffer'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
247 delete $self->{'_filehandle'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
248 $self->noclose( $noclose) if defined $noclose;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
249 # determine whether the input is a file(name) or a stream
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
250 if($input) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
251 if(ref(\$input) eq "SCALAR") {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
252 # we assume that a scalar is a filename
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
253 if($file && ($file ne $input)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
254 $self->throw("input file given twice: $file and $input disagree");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
255 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
256 $file = $input;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
257 } elsif(ref($input) &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
258 ((ref($input) eq "GLOB") || $input->isa('IO::Handle'))) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
259 # input is a stream
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
260 $fh = $input;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
261 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
262 # let's be strict for now
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
263 $self->throw("unable to determine type of input $input: ".
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
264 "not string and not GLOB");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
265 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
266 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
267 if(defined($file) && defined($fh)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
268 $self->throw("Providing both a file and a filehandle for reading - only one please!");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
269 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
270
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
271 if(defined($file) && ($file ne '')) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
272 $fh = Symbol::gensym();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
273 open ($fh,$file) ||
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
274 $self->throw("Could not open $file: $!");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
275 $self->file($file);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
276 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
277 $self->_fh($fh) if $fh; # if not provided, defaults to STDIN and STDOUT
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
278
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
279 $self->_flush_on_write(defined $flush ? $flush : 1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
280
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
281 return 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
282 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
283
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
284 =head2 _fh
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
285
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
286 Title : _fh
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
287 Usage : $obj->_fh($newval)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
288 Function: Get/set the file handle for the stream encapsulated.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
289 Example :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
290 Returns : value of _filehandle
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
291 Args : newvalue (optional)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
292
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
293 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
294
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
295 sub _fh {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
296 my ($obj, $value) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
297 if ( defined $value) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
298 $obj->{'_filehandle'} = $value;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
299 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
300 return $obj->{'_filehandle'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
301 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
302
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
303 =head2 mode
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
304
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
305 Title : mode
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
306 Usage : $obj->mode()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
307 Function:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
308 Example :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
309 Returns : mode of filehandle:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
310 'r' for readable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
311 'w' for writeable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
312 '?' if mode could not be determined
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
313 Args : -force (optional), see notes.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
314 Notes : once mode() has been called, the filehandle's mode is cached
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
315 for further calls to mode(). to override this behavior so
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
316 that mode() re-checks the filehandle's mode, call with arg
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
317 -force
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
318
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
319 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
320
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
321 sub mode {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
322 my ($obj, @arg) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
323 my %param = @arg;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
324 return $obj->{'_mode'} if defined $obj->{'_mode'} and !$param{-force};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
325
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
326 print STDERR "testing mode... " if $obj->verbose;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
327
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
328 # we need to dup() the original filehandle because
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
329 # doing fdopen() calls on an already open handle causes
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
330 # the handle to go stale. is this going to work for non-unix
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
331 # filehandles? -allen
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
332
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
333 my $fh = Symbol::gensym();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
334
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
335 my $iotest = new IO::Handle;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
336
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
337 #test for a readable filehandle;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
338 $iotest->fdopen( dup(fileno($obj->_fh)) , 'r' );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
339 if($iotest->error == 0){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
340
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
341 # note the hack here, we actually have to try to read the line
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
342 # and if we get something, pushback() it into the readbuffer.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
343 # this is because solaris and windows xp (others?) don't set
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
344 # IO::Handle::error. for non-linux the r/w testing is done
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
345 # inside this read-test, instead of the write test below. ugh.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
346
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
347 if($^O eq 'linux'){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
348 $obj->{'_mode'} = 'r';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
349 my $line = $iotest->getline;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
350 $obj->_pushback($line) if defined $line;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
351 $obj->{'_mode'} = defined $line ? 'r' : 'w';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
352 return $obj->{'_mode'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
353 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
354 my $line = $iotest->getline;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
355 $obj->_pushback($line) if defined $line;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
356 $obj->{'_mode'} = defined $line ? 'r' : 'w';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
357 return $obj->{'_mode'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
358 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
359 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
360 $iotest->clearerr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
361
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
362 #test for a writeable filehandle;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
363 $iotest->fdopen( dup(fileno($obj->_fh)) , 'w' );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
364 if($iotest->error == 0){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
365 $obj->{'_mode'} = 'w';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
366 # return $obj->{'_mode'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
367 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
368
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
369 #wtf type of filehandle is this?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
370 # $obj->{'_mode'} = '?';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
371 return $obj->{'_mode'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
372 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
373
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
374 =head2 file
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
375
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
376 Title : file
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
377 Usage : $obj->file($newval)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
378 Function: Get/set the filename, if one has been designated.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
379 Example :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
380 Returns : value of file
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
381 Args : newvalue (optional)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
382
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
383
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
384 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
385
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
386 sub file {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
387 my ($obj, $value) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
388 if ( defined $value) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
389 $obj->{'_file'} = $value;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
390 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
391 return $obj->{'_file'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
392 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
393
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
394 =head2 _print
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
395
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
396 Title : _print
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
397 Usage : $obj->_print(@lines)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
398 Function:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
399 Example :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
400 Returns : writes output
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
401
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
402 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
403
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
404 sub _print {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
405 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
406 my $fh = $self->_fh() || \*STDOUT;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
407 print $fh @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
408 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
409
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
410 =head2 _readline
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
411
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
412 Title : _readline
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
413 Usage : $obj->_readline(%args)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
414 Function: Reads a line of input.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
415
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
416 Note that this method implicitely uses the value of $/ that is
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
417 in effect when called.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
418
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
419 Note also that the current implementation does not handle pushed
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
420 back input correctly unless the pushed back input ends with the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
421 value of $/.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
422
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
423 Example :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
424 Args : Accepts a hash of arguments, currently only -raw is recognized
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
425 passing (-raw => 1) prevents \r\n sequences from being changed
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
426 to \n. The default value of -raw is undef, allowing \r\n to be
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
427 converted to \n.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
428 Returns :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
429
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
430 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
431
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
432 sub _readline {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
433 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
434 my %param =@_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
435 my $fh = $self->_fh || \*ARGV;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
436 my $line;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
437
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
438 # if the buffer been filled by _pushback then return the buffer
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
439 # contents, rather than read from the filehandle
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
440 $line = shift @{$self->{'_readbuffer'}} || <$fh>;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
441
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
442 #don't strip line endings if -raw is specified
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
443 $line =~ s/\r\n/\n/g if( (!$param{-raw}) && (defined $line) );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
444
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
445 return $line;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
446 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
447
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
448 =head2 _pushback
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
449
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
450 Title : _pushback
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
451 Usage : $obj->_pushback($newvalue)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
452 Function: puts a line previously read with _readline back into a buffer.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
453 buffer can hold as many lines as system memory permits.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
454 Example :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
455 Returns :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
456 Args : newvalue
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
457
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
458 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
459
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
460 sub _pushback {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
461 my ($obj, $value) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
462
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
463 $obj->{'_readbuffer'} ||= [];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
464 push @{$obj->{'_readbuffer'}}, $value;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
465 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
466
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
467 =head2 close
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
468
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
469 Title : close
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
470 Usage : $io->close()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
471 Function: Closes the file handle associated with this IO instance.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
472 Will not close the FH if -noclose is specified
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
473 Returns : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
474 Args : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
475
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
476 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
477
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
478 sub close {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
479 my ($self) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
480 return if $self->noclose; # don't close if we explictly asked not to
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
481 if( defined $self->{'_filehandle'} ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
482 $self->flush;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
483 return if( \*STDOUT == $self->_fh ||
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
484 \*STDERR == $self->_fh ||
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
485 \*STDIN == $self->_fh
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
486 ); # don't close STDOUT fh
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
487 if( ! ref($self->{'_filehandle'}) ||
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
488 ! $self->{'_filehandle'}->isa('IO::String') ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
489 close($self->{'_filehandle'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
490 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
491 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
492 $self->{'_filehandle'} = undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
493 delete $self->{'_readbuffer'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
494 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
495
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
496
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
497 =head2 flush
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
498
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
499 Title : flush
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
500 Usage : $io->flush()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
501 Function: Flushes the filehandle
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
502 Returns : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
503 Args : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
504
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
505 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
506
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
507 sub flush {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
508 my ($self) = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
509
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
510 if( !defined $self->{'_filehandle'} ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
511 $self->throw("Attempting to call flush but no filehandle active");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
512 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
513
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
514 if( ref($self->{'_filehandle'}) =~ /GLOB/ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
515 my $oldh = select($self->{'_filehandle'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
516 $| = 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
517 select($oldh);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
518 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
519 $self->{'_filehandle'}->flush();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
520 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
521 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
522
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
523 =head2 noclose
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
524
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
525 Title : noclose
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
526 Usage : $obj->noclose($newval)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
527 Function: Get/Set the NOCLOSE flag - setting this to true will
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
528 prevent a filehandle from being closed
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
529 when an object is cleaned up or explicitly closed
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
530 This is a bit of hack
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
531 Returns : value of noclose (a scalar)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
532 Args : on set, new value (a scalar or undef, optional)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
533
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
534
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
535 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
536
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
537 sub noclose{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
538 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
539
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
540 return $self->{'_noclose'} = shift if @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
541 return $self->{'_noclose'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
542 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
543
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
544 sub _io_cleanup {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
545 my ($self) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
546
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
547 $self->close();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
548 my $v = $self->verbose;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
549
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
550 # we are planning to cleanup temp files no matter what
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
551 if( exists($self->{'_rootio_tempfiles'}) &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
552 ref($self->{'_rootio_tempfiles'}) =~ /array/i) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
553 if( $v > 0 ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
554 print STDERR "going to remove files ",
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
555 join(",", @{$self->{'_rootio_tempfiles'}}), "\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
556 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
557 unlink (@{$self->{'_rootio_tempfiles'}} );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
558 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
559 # cleanup if we are not using File::Temp
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
560 if( $self->{'_cleanuptempdir'} &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
561 exists($self->{'_rootio_tempdirs'}) &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
562 ref($self->{'_rootio_tempdirs'}) =~ /array/i) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
563
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
564 if( $v > 0 ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
565 print STDERR "going to remove dirs ",
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
566 join(",", @{$self->{'_rootio_tempdirs'}}), "\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
567 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
568 $self->rmtree( $self->{'_rootio_tempdirs'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
569 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
570 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
571
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
572 =head2 exists_exe
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
573
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
574 Title : exists_exe
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
575 Usage : $exists = $obj->exists_exe('clustalw');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
576 $exists = Bio::Root::IO->exists_exe('clustalw')
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
577 $exists = Bio::Root::IO::exists_exe('clustalw')
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
578 Function: Determines whether the given executable exists either as file
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
579 or within the path environment. The latter requires File::Spec
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
580 to be installed.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
581 On Win32-based system, .exe is automatically appended to the program
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
582 name unless the program name already ends in .exe.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
583 Example :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
584 Returns : 1 if the given program is callable as an executable, and 0 otherwise
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
585 Args : the name of the executable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
586
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
587 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
588
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
589 sub exists_exe {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
590 my ($self, $exe) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
591 $exe = $self if(!(ref($self) || $exe));
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
592 $exe .= '.exe' if(($^O =~ /mswin/i) && ($exe !~ /\.(exe|com|bat|cmd)$/i));
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
593 return $exe if(-e $exe); # full path and exists
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
594
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
595 # Ewan's comment. I don't think we need this. People should not be
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
596 # asking for a program with a pathseparator starting it
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
597
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
598 # $exe =~ s/^$PATHSEP//;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
599
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
600 # Not a full path, or does not exist. Let's see whether it's in the path.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
601 if($FILESPECLOADED) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
602 foreach my $dir (File::Spec->path()) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
603 my $f = Bio::Root::IO->catfile($dir, $exe);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
604 return $f if(-e $f && -x $f );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
605 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
606 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
607 return 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
608 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
609
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
610 =head2 tempfile
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
611
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
612 Title : tempfile
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
613 Usage : my ($handle,$tempfile) = $io->tempfile();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
614 Function: Returns a temporary filename and a handle opened for writing and
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
615 and reading.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
616
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
617 Caveats : If you do not have File::Temp on your system you should avoid
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
618 specifying TEMPLATE and SUFFIX. (We don't want to recode
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
619 everything, okay?)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
620 Returns : a 2-element array, consisting of temporary handle and temporary
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
621 file name
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
622 Args : named parameters compatible with File::Temp: DIR (defaults to
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
623 $Bio::Root::IO::TEMPDIR), TEMPLATE, SUFFIX.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
624
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
625 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
626
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
627 #'
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
628 sub tempfile {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
629 my ($self, @args) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
630 my ($tfh, $file);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
631 my %params = @args;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
632
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
633 # map between naming with and without dash
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
634 foreach my $key (keys(%params)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
635 if( $key =~ /^-/ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
636 my $v = $params{$key};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
637 delete $params{$key};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
638 $params{uc(substr($key,1))} = $v;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
639 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
640 # this is to upper case
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
641 my $v = $params{$key};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
642 delete $params{$key};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
643 $params{uc($key)} = $v;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
644 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
645 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
646 $params{'DIR'} = $TEMPDIR if(! exists($params{'DIR'}));
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
647 unless (exists $params{'UNLINK'} &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
648 defined $params{'UNLINK'} &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
649 ! $params{'UNLINK'} ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
650 $params{'UNLINK'} = 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
651 } else { $params{'UNLINK'} = 0 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
652
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
653 if($FILETEMPLOADED) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
654 if(exists($params{'TEMPLATE'})) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
655 my $template = $params{'TEMPLATE'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
656 delete $params{'TEMPLATE'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
657 ($tfh, $file) = File::Temp::tempfile($template, %params);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
658 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
659 ($tfh, $file) = File::Temp::tempfile(%params);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
660 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
661 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
662 my $dir = $params{'DIR'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
663 $file = $self->catfile($dir,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
664 (exists($params{'TEMPLATE'}) ?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
665 $params{'TEMPLATE'} :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
666 sprintf( "%s.%s.%s",
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
667 $ENV{USER} || 'unknown', $$,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
668 $TEMPCOUNTER++)));
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
669
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
670 # sneakiness for getting around long filenames on Win32?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
671 if( $HAS_WIN32 ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
672 $file = Win32::GetShortPathName($file);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
673 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
674
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
675 # taken from File::Temp
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
676 if ($] < 5.006) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
677 $tfh = &Symbol::gensym;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
678 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
679 # Try to make sure this will be marked close-on-exec
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
680 # XXX: Win32 doesn't respect this, nor the proper fcntl,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
681 # but may have O_NOINHERIT. This may or may not be in Fcntl.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
682 local $^F = 2;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
683 # Store callers umask
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
684 my $umask = umask();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
685 # Set a known umaskr
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
686 umask(066);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
687 # Attempt to open the file
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
688 if ( sysopen($tfh, $file, $OPENFLAGS, 0600) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
689 # Reset umask
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
690 umask($umask);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
691 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
692 $self->throw("Could not open tempfile $file: $!\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
693 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
694 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
695
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
696 if( $params{'UNLINK'} ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
697 push @{$self->{'_rootio_tempfiles'}}, $file;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
698 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
699
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
700
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
701 return wantarray ? ($tfh,$file) : $tfh;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
702 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
703
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
704 =head2 tempdir
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
705
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
706 Title : tempdir
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
707 Usage : my ($tempdir) = $io->tempdir(CLEANUP=>1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
708 Function: Creates and returns the name of a new temporary directory.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
709
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
710 Note that you should not use this function for obtaining "the"
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
711 temp directory. Use $Bio::Root::IO::TEMPDIR for that. Calling this
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
712 method will in fact create a new directory.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
713
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
714 Returns : The name of a new temporary directory.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
715 Args : args - ( key CLEANUP ) indicates whether or not to cleanup
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
716 dir on object destruction, other keys as specified by File::Temp
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
717
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
718 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
719
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
720 sub tempdir {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
721 my ( $self, @args ) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
722 if($FILETEMPLOADED && File::Temp->can('tempdir') ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
723 return File::Temp::tempdir(@args);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
724 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
725
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
726 # we have to do this ourselves, not good
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
727 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
728 # we are planning to cleanup temp files no matter what
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
729 my %params = @args;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
730 $self->{'_cleanuptempdir'} = ( defined $params{CLEANUP} &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
731 $params{CLEANUP} == 1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
732 my $tdir = $self->catfile($TEMPDIR,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
733 sprintf("dir_%s-%s-%s",
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
734 $ENV{USER} || 'unknown', $$,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
735 $TEMPCOUNTER++));
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
736 mkdir($tdir, 0755);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
737 push @{$self->{'_rootio_tempdirs'}}, $tdir;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
738 return $tdir;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
739 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
740
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
741 =head2 catfile
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
742
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
743 Title : catfile
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
744 Usage : $path = Bio::Root::IO->catfile(@dirs,$filename);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
745 Function: Constructs a full pathname in a cross-platform safe way.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
746
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
747 If File::Spec exists on your system, this routine will merely
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
748 delegate to it. Otherwise it tries to make a good guess.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
749
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
750 You should use this method whenever you construct a path name
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
751 from directory and filename. Otherwise you risk cross-platform
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
752 compatibility of your code.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
753
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
754 You can call this method both as a class and an instance method.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
755
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
756 Returns : a string
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
757 Args : components of the pathname (directories and filename, NOT an
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
758 extension)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
759
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
760 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
761
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
762 sub catfile {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
763 my ($self, @args) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
764
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
765 return File::Spec->catfile(@args) if($FILESPECLOADED);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
766 # this is clumsy and not very appealing, but how do we specify the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
767 # root directory?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
768 if($args[0] eq '/') {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
769 $args[0] = $ROOTDIR;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
770 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
771 return join($PATHSEP, @args);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
772 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
773
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
774 =head2 rmtree
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
775
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
776 Title : rmtree
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
777 Usage : Bio::Root::IO->rmtree($dirname );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
778 Function: Remove a full directory tree
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
779
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
780 If File::Path exists on your system, this routine will merely
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
781 delegate to it. Otherwise it runs a local version of that code.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
782
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
783 You should use this method to remove directories which contain
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
784 files.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
785
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
786 You can call this method both as a class and an instance method.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
787
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
788 Returns : number of files successfully deleted
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
789 Args : roots - rootdir to delete or reference to list of dirs
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
790
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
791 verbose - a boolean value, which if TRUE will cause
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
792 C<rmtree> to print a message each time it
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
793 examines a file, giving the name of the file, and
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
794 indicating whether it's using C<rmdir> or
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
795 C<unlink> to remove it, or that it's skipping it.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
796 (defaults to FALSE)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
797
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
798 safe - a boolean value, which if TRUE will cause C<rmtree>
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
799 to skip any files to which you do not have delete
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
800 access (if running under VMS) or write access (if
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
801 running under another OS). This will change in the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
802 future when a criterion for 'delete permission'
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
803 under OSs other than VMS is settled. (defaults to
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
804 FALSE)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
805
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
806 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
807
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
808 # taken straight from File::Path VERSION = "1.0403"
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
809 sub rmtree {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
810 my($self,$roots, $verbose, $safe) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
811 if( $FILEPATHLOADED ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
812 return File::Path::rmtree ($roots, $verbose, $safe);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
813 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
814
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
815 my $force_writeable = ($^O eq 'os2' || $^O eq 'dos' || $^O eq 'MSWin32'
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
816 || $^O eq 'amigaos');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
817 my $Is_VMS = $^O eq 'VMS';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
818
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
819 my(@files);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
820 my($count) = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
821 $verbose ||= 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
822 $safe ||= 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
823 if ( defined($roots) && length($roots) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
824 $roots = [$roots] unless ref $roots;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
825 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
826 $self->warn("No root path(s) specified\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
827 return 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
828 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
829
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
830 my($root);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
831 foreach $root (@{$roots}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
832 $root =~ s#/\z##;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
833 (undef, undef, my $rp) = lstat $root or next;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
834 $rp &= 07777; # don't forget setuid, setgid, sticky bits
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
835 if ( -d _ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
836 # notabene: 0777 is for making readable in the first place,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
837 # it's also intended to change it to writable in case we have
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
838 # to recurse in which case we are better than rm -rf for
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
839 # subtrees with strange permissions
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
840 chmod(0777, ($Is_VMS ? VMS::Filespec::fileify($root) : $root))
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
841 or $self->warn("Can't make directory $root read+writeable: $!")
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
842 unless $safe;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
843 if (opendir(DIR, $root) ){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
844 @files = readdir DIR;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
845 closedir(DIR);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
846 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
847 $self->warn( "Can't read $root: $!");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
848 @files = ();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
849 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
850
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
851 # Deleting large numbers of files from VMS Files-11 filesystems
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
852 # is faster if done in reverse ASCIIbetical order
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
853 @files = reverse @files if $Is_VMS;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
854 ($root = VMS::Filespec::unixify($root)) =~ s#\.dir\z## if $Is_VMS;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
855 @files = map("$root/$_", grep $_!~/^\.{1,2}\z/s,@files);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
856 $count += $self->rmtree([@files],$verbose,$safe);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
857 if ($safe &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
858 ($Is_VMS ? !&VMS::Filespec::candelete($root) : !-w $root)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
859 print "skipped $root\n" if $verbose;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
860 next;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
861 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
862 chmod 0777, $root
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
863 or $self->warn( "Can't make directory $root writeable: $!")
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
864 if $force_writeable;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
865 print "rmdir $root\n" if $verbose;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
866 if (rmdir $root) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
867 ++$count;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
868 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
869 else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
870 $self->warn( "Can't remove directory $root: $!");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
871 chmod($rp, ($Is_VMS ? VMS::Filespec::fileify($root) : $root))
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
872 or $self->warn("and can't restore permissions to "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
873 . sprintf("0%o",$rp) . "\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
874 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
875 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
876 else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
877
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
878 if ($safe &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
879 ($Is_VMS ? !&VMS::Filespec::candelete($root)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
880 : !(-l $root || -w $root)))
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
881 {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
882 print "skipped $root\n" if $verbose;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
883 next;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
884 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
885 chmod 0666, $root
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
886 or $self->warn( "Can't make file $root writeable: $!")
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
887 if $force_writeable;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
888 print "unlink $root\n" if $verbose;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
889 # delete all versions under VMS
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
890 for (;;) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
891 unless (unlink $root) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
892 $self->warn( "Can't unlink file $root: $!");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
893 if ($force_writeable) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
894 chmod $rp, $root
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
895 or $self->warn("and can't restore permissions to "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
896 . sprintf("0%o",$rp) . "\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
897 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
898 last;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
899 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
900 ++$count;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
901 last unless $Is_VMS && lstat $root;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
902 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
903 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
904 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
905
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
906 $count;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
907 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
908
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
909 =head2 _flush_on_write
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
910
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
911 Title : _flush_on_write
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
912 Usage : $obj->_flush_on_write($newval)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
913 Function: Boolean flag to indicate whether to flush
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
914 the filehandle on writing when the end of
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
915 a component is finished (Sequences,Alignments,etc)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
916 Returns : value of _flush_on_write
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
917 Args : newvalue (optional)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
918
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
919
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
920 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
921
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
922 sub _flush_on_write {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
923 my ($self,$value) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
924 if( defined $value) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
925 $self->{'_flush_on_write'} = $value;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
926 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
927 return $self->{'_flush_on_write'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
928 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
929
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
930 1;