#! /bin/sh
#
# Copyright (C) 1995-1998, 2000-2013 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/>.
#

# This file is meant for authors or maintainers which want to
# internationalize their package with the help of GNU gettext.  For
# further information how to use it consult the GNU gettext manual.

progname=$0
package=gettext-tools
version=0.19.1

# Set variables
# - gettext_datadir     directory where the data files are stored.
prefix="/tmp/ssh-build-qemu-android-deps/build/install-darwin-x86_64"
datarootdir="${prefix}/share"
: ${gettext_datadir="${datarootdir}/gettext"}

# func_tmpdir
# creates a temporary directory.
# Sets variable
# - tmp             pathname of freshly created temporary directory
func_tmpdir ()
{
  # Use the environment variable TMPDIR, falling back to /tmp. This allows
  # users to specify a different temporary directory, for example, if their
  # /tmp is filled up or too small.
  : ${TMPDIR=/tmp}
  {
    # Use the mktemp program if available. If not available, hide the error
    # message.
    tmp=`(umask 077 && mktemp -d "$TMPDIR/gtXXXXXX") 2>/dev/null` &&
    test -n "$tmp" && test -d "$tmp"
  } ||
  {
    # Use a simple mkdir command. It is guaranteed to fail if the directory
    # already exists.  $RANDOM is bash specific and expands to empty in shells
    # other than bash, ksh and zsh.  Its use does not increase security;
    # rather, it minimizes the probability of failure in a very cluttered /tmp
    # directory.
    tmp=$TMPDIR/gt$$-$RANDOM
    (umask 077 && mkdir "$tmp")
  } ||
  {
    echo "$0: cannot create a temporary directory in $TMPDIR" >&2
    { (exit 1); exit 1; }
  }
}

# Support for relocatability.
func_find_curr_installdir ()
{
  # Determine curr_installdir, even taking into account symlinks.
  curr_executable="$0"
  case "$curr_executable" in
    */* | *\\*) ;;
    *) # Need to look in the PATH.
      save_IFS="$IFS"; IFS="${PATH_SEPARATOR=':'}"
      for dir in $PATH; do
        IFS="$save_IFS"
        test -z "$dir" && dir=.
        for exec_ext in ''; do
          if test -f "$dir/$curr_executable$exec_ext"; then
            curr_executable="$dir/$curr_executable$exec_ext"
            break 2
          fi
        done
      done
      IFS="$save_IFS"
      ;;
  esac
  # Make absolute.
  case "$curr_executable" in
    /* | ?:/* | ?:\\*) ;;
    *) curr_executable=`pwd`/"$curr_executable" ;;
  esac
  # Resolve symlinks.
  sed_dirname='s,/[^/]*$,,'
  sed_linkdest='s,^.* -> \(.*\),\1,p'
  while : ; do
    lsline=`LC_ALL=C ls -l "$curr_executable"`
    case "$lsline" in
      *" -> "*)
        linkdest=`echo "$lsline" | sed -n -e "$sed_linkdest"`
        case "$linkdest" in
          /* | ?:/* | ?:\\*) curr_executable="$linkdest" ;;
          *) curr_executable=`echo "$curr_executable" | sed -e "$sed_dirname"`/"$linkdest" ;;
        esac ;;
      *) break ;;
    esac
  done
  curr_installdir=`echo "$curr_executable" | sed -e 's,/[^/]*$,,'`
  # Canonicalize.
  curr_installdir=`cd "$curr_installdir" && pwd`
}
func_find_prefixes ()
{
  # Compute the original/current installation prefixes by stripping the
  # trailing directories off the original/current installation directories.
  orig_installprefix="$orig_installdir"
  curr_installprefix="$curr_installdir"
  while true; do
    orig_last=`echo "$orig_installprefix" | sed -n -e 's,^.*/\([^/]*\)$,\1,p'`
    curr_last=`echo "$curr_installprefix" | sed -n -e 's,^.*/\([^/]*\)$,\1,p'`
    if test -z "$orig_last" || test -z "$curr_last"; then
      break
    fi
    if test "$orig_last" != "$curr_last"; then
      break
    fi
    orig_installprefix=`echo "$orig_installprefix" | sed -e 's,/[^/]*$,,'`
    curr_installprefix=`echo "$curr_installprefix" | sed -e 's,/[^/]*$,,'`
  done
}
if test "no" = yes; then
  exec_prefix="${prefix}"
  bindir="${exec_prefix}/bin"
  orig_installdir="$bindir" # see Makefile.am's *_SCRIPTS variables
  func_find_curr_installdir # determine curr_installdir
  func_find_prefixes
  # Relocate the directory variables that we use.
  gettext_datadir=`echo "$gettext_datadir/" | sed -e "s%^${orig_installprefix}/%${curr_installprefix}/%" | sed -e 's,/$,,'`
fi

# func_trace macro configure.ac
# traces an Autoconf macro call and outputs the arguments to stdout.
func_trace ()
{
  echo '\
dnl disable macros which may abort autom4te
m4_undefine([m4_assert])
m4_undefine([m4_fatal])
m4_undefine([m4_warn])
m4_undefine([m4_errprintn])
m4_undefine([m4_exit])
m4_undefine([m4_include])
m4_undefine([m4_esyscmd])
' \
  | ${AUTOM4TE:-autom4te} --no-cache --language=Autoconf-without-aclocal-m4 \
    --trace="$1":\$% - "$2" 2>/dev/null
}

