summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/web2c/convert
blob: 32b7bd78b6ad42e98b81312ad0aeb598f6f346b7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/bin/sh
# Convert WEB programs not needing special treatment to C.
# 
# $1 is the Pascal file to be converted.
# $2 is the C file to be created.
# $3, if present, is extended with .h, and #included in the C file, and
# extended with .defines, and prepended along with the common
# definitions.

: ${srcdir=.}

usage="Usage: $0 <basefile>."
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 "Missing basefile 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=
splitup_options="-i -l 11500"
# was 10000, but that caused pdfetex4.c to appear. With 11500, the number of
# files for pdf{e}tex is unchanged.
postcmd=
output="> $cfile"
output_files="$cfile $basefile.h"

case $basefile in
  bibtex)
    midcmd="| sed -f $srcdir/web2c/cvtbib.sed";;
  mf) # MF and MP are almost the same.
    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="| ./web2c/splitup $splitup_options $basefile"
    cfile=${basefile}2.c # last output file, or thereabouts
    output=
    output_files="$basefile[0-9].c ${basefile}ini.c ${basefile}d.h \
${basefile}coerce.h"
    ;;
  mp) # MP now needs mp.defines for font inclusion library
    more_defines="$srcdir/web2c/texmf.defines $srcdir/web2c/mfmp.defines"
    prog_defines="$srcdir/${basefile}dir/$basefile.defines"
    if test -f $prog_defines; then
       more_defines="$more_defines $prog_defines"
     fi
    precmd="| sed -f $srcdir/web2c/cvtmf1.sed"
    web2c_options="-m -c${basefile}coerce"
    hfile=texmfmp.h
    midcmd="| sed -f $srcdir/web2c/cvtmf2.sed"
    postcmd="| ./web2c/splitup $splitup_options $basefile"
    cfile=${basefile}2.c # last output file, or thereabouts
    output=
    output_files="$basefile[0-9].c ${basefile}ini.c ${basefile}d.h \
${basefile}coerce.h"
    ;;
  tex|eomega|etex|pdftex|pdfetex|omega|aleph|xetex)
    more_defines="$srcdir/web2c/texmf.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="| ./web2c/splitup $splitup_options ${basefile}"
    cfile=${basefile}2.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 \
  | ./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.
  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)
    sed -e 's/(buftype)//g' -e 's/(pdstype)//g' <bibtex.h >xbibtex.h
    mv xbibtex.h bibtex.h
    ;;
  tex|eomega|etex|pdftex|pdfetex|omega|aleph|mf|mp|xetex)
    sleep 2 # so timestamps are definitely later, to avoid make weirdness
    cat ${basefile}coerce.h $srcdir/web2c/coerce.h >x${basefile}coerce.h
    mv x${basefile}coerce.h ${basefile}coerce.h
    touch ${basefile}d.h
    ;;
esac

exit 0