Whamcloud - gitweb
b=21571 stacksize and locking fixes for loadgen patch from umka
[fs/lustre-release.git] / lustre / doc / chbar.sh
index 8a16d0d..7825241 100755 (executable)
-#! /bin/sh
+#!/bin/sh
 #      Gadget to take two LaTeX files and produce a third which
 #      has changebars highlighting the difference between them.
 #
-# Version 1.1
+# Version 1.2
 # Author:
 #      Don Ward, Careful Computing (don@careful.co.uk)
 # v1.0 April 1989
 # v1.1  Feb 93 Amended to use changebar.sty (v3.0) and dvips
-#
-# Useage:
-#      chbar file1 file2 [output]
-#              (default output is stdout)
-#      chbar old
-#              (new file on stdin, output on stdout)
-#
-# Method:
-# 1    Use diff to get an ed script to go from file1 to file2.
-# 2    Breathe on it a bit (with sed) to insert changebar commands.
-# 3    Apply modified ed script to produce (nearly) the output.
-# 4    Use awk to insert the changebars option into the \documentstyle
-#      and to handle changebar commands inside verbatim environments.
-# 5     Remove changebars before \begin{document} with sed
-if test $# -eq 0
-then cat <<\xEOF
-Useage:
-       chbars old new [output]
-       chbars old
-xEOF
-exit 0
+# v1.2  Aug 95  Added support for LaTeX209/LaTeX2e
+#              Added RCS support to retrive old files
+
+CMD=`basename $0`
+
+SED=sed
+RM="rm -f"
+DIFF=diff
+ED=ed
+AWK=awk
+GREP=grep
+MV=mv
+CAT=cat
+MKDIR=mkdir
+CO="co"
+
+TMPDIR=${TMP-/tmp}/$CMD.$$
+trap 'test $DEBUG = NO && rm -rf $TMPDIR' 0 1 2 3 6 7 13 15
+mkdir $TMPDIR || { echo "cannot create directory \`$TMPDIR'." >&2; exit 1; }
+TMPFILE=${TMPDIR}/$CMD.$$
+SED_CMD_FILE=$TMPFILE.sed
+
+usage()
+{
+$CAT << _END_
+Usage:
+  $CMD [-hgG] [-d dir] old new [output]
+       default output is stdout
+
+  $CMD [-hgG] [-d dir] old
+       new file on stdin, output on stdout
+
+  $CMD [-hgG] -d dir -r rev files
+       old file retrieved using RCS
+
+  Gadget to take two LaTeX files and produce a third which
+  has changebars highlighting the difference between them.
+  Changebars are inserted for differences after '\begin{document}'.
+
+  Feature: \`new' can not be named \`-'.
+
+  Options are:
+  -d dir : Write the output to file  \`dir/new', if \`new' is given or
+          to file \`dir/old'.
+          If \`dir' does not exist, it is created.
+          If \`output' is given, it is discarded.
+
+  -r rev : If the LaTeX \`files' are kept under control of the
+          Revision Control System RCS, the old files of
+          the revision \`rev' can be retrived.
+          \`rev' is specified using the RCS conventions.
+          This option must be used together with the \`-d dir' option.
+          \`files' must be a nonempty list of files.
+
+  -h    : Print this info text.
+  -g    : Print some debugging info.
+  -G    : Even more debug info.
+
+  Version 1.2: August 3. 1995
+_END_
+exit 1
+}
+
+# parse options and arguments
+DEBUG="NO"
+DIR=
+REV=
+# process options
+while getopts d:r:gGh i $*
+do
+  case $i in
+       d ) DIR=$OPTARG;;
+       r ) REV=$OPTARG;;
+       g ) DEBUG="YES" ;;
+       G ) set -x; DEBUG="YES";;
+       h | \
+        * ) usage ;;
+  esac
+done
+
+shift `expr $OPTIND - 1`
+
+case $# in
+  1 ) OLD=$1; NEW="-"; OUT=""   ;;
+  2 ) OLD=$1; NEW=$2;  OUT=""   ;;
+  3 ) OLD=$1; NEW=$2;  OUT="$3" ;;
+  * ) usage ;;
+esac
+
+# check correct options
+if [ ! -z "$DIR" ]
+then
+  [ -d $DIR ] || $MKDIR $DIR
 fi
-#      Strictly speaking, should check that $TMP doesn't exist already.
-TMP=/tmp/chb-$$
-export TMP
-OLD=$1
-if test $# -eq 1
-then   NEW="-";        # arg is old file, take new from stdin
-else   NEW=$2 ; 
-fi  
-#
-#      sed commands to edit ed commands to edit old file
-cat <<\xEOF > $TMP
+
+if [ ! -z "$REV" ]
+then
+  [ -z "$DIR" ] && usage
+  FILES=$*
+else
+  FILES=$NEW
+fi
+
+# do the work
+for NEW in $FILES
+do
+  if [ ! -z "$DIR" ]
+  then
+    if [ $NEW = "-" ]
+    then
+      OUT=$DIR/$OLD
+    else
+      OUT=$DIR/$NEW
+    fi
+  fi
+  if [ ! -z "$REV" ]
+  then
+    OLD=${TMPFILE}.old
+    $CO -p"$REV" -q $NEW > $OLD
+  fi
+
+  [ $DEBUG = "YES" ] && echo "OLD=\`$OLD' NEW=\`$NEW' OUT=\`$OUT'"
+
+  # gather some info about the file
+  # Since we have for sure only the name of the OLD file, ...
+  $GREP "^\\\\begin{document}" $OLD > /dev/null
+  if [ $? -eq 0 ]
+  then
+    [ $DEBUG = "YES" ] && echo "contains a \\begin{document}"
+    HAS_BEGIN_DOC="YES"
+  else
+    [ $DEBUG = "YES" ] && echo "contains no \\begin{document}"
+    HAS_BEGIN_DOC="NO"
+  fi
+
+  # Method to do the work:
+  # 1  Use diff to get an ed script to go from file1 to file2.
+  # 2  Breath on it a bit (with sed) to insert changebar commands.
+  # 3  Apply modified ed script to produce (nearly) the output.
+  # 4  Use awk to insert the changebars option into the \documentstyle
+  #    and to handle changebar commands inside verbatim environments.
+  # 5     Remove changebars before \begin{document} with sed
+
+  #    SED commands to edit ED commands to edit old file
+  $CAT > $SED_CMD_FILE <<\_END_
 /^\.$/i\
 \\cbend{}%
 /^[0-9][0-9]*[ac]$/a\
@@ -54,52 +166,78 @@ i\
 i\
 \\cbdelete{}%\
 .
-xEOF
-diff -b -e $OLD $NEW | ( sed -f $TMP ; echo w ${TMP}1 ; echo q ) | ed - $OLD
-#      awk commands to insert Changebars style and to protect
-#      changebar commands in verbatim environments
-#       and to tell what driver is in use
-cat <<\xEOF >$TMP
-/^\\documentstyle/{
-  if (index($0, "changebar") == 0 ) {
-    opts = index($0, "[")
-    if (opts > 0)
-       printf "%schangebar,%s",substr($0,1,opts),substr($0,opts+1)
-    else
+_END_
+
+  # note DIFF accepts `-' as stdin
+  $DIFF -b -e $OLD $NEW | \
+       ( $SED -f $SED_CMD_FILE ; echo w ${TMPFILE}.1 ; echo q ) | \
+       $ED - $OLD
+
+  #    AWK commands to insert Changebars style and to protect
+  #    changebar commands in verbatim environments
+  #       and to tell what driver is in use; we assume the `dvips' driver
+
+  $AWK '
+  BEGIN {kind=""; # we saw now \documentXXX[]{}
+  }
+  /^\\documentstyle/{
+    kind = "209";
+    if (index($0, "changebar") == 0 ) {
+      opts = index($0, "[")
+      if (opts > 0)
+       printf "%schangebar,%s\n",substr($0,1,opts),substr($0,opts+1)
+      else
        printf "\\documentstyle[changebar]%s\n", substr($0,15)
+      next
+    }
+  }
+  /^\\documentclass/{
+    kind = "2e";
+    printf "%s\n", $0
+    printf "\\usepackage[dvips]{changebar}\n"
     next
   }
-}
-/\\begin{document}/ {print "%\\driver{dvips}"}
-/\\begin{verbatim}/{++nesting}
-/\\end{verbatim}/{--nesting}
-/\\cbstart{}%|\\cbend{}%|\cbdelete{}%/ {
-  if ( nesting > 0) {
-#      changebar command in a verbatim environment: Temporarily exit,
-#      do the changebar command and reenter.
-#
-#      The obvious ( printf "\\end{verbatim}%s\\begin{verbatim} , $0 )
-#      leaves too much vertical space around the changed line(s).
-#      The following magic seeems to work
-#
+  /\\begin{document}/ {if (kind == "209" ) {print "\\driver{dvips}"}}
+  /\\begin{verbatim}/{++nesting}
+  /\\end{verbatim}/{--nesting}
+  /\\cbstart{}%|\\cbend{}%|\cbdelete{}%/ {
+    if ( nesting > 0) {
+  #    changebar command in a verbatim environment: Temporarily exit,
+  #    do the changebar command and reenter.
+  #
+  #    The obvious ( printf "\\end{verbatim}%s\\begin{verbatim} , $0 )
+  #    leaves too much vertical space around the changed line(s).
+  #    The following magic seeems to work
+  #
        print  "\\end{verbatim}\\nointerlineskip"
        print  "\\vskip -\\ht\\strutbox\\vskip -\\ht\\strutbox"
        printf "\\vbox to 0pt{\\vskip \\ht\\strutbox%s\\vss}\n", $0
        print  "\\begin{verbatim}"
        next
        }
-}
-{ print $0 }
-xEOF
-awk -f $TMP ${TMP}1 >${TMP}2
-#    sed commands to clean up unwanted changebars
-#    (those before \begin{document})
-# cat <<xEOF >$TMP
-# 1,/\\begin{document}/s/\\\\cb[sed][tne][adl][^{}]*{}%$/%/
-# xEOF
-# if test $# -le 2 || test $3 = '-'
-# then  sed -f $TMP ${TMP}2
-# else  sed -f $TMP ${TMP}2 >$3
-# fi
-#rm $TMP ${TMP}[0-9]
-cat ${TMP}2
+  }
+  { print $0 }
+  '  ${TMPFILE}.1 > ${TMPFILE}.2
+
+  # if a \begin{document} is contained in the file,
+  # remove the changebar commands before them
+
+  if [ $HAS_BEGIN_DOC = "YES" ]
+  then
+    SED_CMD="1,/\\\\begin{document}/s/\(\\\\cb[sed][tne][adl][^{}]*{}%\)$/%%\1/"
+    $SED "$SED_CMD" ${TMPFILE}.2 > ${TMPFILE}.3
+  else
+    $CAT ${TMPFILE}.2 > ${TMPFILE}.3
+  fi
+  if [ -z "$OUT" ]
+  then
+    $CAT ${TMPFILE}.3
+ else
+    $MV ${TMPFILE}.3 $OUT
+  fi
+
+done
+
+[ $DEBUG =  "NO" ] && $RM ${TMPFILE}.*
+
+###############################################################