#! /usr/bin/perl -w
# -*- perl -*-
# Generated from autoupdate.in; do not edit by hand.

# autoupdate - modernize an Autoconf file.
# Copyright (C) 1994, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
# 2007, 2008, 2009 Free Software Foundation, Inc.

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

# Originally written by David MacKenzie <djm@gnu.ai.mit.edu>.
# Rewritten by Akim Demaille <akim@freefriends.org>.

eval 'case $# in 0) exec /usr/bin/perl -S "$0";; *) exec /usr/bin/perl -S "$0" "$@";; esac'
    if 0;

BEGIN
{
  my $pkgdatadir = $ENV{'autom4te_perllibdir'} || '/usr/local/google/apenwarr/athena/out.mstc/host/usr/share/autoconf';
  unshift @INC, $pkgdatadir;

  # Override SHELL.  On DJGPP SHELL may not be set to a shell
  # that can handle redirection and quote arguments correctly,
  # e.g.: COMMAND.COM.  For DJGPP always use the shell that configure
  # has detected.
  $ENV{'SHELL'} = '/bin/sh' if ($^O eq 'dos');
}

use Autom4te::ChannelDefs;
use Autom4te::Channels;
use Autom4te::Configure_ac;
use Autom4te::FileUtils;
use Autom4te::General;
use Autom4te::XFile;
use File::Basename;
use strict;

# Lib files.
my $autom4te = $ENV{'AUTOM4TE'} || '/usr/local/google/apenwarr/athena/out.mstc/host/usr/bin/autom4te';
my $autoconf = "$autom4te --language=autoconf";
# We need to find m4sugar.
my @prepend_include;
my @include = ('/usr/local/google/apenwarr/athena/out.mstc/host/usr/share/autoconf');
my $force = 0;
# m4.
my $m4 = $ENV{"M4"} || '/usr/local/google/apenwarr/athena/out.mstc/host/usr/bin/m4';


# $HELP
# -----
$help = "Usage: $0 [OPTION]... [TEMPLATE-FILE]...

Update each TEMPLATE-FILE if given, or `configure.ac' if present,
or else `configure.in', to the syntax of the current version of
Autoconf.  The original files are backed up.

Operation modes:
  -h, --help                 print this help, then exit
  -V, --version              print version number, then exit
  -v, --verbose              verbosely report processing
  -d, --debug                don't remove temporary files
  -f, --force                consider all files obsolete

Library directories:
  -B, --prepend-include=DIR  prepend directory DIR to search path
  -I, --include=DIR          append directory DIR to search path

Report bugs to <bug-autoconf\@gnu.org>.
GNU Autoconf home page: <http://www.gnu.org/software/autoconf/>.
General help using GNU software: <http://www.gnu.org/gethelp/>.
";

# $VERSION
# --------
$version = "autoupdate (GNU Autoconf) 2.65
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+/Autoconf: GNU GPL version 3 or later
<http://gnu.org/licenses/gpl.html>, <http://gnu.org/licenses/exceptions.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by David J. MacKenzie and Akim Demaille.
";

## ---------- ##
## Routines.  ##
## ---------- ##


# parse_args ()
# -------------
# Process any command line arguments.
sub parse_args ()
{
  my $srcdir;

  getopt ('I|include=s'         => \@include,
	  'B|prepend-include=s' => \@prepend_include,
	  'f|force'             => \$force);

  if (! @ARGV)
    {
      my $configure_ac = require_configure_ac;
      push @ARGV, $configure_ac;
    }
}



# ----------------- #
# Autoconf macros.  #
# ----------------- #

my (%ac_macros, %au_macros, %m4_builtins);