# func_trace_sed macro configure.ac
# traces a non-standard Autoconf macro call and outputs the first
# argument to stdout.
func_trace_sed ()
{
  sed_extract_arguments='
s,#.*$,,; s,^dnl .*$,,; s, dnl .*$,,;
/'"$1"'(/ {
  ta
  :a
    s/)/)/
    tb
    s/\\$//
    N
    ba
  :b
  s,^.*'"$1"'([[ ]*\([^]"$`\\)]*\).*$,\1,p
}
d'
  sed -e "$sed_extract_arguments" "$2"
}

# func_usage
# outputs to stdout the --help usage message.
func_usage ()
{
  echo "\
Usage: gettextize [OPTION]... [package-dir]

Prepares a source package to use gettext.

Options:
      --help           print this help and exit
      --version        print version information and exit
  -f, --force          force writing of new files even if old exist
      --intl           install libintl in a subdirectory (deprecated)
      --po-dir=DIR     specify directory with PO files
      --no-changelog   don't update or create ChangeLog files
      --symlink        make symbolic links instead of copying files
  -n, --dry-run        print modifications but don't perform them

Report bugs to <bug-gnu-gettext@gnu.org>."
}

# func_version
# outputs to stdout the --version message.
func_version ()
{
  echo "$progname (GNU $package) $version"
  echo "Copyright (C) 1995-1998, 2000-2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law."
  echo "Written by" "Ulrich Drepper"
}

# func_fatal_error message
# outputs to stderr a fatal error message, and terminates the program.
func_fatal_error ()
{
  echo "gettextize: *** $1" 1>&2
  echo "gettextize: *** Stop." 1>&2
  exit 1
}

# Nuisances.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH

# Unset more variables known to interfere with behavior of common tools.
CLICOLOR_FORCE= GREP_OPTIONS=
unset CLICOLOR_FORCE GREP_OPTIONS

# Command-line option processing.
# Removes the OPTIONS from the arguments. Sets the variables:
# - force           1 if --force was given, 0 otherwise
# - intldir         yes if --intl was given, empty otherwise
# - podirs          list of directories specified with --po-dir
# - try_ln_s        : if --symlink was given, false otherwise
# - do_changelog    false if --no-changelog was given, : otherwise
# - doit            false if --dry-run was given, : otherwise
{
  force=0
  intldir=
  podirs=
  try_ln_s=false
  do_changelog=:
  doit=:

  while test $# -gt 0; do
    case "$1" in
      -c | --copy | --cop | --co | --c ) # accepted for backward compatibility
        shift ;;
      -n | --dry-run | --dry-ru | --dry-r | --dry- | --dry | --dr | --d )
        shift
        doit=false ;;
      -f | --force | --forc | --for | --fo | --f )
        shift
        force=1 ;;
      --help | --hel | --he | --h )
        func_usage; exit 0 ;;
      --intl | --int | --in | --i )
        shift
        intldir=yes ;;
      --po-dir | --po-di | --po-d | --po- | --po | --p )
        shift 
        if test $# = 0; then
          func_fatal_error "missing argument for --po-dir"
        fi
        case "$1" in
          -*) func_fatal_error "missing argument for --po-dir" ;;
        esac
        podirs="$podirs $1"
        shift ;;
      --po-dir=* )
        arg=`echo "X$1" | sed -e 's/^X--po-dir=//'`
        podirs="$podirs $arg"
        shift ;;
      --no-changelog | --no-changelo | --no-changel | --no-change | --no-chang | --no-chan | --no-cha | --no-ch | --no-c )
        shift
        do_changelog=false ;;
      --symlink | --symlin | --symli | --syml | --sym | --sy | --s )
        shift
        try_ln_s=: ;;
      --version | --versio | --versi | --vers | --ver | --ve | --v )
        func_version
        exit 0 ;;
      -- ) # Stop option prcessing
        shift; break ;;
      -* )
        echo "gettextize: unknown option $1" 1>&2
        echo "Try 'gettextize --help' for more information." 1>&2
        exit 1 ;;
      * )
        break ;;
    esac
  done
  # podirs defaults to "po".
  test -n "$podirs" || podirs="po"
}

# Warn about deprecated options.
if test -n "$intldir"; then
  echo "gettextize: warning: the option '--intl' is deprecated and will be removed" 1>&2
fi

# Command-line argument processing.
# Analyzes the remaining arguments.
# Sets the variables
# - origdir         to the original directory,
# - srcdir          to the package directory, and cd-s into it.
{
  if test $# -gt 1; then
    func_usage 1>&2
    exit 1
  fi
  origdir=`pwd`
  if test $# -eq 1; then
    srcdir=$1
    if cd "$srcdir"; then
      srcdir=`pwd`
    else
      func_fatal_error "Cannot change directory to '$srcdir'."
    fi
  else
    srcdir=$origdir
  fi
}

# The current directory is now $srcdir.

# Check integrity of package: A configure.in/ac must be present. Sets variable
# - configure_in    name of configure.in/ac file.
test -f configure.in || test -f configure.ac ||
  func_fatal_error "Missing configure.in or configure.ac, please cd to your package first."
configure_in=NONE
if test -f configure.in; then
  configure_in=configure.in
else
  if test -f configure.ac; then
    configure_in=configure.ac
  fi
fi

# Check whether the --force option is needed but has not been specified.
if test $force -eq 0; then
  if test -d intl; then
    func_fatal_error "intl/ subdirectory exists: use option -f if you really want to delete it."
  fi
  for podir in $podirs; do
    if test -f "$podir/Makefile.in.in"; then
      func_fatal_error "$podir/Makefile.in.in exists: use option -f if you really want to delete it."
    fi
  done
  if test -f ABOUT-NLS; then
    func_fatal_error "ABOUT-NLS exists: use option -f if you really want to delete it."
  fi
fi

# Check in which directory config.rpath etc. belong.
auxdir=`func_trace AC_CONFIG_AUX_DIR "$configure_in"`
if test -n "$auxdir"; then
  auxdir="$auxdir/"
fi

# Check in which directory gettext.m4 etc. belong.
macrodirs=`func_trace AC_CONFIG_MACRO_DIR_TRACE "$configure_in"`
if test -z "$macrodirs"; then
  macrodirs=`func_trace AC_CONFIG_MACRO_DIR "$configure_in"`
fi
for arg in $macrodirs; do
  m4dir="$arg"
  break
done

# For simplicity we change to the gettext source directory.
cd "$gettext_datadir" ||
  func_fatal_error "gettext source directory '${gettext_datadir}' doesn't exist"

# Variables which keep track what has been modified.
added_directories=
removed_directory=
added_extradist=
added_acoutput=
removed_acoutput=" intl/intlh.inst"

# Variable:
# - please          accumulates instructions for the user.
please=

# Variable:
# - date            current date, for use in ChangeLog entries.
date=`date +%Y-%m-%d`

# func_copy from to
# copies a file.
# 'from' is a relative pathname, relative to the current directory.
# 'to' is a relative pathname, relative to $srcdir.
func_copy ()
{
  if $doit; then
    rm -f "$srcdir/$2"
    echo "Copying file $2"
    cp "$1" "$srcdir/$2"
  else
    echo "Copy file $2"
  fi
}

# func_linkorcopy from absfrom to
# links or copies a file.
# 'from' is a relative pathname, relative to the current directory.
# 'absfrom' is the corresponding absolute pathname.
# 'to' is a relative pathname, relative to $srcdir.
func_linkorcopy ()
{
  if $doit; then
    rm -f "$srcdir/$3"
    ($try_ln_s && ln -s "$2" "$srcdir/$3" && echo "Symlinking file $3") 2>/dev/null ||
    { echo "Copying file $3"; cp "$1" "$srcdir/$3"; }
  else
    if $try_ln_s; then
      echo "Symlink file $3"
    else
      echo "Copy file $3"
    fi
  fi
}

# func_backup to
# makes a backup of a file that is about to be overwritten or replaced.
# 'to' is a relative pathname, relative to $srcdir.
func_backup ()
{
  if $doit; then
    if test -f "$srcdir/$1"; then
      rm -f "$srcdir/$1~"
      cp -p "$srcdir/$1" "$srcdir/$1~"
    fi
  fi
}

# func_remove to
# removes a file.
# 'to' is a relative pathname, relative to $srcdir.
func_remove ()
{
  if $doit; then
    echo "Removing $1"
    rm -f "$srcdir/$1"
  else
    echo "Remove $1"
  fi
}

# func_ChangeLog_init
# func_ChangeLog_add_entry line
# func_ChangeLog_finish
# manage the ChangeLog file, relative to $srcdir.
func_ChangeLog_init ()
{
  modified_ChangeLog=
}
func_ChangeLog_add_entry ()
{
  if $doit; then
    if test -z "$modified_ChangeLog"; then
      echo "$date  gettextize  <bug-gnu-gettext@gnu.org>" > "$srcdir/ChangeLog.tmp"
      echo >> "$srcdir/ChangeLog.tmp"
      modified_ChangeLog=yes
    fi
    echo "$1" >> "$srcdir/ChangeLog.tmp"
  else
    modified_ChangeLog=yes
  fi
}
func_ChangeLog_finish ()
{
  if test -n "$modified_ChangeLog"; then
    if $doit; then
      echo >> "$srcdir/ChangeLog.tmp"
      if test -f "$srcdir/ChangeLog"; then
        echo "Adding an entry to ChangeLog (backup is in ChangeLog~)"
        cat "$srcdir/ChangeLog" >> "$srcdir/ChangeLog.tmp"
        rm -f "$srcdir/ChangeLog~"
        cp -p "$srcdir/ChangeLog" "$srcdir/ChangeLog~"
      else
        echo "Creating ChangeLog"
      fi
      cp "$srcdir/ChangeLog.tmp" "$srcdir/ChangeLog"
      rm -f "$srcdir/ChangeLog.tmp"
    else
      if test -f "$srcdir/ChangeLog"; then
        echo "Add an entry to ChangeLog"
      else
        echo "Create ChangeLog"
      fi
    fi
  fi
}

# func_poChangeLog_init
# func_poChangeLog_add_entry line
# func_poChangeLog_finish
# manage the $podir/ChangeLog file, relative to $srcdir.
func_poChangeLog_init ()
{
  modified_poChangeLog=
}
func_poChangeLog_add_entry ()
{
  if $doit; then
    if test -z "$modified_poChangeLog"; then
      echo "$date  gettextize  <bug-gnu-gettext@gnu.org>" > "$srcdir/$podir/ChangeLog.tmp"
      echo >> "$srcdir/$podir/ChangeLog.tmp"
      modified_poChangeLog=yes
    fi
    echo "$1" >> "$srcdir/$podir/ChangeLog.tmp"
  else
    modified_poChangeLog=yes
  fi
}
func_poChangeLog_finish ()
{
  if test -n "$modified_poChangeLog"; then
    if $doit; then
      echo >> "$srcdir/$podir/ChangeLog.tmp"
      if test -f "$srcdir/$podir/ChangeLog"; then
        echo "Adding an entry to $podir/ChangeLog (backup is in $podir/ChangeLog~)"
        cat "$srcdir/$podir/ChangeLog" >> "$srcdir/$podir/ChangeLog.tmp"
        rm -f "$srcdir/$podir/ChangeLog~"
        cp -p "$srcdir/$podir/ChangeLog" "$srcdir/$podir/ChangeLog~"
      else
        echo "Creating $podir/ChangeLog"
      fi
      cp "$srcdir/$podir/ChangeLog.tmp" "$srcdir/$podir/ChangeLog"
      rm -f "$srcdir/$podir/ChangeLog.tmp"
    else
      if test -f "$srcdir/$podir/ChangeLog"; then
        echo "Add an entry to $podir/ChangeLog"
      else
        echo "Create $podir/ChangeLog"
      fi
    fi
  fi
}

# func_m4ChangeLog_init
# func_m4ChangeLog_add_entry line
# func_m4ChangeLog_finish
# manage the $m4dir/ChangeLog file, relative to $srcdir.
func_m4ChangeLog_init ()
{
  if test -n "$using_m4ChangeLog"; then
    modified_m4ChangeLog=
    created_m4ChangeLog=
  fi
}
func_m4ChangeLog_add_entry ()
{
  if test -n "$using_m4ChangeLog"; then
    if $doit; then
      if test -z "$modified_m4ChangeLog"; then
        echo "$date  gettextize  <bug-gnu-gettext@gnu.org>" > "$srcdir/$m4dir/ChangeLog.tmp"
        echo >> "$srcdir/$m4dir/ChangeLog.tmp"
        modified_m4ChangeLog=yes
      fi
      echo "$1" >> "$srcdir/$m4dir/ChangeLog.tmp"
    else
      modified_m4ChangeLog=yes
    fi
  else
    line="$1"
    line=`echo "$line" | sed -e "s%^	\\* %	* $m4dir/%"`
    func_ChangeLog_add_entry "$line"
  fi
}
func_m4ChangeLog_finish ()
{
  if test -n "$using_m4ChangeLog"; then
    if test -n "$modified_m4ChangeLog"; then
      if $doit; then
        echo >> "$srcdir/$m4dir/ChangeLog.tmp"
        if test -f "$srcdir/$m4dir/ChangeLog"; then
          echo "Adding an entry to $m4dir/ChangeLog (backup is in $m4dir/ChangeLog~)"
          cat "$srcdir/$m4dir/ChangeLog" >> "$srcdir/$m4dir/ChangeLog.tmp"
          rm -f "$srcdir/$m4dir/ChangeLog~"
          cp -p "$srcdir/$m4dir/ChangeLog" "$srcdir/$m4dir/ChangeLog~"
        else
          echo "Creating $m4dir/ChangeLog"
          created_m4ChangeLog=yes
        fi
        cp "$srcdir/$m4dir/ChangeLog.tmp" "$srcdir/$m4dir/ChangeLog"
        rm -f "$srcdir/$m4dir/ChangeLog.tmp"
      else
        if test -f "$srcdir/$m4dir/ChangeLog"; then
          echo "Add an entry to $m4dir/ChangeLog"
        else
          echo "Create $m4dir/ChangeLog"
          created_m4ChangeLog=yes
        fi
      fi
    fi
  fi
}
using_m4ChangeLog=yes

if test ! -f "$srcdir/intl/Makefile.in" && test -n "$intldir"; then
  added_acoutput="$added_acoutput intl/Makefile"
fi
if test -f "$srcdir/intl/Makefile.in" && test -z "$intldir"; then
  removed_acoutput="$removed_acoutput intl/Makefile"
fi
if test -d "$srcdir/intl"; then
  # Remove everything inside intl except for RCS and CVS subdirs and invisible
  # files.
  if $doit; then
    echo "Wiping out intl/ subdirectory"
    (cd "$srcdir/intl" &&
     for f in *; do
       if test CVS != "$f" && test RCS != "$f"; then
         rm -rf "$f"
       fi
     done)
  else
    echo "Wipe out intl/ subdirectory"
  fi
  if test -z "$intldir"; then
    removed_directory=intl
  fi
else
  if test -n "$intldir"; then
    if $doit; then
      echo "Creating intl/ subdirectory"
      mkdir "$srcdir/intl" || func_fatal_error "failed to create intl/ subdirectory"
    else
      echo "Create intl/ subdirectory"
    fi
    added_directories="$added_directories intl"
  fi
fi

$do_changelog && func_ChangeLog_init

for podir in $podirs; do
  test -d "$srcdir/$podir" || {
    if $doit; then
      echo "Creating $podir/ subdirectory"
      mkdir "$srcdir/$podir" || func_fatal_error "failed to create $podir/ subdirectory"
    else
      echo "Create $podir/ subdirectory"
    fi
    added_directories="$added_directories $podir"
  }
done

# Create the directory for config.rpath, if needed.
# This is for consistency with autoreconf and automake.
# Note that $auxdir is either empty or ends in a slash.
test -d "$srcdir/$auxdir" || {
  if $doit; then
    echo "Creating $auxdir subdirectory"
    mkdir "$srcdir/$auxdir" || func_fatal_error "failed to create $auxdir subdirectory"
  else
    echo "Create $auxdir subdirectory"
  fi
}

# Now copy all files.  Take care for the destination directories.
for file in *; do
  case $file in
    ABOUT-NLS)
      func_linkorcopy $file "$gettext_datadir/$file" $file
      ;;
    config.rpath)
      if test -f "$srcdir/$auxdir$file"; then
        :
      else
        added_extradist="$added_extradist $auxdir$file"
      fi
      func_linkorcopy $file "$gettext_datadir/$file" "$auxdir$file"
      ;;
  esac
done

# Copy files to intl/ subdirectory.
if test -n "$intldir"; then
  cd intl
  for file in *; do
    if test $file != COPYING.LIB-2.0 && test $file != COPYING.LIB-2.1; then
      if test $file != plural.c; then
        func_linkorcopy $file "$gettext_datadir/intl/$file" intl/$file
      else
        # plural.c is a generated file; it must be copied and touched.
        func_copy $file intl/$file
        if $doit; then
          (sleep 2; touch "$srcdir/intl/$file") &
        fi
      fi
    fi
  done
  cd ..
else
  echo "Not copying intl/ directory."
  # Tell the user what to put into configure.ac, if it is not already there.
  external=
  xargs=`func_trace_sed AM_GNU_GETTEXT "$srcdir/$configure_in"`
  save_IFS="$IFS"; IFS=:
  for arg in $xargs; do
    if test 'external' = "$arg"; then
      external=yes
      break
    fi
  done
  IFS="$save_IFS"
  if test -z "$external"; then
    please="$please
Please use AM_GNU_GETTEXT([external]) in order to cause autoconfiguration
to look for an external libintl.
"
  fi
fi

# Copy files to po/ subdirectory.
cd po
for podir in $podirs; do
  $do_changelog && func_poChangeLog_init
  for file in Makefile.in.in; do
    same=no
    if test -f "$srcdir/$podir/$file"; then
      if cmp -s $file "$srcdir/$podir/$file"; then
        same=yes
      fi
    else
      added_acoutput="$added_acoutput $podir/Makefile.in"
    fi
    if $do_changelog && test $same = no; then
      if test -f "$srcdir/$podir/$file"; then
        func_poChangeLog_add_entry "	* $file: Upgrade to gettext-${version}."
      else
        func_poChangeLog_add_entry "	* $file: New file, from gettext-${version}."
      fi
    fi
    func_backup "$podir/$file"
    func_linkorcopy $file "$gettext_datadir/po/$file" "$podir/$file"
  done
  for file in *; do
    case $file in
      Makefile.in.in)
        # Already handled above.
        ;;
      Makevars.template)
        func_linkorcopy Makevars.template "$gettext_datadir/po/Makevars.template" "$podir/Makevars.template"
        if test -f "$srcdir/po/Makevars"; then
          LC_ALL=C sed -n -e 's/[ 	]*\([A-Za-z0-9_]*\)[ 	]*=.*/\1/p' < "$srcdir/$podir/Makevars" | LC_ALL=C sort > "$srcdir/$podir/Makevars.tmp1"
          LC_ALL=C sed -n -e 's/[ 	]*\([A-Za-z0-9_]*\)[ 	]*=.*/\1/p' < "$srcdir/$podir/Makevars.template" | LC_ALL=C sort > "$srcdir/$podir/Makevars.tmp2"
          missingvars=`LC_ALL=C comm -13 "$srcdir/$podir/Makevars.tmp1" "$srcdir/$podir/Makevars.tmp2"`
          rm -f "$srcdir/$podir/Makevars.tmp1" "$srcdir/$podir/Makevars.tmp2"
          if test -n "$missingvars"; then
            please="$please
Please update $podir/Makevars so that it defines all the variables mentioned
in $podir/Makevars.template.
You can then remove $podir/Makevars.template.
"
          fi
        else
          please="$please
Please create $podir/Makevars from the template in $podir/Makevars.template.
You can then remove $podir/Makevars.template.
"
        fi
        ;;
      *)
        same=no
        if test -f "$srcdir/$podir/$file"; then
          if cmp -s $file "$srcdir/$podir/$file"; then
            same=yes
          fi
        fi
        if $do_changelog && test $same = no; then
          if test -f "$srcdir/$podir/$file"; then
            func_poChangeLog_add_entry "	* $file: Upgrade to gettext-${version}."
          else
            func_poChangeLog_add_entry "	* $file: New file, from gettext-${version}."
          fi
        fi
        func_backup "$podir/$file"
        func_linkorcopy $file "$gettext_datadir/po/$file" "$podir/$file"
        ;;
    esac
  done
  if test -f "$srcdir/$podir/cat-id-tbl.c"; then
    func_remove "$podir/cat-id-tbl.c"
    $do_changelog && func_poChangeLog_add_entry "	* cat-id-tbl.c: Remove file."
  fi
  if test -f "$srcdir/$podir/stamp-cat-id"; then
    func_remove "$podir/stamp-cat-id"
    $do_changelog && func_poChangeLog_add_entry "	* stamp-cat-id: Remove file."
  fi
  if test ! -f "$srcdir/$podir/POTFILES.in"; then
    if $doit; then
      echo "Creating initial $podir/POTFILES.in"
      echo '# List of source files which contain translatable strings.' > "$srcdir/$podir/POTFILES.in"
    else
      echo "Create initial $podir/POTFILES.in"
    fi
    $do_changelog && func_poChangeLog_add_entry "	* POTFILES.in: New file."
    please="$please
Please fill $podir/POTFILES.in as described in the documentation.
"
  fi
  $do_changelog && func_poChangeLog_finish
done

# Determine whether we can assume automake 1.9 or newer.
have_automake19=
if (aclocal --version) >/dev/null 2>/dev/null; then
  aclocal_version=`aclocal --version | sed -n -e 1p | sed -e 's/^[^0-9]*//'`
  case $aclocal_version in
    1.9* | 1.[1-9][0-9]* | [2-9]*) have_automake19=yes ;;
  esac
fi

m4filelist='gettext.m4 iconv.m4 lib-ld.m4 lib-link.m4 lib-prefix.m4 nls.m4
 po.m4 progtest.m4'
# With aclocal versions < 1.9 we need all m4 files, otherwise "aclocal -I m4"
# might give an error. (aclocal < 1.9 didn't know which macros are really
# needed, it looked which macros are potentially needed.)
min_automake_version=1.9
if test -n "$intldir" || test -z "$have_automake19"; then
  # Add intldir.m4, intl.m4 and its dependencies.
  m4filelist=$m4filelist' codeset.m4 fcntl-o.m4 glibc2.m4 glibc21.m4 intdiv0.m4
   intl.m4 intldir.m4 intlmacosx.m4 intmax.m4 inttypes_h.m4 inttypes-pri.m4
   lcmessage.m4 lock.m4 longlong.m4 printf-posix.m4 size_max.m4 stdint_h.m4
   threadlib.m4 uintmax_t.m4 visibility.m4 wchar_t.m4 wint_t.m4 xsize.m4'
  min_automake_version=1.8
fi

