home *** CD-ROM | disk | FTP | other *** search
- # $Id: NoUnicodeExt.pm,v 1.2 2002/02/03 12:25:45 matt Exp $
-
- package XML::SAX::PurePerl::Reader;
- use strict;
-
- use XML::SAX::PurePerl::Reader qw(
- CURRENT
- ENCODING
- );
-
- sub set_raw_stream {
- # no-op
- }
-
- sub switch_encoding_stream {
- my ($fh, $encoding) = @_;
- throw XML::SAX::Exception::Parse (
- Message => "Only ASCII encoding allowed without perl 5.7.2 or higher. You tried: $encoding",
- ) if $encoding !~ /(ASCII|UTF\-?8)/i;
- }
-
- sub switch_encoding_string {
- my (undef, $encoding) = @_;
- throw XML::SAX::Exception::Parse (
- Message => "Only ASCII encoding allowed without perl 5.7.2 or higher. You tried: $encoding",
- ) if $encoding !~ /(ASCII|UTF\-?8)/i;
- }
-
- sub nextchar {
- my $self = shift;
- $self->next;
-
- return unless defined $self->[CURRENT];
-
- if ($self->[CURRENT] eq "\x0D") {
- $self->next;
- return unless defined($self->[CURRENT]);
- if ($self->[CURRENT] ne "\x0A") {
- $self->buffer("\x0A");
- }
- }
-
- return unless $self->[ENCODING];
- my $n = ord($self->[CURRENT]);
- # warn(sprintf("ch: 0x%x ($self->[CURRENT])\n", $n));
- if (($] < 5.007002) && ($n > 0x7F)) {
- # utf8 surrogate
- my $current = $self->[CURRENT];
- if ($n >= 0xFC) {
- # read 5 chars
- $self->next; $current .= $self->[CURRENT];
- $self->next; $current .= $self->[CURRENT];
- $self->next; $current .= $self->[CURRENT];
- $self->next; $current .= $self->[CURRENT];
- $self->next; $current .= $self->[CURRENT];
- }
- elsif ($n >= 0xF8) {
- # read 4 chars
- $self->next; $current .= $self->[CURRENT];
- $self->next; $current .= $self->[CURRENT];
- $self->next; $current .= $self->[CURRENT];
- $self->next; $current .= $self->[CURRENT];
- }
- elsif ($n >= 0xF0) {
- # read 3 chars
- $self->next; $current .= $self->[CURRENT];
- $self->next; $current .= $self->[CURRENT];
- $self->next; $current .= $self->[CURRENT];
- }
- elsif ($n >= 0xE0) {
- # read 2 chars
- $self->next; $current .= $self->[CURRENT];
- $self->next; $current .= $self->[CURRENT];
- }
- elsif ($n >= 0xC0) {
- # read 1 char
- $self->next; $current .= $self->[CURRENT];
- }
- else {
- throw XML::SAX::Exception::Parse(
- Message => sprintf("Invalid character 0x%x", $n),
- ColumnNumber => $self->column,
- LineNumber => $self->line,
- PublicId => $self->public_id,
- SystemId => $self->system_id,
- );
- }
- if ($] >= 5.006001) {
- $self->[CURRENT] = pack("U0A*", $current);
- }
- else {
- $self->[CURRENT] = $current;
- }
- # warn("read extra. current now: $current\n");
- }
- }
-
- 1;
-
-