# HANDLE_AUTOCONF_MACROS ()
# -------------------------
# @M4_BUILTINS -- M4 builtins and a useful comment.
sub handle_autoconf_macros ()
{
  # Get the builtins.
  xsystem ("echo dumpdef | $m4 2>" . shell_quote ("$tmp/m4.defs") . " >/dev/null");
  my $m4_defs = new Autom4te::XFile "< " . open_quote ("$tmp/m4.defs");
  while ($_ = $m4_defs->getline)
    {
      $m4_builtins{$1} = 1
	if /^(\w+):/;
    }
  $m4_defs->close;

  my $macros = new Autom4te::XFile ("$autoconf"
				    . " --trace AU_DEFINE:'AU:\$f:\$1'"
				    . " --trace define:'AC:\$f:\$1'"
				    . " --melt /dev/null |");
  while ($_ = $macros->getline)
    {
      chomp;
      my ($domain, $file, $macro) = /^(AC|AU):(.*):([^:]*)$/ or next;
      if ($domain eq "AU")
	{
	  $au_macros{$macro} = 1;
	}
      elsif ($file =~ /(^|\/)m4sugar\/(m4sugar|version)\.m4$/)
	{
	  # Add the m4sugar macros to m4_builtins.
	  $m4_builtins{$macro} = 1;
	}
      else
	{
	  # Autoconf, aclocal, and m4sh macros.
	  $ac_macros{$macro} = 1;
	}
    }
  $macros->close;


  # Don't keep AU macros in @AC_MACROS.
  delete $ac_macros{$_}
    foreach (keys %au_macros);
  # Don't keep M4sugar macros which are redefined by Autoconf,
  # such as `builtin', `changequote' etc.  See autoconf/autoconf.m4.
  delete $ac_macros{$_}
    foreach (keys %m4_builtins);
  error "no current Autoconf macros found"
    unless keys %ac_macros;
  error "no obsolete Autoconf macros found"
    unless keys %au_macros;

  if ($debug)
    {
      print STDERR "Current Autoconf macros:\n";
      print STDERR join (' ', sort keys %ac_macros) . "\n\n";
      print STDERR "Obsolete Autoconf macros:\n";
      print STDERR join (' ', sort keys %au_macros) . "\n\n";
    }

  # ac.m4 -- autoquoting definitions of the AC macros (M4sugar excluded).
  # unac.m4 -- undefine the AC macros.
  my $ac_m4 = new Autom4te::XFile "> " . open_quote ("$tmp/ac.m4");
  print $ac_m4 "# ac.m4 -- autoquoting definitions of the AC macros.\n";
  my $unac_m4 = new Autom4te::XFile "> " . open_quote ("$tmp/unac.m4");
  print $unac_m4 "# unac.m4 -- undefine the AC macros.\n";
  foreach (sort keys %ac_macros)
    {
      print $ac_m4   "_au_m4_define([$_], [m4_if(\$#, 0, [[\$0]], [[\$0(\$\@)]])])\n";
      print $unac_m4 "_au_m4_undefine([$_])\n";
    }

  # m4save.m4 -- save the m4 builtins.
  # unm4.m4 -- disable the m4 builtins.
  # m4.m4 -- enable the m4 builtins.
  my $m4save_m4 = new Autom4te::XFile "> " . open_quote ("$tmp/m4save.m4");
  print $m4save_m4 "# m4save.m4 -- save the m4 builtins.\n";
  my $unm4_m4 = new Autom4te::XFile "> " . open_quote ("$tmp/unm4.m4");
  print $unm4_m4 "# unm4.m4 -- disable the m4 builtins.\n";
  my $m4_m4 = new Autom4te::XFile "> " . open_quote ("$tmp/m4.m4");
  print $m4_m4 "# m4.m4 -- enable the m4 builtins.\n";
  foreach (sort keys %m4_builtins)
    {
      print $m4save_m4 "_au__save([$_])\n";
      print $unm4_m4   "_au__undefine([$_])\n";
      print $m4_m4     "_au__restore([$_])\n";
    }
}


## -------------- ##
## Main program.  ##
## -------------- ##

parse_args;
$autoconf .= " --debug" if $debug;
$autoconf .= " --force" if $force;
$autoconf .= " --verbose" if $verbose;
$autoconf .= join (' --include=', '', map { shell_quote ($_) } @include);
$autoconf .= join (' --prepend-include=', '', map { shell_quote ($_) } @prepend_include);

mktmpdir ('au');
handle_autoconf_macros;

# $au_changequote -- enable the quote `[', `]' right before any AU macro.
my $au_changequote =
  's/\b(' . join ('|', keys %au_macros) . ')\b/_au_m4_changequote([,])$1/g';

# au.m4 -- definitions the AU macros.
xsystem ("$autoconf --trace AU_DEFINE:'_au_defun(\@<:\@\$1\@:>\@,
\@<:\@\$2\@:>\@)' --melt /dev/null "
	. ">" . shell_quote ("$tmp/au.m4"));



## ------------------- ##
## Process the files.  ##
## ------------------- ##