# All sorts of bugs could occur if the configure file was remade with the wrong
# version of gettext.m4 et al. (because then the configure and the po/Makefile.in.in
# don't fit together). It is therefore important that the package carries the
# right versions of gettext.m4 et al. with it.
if test -f "$srcdir/Makefile.am"; then
  # A package using automake.

  # Determine whether it's using automake 1.8 or newer.
  have_automake18=
  if (aclocal --version) >/dev/null 2>/dev/null; then
    aclocal_version=`aclocal --version | sed -n -e 1p | sed -e 's/^[^0-9]*//'`
    case $aclocal_version in
      1.[8-9]* | 1.[1-9][0-9]* | [2-9]*) have_automake18=yes ;;
    esac
  fi

  if test -z "$m4dir"; then
    # Extract the macro directory name from Makefile.am.
    aclocal_amflags=`grep '^ACLOCAL_AMFLAGS[ 	]*=' "$srcdir/Makefile.am" | sed -e 's/^ACLOCAL_AMFLAGS[ 	]*=\(.*\)$/\1/'`
    m4dir_is_next=
    for arg in $aclocal_amflags; do
      if test -n "$m4dir_is_next"; then
        # Ignore absolute directory pathnames, like /usr/local/share/aclocal.
        case "$arg" in
          /*) ;;
          *)
            test -z "$m4dir" || m4dir="$arg"
            macrodirs="$macrodirs $arg"
            ;;
        esac
        m4dir_is_next=
      else
        if test "X$arg" = "X-I"; then
          m4dir_is_next=yes
        else
          m4dir_is_next=
        fi
      fi
    done
    for arg in $macrodirs; do
      m4dir="$arg"
      break
    done
  fi

  if test -z "$m4dir"; then
    m4dir=m4
    m4dir_defaulted=yes
  fi

  # Decide whether to use $m4dir/ChangeLog, or to use ChangeLog instead.
  if test -d "$srcdir/$m4dir" && test -f "$srcdir/ChangeLog" && test ! -f "$srcdir/$m4dir/ChangeLog"; then
    # The programmer has no $m4dir/ChangeLog so far. Don't introduce one.
    using_m4ChangeLog=
  fi

  # Update the *.m4 files and the corresponding Makefile.am.
  $do_changelog && func_m4ChangeLog_init
  added_m4dir=
  added_m4files=
  if test -d "$srcdir/$m4dir"; then
    :
  else
    if $doit; then
      echo "Creating directory $m4dir"
      mkdir "$srcdir/$m4dir"
    else
      echo "Create directory $m4dir"
    fi
    added_m4dir=yes
  fi
  for file in $m4filelist; do
    same=no
    if test -f "$srcdir/$m4dir/$file"; then
      if cmp -s "${datarootdir}/aclocal/$file" "$srcdir/$m4dir/$file"; then
        same=yes
      fi
    else
      added_m4files="$added_m4files $file"
    fi
    if $do_changelog && test $same = no; then
      if test -f "$srcdir/$m4dir/$file"; then
        func_m4ChangeLog_add_entry "	* $file: Upgrade to gettext-${version}."
      else
        func_m4ChangeLog_add_entry "	* $file: New file, from gettext-${version}."
      fi
    fi
    func_backup "$m4dir/$file"
    func_linkorcopy "${datarootdir}/aclocal/$file" "${datarootdir}/aclocal/$file" "$m4dir/$file"
  done
  missing_m4Makefileam=
  if test -n "$added_m4files"; then
    if test -f "$srcdir/$m4dir/Makefile.am"; then
      if $doit; then
        echo "Updating EXTRA_DIST in $m4dir/Makefile.am (backup is in $m4dir/Makefile.am~)"
        func_backup "$m4dir/Makefile.am"
        rm -f "$srcdir/$m4dir/Makefile.am"
        if grep '^EXTRA_DIST[ 	]*=' "$srcdir/$m4dir/Makefile.am~" > /dev/null; then
          sed -e "s%^\(EXTRA_DIST[ 	]*=\) \\?%\\1$added_m4files %" < "$srcdir/$m4dir/Makefile.am~" > "$srcdir/$m4dir/Makefile.am"
          $do_changelog && func_m4ChangeLog_add_entry "	* Makefile.am (EXTRA_DIST): Add the new files."
        else
          (cat "$srcdir/$m4dir/Makefile.am~"; echo; echo "EXTRA_DIST =$added_m4files") > "$srcdir/$m4dir/Makefile.am"
          $do_changelog && func_m4ChangeLog_add_entry "	* Makefile.am (EXTRA_DIST): New variable."
        fi
      else
        echo "Update EXTRA_DIST in $m4dir/Makefile.am"
        $do_changelog && func_m4ChangeLog_add_entry "	* Makefile.am (EXTRA_DIST)."
      fi
    else
      # $m4dir/Makefile.am is not needed any more when aclocal 1.8 or newer
      # is used.
      if test -z "$have_automake18"; then
        if $doit; then
          echo "Creating $m4dir/Makefile.am"
          echo "EXTRA_DIST =$added_m4files" > "$srcdir/$m4dir/Makefile.am"
        else
          echo "Create $m4dir/Makefile.am"
        fi
        $do_changelog && func_m4ChangeLog_add_entry "	* Makefile.am: New file."
        added_acoutput="$added_acoutput $m4dir/Makefile"
      else
        missing_m4Makefileam=yes
      fi
    fi
  fi
  if test -n "$added_m4dir" && test -z "$missing_m4Makefileam"; then
    added_directories="$added_directories $m4dir"
  fi
  $do_changelog && func_m4ChangeLog_finish
  # automake will arrange for $m4dir/ChangeLog to be distributed if a
  # $m4dir/Makefile.am exists. If not, we need to add it to Makefile.am's
  # EXTRA_DIST explicitly.
  if test -n "$created_m4ChangeLog" && test -n "$missing_m4Makefileam"; then
    added_extradist="$added_extradist $m4dir/ChangeLog"
  fi

  # Update the top-level Makefile.am.
  modified_Makefile_am=
  # func_modify_Makefile_am changelog_comment
  # assumes a modified copy of $srcdir/Makefile.am in $srcdir/Makefile.am.tmp
  # and replaces the original Makefile.am file with the modified one if
  # the two files differ. Then it removes the modified copy.
  func_modify_Makefile_am ()
  {
    if cmp -s "$srcdir/Makefile.am" "$srcdir/Makefile.am.tmp"; then
      :
    else
      if test -z "$modified_Makefile_am"; then
        if $doit; then
          echo "Updating Makefile.am (backup is in Makefile.am~)"
          func_backup Makefile.am
        else
          echo "Update Makefile.am"
        fi
      fi
      if $doit; then
        rm -f "$srcdir/Makefile.am"
        cp "$srcdir/Makefile.am.tmp" "$srcdir/Makefile.am"
      fi
      if $do_changelog; then
        if test -z "$modified_Makefile_am"; then
          func_ChangeLog_add_entry "	* Makefile.am $1"
        else
          func_ChangeLog_add_entry "	$1"
        fi
      fi
      modified_Makefile_am=yes
    fi
    rm -f "$srcdir/Makefile.am.tmp"
  }

  if test -n "$added_directories"; then
    if grep '^SUBDIRS[ 	]*=' "$srcdir/Makefile.am" > /dev/null; then
      sed -e "s%^\(SUBDIRS[ 	]*=\) \\?%\\1$added_directories %" < "$srcdir/Makefile.am" > "$srcdir/Makefile.am.tmp"
      added_directories_pretty=`echo $added_directories | sed -e 's/ /, /g'`
      func_modify_Makefile_am "(SUBDIRS): Add $added_directories_pretty."
    else
      (cat "$srcdir/Makefile.am"; echo; echo "SUBDIRS =$added_directories") > "$srcdir/Makefile.am.tmp"
      func_modify_Makefile_am "(SUBDIRS): New variable."
    fi
  fi
  if test -n "$removed_directory"; then
    sed -e '/^SUBDIRS[ 	]*=/ {
        :a
        s%\([ 	]\)'"$removed_directory"'[ 	]%\1%
        s%[ 	]'"$removed_directory"'$%%
        tb
        :b
        s%\\$%\\%
        tc
        bd
        :c
        n
        ba
      :d
    }' < "$srcdir/Makefile.am" > "$srcdir/Makefile.am.tmp"
    func_modify_Makefile_am "(SUBDIRS): Remove $removed_directory."
  fi
  if test -n "$added_directories"; then
    if grep '^DIST_SUBDIRS[ 	]*=' "$srcdir/Makefile.am" > /dev/null; then
      sed -e "s%^\(DIST_SUBDIRS[ 	]*=\) \\?%\\1$added_directories %" < "$srcdir/Makefile.am" > "$srcdir/Makefile.am.tmp"
      added_directories_pretty=`echo $added_directories | sed -e 's/ /, /g'`
      func_modify_Makefile_am "(DIST_SUBDIRS): Add $added_directories_pretty."
    fi
  fi
  if test -n "$removed_directory"; then
    sed -e '/^DIST_SUBDIRS[ 	]*=/ {
        :a
        s%\([ 	]\)'"$removed_directory"'[ 	]%\1%
        s%[ 	]'"$removed_directory"'$%%
        tb
        :b
        s%\\$%\\%
        tc
        bd
        :c
        n
        ba
      :d
    }' < "$srcdir/Makefile.am" > "$srcdir/Makefile.am.tmp"
    func_modify_Makefile_am "(DIST_SUBDIRS): Remove $removed_directory."
  fi
  if test -n "$m4dir_defaulted"; then
    if grep '^ACLOCAL_AMFLAGS[ 	]*=' "$srcdir/Makefile.am" > /dev/null; then
      sed -e "s%^\(ACLOCAL_AMFLAGS[ 	]*=\) \\?%\\1 -I $m4dir %" < "$srcdir/Makefile.am" > "$srcdir/Makefile.am.tmp"
      func_modify_Makefile_am "(ACLOCAL_AMFLAGS): Add -I $m4dir."
    else
      (cat "$srcdir/Makefile.am"; echo; echo "ACLOCAL_AMFLAGS = -I $m4dir") > "$srcdir/Makefile.am.tmp"
      func_modify_Makefile_am "(ACLOCAL_AMFLAGS): New variable."
    fi
    # Also update Makefile.in and, if existent, Makefile. Otherwise they
    # would take into account the new flags only after a few rounds of
    # "./configure", "make", "touch configure.in", "make distclean".
    if $doit; then
      for file in Makefile.in Makefile; do
        if test -f "$srcdir/$file"; then
          func_backup $file
          rm -f "$srcdir/$file"
          sed -e "s%(ACLOCAL)%(ACLOCAL) -I $m4dir%" < "$srcdir/$file~" > "$srcdir/$file"
        fi
      done
    fi
  fi
  if test -n "$added_extradist"; then
    if grep '^EXTRA_DIST[ 	]*=' "$srcdir/Makefile.am" > /dev/null; then
      sed -e "s%^\(EXTRA_DIST[ 	]*=\)%\\1$added_extradist %" < "$srcdir/Makefile.am" > "$srcdir/Makefile.am.tmp"
      added_extradist_pretty=`echo $added_extradist | sed -e 's/ /, /g'`
      func_modify_Makefile_am "(EXTRA_DIST): Add $added_extradist_pretty."
    else
      (cat "$srcdir/Makefile.am"; echo; echo "EXTRA_DIST =$added_extradist") > "$srcdir/Makefile.am.tmp"
      func_modify_Makefile_am "(EXTRA_DIST): New variable."
    fi
  fi
  # Extract the aclocal options name from Makefile.am.
  aclocal_options=
  for arg in $macrodirs; do
    aclocal_options="$aclocal_options -I $arg"
  done
  please="$please
Please run 'aclocal$aclocal_options' to regenerate the aclocal.m4 file.
You need aclocal from GNU automake $min_automake_version (or newer) to do this.
Then run 'autoconf' to regenerate the configure file.
"

  # Also create $m4dir/Makefile.in from $m4dir/Makefile.am, because automake
  # doesn't do it by itself.
  if $doit; then
    case "$added_acoutput" in
      *" $m4dir/Makefile")
        (cd "$srcdir" && automake "$m4dir/Makefile") 2>/dev/null ||
        please="$please
Please run 'automake $m4dir/Makefile' to create $m4dir/Makefile.in
"
        ;;
    esac
  fi
else
  please="$please
Please add the files
$m4filelist
from the ${datarootdir}/aclocal directory to your aclocal.m4 file.
"
fi

modified_configure_in=
# func_modify_configure_in changelog_comment
# assumes a modified copy of $srcdir/$configure_in in $srcdir/$configure_in.tmp
# and replaces the original configure.in/ac file with the modified one if
# the two files differ. Then it removes the modified copy.
func_modify_configure_in ()
{
  if cmp -s "$srcdir/$configure_in" "$srcdir/$configure_in.tmp"; then
    :
  else
    if test -z "$modified_configure_in"; then
      if $doit; then
        echo "Updating $configure_in (backup is in $configure_in~)"
        func_backup $configure_in
      else
        echo "Update $configure_in"
      fi
    fi
    if $doit; then
      rm -f "$srcdir/$configure_in"
      cp "$srcdir/$configure_in.tmp" "$srcdir/$configure_in"
    fi
    if $do_changelog; then
      if test -z "$modified_configure_in"; then
        func_ChangeLog_add_entry "	* $configure_in $1"
      else
        func_ChangeLog_add_entry "	$1"
      fi
    fi
    modified_configure_in=yes
  fi
  rm -f "$srcdir/$configure_in.tmp"
}

if test -n "$added_acoutput"; then
  if grep '^AC_CONFIG_FILES(' "$srcdir/$configure_in" > /dev/null; then
    sedprog='
ta
b
:a
n
ba'
    sed -e "s%^\\(AC_CONFIG_FILES([^])\\,]*\\)%\\1$added_acoutput%$sedprog" < "$srcdir/$configure_in" > "$srcdir/$configure_in.tmp"
    added_acoutput_pretty=`echo $added_acoutput | sed -e 's/ /, /g'`
    func_modify_configure_in "(AC_CONFIG_FILES): Add $added_acoutput_pretty."
  else
    if grep '^AC_OUTPUT(' "$srcdir/$configure_in" > /dev/null; then
      sed -e "s%^\\(AC_OUTPUT([^])\\,]*\\)%\\1$added_acoutput%" < "$srcdir/$configure_in" > "$srcdir/$configure_in.tmp"
      added_acoutput_pretty=`echo $added_acoutput | sed -e 's/ /, /g'`
      func_modify_configure_in "(AC_OUTPUT): Add $added_acoutput_pretty."
    else
      please="$please
Please add$added_acoutput to the AC_OUTPUT or AC_CONFIG_FILES invocation in the $configure_in file.
"
    fi
  fi
fi
if test -n "$removed_acoutput"; then
  for file in $removed_acoutput; do
    tag=
    sedprog='{
      s%\([[ 	]\)'"$file"'[ 	]%\1%
      s%\([[ 	]\)'"$file"'\([]),]\)%\1\2%
      s%[[ 	]'"$file"'$%%
        :a
        tb
        :b
        s%\\$%\\%
        tc
        bd
        :c
        n
        s%\([ 	]\)'"$file"'[ 	]%\1%
        s%\([ 	]\)'"$file"'\([]),]\)%\1\2%
        s%[ 	]'"$file"'$%%
        ba
      :d
    }'
    sed -e '/^AC_CONFIG_FILES(/'"$sedprog" < "$srcdir/$configure_in" > "$srcdir/$configure_in.tmp"
    if cmp -s "$srcdir/$configure_in" "$srcdir/$configure_in.tmp"; then
      sed -e '/^AC_OUTPUT(/'"$sedprog" < "$srcdir/$configure_in" > "$srcdir/$configure_in.tmp"
      if cmp -s "$srcdir/$configure_in" "$srcdir/$configure_in.tmp"; then
        :
      else
        tag=AC_OUTPUT
      fi
    else
      tag=AC_CONFIG_FILES
    fi
    if test -n "$tag"; then
      func_modify_configure_in "($tag): Remove $file."
    else
      rm -f "$srcdir/$configure_in.tmp"
      if test "$file" != intl/intlh.inst; then
        please="$please
Please remove $file from the AC_OUTPUT or AC_CONFIG_FILES invocation
in the $configure_in file.
"
      fi
    fi
  done
fi
sed -e 's%sed -e "/POTFILES =/r po/POTFILES" po/Makefile\.in > po/Makefile *;* *%%' < "$srcdir/$configure_in" > "$srcdir/$configure_in.tmp"
func_modify_configure_in "(AC_OUTPUT): Remove command that created po/Makefile."
sed -e '/^\(dnl \|\)AC_LINK_FILES(\$nls_cv_header_libgt, \$nls_cv_header_intl)$/d' < "$srcdir/$configure_in" > "$srcdir/$configure_in.tmp"
func_modify_configure_in "(AC_LINK_FILES): Remove invocation."
sed -e 's/^AM_GNU_GETTEXT_VERSION([^()]*)/AM_GNU_GETTEXT_VERSION(['"$version"'])/' < "$srcdir/$configure_in" > "$srcdir/$configure_in.tmp"
func_modify_configure_in "(AM_GNU_GETTEXT_VERSION): Bump to $version."
$do_changelog && func_ChangeLog_finish

# Recommend replacement for deprecated Makefile variables.
use_libtool=`cat "$srcdir/$configure_in" | grep '^A[CM]_PROG_LIBTOOL'`
for file in `(cd "$srcdir"; find . -name Makefile.am -print; find . -name Makefile.in -print) | sed -e 's,^\./,,'`; do
  if test -f "$srcdir/$file"; then
    if test `echo "$file" | sed -e 's,^.*/,,'` = Makefile.in && grep automake "$srcdir/$file" >/dev/null 2>&1; then
      continue;
    fi
    # INTLLIBS is deprecated because it doesn't distinguish the two
    # cases: with libtool, without libtool.
    if grep '@''INTLLIBS''@' "$srcdir/$file" >/dev/null 2>&1; then
      if test -n "$use_libtool"; then
        please="$please
