Blame lib/Autom4te/C4che.pm

Packit Service 9646c7
# autoconf -- create `configure' using m4 macros
Packit Service 9646c7
# Copyright (C) 2003, 2006, 2009-2012 Free Software Foundation, Inc.
Packit Service 9646c7
Packit Service 9646c7
# This program is free software: you can redistribute it and/or modify
Packit Service 9646c7
# it under the terms of the GNU General Public License as published by
Packit Service 9646c7
# the Free Software Foundation, either version 3 of the License, or
Packit Service 9646c7
# (at your option) any later version.
Packit Service 9646c7
#
Packit Service 9646c7
# This program is distributed in the hope that it will be useful,
Packit Service 9646c7
# but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 9646c7
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 9646c7
# GNU General Public License for more details.
Packit Service 9646c7
#
Packit Service 9646c7
# You should have received a copy of the GNU General Public License
Packit Service 9646c7
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit Service 9646c7
Packit Service 9646c7
package Autom4te::C4che;
Packit Service 9646c7
Packit Service 9646c7
=head1 NAME
Packit Service 9646c7
Packit Service 9646c7
Autom4te::C4che - a single m4 run request
Packit Service 9646c7
Packit Service 9646c7
=head1 SYNOPSIS
Packit Service 9646c7
Packit Service 9646c7
  use Autom4te::C4che;