foreach my $file (@ARGV)
  {
    # We need an actual file.
    if ($file eq '-')
      {
	$file = "$tmp/stdin";
	system "cat >" . shell_quote ($file);
      }
    elsif (! -r "$file")
      {
	die "$me: $file: No such file or directory";
      }

    # input.m4 -- m4 program to produce the updated file.
    # Load the values, the dispatcher, neutralize m4, and the prepared
    # input file.
    my $input_m4 = <<\EOF;
      divert(-1)                                            -*- Autoconf -*-
      changequote([,])

      # Define our special macros:
      define([_au__defn], defn([defn]))
      define([_au__divert], defn([divert]))
      define([_au__ifdef], defn([ifdef]))
      define([_au__include], defn([include]))
      define([_au___undefine], defn([undefine]))
      define([_au__undefine], [_au__ifdef([$1], [_au___undefine([$1])])])
      define([_au__save], [m4_ifdef([$1],
	[m4_define([_au_$1], _m4_defn([$1]))])])
      define([_au__restore],
	[_au_m4_ifdef([_au_$1],
	  [_au_m4_define([$1], _au__defn([_au_$1]))])])

      # Set up m4sugar.
      include(m4sugar/m4sugar.m4)

      # Redefine __file__ to make warnings nicer; $file is replaced below.
      m4_define([__file__], [$file])

      # Redefine m4_location to fix the line number.
      m4_define([m4_location], [__file__:m4_eval(__line__ - _au__first_line)])

      # Move all the builtins into the `_au_' pseudo namespace
      m4_include([m4save.m4])

      # _au_defun(NAME, BODY)
      # ---------------------
      # Define NAME to BODY, plus AU activation/deactivation.
      _au_m4_define([_au_defun],
      [_au_m4_define([$1],
      [_au_enable()dnl
      $2[]dnl
      _au_disable()])])

      # Import the definition of the obsolete macros.
      _au__include([au.m4])


      ## ------------------------ ##
      ## _au_enable/_au_disable.  ##
      ## ------------------------ ##

      # They work by pair: each time an AU macro is activated, it runs
      # _au_enable, and at its end its runs _au_disable (see _au_defun
      # above).  AU macros might use AU macros, which should
      # enable/disable only for the outer AU macros.
      #
      # `_au_enabled' is used to this end, determining whether we really
      # enable/disable.


      # __au_enable
      # -----------
      # Reenable the builtins, m4sugar, and the autoquoting AC macros.
      _au_m4_define([__au_enable],
      [_au__divert(-1)
      # Enable special characters.
      _au_m4_changecom([#])

      _au__include([m4.m4])
      _au__include([ac.m4])

      _au__divert(0)])

      # _au_enable
      # ----------
      # Called at the beginning of all the obsolete macros.  If this is the
      # outermost level, call __au_enable.
      _au_m4_define([_au_enable],
      [_au_m4_ifdef([_au_enabled],
		 [],
		 [__au_enable()])_au_dnl
      _au_m4_pushdef([_au_enabled])])


      # __au_disable
      # ------------
      # Disable the AC autoquoting macros, m4sugar, and m4.
      _au_m4_define([__au_disable],
      [_au__divert(-1)
      _au__include([unac.m4])
      _au__include([unm4.m4])

      # Disable special characters.
      _au_m4_changequote()
      _au_m4_changecom()

      _au__divert(0)])

      # _au_disable
      # -----------
      # Called at the end of all the obsolete macros.  If we are at the
      # outermost level, call __au_disable.
      _au_m4_define([_au_disable],
      [_au_m4_popdef([_au_enabled])_au_dnl
      _au_m4_ifdef([_au_enabled],
		[],
		[__au_disable()])])


      ## ------------------------------- ##
      ## Disable, and process the file.  ##
      ## ------------------------------- ##
      # The AC autoquoting macros are not loaded yet, hence invoking
      # `_au_disable' would be wrong.
      _au__include([unm4.m4])

      # Disable special characters, and set the first line number.
      _au_m4_changequote()
      _au_m4_changecom()

      _au_m4_define(_au__first_line, _au___line__)_au__divert(0)_au_dnl
EOF

    $input_m4 =~ s/^      //mg;
    $input_m4 =~ s/\$file/$file/g;

    # prepared input -- input, but reenables the quote before each AU macro.
    open INPUT_M4, "> " . open_quote ("$tmp/input.m4")
       or error "cannot open: $!";
    open FILE, "< " . open_quote ($file)
       or error "cannot open: $!";
    print INPUT_M4 "$input_m4";
    while (<FILE>)
       {
	 eval $au_changequote;
	 print INPUT_M4;
       }
    close FILE
       or error "cannot close $file: $!";
    close INPUT_M4
       or error "cannot close $tmp/input.m4: $!";

    # Now ask m4 to perform the update.
    xsystem ("$m4 --include=" . shell_quote ($tmp)
	     . join (' --include=', '', map { shell_quote ($_) } reverse (@prepend_include))
	     . join (' --include=', '', map { shell_quote ($_) } @include)
	     . " " . shell_quote ("$tmp/input.m4") . " > " . shell_quote ("$tmp/updated"));
    update_file ("$tmp/updated",
		 "$file" eq "$tmp/stdin" ? '-' : "$file");
  }
exit 0;


#		  ## ---------------------------- ##
#		  ## How `autoupdate' functions.  ##
#		  ## ---------------------------- ##
#
# The task of `autoupdate' is not trivial: the biggest difficulty being
# that you must limit the changes to the parts that really need to be
# updated.  Finding a satisfying implementation proved to be quite hard,
# as this is the fifth implementation of `autoupdate'.
#
# Below, we will use a simple example of an obsolete macro:
#
#     AU_DEFUN([OLD], [NEW([$1, $2], m4_eval([$1 + $2]))])
#     AC_DEFUN([NEW], [echo "sum($1) = $2"])
#
# the input file contains
#
#     dnl The Unbelievable Truth
#     OLD(1, 2)
#     NEW([0, 0], [0])
#
# Of course the expected output is
#
#     dnl The Unbelievable Truth
#     NEW([1, 2], [3])
#     NEW([0, 0], [0])
#
#
# # First implementation: sed
# # =========================
#
# The first implementation was only able to change the name of obsolete
# macros.
#
# The file `acoldnames.m4' defined the old names based on the new names.
# It was simple then to produce a sed script such as:
#
#     s/OLD/NEW/g
#
# Updating merely consisted in running this script on the file to
# update.
#
# This scheme suffers from an obvious limitation: that `autoupdate' was
# unable to cope with new macros that just swap some of its arguments
# compared to the old macro.  Fortunately, that was enough to upgrade
# from Autoconf 1 to Autoconf 2.  (But I have no idea whether the
# changes in Autoconf 2 were precisely limited by this constraint.)
#
#
# # Second implementation: hooks
# # ============================
#
# The version 2.15 of Autoconf brought a vast number of changes compared
# to 2.13, so a solution was needed.  One could think of extending the
# `sed' scripts with specialized code for complex macros.  However, this
# approach is of course full of flaws:
#
# a. the Autoconf maintainers have to write these snippets, which we
#    just don't want to,
#
# b. I really don't think you'll ever manage to handle the quoting of
#    m4 with a sed script.
#
# To satisfy a., let's remark that the code which implements the old
# features in term of the new feature is exactly the code which should
# replace the old code.
#
# To answer point b, as usual in the history of Autoconf, the answer, at
# least on the paper, is simple: m4 is the best tool to parse m4, so
# let's use m4.
#
# Therefore the specification is:
#
#     I want to be able to tell Autoconf, well, m4, that the macro I
#     am currently defining is an obsolete macro (so that the user is
#     warned), and its code is the code to use when running autoconf,
#     but that the very same code has to be used when running
#     autoupdate.  To summarize, the interface I want is
#     `AU_DEFUN(OLD-NAME, NEW-CODE)'.
#
#
# Now for the technical details.
#
# When running autoconf, except for the warning, AU_DEFUN is basically
# AC_DEFUN.
#
# When running autoupdate, we want *only* OLD-NAMEs to be expanded.
# This obviously means that acgeneral.m4 and acspecific.m4 must not be
# loaded.  Nonetheless, because we want to use a rich set of m4
# features, m4sugar.m4 is needed.  Please note that the fact that
# Autoconf's macros are not loaded is positive on two points:
#
# - we do get an updated `configure.ac', not a `configure'!
#
# - the old macros are replaced by *calls* to the new-macros, not the
#   body of the new macros, since their body is not defined!!!
#   (Whoa, that's really beautiful!).
#
# Additionally we need to disable the quotes when reading the input for
# two reasons: first because otherwise `m4' will swallow the quotes of
# other macros:
#
#     NEW([1, 2], 3)
#     => NEW(1, 2, 3)
#
# and second, because we want to update the macro calls which are
# quoted, i.e., we want
#
#     FOO([OLD(1, 2)])
#     => FOO([NEW([1, 2], [3])])
#
# If we don't disable the quotes, only the macros called at the top
# level would be updated.
#
# So, let's disable the quotes.
#
# Well, not quite: m4sugar.m4 still needs to use quotes for some macros.
# Well, in this case, when running in autoupdate code, each macro first
# reestablishes the quotes, expands itself, and disables the quotes.
#
# Thinking a bit more, you realize that in fact, people may use `define',
# `ifelse' etc. in their files, and you certainly don't want to process
# them.  Another example is `dnl': you don't want to remove the
# comments.  You then realize you don't want exactly to import m4sugar:
# you want to specify when it is enabled (macros active), and disabled.
# m4sugar provides m4_disable/m4_enable to this end.
#
# You're getting close to it.  Now remains one task: how to handle
# twofold definitions?
#
# Remember that the same AU_DEFUN must be understood in two different
# ways, the AC way, and the AU way.
#
# One first solution is to check whether acgeneral.m4 was loaded.  But
# that's definitely not cute.  Another is simply to install `hooks',
# that is to say, to keep in some place m4 knows, late `define' to be
# triggered *only* in AU mode.
#
# You first think of designing AU_DEFUN like this:
#
# 1. AC_DEFUN(OLD-NAME,
#	      [Warn the user OLD-NAME is obsolete.
#	       NEW-CODE])
#
# 2. Store for late AU binding([define(OLD_NAME,
#				[Reestablish the quotes.
#				 NEW-CODE
#				 Disable the quotes.])])
#
# but this will not work: NEW-CODE probably uses $1, $2 etc. and these
# guys will be replaced with the argument of `Store for late AU binding'
# when you call it.
#
# I don't think there is a means to avoid this using this technology
# (remember that $1 etc. are *always* expanded in m4).  You may also try
# to replace them with $[1] to preserve them for a later evaluation, but
# if `Store for late AU binding' is properly written, it will remain
# quoted till the end...
#
# You have to change technology.  Since the problem is that `$1'
# etc. should be `consumed' right away, one solution is to define now a
# second macro, `AU_OLD-NAME', and to install a hook than binds OLD-NAME
# to AU_OLD-NAME.  Then, autoupdate.m4 just need to run the hooks.  By
# the way, the same method was used in autoheader.
#
#
# # Third implementation: m4 namespaces by m4sugar
# # ==============================================
#
# Actually, this implementation was just a clean up of the previous
# implementation: instead of defining hooks by hand, m4sugar was equipped
# with `namespaces'.  What are they?
#
# Sometimes we want to disable some *set* of macros, and restore them
# later.  We provide support for this via namespaces.
#
# There are basically three characters playing this scene: defining a
# macro in a namespace, disabling a namespace, and restoring a namespace
# (i.e., all the definitions it holds).
#
# Technically, to define a MACRO in NAMESPACE means to define the macro
# named `NAMESPACE::MACRO' to the VALUE.  At the same time, we append
# `undefine(NAME)' in the macro named `m4_disable(NAMESPACE)', and
# similarly a binding of NAME to the value of `NAMESPACE::MACRO' in
# `m4_enable(NAMESPACE)'.  These mechanisms allow to bind the macro of
# NAMESPACE and to unbind them at will.
#
# Of course this implementation is really inefficient: m4 has to grow
# strings which can become quickly huge, which slows it significantly.
#
# In particular one should avoid as much as possible to use `define' for
# temporaries.  Now that `define' has quite a complex meaning, it is an
# expensive operations that should be limited to macros.  Use
# `m4_define' for temporaries.
#
# Private copies of the macros we used in entering / exiting the m4sugar
# namespace.  It is much more convenient than fighting with the renamed
# version of define etc.
#
#
#
# Those two implementations suffered from serious problems:
#
# - namespaces were really expensive, and incurred a major performance
#   loss on `autoconf' itself, not only `autoupdate'.  One solution
#   would have been the limit the use of namespaces to `autoupdate', but
#   that's again some complications on m4sugar, which really doesn't need
#   this.  So we wanted to get rid of the namespaces.
#
# - since the quotes were disabled, autoupdate was sometimes making
#   wrong guesses, for instance on:
#
#     foo([1, 2])
#
#   m4 saw 2 arguments: `[1'and `2]'.  A simple solution, somewhat
#   fragile, is to reestablish the quotes right before all the obsolete
#   macros, i.e., to use sed so that the previous text becomes
#
#     changequote([, ])foo([1, 2])
#
#   To this end, one wants to trace the definition of obsolete macros.
#
# It was there that the limitations of the namespace approach became
# painful: because it was a complex machinery playing a lot with the
# builtins of m4 (hence, quite fragile), tracing was almost impossible.
#
#
# So this approach was dropped.
#
#
# # The fourth implementation: two steps
# # ====================================
#
# If you drop the uses of namespaces, you no longer can compute the
# updated value, and replace the old call with it simultaneously.
#
# Obviously you will use m4 to compute the updated values, but you may
# use some other tool to achieve the replacement.  Personally, I trust
# nobody but m4 to parse m4, so below, m4 will perform the two tasks.
#
# How can m4 be used to replace *some* macros calls with newer values.
# Well, that's dead simple: m4 should learn the definitions of obsolete
# macros, forget its builtins, disable the quotes, and then run on the
# input file, which amounts to doing this:
#
#     divert(-1)dnl
#     changequote([, ])
#     define([OLD], [NEW([$1, $2], m4_eval([$1 + $2]))changequote()])
#     undefine([dnl])
#     undefine([m4_eval])
#     # Some more undefines...
#     changequote()
#     divert(0)dnl
#     dnl The Unbelievable Truth
#     changequote([, ])OLD(1, 2)
#     NEW([0, 0],
#	  0)
#
# which will result in
#
#     dnl The Unbelievable Truth
#     NEW(1, 2, m4_eval(1 + 2))
#     NEW([0, 0],
#	  0)
#
# Grpmh.  Two problems.  A minor problem: it would have been much better
# to have the `m4_eval' computed, and a major problem: you lost the
# quotation in the result.
#
# Let's address the big problem first.  One solution is to define any
# modern macro to rewrite its calls with the proper quotation, thanks to
# `$@'.  Again, tracing the `define's makes it possible to know which
# are these macros, so you input is:
#
#     divert(-1)dnl
#     changequote([, ])
#     define([OLD], [NEW([$1, $2], m4_eval([$1 + $2]))changequote()])
#     define([NEW], [[NEW($@)]changequote()])
#     undefine([dnl])
#     undefine([m4_eval])
#     # Some more undefines...
#     changequote()
#     divert(0)dnl
#     dnl The Unbelievable Truth
#     changequote([, ])OLD(1, 2)
#     changequote([, ])NEW([0, 0],
#	  0)
#
# which results in
#
#     dnl The Unbelievable Truth
#     NEW([1, 2],[m4_eval(1 + 2)])
#     NEW([0, 0],[0])
#
# Our problem is solved, i.e., the first call to `NEW' is properly
# quoted, but introduced another problem: we changed the layout of the
# second calls, which can be a drama in the case of huge macro calls
# (think of `AC_TRY_RUN' for instance).  This example didn't show it,
# but we also introduced parens to macros which did not have some:
#
#     AC_INIT
#     => AC_INIT()
#
# No big deal for the semantics (unless the macro depends upon $#, which
# is bad), but the users would not be happy.
#
# Additionally, we introduced quotes that were not there before, which is
# OK in most cases, but could change the semantics of the file.
#
# Cruel dilemma: we do want the auto-quoting definition of `NEW' when
# evaluating `OLD', but we don't when we evaluate the second `NEW'.
# Back to namespaces?
#
# No.
#
#
# # Second step: replacement
# # ------------------------
#
# No, as announced above, we will work in two steps: in a first step we
# compute the updated values, and in a second step we replace them.  Our
# goal is something like this:
#
#     divert(-1)dnl
#     changequote([, ])
#     define([OLD], [NEW([1, 2], [3])changequote()])
#     undefine([dnl])
#     undefine([m4_eval])
#     # Some more undefines...
#     changequote()
#     divert(0)dnl
#     dnl The Unbelievable Truth
#     changequote([, ])OLD(1, 2)
#     NEW([0, 0],
#	  0)
#
# i.e., the new value of `OLD' is precomputed using the auto-quoting
# definition of `NEW' and the m4 builtins.  We'll see how afterwards,
# let's finish with the replacement.
#
# Of course the solution above is wrong: if there were other calls to
# `OLD' with different values, we would smash them to the same value.
# But it is quite easy to generalize the scheme above:
#
#     divert(-1)dnl
#     changequote([, ])
#     define([OLD([1],[2])], [NEW([1, 2], [3])])
#     define([OLD], [defn([OLD($@)])changequote()])
#     undefine([dnl])
#     undefine([m4_eval])
#     # Some more undefines...
#     changequote()
#     divert(0)dnl
#     dnl The Unbelievable Truth
#     changequote([, ])OLD(1, 2)
#     NEW([0, 0],
#	  0)
#
# i.e., for each call to obsolete macros, we build an array `call =>
# value', and use a macro to dispatch these values.  This results in:
#
#     dnl The Unbelievable Truth
#     NEW([1, 2], [3])
#     NEW([0, 0],
#	  0)
#
# In French, we say `Youpi !', which you might roughly translate as
# `Yippee!'.
#
#
# # First step: computation
# # -----------------------
#
# Let's study the anatomy of the file, and name its sections:
#
# prologue
#     divert(-1)dnl
#     changequote([, ])
# values
#     define([OLD([1],[2])], [NEW([1, 2], [3])])
# dispatcher
#     define([OLD], [defn([OLD($@)])changequote()])
# disabler
#     undefine([dnl])
#     undefine([m4_eval])
#     # Some more undefines...
#     changequote()
#     divert(0)dnl
# input
#     dnl The Unbelievable Truth
#     changequote([, ])OLD(1, 2)
#     NEW([0, 0],
#	  0)
#
#
# # Computing the `values' section
# # ..............................
#
# First we need to get the list of all the AU macro uses.  To this end,
# first get the list of all the AU macros names by tracing `AU_DEFUN' in
# the initialization of autoconf.  This list is computed in the file
# `au.txt' below.
#
# Then use this list to trace all the AU macro uses in the input.  The
# goal is obtain in the case of our example:
#
#     [define([OLD([1],[2])],]@<<@OLD([1],[2])@>>@[)]
#
# This is the file `values.in' below.
#
# We want to evaluate this with only the builtins (in fact m4sugar), the
# auto-quoting definitions of the new macros (`new.m4'), and the
# definition of the old macros (`old.m4').  Computing these last two
# files is easy: it's just a matter of using the right `--trace' option.
#
# So the content of `values.in' is:
#
#     include($autoconf_dir/m4sugar.m4)
#     m4_include(new.m4)
#     m4_include(old.m4)
#     divert(0)dnl
#     [define([OLD([1],[2])],]@<<@OLD([1],[2])@>>@[)]
#
# We run m4 on it, which yields:
#
#     define([OLD([1],[2])],@<<@NEW([1, 2], [3])@>>@)
#
# Transform `@<<@' and `@>>@' into quotes and we get
#
#     define([OLD([1],[2])],[NEW([1, 2], [3])])
#
# This is `values.m4'.
#
#
# # Computing the `dispatcher' section
# # ..................................
#
# The `prologue', and the `disabler' are simple and need no commenting.
#
# To compute the `dispatcher' (`dispatch.m4'), again, it is a simple
# matter of using the right `--trace'.
#
# Finally, the input is not exactly the input file, rather it is the
# input file with the added `changequote'.  To this end, we build
# `quote.sed'.
#
#
# # Putting it all together
# # .......................
#
# We build the file `input.m4' which contains:
#
#     divert(-1)dnl
#     changequote([, ])
#     include(values.m4)
#     include(dispatch.m4)
#     undefine([dnl])
#     undefine([eval])
#     # Some more undefines...
#     changequote()
#     divert(0)dnl
#     dnl The Unbelievable Truth
#     changequote([, ])OLD(1, 2)
#     NEW([0, 0],
#	  0)
#
# And we just run m4 on it.  Et voila`, Monsieur !  Mais oui, mais oui.
#
# Well, there are a few additional technicalities.  For instance, we
# rely on `changequote', `ifelse' and `defn', but we don't want to
# interpret the changequotes of the user, so we simply use another name:
# `_au_changequote' etc.
#
#
# # Failure of the fourth approach
# # ------------------------------
#
# This approach is heavily based on traces, but then there is an obvious
# problem: non expanded code will never be seen.  In particular, the body
# of a `define' definition is not seen, so on the input
#
#	  define([idem], [OLD(0, [$1])])
#
# autoupdate would never see the `OLD', and wouldn't have updated it.
# Worse yet, if `idem(0)' was used later, then autoupdate sees that
# `OLD' is used, computes the result for `OLD(0, 0)' and sets up a
# dispatcher for `OLD'.  Since there was no computed value for `OLD(0,
# [$1])', the dispatcher would have replaced with... nothing, leading
# to
#
#	  define([idem], [])
#
# With some more thinking, you see that the two step approach is wrong,
# the namespace approach was much saner.
#
# But you learned a lot, in particular you realized that using traces
# can make it possible to simulate namespaces!
#
#
#
# # The fifth implementation: m4 namespaces by files
# # ================================================
#
# The fourth implementation demonstrated something unsurprising: you
# cannot precompute, i.e., the namespace approach was the right one.
# Still, we no longer want them, they're too expensive.  Let's have a
# look at the way it worked.
#
# When updating
#
#     dnl The Unbelievable Truth
#     OLD(1, 2)
#     NEW([0, 0], [0])
#
# you evaluate `input.m4':
#
#     divert(-1)
#     changequote([, ])
#     define([OLD],
#     [m4_enable()NEW([$1, $2], m4_eval([$1 + $2]))m4_disable()])
#     ...
#     m4_disable()
#     dnl The Unbelievable Truth
#     OLD(1, 2)
#     NEW([0, 0], [0])
#
# where `m4_disable' undefines the m4 and m4sugar, and disables the quotes
# and comments:
#
#     define([m4_disable],
#     [undefine([__file__])
#     ...
#     changecom(#)
#     changequote()])
#
# `m4_enable' does the converse: reestablish quotes and comments
# --easy--, reestablish m4sugar --easy: just load `m4sugar.m4' again-- and
# reenable the builtins.  This later task requires that you first save
# the builtins.  And BTW, the definition above of `m4_disable' cannot
# work: you undefined `changequote' before using it!  So you need to use
# your privates copies of the builtins.  Let's introduce three files for
# this:
#
#  `m4save.m4'
#    moves the m4 builtins into the `_au_' pseudo namespace,
#  `unm4.m4'
#    undefines the builtins,
#  `m4.m4'
#    restores them.
#
# So `input.m4' is:
#
#     divert(-1)
#     changequote([, ])
#
#     include([m4save.m4])
#
#     # Import AU.
#     define([OLD],
#     [m4_enable()NEW([$1, $2], m4_eval([$1 + $2]))m4_disable()])
#
#     define([_au_enable],
#     [_au_changecom([#])
#     _au_include([m4.m4])
#     _au_include(m4sugar.m4)])
#
#     define([_au_disable],
#     [# Disable m4sugar.
#     # Disable the m4 builtins.
#     _au_include([unm4.m4])
#     # 1. Disable special characters.
#     _au_changequote()
#     _au_changecom()])
#
#     m4_disable()
#     dnl The Unbelievable Truth
#     OLD(1, 2)
#     NEW([0, 0], [0])
#
# Based on what we learned in the fourth implementation we know that we
# have to enable the quotes *before* any AU macro, and we know we need
# to build autoquoting versions of the AC macros.  But the autoquoting
# AC definitions must be disabled in the rest of the file, and enabled
# inside AU macros.
#
# Using `autoconf --trace' it is easy to build the files
#
#   `ac.m4'
#     define the autoquoting AC fake macros
#   `disable.m4'
#     undefine the m4sugar and AC autoquoting macros.
#   `au.m4'
#     definitions of the AU macros (such as `OLD' above).
#
# Now, `input.m4' is:
#
#     divert(-1)
#     changequote([, ])
#
#     include([m4save.m4])
#     # Import AU.
#     include([au.m4])
#
#     define([_au_enable],
#     [_au_changecom([#])
#     _au_include([m4.m4])
#     _au_include(m4sugar.m4)
#     _au_include(ac.m4)])
#
#     define([_au_disable],
#     [_au_include([disable.m4])
#     _au_include([unm4.m4])
#     # 1. Disable special characters.
#     _au_changequote()
#     _au_changecom()])
#
#     m4_disable()
#     dnl The Unbelievable Truth
#     _au_changequote([, ])OLD(1, 2)
#     NEW([0, 0], [0])
#
# Finally, version V is ready.
#
# Well... almost.
#
# There is a slight problem that remains: if an AU macro OUTER includes
# an AU macro INNER, then _au_enable will be run when entering OUTER
# and when entering INNER (not good, but not too bad yet).  But when
# getting out of INNER, _au_disable will disable everything while we
# were still in OUTER.  Badaboom.
#
# Therefore _au_enable and _au_disable have to be written to work by
# pairs: each _au_enable pushdef's _au_enabled, and each _au_disable
# popdef's _au_enabled.  And of course _au_enable and _au_disable are
# effective when _au_enabled is *not* defined.
#
# Finally, version V' is ready.  And there is much rejoicing.  (And I
# have free time again.  I think.  Yeah, right.)

### Setup "GNU" style for perl-mode and cperl-mode.
## Local Variables:
## perl-indent-level: 2
## perl-continued-statement-offset: 2
## perl-continued-brace-offset: 0
## perl-brace-offset: 0
## perl-brace-imaginary-offset: 0
## perl-label-offset: -2
## cperl-indent-level: 2
## cperl-brace-offset: 0
## cperl-continued-brace-offset: 0
## cperl-label-offset: -2
## cperl-extra-newline-before-brace: t
## cperl-merge-trailing-else: nil
## cperl-continued-statement-offset: 2
## End:
