#! /bin/sh
# texi2dvi --- produce DVI (or PDF) files from Texinfo (or LaTeX) sources.
# $Id: texi2dvi,v 1.14 2003/02/05 00:42:33 karl Exp $
#
# 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 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/>.
#
# 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: 1.14 $'
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.
