xref: /openbsd-src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Builder/IO/Scalar.pm (revision 9f11ffb7133c203312a01e4b986886bc88c7d74b)
1b8851fccSafresh1package Test::Builder::IO::Scalar;
2b8851fccSafresh1
3b8851fccSafresh1
4b8851fccSafresh1=head1 NAME
5b8851fccSafresh1
6b8851fccSafresh1Test::Builder::IO::Scalar - A copy of IO::Scalar for Test::Builder
7b8851fccSafresh1
8b8851fccSafresh1=head1 DESCRIPTION
9b8851fccSafresh1
10b8851fccSafresh1This is a copy of L<IO::Scalar> which ships with L<Test::Builder> to
11b8851fccSafresh1support scalar references as filehandles on Perl 5.6.  Newer
12b8851fccSafresh1versions of Perl simply use C<open()>'s built in support.
13b8851fccSafresh1
14b8851fccSafresh1L<Test::Builder> can not have dependencies on other modules without
15b8851fccSafresh1careful consideration, so its simply been copied into the distribution.
16b8851fccSafresh1
17b8851fccSafresh1=head1 COPYRIGHT and LICENSE
18b8851fccSafresh1
19b8851fccSafresh1This file came from the "IO-stringy" Perl5 toolkit.
20b8851fccSafresh1
21b8851fccSafresh1Copyright (c) 1996 by Eryq.  All rights reserved.
22b8851fccSafresh1Copyright (c) 1999,2001 by ZeeGee Software Inc.  All rights reserved.
23b8851fccSafresh1
24b8851fccSafresh1This program is free software; you can redistribute it and/or
25b8851fccSafresh1modify it under the same terms as Perl itself.
26b8851fccSafresh1
27b8851fccSafresh1
28b8851fccSafresh1=cut
29b8851fccSafresh1
30b8851fccSafresh1# This is copied code, I don't care.
31b8851fccSafresh1##no critic
32b8851fccSafresh1
33b8851fccSafresh1use Carp;
34b8851fccSafresh1use strict;
35b8851fccSafresh1use vars qw($VERSION @ISA);
36b8851fccSafresh1use IO::Handle;
37b8851fccSafresh1
38b8851fccSafresh1use 5.005;
39b8851fccSafresh1
40b8851fccSafresh1### The package version, both in 1.23 style *and* usable by MakeMaker:
41*9f11ffb7Safresh1$VERSION = "2.114";
42b8851fccSafresh1
43b8851fccSafresh1### Inheritance:
44b8851fccSafresh1@ISA = qw(IO::Handle);
45b8851fccSafresh1
46b8851fccSafresh1#==============================
47b8851fccSafresh1
48b8851fccSafresh1=head2 Construction
49b8851fccSafresh1
50b8851fccSafresh1=over 4
51b8851fccSafresh1
52b8851fccSafresh1=cut
53b8851fccSafresh1
54b8851fccSafresh1#------------------------------
55b8851fccSafresh1
56b8851fccSafresh1=item new [ARGS...]
57b8851fccSafresh1
58b8851fccSafresh1I<Class method.>
59b8851fccSafresh1Return a new, unattached scalar handle.
60b8851fccSafresh1If any arguments are given, they're sent to open().
61b8851fccSafresh1
62b8851fccSafresh1=cut
63b8851fccSafresh1
64b8851fccSafresh1sub new {
65b8851fccSafresh1    my $proto = shift;
66b8851fccSafresh1    my $class = ref($proto) || $proto;
67b8851fccSafresh1    my $self = bless \do { local *FH }, $class;
68b8851fccSafresh1    tie *$self, $class, $self;
69b8851fccSafresh1    $self->open(@_);   ### open on anonymous by default
70b8851fccSafresh1    $self;
71b8851fccSafresh1}
72b8851fccSafresh1sub DESTROY {
73b8851fccSafresh1    shift->close;
74b8851fccSafresh1}
75b8851fccSafresh1
76b8851fccSafresh1#------------------------------
77b8851fccSafresh1
78b8851fccSafresh1=item open [SCALARREF]
79b8851fccSafresh1
80b8851fccSafresh1I<Instance method.>
81b8851fccSafresh1Open the scalar handle on a new scalar, pointed to by SCALARREF.
82b8851fccSafresh1If no SCALARREF is given, a "private" scalar is created to hold
83b8851fccSafresh1the file data.
84b8851fccSafresh1
85b8851fccSafresh1Returns the self object on success, undefined on error.
86b8851fccSafresh1
87b8851fccSafresh1=cut
88b8851fccSafresh1
89b8851fccSafresh1sub open {
90b8851fccSafresh1    my ($self, $sref) = @_;
91b8851fccSafresh1
92b8851fccSafresh1    ### Sanity:
93b8851fccSafresh1    defined($sref) or do {my $s = ''; $sref = \$s};
94b8851fccSafresh1    (ref($sref) eq "SCALAR") or croak "open() needs a ref to a scalar";
95b8851fccSafresh1
96b8851fccSafresh1    ### Setup:
97b8851fccSafresh1    *$self->{Pos} = 0;          ### seek position
98b8851fccSafresh1    *$self->{SR}  = $sref;      ### scalar reference
99b8851fccSafresh1    $self;
100b8851fccSafresh1}
101b8851fccSafresh1
102b8851fccSafresh1#------------------------------
103b8851fccSafresh1
104b8851fccSafresh1=item opened
105b8851fccSafresh1
106b8851fccSafresh1I<Instance method.>
107b8851fccSafresh1Is the scalar handle opened on something?
108b8851fccSafresh1
109b8851fccSafresh1=cut
110b8851fccSafresh1
111b8851fccSafresh1sub opened {
112b8851fccSafresh1    *{shift()}->{SR};
113b8851fccSafresh1}
114b8851fccSafresh1
115b8851fccSafresh1#------------------------------
116b8851fccSafresh1
117b8851fccSafresh1=item close
118b8851fccSafresh1
119b8851fccSafresh1I<Instance method.>
120b8851fccSafresh1Disassociate the scalar handle from its underlying scalar.
121b8851fccSafresh1Done automatically on destroy.
122b8851fccSafresh1
123b8851fccSafresh1=cut
124b8851fccSafresh1
125b8851fccSafresh1sub close {
126b8851fccSafresh1    my $self = shift;
127b8851fccSafresh1    %{*$self} = ();
128b8851fccSafresh1    1;
129b8851fccSafresh1}
130b8851fccSafresh1
131b8851fccSafresh1=back
132b8851fccSafresh1
133b8851fccSafresh1=cut
134b8851fccSafresh1
135b8851fccSafresh1
136b8851fccSafresh1
137b8851fccSafresh1#==============================
138b8851fccSafresh1
139b8851fccSafresh1=head2 Input and output
140b8851fccSafresh1
141b8851fccSafresh1=over 4
142b8851fccSafresh1
143b8851fccSafresh1=cut
144b8851fccSafresh1
145b8851fccSafresh1
146b8851fccSafresh1#------------------------------
147b8851fccSafresh1
148b8851fccSafresh1=item flush
149b8851fccSafresh1
150b8851fccSafresh1I<Instance method.>
151b8851fccSafresh1No-op, provided for OO compatibility.
152b8851fccSafresh1
153b8851fccSafresh1=cut
154b8851fccSafresh1
155b8851fccSafresh1sub flush { "0 but true" }
156b8851fccSafresh1
157b8851fccSafresh1#------------------------------
158b8851fccSafresh1
159b8851fccSafresh1=item getc
160b8851fccSafresh1
161b8851fccSafresh1I<Instance method.>
162b8851fccSafresh1Return the next character, or undef if none remain.
163b8851fccSafresh1
164b8851fccSafresh1=cut
165b8851fccSafresh1
166b8851fccSafresh1sub getc {
167b8851fccSafresh1    my $self = shift;
168b8851fccSafresh1
169b8851fccSafresh1    ### Return undef right away if at EOF; else, move pos forward:
170b8851fccSafresh1    return undef if $self->eof;
171b8851fccSafresh1    substr(${*$self->{SR}}, *$self->{Pos}++, 1);
172b8851fccSafresh1}
173b8851fccSafresh1
174b8851fccSafresh1#------------------------------
175b8851fccSafresh1
176b8851fccSafresh1=item getline
177b8851fccSafresh1
178b8851fccSafresh1I<Instance method.>
179b8851fccSafresh1Return the next line, or undef on end of string.
180b8851fccSafresh1Can safely be called in an array context.
181b8851fccSafresh1Currently, lines are delimited by "\n".
182b8851fccSafresh1
183b8851fccSafresh1=cut
184b8851fccSafresh1
185b8851fccSafresh1sub getline {
186b8851fccSafresh1    my $self = shift;
187b8851fccSafresh1
188b8851fccSafresh1    ### Return undef right away if at EOF:
189b8851fccSafresh1    return undef if $self->eof;
190b8851fccSafresh1
191b8851fccSafresh1    ### Get next line:
192b8851fccSafresh1    my $sr = *$self->{SR};
193b8851fccSafresh1    my $i  = *$self->{Pos};	        ### Start matching at this point.
194b8851fccSafresh1
195b8851fccSafresh1    ### Minimal impact implementation!
196b8851fccSafresh1    ### We do the fast fast thing (no regexps) if using the
197b8851fccSafresh1    ### classic input record separator.
198b8851fccSafresh1
199b8851fccSafresh1    ### Case 1: $/ is undef: slurp all...
200b8851fccSafresh1    if    (!defined($/)) {
201b8851fccSafresh1	*$self->{Pos} = length $$sr;
202b8851fccSafresh1        return substr($$sr, $i);
203b8851fccSafresh1    }
204b8851fccSafresh1
205b8851fccSafresh1    ### Case 2: $/ is "\n": zoom zoom zoom...
206b8851fccSafresh1    elsif ($/ eq "\012") {
207b8851fccSafresh1
208b8851fccSafresh1        ### Seek ahead for "\n"... yes, this really is faster than regexps.
209b8851fccSafresh1        my $len = length($$sr);
210b8851fccSafresh1        for (; $i < $len; ++$i) {
211b8851fccSafresh1           last if ord (substr ($$sr, $i, 1)) == 10;
212b8851fccSafresh1        }
213b8851fccSafresh1
214b8851fccSafresh1        ### Extract the line:
215b8851fccSafresh1        my $line;
216b8851fccSafresh1        if ($i < $len) {                ### We found a "\n":
217b8851fccSafresh1            $line = substr ($$sr, *$self->{Pos}, $i - *$self->{Pos} + 1);
218b8851fccSafresh1            *$self->{Pos} = $i+1;            ### Remember where we finished up.
219b8851fccSafresh1        }
220b8851fccSafresh1        else {                          ### No "\n"; slurp the remainder:
221b8851fccSafresh1            $line = substr ($$sr, *$self->{Pos}, $i - *$self->{Pos});
222b8851fccSafresh1            *$self->{Pos} = $len;
223b8851fccSafresh1        }
224b8851fccSafresh1        return $line;
225b8851fccSafresh1    }
226b8851fccSafresh1
227b8851fccSafresh1    ### Case 3: $/ is ref to int. Do fixed-size records.
228b8851fccSafresh1    ###        (Thanks to Dominique Quatravaux.)
229b8851fccSafresh1    elsif (ref($/)) {
230b8851fccSafresh1        my $len = length($$sr);
231b8851fccSafresh1		my $i = ${$/} + 0;
232b8851fccSafresh1		my $line = substr ($$sr, *$self->{Pos}, $i);
233b8851fccSafresh1		*$self->{Pos} += $i;
234b8851fccSafresh1        *$self->{Pos} = $len if (*$self->{Pos} > $len);
235b8851fccSafresh1		return $line;
236b8851fccSafresh1    }
237b8851fccSafresh1
238b8851fccSafresh1    ### Case 4: $/ is either "" (paragraphs) or something weird...
239b8851fccSafresh1    ###         This is Graham's general-purpose stuff, which might be
240b8851fccSafresh1    ###         a tad slower than Case 2 for typical data, because
241b8851fccSafresh1    ###         of the regexps.
242b8851fccSafresh1    else {
243b8851fccSafresh1        pos($$sr) = $i;
244b8851fccSafresh1
245b8851fccSafresh1	### If in paragraph mode, skip leading lines (and update i!):
246b8851fccSafresh1        length($/) or
247b8851fccSafresh1	    (($$sr =~ m/\G\n*/g) and ($i = pos($$sr)));
248b8851fccSafresh1
249b8851fccSafresh1        ### If we see the separator in the buffer ahead...
250b8851fccSafresh1        if (length($/)
251b8851fccSafresh1	    ?  $$sr =~ m,\Q$/\E,g          ###   (ordinary sep) TBD: precomp!
252b8851fccSafresh1            :  $$sr =~ m,\n\n,g            ###   (a paragraph)
253b8851fccSafresh1            ) {
254b8851fccSafresh1            *$self->{Pos} = pos $$sr;
255b8851fccSafresh1            return substr($$sr, $i, *$self->{Pos}-$i);
256b8851fccSafresh1        }
257b8851fccSafresh1        ### Else if no separator remains, just slurp the rest:
258b8851fccSafresh1        else {
259b8851fccSafresh1            *$self->{Pos} = length $$sr;
260b8851fccSafresh1            return substr($$sr, $i);
261b8851fccSafresh1        }
262b8851fccSafresh1    }
263b8851fccSafresh1}
264b8851fccSafresh1
265b8851fccSafresh1#------------------------------
266b8851fccSafresh1
267b8851fccSafresh1=item getlines
268b8851fccSafresh1
269b8851fccSafresh1I<Instance method.>
270b8851fccSafresh1Get all remaining lines.
271b8851fccSafresh1It will croak() if accidentally called in a scalar context.
272b8851fccSafresh1
273b8851fccSafresh1=cut
274b8851fccSafresh1
275b8851fccSafresh1sub getlines {
276b8851fccSafresh1    my $self = shift;
277b8851fccSafresh1    wantarray or croak("can't call getlines in scalar context!");
278b8851fccSafresh1    my ($line, @lines);
279b8851fccSafresh1    push @lines, $line while (defined($line = $self->getline));
280b8851fccSafresh1    @lines;
281b8851fccSafresh1}
282b8851fccSafresh1
283b8851fccSafresh1#------------------------------
284b8851fccSafresh1
285b8851fccSafresh1=item print ARGS...
286b8851fccSafresh1
287b8851fccSafresh1I<Instance method.>
288b8851fccSafresh1Print ARGS to the underlying scalar.
289b8851fccSafresh1
290b8851fccSafresh1B<Warning:> this continues to always cause a seek to the end
291b8851fccSafresh1of the string, but if you perform seek()s and tell()s, it is
292b8851fccSafresh1still safer to explicitly seek-to-end before subsequent print()s.
293b8851fccSafresh1
294b8851fccSafresh1=cut
295b8851fccSafresh1
296b8851fccSafresh1sub print {
297b8851fccSafresh1    my $self = shift;
298b8851fccSafresh1    *$self->{Pos} = length(${*$self->{SR}} .= join('', @_) . (defined($\) ? $\ : ""));
299b8851fccSafresh1    1;
300b8851fccSafresh1}
301b8851fccSafresh1sub _unsafe_print {
302b8851fccSafresh1    my $self = shift;
303b8851fccSafresh1    my $append = join('', @_) . $\;
304b8851fccSafresh1    ${*$self->{SR}} .= $append;
305b8851fccSafresh1    *$self->{Pos}   += length($append);
306b8851fccSafresh1    1;
307b8851fccSafresh1}
308b8851fccSafresh1sub _old_print {
309b8851fccSafresh1    my $self = shift;
310b8851fccSafresh1    ${*$self->{SR}} .= join('', @_) . $\;
311b8851fccSafresh1    *$self->{Pos} = length(${*$self->{SR}});
312b8851fccSafresh1    1;
313b8851fccSafresh1}
314b8851fccSafresh1
315b8851fccSafresh1
316b8851fccSafresh1#------------------------------
317b8851fccSafresh1
318b8851fccSafresh1=item read BUF, NBYTES, [OFFSET]
319b8851fccSafresh1
320b8851fccSafresh1I<Instance method.>
321b8851fccSafresh1Read some bytes from the scalar.
322b8851fccSafresh1Returns the number of bytes actually read, 0 on end-of-file, undef on error.
323b8851fccSafresh1
324b8851fccSafresh1=cut
325b8851fccSafresh1
326b8851fccSafresh1sub read {
327b8851fccSafresh1    my $self = $_[0];
328b8851fccSafresh1    my $n    = $_[2];
329b8851fccSafresh1    my $off  = $_[3] || 0;
330b8851fccSafresh1
331b8851fccSafresh1    my $read = substr(${*$self->{SR}}, *$self->{Pos}, $n);
332b8851fccSafresh1    $n = length($read);
333b8851fccSafresh1    *$self->{Pos} += $n;
334b8851fccSafresh1    ($off ? substr($_[1], $off) : $_[1]) = $read;
335b8851fccSafresh1    return $n;
336b8851fccSafresh1}
337b8851fccSafresh1
338b8851fccSafresh1#------------------------------
339b8851fccSafresh1
340b8851fccSafresh1=item write BUF, NBYTES, [OFFSET]
341b8851fccSafresh1
342b8851fccSafresh1I<Instance method.>
343b8851fccSafresh1Write some bytes to the scalar.
344b8851fccSafresh1
345b8851fccSafresh1=cut
346b8851fccSafresh1
347b8851fccSafresh1sub write {
348b8851fccSafresh1    my $self = $_[0];
349b8851fccSafresh1    my $n    = $_[2];
350b8851fccSafresh1    my $off  = $_[3] || 0;
351b8851fccSafresh1
352b8851fccSafresh1    my $data = substr($_[1], $off, $n);
353b8851fccSafresh1    $n = length($data);
354b8851fccSafresh1    $self->print($data);
355b8851fccSafresh1    return $n;
356b8851fccSafresh1}
357b8851fccSafresh1
358b8851fccSafresh1#------------------------------
359b8851fccSafresh1
360b8851fccSafresh1=item sysread BUF, LEN, [OFFSET]
361b8851fccSafresh1
362b8851fccSafresh1I<Instance method.>
363b8851fccSafresh1Read some bytes from the scalar.
364b8851fccSafresh1Returns the number of bytes actually read, 0 on end-of-file, undef on error.
365b8851fccSafresh1
366b8851fccSafresh1=cut
367b8851fccSafresh1
368b8851fccSafresh1sub sysread {
369b8851fccSafresh1  my $self = shift;
370b8851fccSafresh1  $self->read(@_);
371b8851fccSafresh1}
372b8851fccSafresh1
373b8851fccSafresh1#------------------------------
374b8851fccSafresh1
375b8851fccSafresh1=item syswrite BUF, NBYTES, [OFFSET]
376b8851fccSafresh1
377b8851fccSafresh1I<Instance method.>
378b8851fccSafresh1Write some bytes to the scalar.
379b8851fccSafresh1
380b8851fccSafresh1=cut
381b8851fccSafresh1
382b8851fccSafresh1sub syswrite {
383b8851fccSafresh1  my $self = shift;
384b8851fccSafresh1  $self->write(@_);
385b8851fccSafresh1}
386b8851fccSafresh1
387b8851fccSafresh1=back
388b8851fccSafresh1
389b8851fccSafresh1=cut
390b8851fccSafresh1
391b8851fccSafresh1
392b8851fccSafresh1#==============================
393b8851fccSafresh1
394b8851fccSafresh1=head2 Seeking/telling and other attributes
395b8851fccSafresh1
396b8851fccSafresh1=over 4
397b8851fccSafresh1
398b8851fccSafresh1=cut
399b8851fccSafresh1
400b8851fccSafresh1
401b8851fccSafresh1#------------------------------
402b8851fccSafresh1
403b8851fccSafresh1=item autoflush
404b8851fccSafresh1
405b8851fccSafresh1I<Instance method.>
406b8851fccSafresh1No-op, provided for OO compatibility.
407b8851fccSafresh1
408b8851fccSafresh1=cut
409b8851fccSafresh1
410b8851fccSafresh1sub autoflush {}
411b8851fccSafresh1
412b8851fccSafresh1#------------------------------
413b8851fccSafresh1
414b8851fccSafresh1=item binmode
415b8851fccSafresh1
416b8851fccSafresh1I<Instance method.>
417b8851fccSafresh1No-op, provided for OO compatibility.
418b8851fccSafresh1
419b8851fccSafresh1=cut
420b8851fccSafresh1
421b8851fccSafresh1sub binmode {}
422b8851fccSafresh1
423b8851fccSafresh1#------------------------------
424b8851fccSafresh1
425b8851fccSafresh1=item clearerr
426b8851fccSafresh1
427b8851fccSafresh1I<Instance method.>  Clear the error and EOF flags.  A no-op.
428b8851fccSafresh1
429b8851fccSafresh1=cut
430b8851fccSafresh1
431b8851fccSafresh1sub clearerr { 1 }
432b8851fccSafresh1
433b8851fccSafresh1#------------------------------
434b8851fccSafresh1
435b8851fccSafresh1=item eof
436b8851fccSafresh1
437b8851fccSafresh1I<Instance method.>  Are we at end of file?
438b8851fccSafresh1
439b8851fccSafresh1=cut
440b8851fccSafresh1
441b8851fccSafresh1sub eof {
442b8851fccSafresh1    my $self = shift;
443b8851fccSafresh1    (*$self->{Pos} >= length(${*$self->{SR}}));
444b8851fccSafresh1}
445b8851fccSafresh1
446b8851fccSafresh1#------------------------------
447b8851fccSafresh1
448b8851fccSafresh1=item seek OFFSET, WHENCE
449b8851fccSafresh1
450b8851fccSafresh1I<Instance method.>  Seek to a given position in the stream.
451b8851fccSafresh1
452b8851fccSafresh1=cut
453b8851fccSafresh1
454b8851fccSafresh1sub seek {
455b8851fccSafresh1    my ($self, $pos, $whence) = @_;
456b8851fccSafresh1    my $eofpos = length(${*$self->{SR}});
457b8851fccSafresh1
458b8851fccSafresh1    ### Seek:
459b8851fccSafresh1    if    ($whence == 0) { *$self->{Pos} = $pos }             ### SEEK_SET
460b8851fccSafresh1    elsif ($whence == 1) { *$self->{Pos} += $pos }            ### SEEK_CUR
461b8851fccSafresh1    elsif ($whence == 2) { *$self->{Pos} = $eofpos + $pos}    ### SEEK_END
462b8851fccSafresh1    else                 { croak "bad seek whence ($whence)" }
463b8851fccSafresh1
464b8851fccSafresh1    ### Fixup:
465b8851fccSafresh1    if (*$self->{Pos} < 0)       { *$self->{Pos} = 0 }
466b8851fccSafresh1    if (*$self->{Pos} > $eofpos) { *$self->{Pos} = $eofpos }
467b8851fccSafresh1    return 1;
468b8851fccSafresh1}
469b8851fccSafresh1
470b8851fccSafresh1#------------------------------
471b8851fccSafresh1
472b8851fccSafresh1=item sysseek OFFSET, WHENCE
473b8851fccSafresh1
474b8851fccSafresh1I<Instance method.> Identical to C<seek OFFSET, WHENCE>, I<q.v.>
475b8851fccSafresh1
476b8851fccSafresh1=cut
477b8851fccSafresh1
478b8851fccSafresh1sub sysseek {
479b8851fccSafresh1    my $self = shift;
480b8851fccSafresh1    $self->seek (@_);
481b8851fccSafresh1}
482b8851fccSafresh1
483b8851fccSafresh1#------------------------------
484b8851fccSafresh1
485b8851fccSafresh1=item tell
486b8851fccSafresh1
487b8851fccSafresh1I<Instance method.>
488b8851fccSafresh1Return the current position in the stream, as a numeric offset.
489b8851fccSafresh1
490b8851fccSafresh1=cut
491b8851fccSafresh1
492b8851fccSafresh1sub tell { *{shift()}->{Pos} }
493b8851fccSafresh1
494b8851fccSafresh1#------------------------------
495b8851fccSafresh1
496b8851fccSafresh1=item  use_RS [YESNO]
497b8851fccSafresh1
498b8851fccSafresh1I<Instance method.>
499b8851fccSafresh1B<Deprecated and ignored.>
500b8851fccSafresh1Obey the current setting of $/, like IO::Handle does?
501b8851fccSafresh1Default is false in 1.x, but cold-welded true in 2.x and later.
502b8851fccSafresh1
503b8851fccSafresh1=cut
504b8851fccSafresh1
505b8851fccSafresh1sub use_RS {
506b8851fccSafresh1    my ($self, $yesno) = @_;
507b8851fccSafresh1    carp "use_RS is deprecated and ignored; \$/ is always consulted\n";
508b8851fccSafresh1 }
509b8851fccSafresh1
510b8851fccSafresh1#------------------------------
511b8851fccSafresh1
512b8851fccSafresh1=item setpos POS
513b8851fccSafresh1
514b8851fccSafresh1I<Instance method.>
515b8851fccSafresh1Set the current position, using the opaque value returned by C<getpos()>.
516b8851fccSafresh1
517b8851fccSafresh1=cut
518b8851fccSafresh1
519b8851fccSafresh1sub setpos { shift->seek($_[0],0) }
520b8851fccSafresh1
521b8851fccSafresh1#------------------------------
522b8851fccSafresh1
523b8851fccSafresh1=item getpos
524b8851fccSafresh1
525b8851fccSafresh1I<Instance method.>
526b8851fccSafresh1Return the current position in the string, as an opaque object.
527b8851fccSafresh1
528b8851fccSafresh1=cut
529b8851fccSafresh1
530b8851fccSafresh1*getpos = \&tell;
531b8851fccSafresh1
532b8851fccSafresh1
533b8851fccSafresh1#------------------------------
534b8851fccSafresh1
535b8851fccSafresh1=item sref
536b8851fccSafresh1
537b8851fccSafresh1I<Instance method.>
538b8851fccSafresh1Return a reference to the underlying scalar.
539b8851fccSafresh1
540b8851fccSafresh1=cut
541b8851fccSafresh1
542b8851fccSafresh1sub sref { *{shift()}->{SR} }
543b8851fccSafresh1
544b8851fccSafresh1
545b8851fccSafresh1#------------------------------
546b8851fccSafresh1# Tied handle methods...
547b8851fccSafresh1#------------------------------
548b8851fccSafresh1
549b8851fccSafresh1# Conventional tiehandle interface:
550b8851fccSafresh1sub TIEHANDLE {
551b8851fccSafresh1    ((defined($_[1]) && UNIVERSAL::isa($_[1], __PACKAGE__))
552b8851fccSafresh1     ? $_[1]
553b8851fccSafresh1     : shift->new(@_));
554b8851fccSafresh1}
555b8851fccSafresh1sub GETC      { shift->getc(@_) }
556b8851fccSafresh1sub PRINT     { shift->print(@_) }
557b8851fccSafresh1sub PRINTF    { shift->print(sprintf(shift, @_)) }
558b8851fccSafresh1sub READ      { shift->read(@_) }
559b8851fccSafresh1sub READLINE  { wantarray ? shift->getlines(@_) : shift->getline(@_) }
560b8851fccSafresh1sub WRITE     { shift->write(@_); }
561b8851fccSafresh1sub CLOSE     { shift->close(@_); }
562b8851fccSafresh1sub SEEK      { shift->seek(@_); }
563b8851fccSafresh1sub TELL      { shift->tell(@_); }
564b8851fccSafresh1sub EOF       { shift->eof(@_); }
565*9f11ffb7Safresh1sub FILENO    { -1 }
566b8851fccSafresh1
567b8851fccSafresh1#------------------------------------------------------------
568b8851fccSafresh1
569b8851fccSafresh11;
570b8851fccSafresh1
571b8851fccSafresh1__END__
572b8851fccSafresh1
573b8851fccSafresh1
574b8851fccSafresh1
575b8851fccSafresh1=back
576b8851fccSafresh1
577b8851fccSafresh1=cut
578b8851fccSafresh1
579b8851fccSafresh1
580b8851fccSafresh1=head1 WARNINGS
581b8851fccSafresh1
582b8851fccSafresh1Perl's TIEHANDLE spec was incomplete prior to 5.005_57;
583b8851fccSafresh1it was missing support for C<seek()>, C<tell()>, and C<eof()>.
584b8851fccSafresh1Attempting to use these functions with an IO::Scalar will not work
585b8851fccSafresh1prior to 5.005_57. IO::Scalar will not have the relevant methods
586b8851fccSafresh1invoked; and even worse, this kind of bug can lie dormant for a while.
587b8851fccSafresh1If you turn warnings on (via C<$^W> or C<perl -w>),
588b8851fccSafresh1and you see something like this...
589b8851fccSafresh1
590b8851fccSafresh1    attempt to seek on unopened filehandle
591b8851fccSafresh1
592b8851fccSafresh1...then you are probably trying to use one of these functions
593b8851fccSafresh1on an IO::Scalar with an old Perl.  The remedy is to simply
594b8851fccSafresh1use the OO version; e.g.:
595b8851fccSafresh1
596b8851fccSafresh1    $SH->seek(0,0);    ### GOOD: will work on any 5.005
597b8851fccSafresh1    seek($SH,0,0);     ### WARNING: will only work on 5.005_57 and beyond
598b8851fccSafresh1
599b8851fccSafresh1
600b8851fccSafresh1=head1 VERSION
601b8851fccSafresh1
602b8851fccSafresh1$Id: Scalar.pm,v 1.6 2005/02/10 21:21:53 dfs Exp $
603b8851fccSafresh1
604b8851fccSafresh1
605b8851fccSafresh1=head1 AUTHORS
606b8851fccSafresh1
607b8851fccSafresh1=head2 Primary Maintainer
608b8851fccSafresh1
609b8851fccSafresh1David F. Skoll (F<dfs@roaringpenguin.com>).
610b8851fccSafresh1
611b8851fccSafresh1=head2 Principal author
612b8851fccSafresh1
613b8851fccSafresh1Eryq (F<eryq@zeegee.com>).
614b8851fccSafresh1President, ZeeGee Software Inc (F<http://www.zeegee.com>).
615b8851fccSafresh1
616b8851fccSafresh1
617b8851fccSafresh1=head2 Other contributors
618b8851fccSafresh1
619b8851fccSafresh1The full set of contributors always includes the folks mentioned
620b8851fccSafresh1in L<IO::Stringy/"CHANGE LOG">.  But just the same, special
621b8851fccSafresh1thanks to the following individuals for their invaluable contributions
622b8851fccSafresh1(if I've forgotten or misspelled your name, please email me!):
623b8851fccSafresh1
624b8851fccSafresh1I<Andy Glew,>
625b8851fccSafresh1for contributing C<getc()>.
626b8851fccSafresh1
627b8851fccSafresh1I<Brandon Browning,>
628b8851fccSafresh1for suggesting C<opened()>.
629b8851fccSafresh1
630b8851fccSafresh1I<David Richter,>
631b8851fccSafresh1for finding and fixing the bug in C<PRINTF()>.
632b8851fccSafresh1
633b8851fccSafresh1I<Eric L. Brine,>
634b8851fccSafresh1for his offset-using read() and write() implementations.
635b8851fccSafresh1
636b8851fccSafresh1I<Richard Jones,>
637b8851fccSafresh1for his patches to massively improve the performance of C<getline()>
638b8851fccSafresh1and add C<sysread> and C<syswrite>.
639b8851fccSafresh1
640b8851fccSafresh1I<B. K. Oxley (binkley),>
641b8851fccSafresh1for stringification and inheritance improvements,
642b8851fccSafresh1and sundry good ideas.
643b8851fccSafresh1
644b8851fccSafresh1I<Doug Wilson,>
645b8851fccSafresh1for the IO::Handle inheritance and automatic tie-ing.
646b8851fccSafresh1
647b8851fccSafresh1
648b8851fccSafresh1=head1 SEE ALSO
649b8851fccSafresh1
650b8851fccSafresh1L<IO::String>, which is quite similar but which was designed
651b8851fccSafresh1more-recently and with an IO::Handle-like interface in mind,
652b8851fccSafresh1so you could mix OO- and native-filehandle usage without using tied().
653b8851fccSafresh1
654b8851fccSafresh1I<Note:> as of version 2.x, these classes all work like
655b8851fccSafresh1their IO::Handle counterparts, so we have comparable
656b8851fccSafresh1functionality to IO::String.
657b8851fccSafresh1
658b8851fccSafresh1=cut
659b8851fccSafresh1
660