#! /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/qemu-android-deps-build/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