Please change $file to use @""LTLIBINTL""@ or @""LIBINTL""@ instead of
@""INTLLIBS""@. Which one, depends whether it is used with libtool or not.
@""INTLLIBS""@ will go away.
"
      else
        please="$please
Please change $file to use @""LIBINTL""@ instead of @""INTLLIBS""@.
@""INTLLIBS""@ will go away.
"
      fi
    fi
    # DATADIRNAME is deprecated because we install only .gmo files nowadays,
    # which can be stored in the platform independent $prefix/share hierarchy.
    if grep '@''DATADIRNAME''@' "$srcdir/$file" >/dev/null 2>&1; then
      please="$please
Please change $file to use the constant string \"share\" instead of
@""DATADIRNAME""@. @""DATADIRNAME""@ will go away.
"
    fi
    # INSTOBJEXT is deprecated because we install only .gmo files nowadays,
    # no catgets .cat catalogs.
    if grep '@''INSTOBJEXT''@' "$srcdir/$file" >/dev/null 2>&1; then
      please="$please
Please change $file to use the constant string \".mo\" instead of
@""INSTOBJEXT""@. @""INSTOBJEXT""@ will go away.
"
    fi
    # GENCAT is deprecated because we install no catgets catalogs anymore.
    if grep '@''GENCAT''@' "$srcdir/$file" >/dev/null 2>&1; then
      please="$please
