#! /bin/sh
# texi2dvi --- produce DVI (or PDF) files from Texinfo (or LaTeX) sources.
# $Id$
#
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001,
# 2002, 2003 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 2, 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, you can either send email to this
# program's maintainer or write to: The Free Software Foundation,
# Inc.; 59 Temple Place, Suite 330; Boston, MA 02111-1307, USA.
#
# Original author: Noah Friedman <friedman@gnu.org>.
#
# Please send bug reports, etc. to bug-texinfo@gnu.org.
# If possible, please send a copy of the output of the script called with
# the `--debug' option when making a bug report.

# This string is expanded by rcs automatically when this file is checked out.
rcs_revision='$Revision$'
rcs_version=`set - $rcs_revision; echo $2`
program=`echo $0 | sed -e 's!.*/!!'`
version="texi2dvi (GNU Texinfo 4.5) $rcs_version

Copyright (C) 2003 Free Software Foundation, Inc.
There is NO warranty.  You may redistribute this software
under the terms of the GNU General Public License.
For more information about these matters, see the files named COPYING."

usage="Usage: $program [OPTION]... FILE...

Run each Texinfo or LaTeX FILE through TeX in turn until all
cross-references are resolved, building all indices.  The directory
containing each FILE is searched for included files.  The suffix of FILE
is used to determine its language (LaTeX or Texinfo).

Makeinfo is used to perform Texinfo macro expansion before running TeX
when needed.

Operation modes:
  -b, --batch         no interaction
  -c, --clean         remove all auxiliary files
  -D, --debug         turn on shell debugging (set -x)
  -h, --help          display this help and exit successfully
  -o, --output=OFILE  leave output in OFILE (implies --clean);
                      Only one input FILE may be specified in this case
  -q, --quiet         no output unless errors (implies --batch)
  -s, --silent        same as --quiet
  -v, --version       display version information and exit successfully
  -V, --verbose       report on what is done

TeX tuning:
  -@                   use @input instead of \input; for preloaded Texinfo
  -e, -E, --expand     force macro expansion using makeinfo
  -I DIR               search DIR for Texinfo files
  -l, --language=LANG  specify the LANG of FILE (LaTeX or Texinfo)
  -p, --pdf            use pdftex or pdflatex for processing
  -t, --texinfo=CMD    insert CMD after @setfilename in copy of input file
                       multiple values accumulate

The values of the BIBTEX, LATEX (or PDFLATEX), MAKEINDEX, MAKEINFO,
TEX (or PDFTEX), and TEXINDEX environment variables are used to run
those commands, if they are set.

Email bug reports to <bug-texinfo@gnu.org>,
general questions and discussion to <help-texinfo@gnu.org>.
Texinfo home page: http://www.gnu.org/software/texinfo/"

# Initialize variables for option overriding and otherwise.
# Don't use `unset' since old bourne shells don't have this command.
# Instead, assign them an empty value.
batch=false     # eval for batch mode
clean=
debug=
escape='\'
expand=         # t for expansion via makeinfo
miincludes=     # makeinfo include path
oformat=dvi
oname=          # --output
quiet=          # by default let the tools' message be displayed
set_language=
textra=
tmpdir=${TMPDIR:-/tmp}/t2d$$  # avoid collisions on 8.3 filesystems.
txincludes=     # TEXINPUTS extensions, with trailing colon
txiprereq=19990129 # minimum texinfo.tex version to have macro expansion
verbose=false   # echo for verbose mode

orig_pwd=`pwd`

# Systems which define $COMSPEC or $ComSpec use semicolons to separate
# directories in TEXINPUTS.
if test -n "$COMSPEC$ComSpec"; then
  path_sep=";"
else
  path_sep=":"
fi

# Pacify verbose cds.
CDPATH=${ZSH_VERSION+.}$path_sep

# In case someone crazy insists on using grep -E.
: ${EGREP=egrep}

# Save this so we can construct a new TEXINPUTS path for each file.
TEXINPUTS_orig="$TEXINPUTS"
# Unfortunately makeindex does not read TEXINPUTS.
INDEXSTYLE_orig="$INDEXSTYLE"
export TEXINPUTS INDEXSTYLE