Packit Service 9646c7
Packit Service 9646c7
=head1 DESCRIPTION
Packit Service 9646c7
Packit Service 9646c7
This Perl module handles the cache of M4 runs used by autom4te.
Packit Service 9646c7
Packit Service 9646c7
=cut
Packit Service 9646c7
Packit Service 9646c7
use Data::Dumper;
Packit Service 9646c7
use Autom4te::Request;
Packit Service 9646c7
use Carp;
Packit Service 9646c7
use strict;
Packit Service 9646c7
Packit Service 9646c7
=over 4
Packit Service 9646c7
Packit Service 9646c7
=item @request
Packit Service 9646c7
Packit Service 9646c7
List of requests.
Packit Service 9646c7
Packit Service 9646c7
We cannot declare it "my" as the loading, performed via "do", would
Packit Service 9646c7
refer to another scope, and @request would not be updated.  It used to
Packit Service 9646c7
work with "my" vars, and I do not know whether the current behavior
Packit Service 9646c7
(5.6) is wanted or not.
Packit Service 9646c7
Packit Service 9646c7
=cut
Packit Service 9646c7
Packit Service 9646c7
use vars qw(@request);
Packit Service 9646c7
Packit Service 9646c7
=item C<$req = Autom4te::C4che-E<gt>retrieve (%attr)>
Packit Service 9646c7
Packit Service 9646c7
Find a request with the same path and input.
Packit Service 9646c7
Packit Service 9646c7
=cut
Packit Service 9646c7
Packit Service 9646c7
sub retrieve($%)
Packit Service 9646c7
{
Packit Service 9646c7
  my ($self, %attr) = @_;
Packit Service 9646c7
Packit Service 9646c7
  foreach (@request)
Packit Service 9646c7
    {
Packit Service 9646c7
      # Same path.
Packit Service 9646c7
      next
Packit Service 9646c7
	if join ("\n", @{$_->path}) ne join ("\n", @{$attr{path}});
Packit Service 9646c7
Packit Service 9646c7
      # Same inputs.
Packit Service 9646c7
      next
Packit Service 9646c7
	if join ("\n", @{$_->input}) ne join ("\n", @{$attr{input}});
Packit Service 9646c7
Packit Service 9646c7
      # Found it.
Packit Service 9646c7
      return $_;
Packit Service 9646c7
    }
Packit Service 9646c7
Packit Service 9646c7
  return undef;
Packit Service 9646c7
}
Packit Service 9646c7
Packit Service 9646c7
=item C<$req = Autom4te::C4che-E<gt>register (%attr)>
Packit Service 9646c7
Packit Service 9646c7
Create and register a request for these path and input.
Packit Service 9646c7
Packit Service 9646c7
=cut
Packit Service 9646c7
Packit Service 9646c7
# $REQUEST-OBJ
Packit Service 9646c7
# register ($SELF, %ATTR)
Packit Service 9646c7
# -----------------------
Packit Service 9646c7
# NEW should not be called directly.
Packit Service 9646c7
# Private.
Packit Service 9646c7
sub register ($%)
Packit Service 9646c7
{
Packit Service 9646c7
  my ($self, %attr) = @_;
Packit Service 9646c7
Packit Service 9646c7
  # path and input are the only ID for a request object.
Packit Service 9646c7
  my $obj = new Autom4te::Request ('path'  => $attr{path},
Packit Service 9646c7
				   'input' => $attr{input});
Packit Service 9646c7
  push @request, $obj;
Packit Service 9646c7
Packit Service 9646c7
  # Assign an id for cache file.
Packit Service 9646c7
  $obj->id ("$#request");
Packit Service 9646c7
Packit Service 9646c7
  return $obj;
Packit Service 9646c7
}
Packit Service 9646c7
Packit Service 9646c7
Packit Service 9646c7
=item C<$req = Autom4te::C4che-E<gt>request (%request)>
Packit Service 9646c7
Packit Service 9646c7
Get (retrieve or create) a request for the path C<$request{path}> and
Packit Service 9646c7
the input C<$request{input}>.
Packit Service 9646c7
Packit Service 9646c7
=cut
Packit Service 9646c7
Packit Service 9646c7
# $REQUEST-OBJ
Packit Service 9646c7
# request($SELF, %REQUEST)
Packit Service 9646c7
# ------------------------
Packit Service 9646c7
sub request ($%)
Packit Service 9646c7
{
Packit Service 9646c7
  my ($self, %request) = @_;
Packit Service 9646c7
Packit Service 9646c7
  my $req =
Packit Service 9646c7
    Autom4te::C4che->retrieve (%request)
Packit Service 9646c7
    || Autom4te::C4che->register (%request);
Packit Service 9646c7
Packit Service 9646c7
  # If there are new traces to produce, then we are not valid.
Packit Service 9646c7
  foreach (@{$request{'macro'}})
Packit Service 9646c7
    {
Packit Service 9646c7
      if (! exists ${$req->macro}{$_})
Packit Service 9646c7
	{
Packit Service 9646c7
	  ${$req->macro}{$_} = 1;
Packit Service 9646c7
	  $req->valid (0);
Packit Service 9646c7
	}
Packit Service 9646c7
    }
Packit Service 9646c7
Packit Service 9646c7
  # It would be great to have $REQ check that it is up to date wrt
Packit Service 9646c7
  # its dependencies, but that requires getting traces (to fetch the
Packit Service 9646c7
  # included files), which is out of the scope of Request (currently?).
Packit Service 9646c7
Packit Service 9646c7
  return $req;
Packit Service 9646c7
}
Packit Service 9646c7
Packit Service 9646c7
Packit Service 9646c7
=item C<$string = Autom4te::C4che-E<gt>marshall ()>
Packit Service 9646c7
Packit Service 9646c7
Serialize all the current requests.
Packit Service 9646c7
Packit Service 9646c7
=cut
Packit Service 9646c7
Packit Service 9646c7
Packit Service 9646c7
# marshall($SELF)
Packit Service 9646c7
# ---------------
Packit Service 9646c7
sub marshall ($)
Packit Service 9646c7
{
Packit Service 9646c7
  my ($caller) = @_;
Packit Service 9646c7
  my $res = '';
Packit Service 9646c7
Packit Service 9646c7
  my $marshall = Data::Dumper->new ([\@request], [qw (*request)]);
Packit Service 9646c7
  $marshall->Indent(2)->Terse(0);
Packit Service 9646c7
  $res = $marshall->Dump . "\n";
Packit Service 9646c7
Packit Service 9646c7
  return $res;
Packit Service 9646c7
}
Packit Service 9646c7
Packit Service 9646c7
Packit Service 9646c7
=item C<Autom4te::C4che-E<gt>save ($file)>
Packit Service 9646c7
Packit Service 9646c7
Save the cache in the C<$file> file object.
Packit Service 9646c7
Packit Service 9646c7
=cut
Packit Service 9646c7
Packit Service 9646c7
# SAVE ($FILE)
Packit Service 9646c7
# ------------
Packit Service 9646c7
sub save ($$)
Packit Service 9646c7
{
Packit Service 9646c7
  my ($self, $file) = @_;
Packit Service 9646c7
Packit Service 9646c7
  confess "cannot save a single request\n"
Packit Service 9646c7
    if ref ($self);
Packit Service 9646c7
Packit Service 9646c7
  $file->seek (0, 0);
Packit Service 9646c7
  $file->truncate (0);
Packit Service 9646c7
  print $file
Packit Service 9646c7
    "# This file was generated.\n",
Packit Service 9646c7
    "# It contains the lists of macros which have been traced.\n",
Packit Service 9646c7
    "# It can be safely removed.\n",
Packit Service 9646c7
    "\n",
Packit Service 9646c7
    $self->marshall;
Packit Service 9646c7
}
Packit Service 9646c7
Packit Service 9646c7
Packit Service 9646c7
=item C<Autom4te::C4che-E<gt>load ($file)>
Packit Service 9646c7
Packit Service 9646c7
Load the cache from the C<$file> file object.
Packit Service 9646c7
Packit Service 9646c7
=cut
Packit Service 9646c7
Packit Service 9646c7
# LOAD ($FILE)
Packit Service 9646c7
# ------------
Packit Service 9646c7
sub load ($$)
Packit Service 9646c7
{
Packit Service 9646c7
  my ($self, $file) = @_;
Packit Service 9646c7
  my $fname = $file->name;
Packit Service 9646c7
Packit Service 9646c7
  confess "cannot load a single request\n"
Packit Service 9646c7
    if ref ($self);
Packit Service 9646c7
Packit Service 9646c7
  my $contents = join "", $file->getlines;
Packit Service 9646c7
Packit Service 9646c7
  eval $contents;
Packit Service 9646c7
Packit Service 9646c7
  confess "cannot eval $fname: $@\n" if $@;
Packit Service 9646c7
}
Packit Service 9646c7
Packit Service 9646c7
Packit Service 9646c7
=head1 SEE ALSO
Packit Service 9646c7
Packit Service 9646c7
L<Autom4te::Request>
Packit Service 9646c7
Packit Service 9646c7
=head1 HISTORY
Packit Service 9646c7
Packit Service 9646c7
Written by Akim Demaille E<lt>F<akim@freefriends.org>E<gt>.
Packit Service 9646c7
Packit Service 9646c7
=cut
Packit Service 9646c7
Packit Service 9646c7
1; # for require
Packit Service 9646c7
Packit Service 9646c7
### Setup "GNU" style for perl-mode and cperl-mode.
Packit Service 9646c7
## Local Variables:
Packit Service 9646c7
## perl-indent-level: 2
Packit Service 9646c7
## perl-continued-statement-offset: 2
Packit Service 9646c7
## perl-continued-brace-offset: 0
Packit Service 9646c7
## perl-brace-offset: 0
Packit Service 9646c7
## perl-brace-imaginary-offset: 0
Packit Service 9646c7
## perl-label-offset: -2
Packit Service 9646c7
## cperl-indent-level: 2
Packit Service 9646c7
## cperl-brace-offset: 0
Packit Service 9646c7
## cperl-continued-brace-offset: 0
Packit Service 9646c7
## cperl-label-offset: -2
Packit Service 9646c7
## cperl-extra-newline-before-brace: t
Packit Service 9646c7
## cperl-merge-trailing-else: nil
Packit Service 9646c7
## cperl-continued-statement-offset: 2
Packit Service 9646c7
## End: