Blame util/perl/OpenSSL/Util/Pod.pm

Packit c4476c
# Copyright 2016 The OpenSSL Project Authors. All Rights Reserved.
Packit c4476c
#
Packit c4476c
# Licensed under the OpenSSL license (the "License").  You may not use
Packit c4476c
# this file except in compliance with the License.  You can obtain a copy
Packit c4476c
# in the file LICENSE in the source distribution or at
Packit c4476c
# https://www.openssl.org/source/license.html
Packit c4476c
Packit c4476c
package OpenSSL::Util::Pod;
Packit c4476c
Packit c4476c
use strict;
Packit c4476c
use warnings;
Packit c4476c
Packit c4476c
use Exporter;
Packit c4476c
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
Packit c4476c
$VERSION = "0.1";
Packit c4476c
@ISA = qw(Exporter);
Packit c4476c
@EXPORT = qw(extract_pod_info);
Packit c4476c
@EXPORT_OK = qw();
Packit c4476c
Packit c4476c
=head1 NAME
Packit c4476c
Packit c4476c
OpenSSL::Util::Pod - utilities to manipulate .pod files
Packit c4476c
Packit c4476c
=head1 SYNOPSIS
Packit c4476c
Packit c4476c
  use OpenSSL::Util::Pod;
Packit c4476c
Packit c4476c
  my %podinfo = extract_pod_info("foo.pod");
Packit c4476c
Packit c4476c
  # or if the file is already opened...  Note that this consumes the
Packit c4476c
  # remainder of the file.
Packit c4476c
Packit c4476c
  my %podinfo = extract_pod_info(\*STDIN);
Packit c4476c
Packit c4476c
=head1 DESCRIPTION
Packit c4476c
Packit c4476c
=over
Packit c4476c
Packit c4476c
=item B<extract_pod_info "FILENAME", HASHREF>
Packit c4476c
Packit c4476c
=item B<extract_pod_info "FILENAME">
Packit c4476c
Packit c4476c
=item B<extract_pod_info GLOB, HASHREF>
Packit c4476c
Packit c4476c
=item B<extract_pod_info GLOB>
Packit c4476c
Packit c4476c
Extracts information from a .pod file, given a STRING (file name) or a
Packit c4476c
GLOB (a file handle).  The result is given back as a hash table.
Packit c4476c
Packit c4476c
The additional hash is for extra parameters:
Packit c4476c
Packit c4476c
=over
Packit c4476c
Packit c4476c
=item B<section =E<gt> N>
Packit c4476c
Packit c4476c
The value MUST be a number, and will be the man section number
Packit c4476c
to be used with the given .pod file.
Packit c4476c
Packit c4476c
=item B<debug =E<gt> 0|1>
Packit c4476c
Packit c4476c
If set to 1, extra debug text will be printed on STDERR
Packit c4476c
Packit c4476c
=back
Packit c4476c
Packit c4476c
=back
Packit c4476c
Packit c4476c
=head1 RETURN VALUES
Packit c4476c
Packit c4476c
=over
Packit c4476c
Packit c4476c
=item B<extract_pod_info> returns a hash table with the following
Packit c4476c
items:
Packit c4476c
Packit c4476c
=over
Packit c4476c
Packit c4476c
=item B<section =E<gt> N>
Packit c4476c
Packit c4476c
The man section number this .pod file belongs to.  Often the same as
Packit c4476c
was given as input.
Packit c4476c
Packit c4476c
=item B<names =E<gt> [ "name", ... ]>
Packit c4476c
Packit c4476c
All the names extracted from the NAME section.
Packit c4476c
Packit c4476c
=back
Packit c4476c
Packit c4476c
=back
Packit c4476c
Packit c4476c
=cut
Packit c4476c
Packit c4476c
sub extract_pod_info {
Packit c4476c
    my $input = shift;
Packit c4476c
    my $defaults_ref = shift || {};
Packit c4476c
    my %defaults = ( debug => 0, section => 0, %$defaults_ref );
Packit c4476c
    my $fh = undef;
Packit c4476c
    my $filename = undef;
Packit c4476c
Packit c4476c
    # If not a file handle, then it's assume to be a file path (a string)
Packit c4476c
    unless (ref $input eq "GLOB") {
Packit c4476c
        $filename = $input;
Packit c4476c
        open $fh, $input or die "Trying to read $filename: $!\n";
Packit c4476c
        print STDERR "DEBUG: Reading $input\n" if $defaults{debug};
Packit c4476c
        $input = $fh;
Packit c4476c
    }
Packit c4476c
Packit c4476c
    my %podinfo = ( section => $defaults{section});
Packit c4476c
    while(<$input>) {
Packit c4476c
        s|\R$||;
Packit c4476c
        # Stop reading when we have reached past the NAME section.
Packit c4476c
        last if (m|^=head1|
Packit c4476c
                 && defined $podinfo{lastsect}
Packit c4476c
                 && $podinfo{lastsect} eq "NAME");
Packit c4476c
Packit c4476c
        # Collect the section name
Packit c4476c
        if (m|^=head1\s*(.*)|) {
Packit c4476c
            $podinfo{lastsect} = $1;
Packit c4476c
            $podinfo{lastsect} =~ s/\s+$//;
Packit c4476c
            print STDERR "DEBUG: Found new pod section $1\n"
Packit c4476c
                if $defaults{debug};
Packit c4476c
            print STDERR "DEBUG: Clearing pod section text\n"
Packit c4476c
                if $defaults{debug};
Packit c4476c
            $podinfo{lastsecttext} = "";
Packit c4476c
        }
Packit c4476c
Packit c4476c
        next if (m|^=| || m|^\s*$|);
Packit c4476c
Packit c4476c
        # Collect the section text
Packit c4476c
        print STDERR "DEBUG: accumulating pod section text \"$_\"\n"
Packit c4476c
            if $defaults{debug};
Packit c4476c
        $podinfo{lastsecttext} .= " " if $podinfo{lastsecttext};
Packit c4476c
        $podinfo{lastsecttext} .= $_;
Packit c4476c
    }
Packit c4476c
Packit c4476c
Packit c4476c
    if (defined $fh) {
Packit c4476c
        close $fh;
Packit c4476c
        print STDERR "DEBUG: Done reading $filename\n" if $defaults{debug};
Packit c4476c
    }
Packit c4476c
Packit c4476c
    $podinfo{lastsecttext} =~ s| - .*$||;
Packit c4476c
Packit c4476c
    my @names =
Packit c4476c
        map { s|\s+||g; $_ }
Packit c4476c
        split(m|,|, $podinfo{lastsecttext});
Packit c4476c
Packit c4476c
    return ( section => $podinfo{section}, names => [ @names ] );
Packit c4476c
}
Packit c4476c
Packit c4476c
1;