# Push a token among the arguments that will be used to notice when we
# ended options/arguments parsing.
# Use "set dummy ...; shift" rather than 'set - ..." because on
# Solaris set - turns off set -x (but keeps set -e).
# Use ${1+"$@"} rather than "$@" because Digital Unix and Ultrix 4.3
# still expand "$@" to a single argument (the empty string) rather
# than nothing at all.
arg_sep="$$--$$"
set dummy ${1+"$@"} "$arg_sep"; shift

# 
# Parse command line arguments.
while test x"$1" != x"$arg_sep"; do

  # Handle --option=value by splitting apart and putting back on argv.
  case "$1" in
    --*=*)
      opt=`echo "$1" | sed -e 's/=.*//'`
      val=`echo "$1" | sed -e 's/[^=]*=//'`
      shift
      set dummy "$opt" "$val" ${1+"$@"}; shift
      ;;
  esac

  # This recognizes --quark as --quiet.  So what.
  case "$1" in
    -@ ) escape=@;;
    # Silently and without documentation accept -b and --b[atch] as synonyms.
    -b | --b*) batch=eval;;
    -q | -s | --q* | --s*) quiet=t; batch=eval;;
    -c | --c*) clean=t;;
    -D | --d*) debug=t;;
    -e | -E | --e*) expand=t;;
    -h | --h*) echo "$usage"; exit 0;;
    -I | --I*)
      shift
      miincludes="$miincludes -I $1"
      txincludes="$txincludes$1$path_sep"
      ;;
    -l | --l*) shift; set_language=$1;;
    -o | --o*)
      shift
      clean=t
      case "$1" in
        /* | ?:/*) oname=$1;;
                *) oname="$orig_pwd/$1";;
      esac;;
    -p | --p*) oformat=pdf;;
    -t | --t*) shift; textra="$textra\\
$1";;
    -v | --vers*) echo "$version"; exit 0;;
    -V | --verb*) verbose=echo;;
    --) # What remains are not options.
      shift
      while test x"$1" != x"$arg_sep"; do
        set dummy ${1+"$@"} "$1"; shift
        shift
      done
      break;;
    -*)
      echo "$0: Unknown or ambiguous option \`$1'." >&2
      echo "$0: Try \`--help' for more information." >&2
      exit 1;;
    *) set dummy ${1+"$@"} "$1"; shift;;
   esac
   shift
done
# Pop the token
shift

# Interpret remaining command line args as filenames.
case $# in
 0)
  echo "$0: Missing file arguments." >&2
  echo "$0: Try \`--help' for more information." >&2
  exit 2
  ;;
 1) ;;
 *)
  if test -n "$oname"; then
    echo "$0: Can't use option \`--output' with more than one argument." >&2
    exit 2
  fi
  ;;
esac

# Prepare the temporary directory.  Remove it at exit, unless debugging.
if test -z "$debug"; then
  trap "cd / && rm -rf $tmpdir" 0 1 2 15
fi

# Create the temporary directory with strict rights
(umask 077 && mkdir $tmpdir) || exit 1

# Prepare the tools we might need.  This may be extra work in some
# cases, but improves the readibility of the script.
utildir=$tmpdir/utils
mkdir $utildir || exit 1

# A sed script that preprocesses Texinfo sources in order to keep the
# iftex sections only.  We want to remove non TeX sections, and
# comment (with `@c texi2dvi') TeX sections so that makeinfo does not
# try to parse them.  Nevertheless, while commenting TeX sections,
# don't comment @macro/@end macro so that makeinfo does propagate
# them.  Unfortunately makeinfo --iftex --no-ifhtml --no-ifinfo
# doesn't work well enough (yet) to use that, so work around with sed.
comment_iftex_sed=$utildir/comment.sed
cat <<EOF >$comment_iftex_sed
/^@tex/,/^@end tex/{
  s/^/@c texi2dvi/
}
/^@iftex/,/^@end iftex/{
  s/^/@c texi2dvi/
  /^@c texi2dvi@macro/,/^@c texi2dvi@end macro/{
    s/^@c texi2dvi//
  }
}
/^@html/,/^@end html/{
  s/^/@c (texi2dvi)/
}
/^@ifhtml/,/^@end ifhtml/{
  s/^/@c (texi2dvi)/
}
/^@ifnottex/,/^@end ifnottex/{
  s/^/@c (texi2dvi)/
}
/^@ifinfo/,/^@end ifinfo/{
  /^@node/p
  /^@menu/,/^@end menu/p
  t
  s/^/@c (texi2dvi)/
}
s/^@ifnotinfo/@c texi2dvi@ifnotinfo/
s/^@end ifnotinfo/@c texi2dvi@end ifnotinfo/
EOF
# Uncommenting is simple: Remove any leading `@c texi2dvi'.
uncomment_iftex_sed=$utildir/uncomment.sed
cat <<EOF >$uncomment_iftex_sed
s/^@c texi2dvi//
EOF

# A shell script that computes the list of xref files.
# Takes the filename (without extension) of which we look for xref
# files as argument.  The index files must be reported last.
get_xref_files=$utildir/get_xref.sh
cat <<\EOF >$get_xref_files
#! /bin/sh

# Get list of xref files (indexes, tables and lists).
# Find all files having root filename with a two-letter extension,
# saves the ones that are really Texinfo-related files.  .?o? catches
# many files: .toc, .log, LaTeX tables and lists, FiXme's .lox, maybe more.
for this_file in "$1".?o? "$1".aux "$1".?? "$1".idx; do
  # If file is empty, skip it.
  test -s "$this_file" || continue
  # If the file is not suitable to be an index or xref file, don't
  # process it.  The file can't be if its first character is not a
  # backslash or single quote.
  first_character=`sed -n '1s/^\(.\).*$/\1/p;q' $this_file`
  if test "x$first_character" = "x\\" \
     || test "x$first_character" = "x'"; then
    xref_files="$xref_files ./$this_file"
  fi
done
echo "$xref_files"
EOF
chmod 500 $get_xref_files

# File descriptor usage:
# 0 standard input
# 1 standard output (--verbose messages)
# 2 standard error
# 3 some systems may open it to /dev/tty
# 4 used on the Kubota Titan
# 5 tools output (turned off by --quiet)

# Tools' output.  If quiet, discard, else redirect to the message flow.
if test "$quiet" = t; then
  exec 5>/dev/null
else
  exec 5>&1
fi

# Enable tracing
test "$debug" = t && set -x

# 
# TeXify files.

for command_line_filename in ${1+"$@"}; do
  $verbose "Processing $command_line_filename ..."

  # If the COMMAND_LINE_FILENAME is not absolute (e.g., --debug.tex),
  # prepend `./' in order to avoid that the tools take it as an option.
  echo "$command_line_filename" | $EGREP '^(/|[A-z]:/)' >/dev/null \
  || command_line_filename="./$command_line_filename"

  # See if the file exists.  If it doesn't we're in trouble since, even
  # though the user may be able to reenter a valid filename at the tex
  # prompt (assuming they're attending the terminal), this script won't
  # be able to find the right xref files and so forth.
  if test ! -r "$command_line_filename"; then
    echo "$0: Could not read $command_line_filename, skipping." >&2
    continue
  fi

  # Get the name of the current directory.  We want the full path
  # because in clean mode we are in tmp, in which case a relative
  # path has no meaning.
  filename_dir=`echo $command_line_filename | sed 's!/[^/]*$!!;s!^$!.!'`
  filename_dir=`cd "$filename_dir" >/dev/null && pwd`

  # Strip directory part but leave extension.
  filename_ext=`basename "$command_line_filename"`
  # Strip extension.
  filename_noext=`echo "$filename_ext" | sed 's/\.[^.]*$//'`
  ext=`echo "$filename_ext" | sed 's/^.*\.//'`

  # _src.  Use same basename since we want to generate aux files with
  # the same basename as the manual.  If --expand, then output the
  # macro-expanded file to here, else copy the original file.
  tmpdir_src=$tmpdir/src
  filename_src=$tmpdir_src/$filename_noext.$ext

  # _xtr.  The file with the user's extra commands.
  tmpdir_xtr=$tmpdir/xtr
  filename_xtr=$tmpdir_xtr/$filename_noext.$ext

  # _bak.  Copies of the previous xref files (another round is run if
  # they differ from the new one).
  tmpdir_bak=$tmpdir/bak

  # Make all those directories and give up if we can't succeed.
  mkdir $tmpdir_src $tmpdir_xtr $tmpdir_bak || exit 1

  # Source file might include additional sources.
  # We want `.:$orig_pwd' before anything else.  (We'll add `.:' later
  # after all other directories have been turned into absolute paths.)
  # `.' goes first to ensure that any old .aux, .cps,
  # etc. files in ${directory} don't get used in preference to fresher
  # files in `.'.  Include orig_pwd in case we are in clean mode, where
  # we've cd'd to a temp directory.
  common="$orig_pwd$path_sep$filename_dir$path_sep$txincludes"
   TEXINPUTS="$common$TEXINPUTS_orig"
  INDEXSTYLE="$common$INDEXSTYLE_orig"

  # Convert relative paths to absolute paths, so we can run in another
  # directory (e.g., in --clean mode, or during the macro-support
  # detection.)
  #
  # Empty path components are meaningful to tex.  We rewrite them
  # as `EMPTY' so they don't get lost when we split on $path_sep.
   TEXINPUTS=`echo $TEXINPUTS  |sed 's/^:/EMPTY:/;s/:$/:EMPTY/;s/::/:EMPTY:/g'`
  INDEXSTYLE=`echo $INDEXSTYLE |sed 's/^:/EMPTY:/;s/:$/:EMPTY/;s/::/:EMPTY:/g'`
  save_IFS=$IFS
  IFS=$path_sep
  set x $TEXINPUTS; shift
  TEXINPUTS=.
  for dir
  do
    case $dir in
      EMPTY)
        TEXINPUTS=$TEXINPUTS$path_sep
        ;;
      [\\/]* | ?:[\\/]*)        # Absolute paths don't need to be expansed.
        TEXINPUTS=$TEXINPUTS$path_sep$dir
        ;;
      *)
        abs=`cd "$dir" && pwd` && TEXINPUTS=$TEXINPUTS$path_sep$abs
        ;;
    esac
  done
  set x $INDEXSTYLE; shift
  INDEXSTYLE=.
  for dir
  do
    case $dir in
      EMPTY)
        INDEXSTYLE=$INDEXSTYLE$path_sep
        ;;
      [\\/]* | ?:[\\/]*)        # Absolute paths don't need to be expansed.
        INDEXSTYLE=$INDEXSTYLE$path_sep$dir
        ;;
      *)
        abs=`cd "$dir" && pwd` && INDEXSTYLE=$INDEXSTYLE$path_sep$abs
        ;;
    esac
  done
  IFS=$save_IFS

  # If the user explicitly specified the language, use that.
  # Otherwise, if the first line is \input texinfo, assume it's texinfo.
  # Otherwise, guess from the file extension.
  if test -n "$set_language"; then
    language=$set_language
  elif sed 1q "$command_line_filename" | grep 'input texinfo' >/dev/null; then
    language=texinfo
  else
    language=
  fi

  # Get the type of the file (latex or texinfo) from the given language
  # we just guessed, or from the file extension if not set yet.
  case ${language:-$filename_ext} in
    [lL]a[tT]e[xX] | *.ltx | *.tex)
      # Assume a LaTeX file.  LaTeX needs bibtex and uses latex for
      # compilation.  No makeinfo.
      bibtex=${BIBTEX:-bibtex}
      makeinfo= # no point in running makeinfo on latex source.
      texindex=${MAKEINDEX:-makeindex}
      if test $oformat = dvi; then
        tex=${LATEX:-latex}
      else
        tex=${PDFLATEX:-pdflatex}
      fi
      ;;

    *)
      # Assume a Texinfo file.  Texinfo files need makeinfo, texindex and tex.
      bibtex=
      texindex=${TEXINDEX:-texindex}
      if test $oformat = dvi; then
        tex=${TEX:-tex}
      else
        tex=${PDFTEX:-pdftex}
      fi
      # Unless required by the user, makeinfo expansion is wanted only
      # if texinfo.tex is too old.
      if test "$expand" = t; then
        makeinfo=${MAKEINFO:-makeinfo}
      else
        # Check if texinfo.tex performs macro expansion by looking for
        # its version.  The version is a date of the form YEAR-MO-DA.
        # We don't need to use [0-9] to match the digits since anyway
        # the comparison with $txiprereq, a number, will fail with non
        # digits.
        txiversion_tex=txiversion.tex
        echo '\input texinfo.tex @bye' >$tmpdir/$txiversion_tex
        # Run in the tmpdir to avoid leaving files.
        eval `cd $tmpdir >/dev/null &&
              $tex $txiversion_tex 2>/dev/null |
              sed -n 's/^.*\[\(.*\)version \(....\)-\(..\)-\(..\).*$/txiformat=\1 txiversion="\2\3\4"/p'`
        $verbose "texinfo.tex preloaded as \`$txiformat', version is \`$txiversion' ..."
        if test "$txiprereq" -le "$txiversion" >/dev/null 2>&1; then
          makeinfo=
        else
          makeinfo=${MAKEINFO:-makeinfo}
        fi
        # As long as we had to run TeX, offer the user this convenience
        if test "$txiformat" = Texinfo; then
          escape=@
        fi
      fi
      ;;
  esac

  # Expand macro commands in the original source file using Makeinfo.
  # Always use `end' footnote style, since the `separate' style
  #   generates different output (arguably this is a bug in -E).
  # Discard main info output, the user asked to run TeX, not makeinfo.
  if test -n "$makeinfo"; then
    $verbose "Macro-expanding $command_line_filename to $filename_src ..."
    sed -f $comment_iftex_sed "$command_line_filename" \
      | $makeinfo --footnote-style=end -I "$filename_dir" $miincludes \
        -o /dev/null --macro-expand=- \
      | sed -f $uncomment_iftex_sed >"$filename_src"
    filename_input=$filename_src
  fi

  # If makeinfo failed (or was not even run), use the original file as input.
  if test $? -ne 0 \
     || test ! -r "$filename_src"; then
    $verbose "Reverting to $command_line_filename ..."
    filename_input=$filename_dir/$filename_ext
  fi

  # Used most commonly for @finalout, @smallbook, etc.
  if test -n "$textra"; then
    $verbose "Inserting extra commands: $textra"
    sed '/^@setfilename/a\
'"$textra" "$filename_input" >$filename_xtr
    filename_input=$filename_xtr
  fi

  # If clean mode was specified, then move to the temporary directory.
  if test "$clean" = t; then
    $verbose "cd $tmpdir_src"
    cd "$tmpdir_src" || exit 1
  fi

  while :; do # will break out of loop below
    orig_xref_files=`$get_xref_files "$filename_noext"`

    # Save copies of originals for later comparison.
    if test -n "$orig_xref_files"; then
      $verbose "Backing up xref files: `echo $orig_xref_files | sed 's|\./||g'`"
      cp $orig_xref_files $tmpdir_bak
    fi

    # Run bibtex on current file.
    # - If its input (AUX) exists.
    # - If AUX contains both `\bibdata' and `\bibstyle'.
    # - If some citations are missing (LOG contains `Citation').
    #   or the LOG complains of a missing .bbl
    #
    # We run bibtex first, because I can see reasons for the indexes
    # to change after bibtex is run, but I see no reason for the
    # converse.
    #
    # Don't try to be too smart.  Running bibtex only if the bbl file
    # exists and is older than the LaTeX file is wrong, since the
    # document might include files that have changed.  Because there
    # can be several AUX (if there are \include's), but a single LOG,
    # looking for missing citations in LOG is easier, though we take
    # the risk to match false messages.
    if test -n "$bibtex" \
       && test -r "$filename_noext.aux" \
       && test -r "$filename_noext.log" \
       && (grep '^\\bibdata[{]'  "$filename_noext.aux" \
           && grep '^\\bibstyle[{]' "$filename_noext.aux" \
           && (grep 'Warning:.*Citation.*undefined' "$filename_noext.log" \
               || grep 'No file .*\.bbl\.' "$filename_noext.log")) \
          >/dev/null 2>&1; \
    then
      $verbose "Running $bibtex $filename_noext ..."
      if $bibtex "$filename_noext" >&5; then :; else
        echo "$0: $bibtex exited with bad status, quitting." >&2
        exit 1
      fi
    fi

    # What we'll run texindex on -- exclude non-index files.
    # Since we know index files are last, it is correct to remove everything
    # before .aux and .?o?.  But don't really do <anything>o<anything>
    # -- don't match whitespace as <anything>.
    # Otherwise, if orig_xref_files contains something like
    #   foo.xo foo.whatever
    # the space after the o will get matched.
    index_files=`echo "$orig_xref_files" \
                 | sed "s!.*\.aux!!g;
                        s!./$filename_noext\.[^ ]o[^ ]!!g;
                        s/^[ ]*//;s/[ ]*$//"`
    # Run texindex (or makeindex) on current index files.  If they
    # already exist, and after running TeX a first time the index
    # files don't change, then there's no reason to run TeX again.
    # But we won't know that if the index files are out of date or
    # nonexistent.
    if test -n "$texindex" && test -n "$index_files"; then
      $verbose "Running $texindex $index_files ..."
      if $texindex $index_files 2>&5 1>&2; then :; else
         echo "$0: $texindex exited with bad status, quitting." >&2
         exit 1
      fi
    fi

    # Finally, run TeX.
    # Prevent $ESCAPE from being interpreted by the shell if it happens
    # to be `/'.
    $batch tex_args="\\${escape}nonstopmode\ \\${escape}input"
    cmd="$tex $tex_args $filename_input"
    $verbose "Running $cmd ..."
    if $cmd >&5; then :; else
      echo "$0: $tex exited with bad status, quitting." >&2
      echo "$0: see $filename_noext.log for errors." >&2
      test "$clean" = t \
        && cp "$filename_noext.log" "$orig_pwd"
      exit 1
    fi


    # Decide if looping again is needed.
    finished=t

    # LaTeX (and the package changebar) report in the LOG file if it
    # should be rerun.  This is needed for files included from
    # subdirs, since texi2dvi does not try to compare xref files in
    # subdirs.  Performing xref files test is still good since LaTeX
    # does not report changes in xref files.
    if grep "Rerun to get" "$filename_noext.log" >/dev/null 2>&1; then
      finished=
    fi

    # Check if xref files changed.
    new_xref_files=`$get_xref_files "$filename_noext"`
    $verbose "Original xref files = `echo $orig_xref_files | sed 's|\./||g'`"
    $verbose "New xref files      = `echo $new_xref_files | sed 's|\./||g'`"

    # If old and new lists don't at least have the same file list,
    # then one file or another has definitely changed.
    test "x$orig_xref_files" != "x$new_xref_files" && finished=

    # File list is the same.  We must compare each file until we find
    # a difference.
    if test -n "$finished"; then
      for this_file in $new_xref_files; do
        $verbose "Comparing xref file `echo $this_file | sed 's|\./||g'` ..."
        # cmp -s returns nonzero exit status if files differ.
        if cmp -s "$this_file" "$tmpdir_bak/$this_file"; then :; else
          # We only need to keep comparing until we find one that
          # differs, because we'll have to run texindex & tex again no
          # matter how many more there might be.
          finished=
          $verbose "xref file `echo $this_file | sed 's|\./||g'` differed ..."
          test "$debug" = t && diff -c "$tmpdir_bak/$this_file" "$this_file"
          break
        fi
      done
    fi

    # If finished, exit the loop, else rerun the loop.
    test -n "$finished" && break
  done

  # If we were in clean mode, compilation was in a tmp directory.
  # Copy the DVI (or PDF) file into the directory where the compilation
  # has been done.  (The temp dir is about to get removed anyway.)
  # We also return to the original directory so that
  # - the next file is processed in correct conditions
  # - the temporary file can be removed
  if test -n "$clean"; then
    if test -n "$oname"; then
       dest=$oname
    else
       dest=$orig_pwd
    fi
    $verbose "Copying $oformat file from `pwd` to $dest"
    cp -p "./$filename_noext.$oformat" "$dest"
    cd / # in case $orig_pwd is on a different drive (for DOS)
    cd $orig_pwd || exit 1
  fi

  # Remove temporary files.
  if test "x$debug" = "x"; then
    $verbose "Removing $tmpdir_src $tmpdir_xtr $tmpdir_bak ..."
    cd /
    rm -rf $tmpdir_src $tmpdir_xtr $tmpdir_bak
  fi
done

$verbose "$0 done."
exit 0 # exit successfully, not however we ended the loop.
