#!/bin/sh
# Convert WEB programs not needing special treatment to C.

: ${srcdir=.}

usage="Usage: $0 BASE

BASE is the root part of the file to be converted; it is extended with
.p to make the name of the (input) Pascal file, and extended with .c and
.h to make the name of the main (output) C files.  Additional files
BASEini.c, BASEd.h, BASEcoerce.h are created for the larger programs.
"
native=.

basefile=
while test $# -gt 0; do
  case $1 in
    -*) echo "$1?" >&2; echo "$usage" >&2; exit 1;;
     *) if test -n "$basefile"; then
          echo "$1?" >&2; echo "$usage" >&2; exit 1; fi
        basefile=$1;;
  esac
  shift
done
if test -z "$basefile"; then
  echo "$0: missing base (Pascal) file argument." >&2
  echo "$usage" >&2
  exit 1
fi

pascalfile=$basefile.p
cfile=$basefile.c

# This is for tangleboot if the build and source directories are different.
test -r $pascalfile || pascalfile=$srcdir/$pascalfile

# We use cpascal.h by default instead of config.h because straight C
# routines can only be confused by the definitions for `chr', etc.
hfile=cpascal.h
more_defines=
web2c_options=-c$basefile
precmd=
midcmd=
fixwrites_options=
# This used to have various values to control the number of *tex[0-9].c files.
# We now avoid to split the C code for MF and all TeX-like engines.
splitup_options="-i -l 65000"
postcmd=
output="> $cfile"
output_files="$cfile $basefile.h"

case $basefile in
  bibtex)
    midcmd="| sed -f $srcdir/web2c/cvtbib.sed"
    ;;

  mp)
    more_defines="$srcdir/web2c/texmf.defines $srcdir/web2c/mfmp.defines"
    precmd="| sed -f $srcdir/web2c/cvtmf1.sed"
    web2c_options="-m -c${basefile}coerce"
    hfile=texmfmp.h
    midcmd="| sed -f $srcdir/web2c/cvtmf2.sed"
    postcmd="| $native/web2c/splitup $splitup_options $basefile"
    cfile=${basefile}0.c # last output file, or thereabouts
    output=
    output_files="$basefile[0-9].c ${basefile}ini.c ${basefile}d.h \
${basefile}coerce.h"
    ;;

  mf)
    more_defines="$srcdir/web2c/texmf.defines $srcdir/web2c/mfmp.defines"
    precmd="| sed -f $srcdir/web2c/cvtmf1.sed"
    web2c_options="-m -c${basefile}coerce"
    hfile=texmfmp.h
    midcmd="| sed -f $srcdir/web2c/cvtmf2.sed"
    postcmd="| $native/web2c/splitup $splitup_options $basefile"
    cfile=${basefile}0.c # last output file, or thereabouts
    output=
    output_files="$basefile[0-9].c ${basefile}ini.c ${basefile}d.h \
${basefile}coerce.h"
    ;;

  tex|etex|pdftex|omega|aleph|xetex)
    more_defines="$srcdir/web2c/texmf.defines $srcdir/synctexdir/synctex.defines"
    prog_defines="$srcdir/${basefile}dir/$basefile.defines"
    if test -f $prog_defines; then
      more_defines="$more_defines $prog_defines"
    fi
    web2c_options="-t -c${basefile}coerce"
    hfile=texmfmp.h
    fixwrites_options=-t
    postcmd="| $native/web2c/splitup $splitup_options ${basefile}"
    cfile=${basefile}0.c # last output file, or thereabouts
    output=
    output_files="$basefile[0-9].c ${basefile}ini.c ${basefile}d.h \
                  ${basefile}coerce.h"
    ;;

esac

# Do it.
eval "cat $srcdir/web2c/common.defines $more_defines $pascalfile \
  $precmd \
  | $native/web2c/web2c -h$hfile $web2c_options \
  $midcmd \
  | $native/web2c/fixwrites $fixwrites_options $basefile \
  $postcmd \
  $output"

# Using the above pipeline as the condition of an if does no good, since
# typical sh's use the status of the first command as the pipeline result.
# So check for an empty output file, or one with the error marker we put in.
if test ! -s $cfile || grep @error@ $output_files >nul; then
  : ${TMPDIR=/tmp}
  # Don't just delete it, since it may be useful for debugging.
  echo "$0: conversion of $pascalfile failed, moving dregs:" >&2
  cmd="cp $output_files $TMPDIR"
  (cd $TMPDIR && rm -f $output_files)
  echo "$0:   $cmd" >&2
  $cmd
  rm -f $output_files
  exit 1
fi

case $basefile in
  bibtex)
    sed -e 's/(buftype)//g' -e 's/(pdstype)//g' <bibtex.h >xbibtex.h
    mv xbibtex.h bibtex.h
    ;;
  tex|etex|pdftex|omega|mf|mp|aleph|luatex|xetex)
    sleep 2 # so timestamps are definitely later, to avoid make weirdness
    cat $srcdir/web2c/coerce.h >>${basefile}coerce.h
    touch ${basefile}d.h
    ;;
esac

exit 0
