Blame lib/Autom4te/C4che.pm

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