This file is indexed.

/usr/share/perl5/XML/Handler/Subs.pm is in libxml-perl 0.08-2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#
# Copyright (C) 1999 Ken MacLeod
# XML::Handler::XMLWriter is free software; you can redistribute it and/or
# modify it under the same terms as Perl itself.
#
# $Id: Subs.pm,v 1.2 1999/12/22 21:15:00 kmacleod Exp $
#

use strict;

package XML::Handler::Subs;

use UNIVERSAL;

use vars qw{ $VERSION };

# will be substituted by make-rel script
$VERSION = "0.08";

sub new {
    my $type = shift;
    my $self = ($#_ == 0) ? { %{ (shift) } } : { @_ };

    return bless $self, $type;
}

sub start_document {
    my ($self, $document) = @_;

    $self->{Names} = [];
    $self->{Nodes} = [];
}

sub end_document {
    my ($self, $document) = @_;

    delete $self->{Names};
    delete $self->{Nodes};

    return();
}

sub start_element {
    my ($self, $element) = @_;

    push @{$self->{Names}}, $element->{Name};
    push @{$self->{Nodes}}, $element;

    my $el_name = "s_" . $element->{Name};
    $el_name =~ s/[^a-zA-Z0-9_]/_/g;
    if ($self->can($el_name)) {
	$self->$el_name($element);
	return 1;
    }

    return 0;
}

sub end_element {
    my ($self, $element) = @_;

    my $called_sub = 0;
    my $el_name = "e_" . $element->{Name};
    $el_name =~ s/[^a-zA-Z0-9_]/_/g;
    if ($self->can(${el_name})) {
	$self->$el_name($element);
	$called_sub = 1;
    }

    pop @{$self->{Names}};
    pop @{$self->{Nodes}};

    return $called_sub;
}

sub in_element {
    my ($self, $name) = @_;

    return ($self->{Names}[-1] eq $name);
}

sub within_element {
    my ($self, $name) = @_;

    my $count = 0;
    foreach my $el_name (@{$self->{Names}}) {
	$count ++ if ($el_name eq $name);
    }

    return $count;
}

1;

__END__

=head1 NAME

XML::Handler::Subs - a PerlSAX handler base class for calling user-defined subs

=head1 SYNOPSIS

 use XML::Handler::Subs;

 package MyHandlers;
 use vars qw{ @ISA };

 sub s_NAME { my ($self, $element) = @_ };
 sub e_NAME { my ($self, $element) = @_ };

 $self->{Names};    # an array of names
 $self->{Nodes};    # an array of $element nodes

 $handler = MyHandlers->new();
 $self->in_element($name);
 $self->within_element($name);

=head1 DESCRIPTION

C<XML::Handler::Subs> is a base class for PerlSAX handlers.
C<XML::Handler::Subs> is subclassed to implement complete behavior and
to add element-specific handling.

Each time an element starts, a method by that name prefixed with `s_'
is called with the element to be processed.  Each time an element
ends, a method with that name prefixed with `e_' is called.  Any
special characters in the element name are replaced by underscores.

Subclassing XML::Handler::Subs in this way is similar to
XML::Parser's Subs style.

XML::Handler::Subs maintains a stack of element names,
`C<$self->{Names}', and a stack of element nodes, `C<$self->{Nodes}>'
that can be used by subclasses.  The current element is pushed on the
stacks before calling an element-name start method and popped off the
stacks after calling the element-name end method.  The
`C<in_element()>' and `C<within_element()>' calls use these stacks.

If the subclass implements `C<start_document()>', `C<end_document()>',
`C<start_element()>', and `C<end_element()>', be sure to use
`C<SUPER::>' to call the the superclass methods also.  See perlobj(1)
for details on SUPER::.  `C<SUPER::start_element()>' and
`C<SUPER::end_element()>' return 1 if an element-name method is
called, they return 0 if no method was called.

XML::Handler::Subs does not implement any other PerlSAX handlers.

XML::Handler::Subs supports the following methods:

=over 4

=item new( I<OPTIONS> )

A basic `C<new()>' method.  `C<new()>' takes a list of key, value
pairs or a hash and creates and returns a hash with those options; the
hash is blessed into the subclass.

=item in_element($name)

Returns true if `C<$name>' is equal to the name of the innermost
currently opened element.

=item within_element($name)

Returns the number of times the `C<$name>' appears in Names.

=back

=head1 AUTHOR

Ken MacLeod, ken@bitsko.slc.ut.us

=head1 SEE ALSO

perl(1), PerlSAX.pod(3)

=cut