1# $Id: Stream.pm,v 1.1.1.1 2004/05/20 17:59:56 jpetri Exp $
2
3package XML::SAX::PurePerl::Reader::Stream;
4
5use strict;
6use vars qw(@ISA);
7
8use XML::SAX::PurePerl::Reader qw(
9    EOF
10    BUFFER
11    INTERNAL_BUFFER
12    LINE
13    COLUMN
14    CURRENT
15    ENCODING
16);
17use XML::SAX::Exception;
18
19@ISA = ('XML::SAX::PurePerl::Reader');
20
21use constant FH => 11;
22use constant BUFFER_SIZE => 12;
23
24sub new {
25    my $class = shift;
26    my $ioref = shift;
27    XML::SAX::PurePerl::Reader::set_raw_stream($ioref);
28    my @parts;
29    @parts[FH, LINE, COLUMN, BUFFER, EOF, INTERNAL_BUFFER, BUFFER_SIZE] =
30        ($ioref, 1,   0,      '',     0,   '',              1);
31    return bless \@parts, $class;
32}
33
34sub next {
35    my $self = shift;
36
37    # check for chars in buffer first.
38    if (length($self->[BUFFER])) {
39        return $self->[CURRENT] = substr($self->[BUFFER], 0, 1, ''); # last param truncates buffer
40    }
41
42
43    if (length($self->[INTERNAL_BUFFER])) {
44BUFFERED_READ:
45        $self->[CURRENT] = substr($self->[INTERNAL_BUFFER], 0, 1, '');
46        if ($self->[CURRENT] eq "\x0A") {
47            $self->[LINE]++;
48            $self->[COLUMN] = 1;
49        }
50        else { $self->[COLUMN]++ }
51        return;
52    }
53
54    my $bytesread = read($self->[FH], $self->[INTERNAL_BUFFER], $self->[BUFFER_SIZE]);
55    if ($bytesread) {
56        goto BUFFERED_READ;
57    }
58    elsif (defined($bytesread)) {
59        $self->[EOF]++;
60        return $self->[CURRENT] = undef;
61    }
62    throw XML::SAX::Exception::Parse(
63        Message => "Error reading from filehandle: $!",
64    );
65}
66
67sub set_encoding {
68    my $self = shift;
69    my ($encoding) = @_;
70    # warn("set encoding to: $encoding\n");
71    XML::SAX::PurePerl::Reader::switch_encoding_stream($self->[FH], $encoding);
72    $self->[BUFFER_SIZE] = 1024;
73    $self->[ENCODING] = $encoding;
74}
75
76sub bytepos {
77    my $self = shift;
78    tell($self->[FH]);
79}
80
811;
82
83