home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / texinfo-3.7-src.tgz / tar.out / fsf / texinfo / util / texi2dvi-PasTeX < prev    next >
Text File  |  1996-09-28  |  10KB  |  272 lines

  1. #!/bin/sh
  2. # texi2dvi -- smartly produce DVI files from texinfo sources
  3. #
  4. # Copyright (C) 1992, 1993 Free Software Foundation.
  5. #
  6. # This program is free software; you can redistribute it and/or modify
  7. # it under the terms of the GNU General Public License as published by
  8. # the Free Software Foundation; either version 2, or (at your option)
  9. # any later version.
  10. #
  11. # This program is distributed in the hope that it will be useful,
  12. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. # GNU General Public License for more details.
  15. #
  16. # You should have received a copy of the GNU General Public License
  17. # along with this program; if not, you can either send email to this
  18. # program's author (see below) or write to:
  19. #
  20. #              Free Software Foundation, Inc.
  21. #              675 Mass Ave.
  22. #              Cambridge, MA 02139, USA. 
  23. #
  24. # Please send bug reports, etc. to bug-texinfo@prep.ai.mit.edu
  25. # If possible, please send a copy of the output of the script called with
  26. # the `--debug' option when making a bug report. 
  27. #
  28. # Version 0.4
  29. # Last modified 26-Mar-93
  30. #
  31.  
  32. # Please note that in the interest of general portability, some common
  33. # bourne shell constructs were avoided because they weren't guaranteed to
  34. # be available in some earlier implementations.  I've tried to make this as
  35. # portable as possible. 
  36. #
  37. # Among the more interesting lossages I noticed with some bourne shells
  38. # are:
  39. #       1) Some don't have an `unset' builtin 
  40. #       2) In some implementations the `shift' builtin can't take a
  41. #          numerical argument. 
  42.  
  43. progname=`basename $0`
  44.  
  45. usage="Usage: ${progname} {-D} {-h} [file1] {file2} {...}
  46.        {--debug} {--help}
  47.  
  48.    Options in braces are optional.  Those in brackets are required. 
  49. "
  50.  
  51. if test $# -eq 0 ; then
  52.    echo "${usage}" 1>&2;
  53.    exit 1
  54. fi
  55.  
  56. backup_extension=".bak"
  57. texindex="texindex"
  58. # Amiga Hack - PasTex seems to require an &plain here...
  59. tex="tex &plain"
  60. bq="\`"  # To prevent hairy quoting and escaping later.
  61. eq="'"
  62. orig_pwd="`pwd`"
  63.  
  64. if test "z${TEXINDEX}" != "z" ; then
  65.    texindex="${TEXINDEX}"
  66. fi
  67.  
  68. if test "z${TEX}" != "z" ; then
  69.    tex="${TEX}"
  70. fi
  71.  
  72. # Save this so we can construct a new TEXINPUTS path for each file to be
  73. # processed.
  74. TEXINPUTS_orig="${TEXINPUTS}"
  75. export TEXINPUTS
  76.  
  77. # Parse command line options
  78.  
  79. # "unset" option variables to make sure they weren't accidentally
  80. # exported
  81. debug=""
  82.  
  83. # If you add new commands be sure to change the wildcards below to make
  84. # sure they are unambiguous (i.e. only match one possible long option)
  85. # Be sure to show at least one instance of the full long option name to
  86. # document what the long option is canonically called. 
  87. while test $# -gt 0 ; do
  88.    case z$1 in
  89.       z-D | z--debug | z--d* )
  90.          debug="t"
  91.          shift
  92.         ;;
  93.       z-h | z--help | z--h* )
  94.          echo "${usage}" 1>&2
  95.          exit 1
  96.         ;;
  97.       z-- )
  98.          shift
  99.          break 
  100.         ;;
  101.       z-* )
  102.          echo "${progname}: ${bq}${1}${eq} is not a valid option." 1>&2
  103.          echo "" 1>&2
  104.          echo "${usage}" 1>&2
  105.          exit 1
  106.         ;;
  107.       * )
  108.          break 
  109.         ;;
  110.    esac
  111. done
  112.  
  113. # See if there are any command line args left (which will be interpreted as
  114. # filename arguments)
  115. if test $# -eq 0 ; then
  116.    echo "${progname}: at least one file name is required as an argument." 1>&2
  117.    echo "" 1>&2
  118.    echo "${usage}" 1>&2
  119.    exit 1
  120. fi
  121.  
  122. test "z${debug}" = "zt" && set -x
  123.  
  124. # Texify files
  125. for command_line_filename in ${1+"$@"} ; do
  126.    # AmigaOS hack - Since PasTex does not understand the ixemul.library
  127.    # convention of changing /foo/bar into foo:bar internally, we have to
  128.    # do it explicitly.
  129.    command_line_filename=`echo ${command_line_filename} | sed 's:^/::' | sed 's@/@:@'`
  130.    # Roughly equivalent to `dirname ...`, but more portable
  131.    directory="`echo ${command_line_filename} | sed 's/\/[^\/]*$//'`"
  132.    filename_texi="`basename ${command_line_filename}`"
  133.    # Strip off the last extension part (probably .texinfo or .texi)
  134.    filename_noext="`echo ${filename_texi} | sed 's/\.[^.]*$//'`"
  135.  
  136.    # If directory and file are the same, then it's probably because there's
  137.    # no pathname component.  Set dirname to `.', the current directory.
  138.    if test "z${directory}" = "z${command_line_filename}" ; then
  139.       directory="."
  140.    fi
  141.  
  142.    # Source file might @include additional texinfo sources.  Put `.' and
  143.    # directory where source file(s) reside in TEXINPUTS before anything
  144.    # else.  `.' goes first to ensure that any old .aux, .cps, etc. files in
  145.    # ${directory} don't get used in preference to fresher files in `.'. 
  146.    # Amiga hack - PasTex currently only sees AmigaOS environment, and
  147.    # the TEXINPUTS fields are comma separated, not ':' separated.
  148.    TEXINPUTS=".,${directory},${TEXINPUTS_orig}"
  149.    echo "${TEXINPUTS}" >env:TEXINPUTS
  150.  
  151.    # "Unset" variables that might have values from previous iterations and
  152.    # which won't be completely reset later.
  153.    definite_index_files=""
  154.  
  155.    # See if file exists here.  If it doesn't we're in trouble since, even
  156.    # though the user may be able to reenter a valid filename at the tex
  157.    # prompt (assuming they're attending the terminal), this script won't be
  158.    # able to find the right index files and so forth.
  159.    if test ! -r "${command_line_filename}" ; then
  160.       echo "${progname}: ${command_line_filename}: No such file or permission denied." 1>&2
  161.       continue; 
  162.    fi
  163.  
  164.    # Find all files having root filename with a two-letter extension,
  165.    # determine whether they're really index files, and save them.  Foo.aux
  166.    # is actually the cross-references file, but we need to keep track of
  167.    # that too.
  168.    possible_index_files="`eval echo ${filename_noext}.?? ${filename_noext}.aux`"
  169.    for this_file in ${possible_index_files} ; do
  170.       # If file is empty, forget it.  
  171.       if test ! -s "${this_file}" ; then
  172.          continue;
  173.       fi
  174.  
  175.       # Examine first character of file.  If it's not a backslash or
  176.       # single quote, then it's definitely not an index or xref file.
  177.       first_character="`sed -n '1s/^\(.\).*$/\1/p;q' ${this_file}`"
  178.       if test "${first_character}" = "\\" -o "${first_character}" = "'" ; then
  179.          definite_index_files="${definite_index_files} ${this_file}"
  180.       fi
  181.    done
  182.    orig_index_files="${definite_index_files}"
  183.    orig_index_files_sans_aux="`echo ${definite_index_files} \
  184.                                 | sed 's/'${filename_noext}'\.aux//;
  185.                                        s/^[ ]*//;s/[ ]*$//;'`"
  186.  
  187.    # Now save copies of original index files so we have some means of
  188.    # comparison later. 
  189.    for index_file_to_save in ${orig_index_files} ; do
  190.        cp "${index_file_to_save}" "${index_file_to_save}${backup_extension}"
  191.    done
  192.  
  193.    # Run texindex on current index files.  If they already exist, and
  194.    # after running TeX a first time the index files don't change, then
  195.    # there's no reason to run TeX again.  But we won't know that if the
  196.    # index files are out of date or nonexistent.
  197.    if test "${orig_index_files_sans_aux}" ; then
  198.       ${texindex} ${orig_index_files_sans_aux}
  199.    fi
  200.  
  201.    if ${tex} ${command_line_filename} ; then        # TeX run first time
  202.       definite_index_files=""
  203.       # Get list of new index files
  204.       possible_index_files="`eval echo ${filename_noext}.?? ${filename_noext}.aux`"
  205.       for this_file in ${possible_index_files} ; do
  206.          # If file is empty, forget it.
  207.          if test ! -s ${this_file} ; then
  208.             continue;
  209.          fi
  210.  
  211.          # Examine first character of file.  If it's not a backslash or
  212.          # single quote, then it's definitely not an index or xref file.
  213.          first_character="`sed -n '1s/^\(.\).*$/\1/p;q' ${this_file}`"
  214.          if test "${first_character}" = "\\" -o "${first_character}" = "'" ; then
  215.             definite_index_files="${definite_index_files} ${this_file}"
  216.          fi
  217.       done
  218.       new_index_files="${definite_index_files}"
  219.       new_index_files_sans_aux="`echo ${definite_index_files} \
  220.                                   | sed 's/'${filename_noext}'\.aux//;
  221.                                          s/^[ ]*//;s/[ ]*$//;'`"
  222.  
  223.       # If old and new list don't at least have the same file list, then one
  224.       # file or another has definitely changed.  
  225.       if test "${orig_index_files}" != "${new_index_files}" ; then
  226.          index_files_changed_p=t
  227.       else
  228.          # File list is the same.  We must compare each file until we find a
  229.          # difference.  
  230.          index_files_changed_p=""
  231.          for this_file in ${new_index_files} ; do
  232.             # cmp -s will return nonzero exit status if files differ. 
  233.             cmp -s "${this_file}" "${this_file}${backup_extension}"
  234.             if test $? -ne 0  ; then
  235.                # We only need to keep comparing until we find *one* that
  236.                # differs, because we'll have to run texindex & tex no
  237.                # matter what. 
  238.                index_files_changed_p=t
  239.                break
  240.             fi
  241.          done
  242.       fi
  243.  
  244.       # If index files have changed since TeX has been run, or if the aux
  245.       # file wasn't present originally, run texindex and TeX again.
  246.       if test "${index_files_changed_p}"  ; then
  247.          retval=0
  248.          if test "${new_index_files_sans_aux}" ; then
  249.             ${texindex} ${new_index_files_sans_aux} 
  250.             retval=$?
  251.          fi
  252.          if test ${retval} -eq 0 ; then
  253.             ${tex} "${command_line_filename}"
  254.          fi
  255.       fi
  256.    fi
  257.  
  258.    # Generate list of files to delete, then call rm once with the entire
  259.    # list.  This is significantly faster than multiple executions of rm. 
  260.    file_list=""
  261.    for file in ${orig_index_files} ; do
  262.        file_list="${file_list} ${file}${backup_extension}"
  263.    done
  264.    if test "${file_list}" ; then
  265.       rm -f ${file_list}
  266.    fi
  267. done
  268.  
  269. #
  270. # eof
  271. #
  272.