#!/bin/sh # Convert WEB programs not needing special treatment to C. # Public domain. Originally written ca.1985 by Tom Rokicki, # Tim Morgan, Karl Berry, et al. : ${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. " 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 pbibtex|pdvitype|ppltotf|ptftopl) more_defines="$srcdir/ptexdir/ptex.defines" hfile=ptexdir/kanji.h ;; upbibtex|updvitype|uppltotf|uptftopl) more_defines="$srcdir/uptexdir/uptex.defines" hfile=uptexdir/kanji.h ;; esac case $basefile in bibtex|pbibtex|upbibtex) midcmd="| sed -f $srcdir/web2c/cvtbib.sed" ;; mf|mflua|mfluajit|tex|aleph|etex|pdftex|ptex|eptex|euptex|uptex|xetex) case $basefile in mf*) more_defines="$srcdir/web2c/texmf.defines $srcdir/web2c/mfmp.defines" precmd="| sed -f $srcdir/web2c/cvtmf1.sed" web2c_options="-m -c${basefile}coerce" midcmd="| sed -f $srcdir/web2c/cvtmf2.sed" ;; *) more_defines="$srcdir/web2c/texmf.defines $srcdir/synctexdir/synctex.defines" web2c_options="-t -c${basefile}coerce" fixwrites_options=-t ;; esac prog_defines="$srcdir/${basefile}dir/$basefile.defines" if test -f $prog_defines; then more_defines="$more_defines $prog_defines" fi hfile=texmfmp.h postcmd="| ./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. #set -x eval "cat $srcdir/web2c/common.defines $more_defines $pascalfile \ $precmd \ | ./web2c/web2c -h$hfile $web2c_options \ $midcmd \ | ./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 >/dev/null; then : ${TMPDIR=/tmp} # Don't just delete it, since it may be useful for debugging. if test ! -s "$pascalfile"; then echo "$0: $pascalfile empty, removing it." >&2 rm -f $pascalfile fi echo "$0: conversion of $pascalfile failed, moving dregs:" >&2 cmd="mv $output_files $TMPDIR" (cd $TMPDIR && rm -f $output_files) echo "$0: $cmd" >&2 $cmd exit 1 fi case $basefile in bibtex|pbibtex|upbibtex) sed -e 's/(buftype)//g' -e 's/(pdstype)//g' <$basefile.h >x$basefile.h mv x$basefile.h $basefile.h ;; mf|mflua|mfluajit|tex|aleph|etex|pdftex|ptex|eptex|euptex|uptex|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