Please change $file to use the constant string \"gencat\" instead of
@""GENCAT""@. @""GENCAT""@ will go away. Maybe you don't even need it any more?
"
    fi
    # POSUB is deprecated because it causes "./configure --disable-nls", "make",
    # "make dist" to create a buggy tarfile.
    if grep '@''POSUB''@' "$srcdir/$file" >/dev/null 2>&1; then
      please="$please
Please change $file to use the constant string \"po\" instead of
@""POSUB""@. @""POSUB""@ will go away.
"
    fi
  fi
done

# Recommend replacement for deprecated configure variables.
if grep '\$nls_cv_header_' "$srcdir/$configure_in" >/dev/null 2>&1; then
  please="$please
Please stop using \$nls_cv_header_intl or \$nls_cv_header_libgt in the
$configure_in file. Both will go away. Use <libintl.h> or \"gettext.h\" instead.
"
fi

# Recommend fetching config.guess and config.sub.
if test -f "$srcdir/$auxdir"config.guess && test -f "$srcdir/$auxdir"config.sub; then
  :
else
  please="$please
You will also need config.guess and config.sub, which you can get from the CVS
of the 'config' project at http://savannah.gnu.org/. The commands to fetch them
are
\$ wget 'http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess'
\$ wget 'http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub'
"
fi

if $doit; then
  echo "$please"
  echo "You might also want to copy the convenience header file gettext.h"
  echo "from the $gettext_datadir directory into your package."
  echo "It is a wrapper around <libintl.h> that implements the configure --disable-nls"
  echo "option."
  echo
  count=`echo "$please" | grep '^$' | wc -l`
  count=`echo "$count" | sed -e 's/[ 	]//g'`
  case "$count" in
    1) count="paragraph";;
    2) count="two paragraphs";;
    3) count="three paragraphs";;
    4) count="four paragraphs";;
    5) count="five paragraphs";;
    *) count="$count paragraphs";;
  esac
  echo "Press Return to acknowledge the previous $count."
  # Read from /dev/tty, not stdin, so that gettextize cannot be abused by
  # non-interactive tools.
  read dummy < /dev/tty
fi

exit 0
