| XML-SAX-ExpatXS documentation | Contained in the XML-SAX-ExpatXS distribution. |
XML::SAX::ExpatXS::Encoding - Encoding support for XML::SAX::ExpatXS
This module is derived from XML::Parser::Expat. It provides XML::SAX::ExpatXS parser with support of not-built-in encodings.
Larry Wall <larry@wall.org>
and
Clark Cooper <coopercc@netheaven.com> authored XML::Parser::Expat.
Petr Cimprich <petr@gingerall.cz> addapted it for XML::SAX::ExpatXS.
| XML-SAX-ExpatXS documentation | Contained in the XML-SAX-ExpatXS distribution. |
# $Id: Encoding.pm,v 1.2 2004/05/15 15:56:26 cvspetr Exp $ package XML::SAX::ExpatXS::Encoding; require 5.004; use strict; use vars qw(@ISA %Encoding_Table @Encoding_Path $have_File_Spec); use XML::SAX::ExpatXS; use Carp; require DynaLoader; @ISA = qw(DynaLoader); $have_File_Spec = $INC{'File/Spec.pm'} || do 'File/Spec.pm'; %Encoding_Table = (); if ($have_File_Spec) { @Encoding_Path = (grep(-d $_, map(File::Spec->catdir($_, qw(XML SAX ExpatXS Encodings)), @INC)), File::Spec->curdir); } else { @Encoding_Path = (grep(-d $_, map($_ . '/XML/SAX/ExpatXS/Encodings', @INC)), '.'); } sub load_encoding { my ($file) = @_; $file =~ s!([^/]+)$!\L$1\E!; $file .= '.enc' unless $file =~ /\.enc$/; unless ($file =~ m!^/!) { foreach (@Encoding_Path) { my $tmp = ($have_File_Spec ? File::Spec->catfile($_, $file) : "$_/$file"); if (-e $tmp) { $file = $tmp; last; } } } local(*ENC); open(ENC, $file) or croak("Couldn't open encmap $file:\n$!\n"); binmode(ENC); my $data; my $br = sysread(ENC, $data, -s $file); croak("Trouble reading $file:\n$!\n") unless defined($br); close(ENC); my $name = XML::SAX::ExpatXS::LoadEncoding($data, $br); croak("$file isn't an encmap file") unless defined($name); $name; } # End load_encoding ################################################################ package XML::SAX::ExpatXS::Encinfo; sub DESTROY { my $self = shift; XML::SAX::ExpatXS::FreeEncoding($self); } ################################################################ package XML::SAX::ExpatXS::ContentModel; use overload '""' => \&asString, 'eq' => \&thiseq; sub EMPTY () {1} sub ANY () {2} sub MIXED () {3} sub NAME () {4} sub CHOICE () {5} sub SEQ () {6} sub isempty { return $_[0]->{Type} == EMPTY; } sub isany { return $_[0]->{Type} == ANY; } sub ismixed { return $_[0]->{Type} == MIXED; } sub isname { return $_[0]->{Type} == NAME; } sub name { return $_[0]->{Tag}; } sub ischoice { return $_[0]->{Type} == CHOICE; } sub isseq { return $_[0]->{Type} == SEQ; } sub quant { return $_[0]->{Quant}; } sub children { my $children = $_[0]->{Children}; if (defined $children) { return @$children; } return undef; } sub asString { my ($self) = @_; my $ret; if ($self->{Type} == NAME) { $ret = $self->{Tag}; } elsif ($self->{Type} == EMPTY) { return "EMPTY"; } elsif ($self->{Type} == ANY) { return "ANY"; } elsif ($self->{Type} == MIXED) { $ret = '(#PCDATA'; foreach (@{$self->{Children}}) { $ret .= '|' . $_; } $ret .= ')'; } else { my $sep = $self->{Type} == CHOICE ? '|' : ','; $ret = '(' . join($sep, map { $_->asString } @{$self->{Children}}) . ')'; } $ret .= $self->{Quant} if $self->{Quant}; return $ret; } sub thiseq { my $self = shift; return $self->asString eq $_[0]; } 1; __END__