summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2019-01-06 23:19:16 +0000
committerKarl Berry <karl@freefriends.org>2019-01-06 23:19:16 +0000
commit976f2b9b61a086f8594f6bfe6dbea42faa56edb2 (patch)
tree9e620153df80a27b0304ae9827fa0f69a02191e0
parentb109e3c47399f4fdfc7805b8f9168c7452f78e96 (diff)
cwebbin for cweb, from Andreas Scherer https://github.com/ascherer/cwebbin)
git-svn-id: svn://tug.org/texlive/trunk@49626 c570f23f-e606-0410-a88d-b1316a301751
-rw-r--r--Build/source/texk/web2c/ChangeLog27
-rw-r--r--Build/source/texk/web2c/Makefile.in168
-rw-r--r--Build/source/texk/web2c/NEWS5
-rw-r--r--Build/source/texk/web2c/am/bootstrap.am22
-rw-r--r--Build/source/texk/web2c/am/cweb.am23
-rw-r--r--Build/source/texk/web2c/ctangleboot-sh.in3
-rw-r--r--Build/source/texk/web2c/ctangleboot.cin830
-rw-r--r--Build/source/texk/web2c/cwebboot.cin1006
-rw-r--r--Build/source/texk/web2c/cwebboot.hin65
-rw-r--r--Build/source/texk/web2c/cwebdir/ChangeLog26
-rw-r--r--Build/source/texk/web2c/cwebdir/comm-w2c.ch1303
-rw-r--r--Build/source/texk/web2c/cwebdir/comm-w2c.h225
-rw-r--r--Build/source/texk/web2c/cwebdir/ctang-w2c.ch833
-rw-r--r--Build/source/texk/web2c/cwebdir/ctproofmac.tex353
-rw-r--r--Build/source/texk/web2c/cwebdir/cttwinxmac.tex319
-rw-r--r--Build/source/texk/web2c/cwebdir/ctwill-w2c.ch3217
-rw-r--r--Build/source/texk/web2c/cwebdir/ctwimac.tex476
-rw-r--r--Build/source/texk/web2c/cwebdir/cweav-w2c.ch1791
-rw-r--r--Build/source/texk/web2c/cwebdir/cwebinputs/amiga_types.w109
-rw-r--r--Build/source/texk/web2c/cwebdir/cwebinputs/c++1xlib.w22
-rw-r--r--Build/source/texk/web2c/cwebdir/cwebinputs/ecma94.w43
-rw-r--r--Build/source/texk/web2c/cwebdir/cwebinputs/hp8.w46
-rw-r--r--Build/source/texk/web2c/cwebdir/cwebinputs/iso_types.w119
-rw-r--r--Build/source/texk/web2c/cwebdir/cwebinputs/mac8.w52
-rw-r--r--Build/source/texk/web2c/cwebdir/cwebinputs/pc850.w49
-rw-r--r--Build/source/texk/web2c/cwebdir/po/cweb-tl.pot47
-rw-r--r--Build/source/texk/web2c/cwebdir/po/cweb.pot598
-rw-r--r--Build/source/texk/web2c/cwebdir/po/de/cweb-tl.mobin0 -> 887 bytes
-rw-r--r--Build/source/texk/web2c/cwebdir/po/de/cweb-tl.po50
-rw-r--r--Build/source/texk/web2c/cwebdir/po/de/cweb.mobin0 -> 12503 bytes
-rw-r--r--Build/source/texk/web2c/cwebdir/po/de/cweb.po675
-rw-r--r--Build/source/texk/web2c/cwebdir/po/de/web2c-help.mobin0 -> 3657 bytes
-rw-r--r--Build/source/texk/web2c/cwebdir/po/de/web2c-help.po114
-rw-r--r--Build/source/texk/web2c/cwebdir/po/it/cweb.mobin0 -> 12388 bytes
-rw-r--r--Build/source/texk/web2c/cwebdir/po/it/cweb.po675
-rw-r--r--Build/source/texk/web2c/cwebdir/po/web2c-help.pot117
-rw-r--r--Build/source/texk/web2c/cwebdir/prod-twill.w303
-rw-r--r--Build/source/texk/web2c/cwebdir/refsort.w165
-rw-r--r--Build/source/texk/web2c/cwebdir/texinputs/Xcwebmac.tex41
-rw-r--r--Build/source/texk/web2c/cwebdir/texinputs/dctproofmac.tex28
-rw-r--r--Build/source/texk/web2c/cwebdir/texinputs/dctwimac.tex12
-rw-r--r--Build/source/texk/web2c/cwebdir/texinputs/dcwebmac.tex106
-rw-r--r--Build/source/texk/web2c/cwebdir/texinputs/dcwebstrings.tex40
-rw-r--r--Build/source/texk/web2c/cwebdir/texinputs/ecma94.sty205
-rw-r--r--Build/source/texk/web2c/cwebdir/texinputs/fcwebmac.tex137
-rw-r--r--Build/source/texk/web2c/cwebdir/texinputs/hp8.sty183
-rw-r--r--Build/source/texk/web2c/cwebdir/texinputs/icwebmac.tex157
-rw-r--r--Build/source/texk/web2c/cwebdir/texinputs/mac8.sty231
-rw-r--r--Build/source/texk/web2c/cwebdir/texinputs/pc850.sty193
-rw-r--r--Build/source/texk/web2c/cwebdir/twinx.w460
-rw-r--r--Build/source/texk/web2c/help.h41
-rw-r--r--Build/source/texk/web2c/man/ChangeLog4
-rw-r--r--Build/source/texk/web2c/man/cweb.man44
53 files changed, 13909 insertions, 1849 deletions
diff --git a/Build/source/texk/web2c/ChangeLog b/Build/source/texk/web2c/ChangeLog
index 4960c098620..0985f0f73ed 100644
--- a/Build/source/texk/web2c/ChangeLog
+++ b/Build/source/texk/web2c/ChangeLog
@@ -1,3 +1,30 @@
+2019-01-06 Andreas Scherer <https://ascherer.github.io>
+
+ Integration of CWEBbin as the new CWEB in TeX Live,
+ https://github.com/ascherer/cwebbin.
+
+ Purge cweb.h and cwebboot.h[in] from CWEB build process.
+ * am/bootstrap.am (cweb.h): no longer created at common-ctangle.
+ (DISTCLEANFILES): do not remove cweb.h or cwebboot.h.
+ $(ctangleboot_OBJECTS): do not depend on cwebboot.h.
+ (EXTRA_DIST): omit no-longer-created cwebboot.hin.
+ (ctangle.c),
+ * am/cweb.am (cweave.c): depend on new file cwebdir/comm-w2c.h,
+ instead of common.h.
+ $(cweave_OBJECTS): remove rule.
+ * ctangleboot-sh.in <common>: only generate .c, not .h;
+ don't try to #include cwebboot.h.
+ * ctangleboot.cin,
+ * cwebboot.cin: regenerate.
+ * cwebboot.hin: delete.
+ * help.h (CTWILLHELP): new help string.
+ (CTANGLEHELP, CWEAVEHELP): update.
+
+ Add CTWILL material on top of CWEAVE.
+ * am/bootstrap.am (NEVER_DIST): omit {ctwill,refsort,twinx}.{log,trs}.
+ * am/cweb.am (bin_programs): add ctwill, ctwill-refsort, ctwill-twinx,
+ with related targets and dependencies.
+
2018-12-30 Karl Berry <karl@tug.org>
* mplibdir/am/mplib.am,
diff --git a/Build/source/texk/web2c/Makefile.in b/Build/source/texk/web2c/Makefile.in
index 5e066a25b06..5f55f48afce 100644
--- a/Build/source/texk/web2c/Makefile.in
+++ b/Build/source/texk/web2c/Makefile.in
@@ -106,15 +106,17 @@ EXTRA_PROGRAMS = $(am__EXEEXT_1) tex$(EXEEXT) mf$(EXEEXT) \
xetex$(EXEEXT) $(am__EXEEXT_4) aleph$(EXEEXT) synctex$(EXEEXT) \
md5main$(EXEEXT)
bin_PROGRAMS = tangle$(EXEEXT) ctangle$(EXEEXT) $(am__EXEEXT_5) \
- ctie$(EXEEXT) cweave$(EXEEXT) tie$(EXEEXT) $(am__EXEEXT_6) \
- $(am__EXEEXT_7) $(am__EXEEXT_8) $(am__EXEEXT_9) \
- $(am__EXEEXT_10) $(am__EXEEXT_11) $(am__EXEEXT_12) \
- $(am__EXEEXT_13) $(am__EXEEXT_14) $(am__EXEEXT_15) \
- $(am__EXEEXT_16) $(am__EXEEXT_17) $(am__EXEEXT_18) \
- $(am__EXEEXT_19) $(am__EXEEXT_20) $(am__EXEEXT_21) \
- $(am__EXEEXT_22) $(am__EXEEXT_23) $(am__EXEEXT_24) \
- $(am__EXEEXT_25) $(am__EXEEXT_26) $(am__EXEEXT_27) \
- $(am__EXEEXT_28) $(am__EXEEXT_29) $(am__EXEEXT_30)
+ ctie$(EXEEXT) cweave$(EXEEXT) ctwill$(EXEEXT) \
+ ctwill-refsort$(EXEEXT) ctwill-twinx$(EXEEXT) tie$(EXEEXT) \
+ $(am__EXEEXT_6) $(am__EXEEXT_7) $(am__EXEEXT_8) \
+ $(am__EXEEXT_9) $(am__EXEEXT_10) $(am__EXEEXT_11) \
+ $(am__EXEEXT_12) $(am__EXEEXT_13) $(am__EXEEXT_14) \
+ $(am__EXEEXT_15) $(am__EXEEXT_16) $(am__EXEEXT_17) \
+ $(am__EXEEXT_18) $(am__EXEEXT_19) $(am__EXEEXT_20) \
+ $(am__EXEEXT_21) $(am__EXEEXT_22) $(am__EXEEXT_23) \
+ $(am__EXEEXT_24) $(am__EXEEXT_25) $(am__EXEEXT_26) \
+ $(am__EXEEXT_27) $(am__EXEEXT_28) $(am__EXEEXT_29) \
+ $(am__EXEEXT_30)
noinst_PROGRAMS = tangleboot$(EXEEXT) ctangleboot$(EXEEXT) \
$(am__EXEEXT_31) $(am__EXEEXT_32) $(am__EXEEXT_33) \
$(am__EXEEXT_34) $(am__EXEEXT_35) $(am__EXEEXT_36) \
@@ -1148,6 +1150,18 @@ nodist_ctie_OBJECTS = ctie.$(OBJEXT)
ctie_OBJECTS = $(nodist_ctie_OBJECTS)
ctie_LDADD = $(LDADD)
ctie_DEPENDENCIES = $(proglib) $(am__DEPENDENCIES_1)
+nodist_ctwill_OBJECTS = ctwill.$(OBJEXT) cweb.$(OBJEXT)
+ctwill_OBJECTS = $(nodist_ctwill_OBJECTS)
+ctwill_LDADD = $(LDADD)
+ctwill_DEPENDENCIES = $(proglib) $(am__DEPENDENCIES_1)
+nodist_ctwill_refsort_OBJECTS = ctwill-refsort.$(OBJEXT)
+ctwill_refsort_OBJECTS = $(nodist_ctwill_refsort_OBJECTS)
+ctwill_refsort_LDADD = $(LDADD)
+ctwill_refsort_DEPENDENCIES = $(proglib) $(am__DEPENDENCIES_1)
+nodist_ctwill_twinx_OBJECTS = ctwill-twinx.$(OBJEXT)
+ctwill_twinx_OBJECTS = $(nodist_ctwill_twinx_OBJECTS)
+ctwill_twinx_LDADD = $(LDADD)
+ctwill_twinx_DEPENDENCIES = $(proglib) $(am__DEPENDENCIES_1)
nodist_cweave_OBJECTS = cweave.$(OBJEXT) cweb.$(OBJEXT)
cweave_OBJECTS = $(nodist_cweave_OBJECTS)
cweave_LDADD = $(LDADD)
@@ -1545,12 +1559,14 @@ am__depfiles_remade = ./$(DEPDIR)/aleph-aleph-pool.Po \
./$(DEPDIR)/call_pmpost-callexe.Po \
./$(DEPDIR)/call_upmpost-callexe.Po ./$(DEPDIR)/ctangle.Po \
./$(DEPDIR)/ctangleboot.Po ./$(DEPDIR)/ctie.Po \
- ./$(DEPDIR)/cweave.Po ./$(DEPDIR)/cweb.Po \
- ./$(DEPDIR)/cwebboot.Po ./$(DEPDIR)/dvicopy.Po \
- ./$(DEPDIR)/dvitype.Po ./$(DEPDIR)/eptex-eptex-pool.Po \
- ./$(DEPDIR)/eptex-eptex0.Po ./$(DEPDIR)/eptex-eptexini.Po \
- ./$(DEPDIR)/etex-etex-pool.Po ./$(DEPDIR)/etex-etex0.Po \
- ./$(DEPDIR)/etex-etexini.Po ./$(DEPDIR)/euptex-euptex-pool.Po \
+ ./$(DEPDIR)/ctwill-refsort.Po ./$(DEPDIR)/ctwill-twinx.Po \
+ ./$(DEPDIR)/ctwill.Po ./$(DEPDIR)/cweave.Po \
+ ./$(DEPDIR)/cweb.Po ./$(DEPDIR)/cwebboot.Po \
+ ./$(DEPDIR)/dvicopy.Po ./$(DEPDIR)/dvitype.Po \
+ ./$(DEPDIR)/eptex-eptex-pool.Po ./$(DEPDIR)/eptex-eptex0.Po \
+ ./$(DEPDIR)/eptex-eptexini.Po ./$(DEPDIR)/etex-etex-pool.Po \
+ ./$(DEPDIR)/etex-etex0.Po ./$(DEPDIR)/etex-etexini.Po \
+ ./$(DEPDIR)/euptex-euptex-pool.Po \
./$(DEPDIR)/euptex-euptex0.Po ./$(DEPDIR)/euptex-euptexini.Po \
./$(DEPDIR)/gftodvi.Po ./$(DEPDIR)/gftopk.Po \
./$(DEPDIR)/gftype.Po ./$(DEPDIR)/initex-callexe.Po \
@@ -2165,7 +2181,9 @@ SOURCES = $(libff_a_SOURCES) $(libkanji_a_SOURCES) \
$(nodist_call_mfluajit_SOURCES) $(nodist_call_mpost_SOURCES) \
$(nodist_call_pmpost_SOURCES) $(nodist_call_upmpost_SOURCES) \
$(nodist_ctangle_SOURCES) $(nodist_ctangleboot_SOURCES) \
- $(nodist_ctie_SOURCES) $(nodist_cweave_SOURCES) \
+ $(nodist_ctie_SOURCES) $(nodist_ctwill_SOURCES) \
+ $(nodist_ctwill_refsort_SOURCES) \
+ $(nodist_ctwill_twinx_SOURCES) $(nodist_cweave_SOURCES) \
$(nodist_dvicopy_SOURCES) $(nodist_dvitype_SOURCES) \
$(dist_eptex_SOURCES) $(nodist_eptex_SOURCES) \
$(dist_etex_SOURCES) $(nodist_etex_SOURCES) \
@@ -2807,19 +2825,18 @@ TEST_EXTENSIONS = .pl .test
#dist_liblua53tex_sources = $(dist_libluatex_sources)
EXTRA_DIST = PROJECTS cftests cpascal.h help.h w2c/config.h \
triptrap-sh tangle.web tangle.ch tangleboot.pin cwebdir \
- ctangleboot.cin cwebboot.cin cwebboot.hin tangle.test \
- $(web_programs:=.web) $(web_programs:=.ch) $(web_tests) \
- tests/memdata1.bst tests/memdata2.bst tests/memdata3.bst \
- tests/auxinclude.aux tests/auxinclude.bbl tests/auxinclude.bib \
- tests/auxinclude.tex tests/auxinclude2.aux \
- tests/auxinclude2.tex tests/allbib.aux tests/allbib.tex \
- tests/apalike.bst tests/badpl.pl tests/badtfm.tfm \
- tests/badvf.tfm tests/badvf.vf tests/badvpl.vpl \
- tests/batch.tex tests/check.log tests/cmr10.600gf \
- tests/cmr10.pk tests/cmr10.pl tests/cmr10.tfm tests/cmr7.tfm \
- tests/cmr8.tfm tests/cmti10.tfm tests/cmtt10.tfm \
- tests/cmtt8.tfm tests/dict tests/eight.tex tests/end.tex \
- tests/exampl.aux tests/exampl.tex tests/gray.tfm \
+ ctangleboot.cin cwebboot.cin tangle.test $(web_programs:=.web) \
+ $(web_programs:=.ch) $(web_tests) tests/memdata1.bst \
+ tests/memdata2.bst tests/memdata3.bst tests/auxinclude.aux \
+ tests/auxinclude.bbl tests/auxinclude.bib tests/auxinclude.tex \
+ tests/auxinclude2.aux tests/auxinclude2.tex tests/allbib.aux \
+ tests/allbib.tex tests/apalike.bst tests/badpl.pl \
+ tests/badtfm.tfm tests/badvf.tfm tests/badvf.vf \
+ tests/badvpl.vpl tests/batch.tex tests/check.log \
+ tests/cmr10.600gf tests/cmr10.pk tests/cmr10.pl \
+ tests/cmr10.tfm tests/cmr7.tfm tests/cmr8.tfm tests/cmti10.tfm \
+ tests/cmtt10.tfm tests/cmtt8.tfm tests/dict tests/eight.tex \
+ tests/end.tex tests/exampl.aux tests/exampl.tex tests/gray.tfm \
tests/hello.tex tests/io.mf tests/just.texi tests/label.mp \
tests/label.mpx tests/logo8.tfm tests/longline.aux \
tests/longline.bib tests/longline.tex tests/longtfm.tex \
@@ -3148,12 +3165,11 @@ EXTRA_DIST = PROJECTS cftests cpascal.h help.h w2c/config.h \
synctexdir/synctex-xe-rec.ch3 $(synctex_tests) libmd5/md5.test
DISTCLEANFILES = CXXLD.sh tangle.c tangle.h tangle.p tangle-web2c \
tangleboot.c tangleboot.h tangleboot.p tangleboot-web2c \
- ctangle.c cweb.c cweb.h common-ctangle ctangleboot.c \
- cwebboot.c cwebboot.h cftest.p $(web_programs:=.c) \
- $(web_programs:=.h) $(web_programs:=.p) \
- $(web_programs:=-web2c) tests/xexampl.aux tests/xexampl.bbl \
- tests/xexampl.blg longline.aux longline.bbl longline.bib \
- longline.blg tests/memtest.bib tests/memtest?.* \
+ ctangle.c cweb.c common-ctangle ctangleboot.c cwebboot.c \
+ cftest.p $(web_programs:=.c) $(web_programs:=.h) \
+ $(web_programs:=.p) $(web_programs:=-web2c) tests/xexampl.aux \
+ tests/xexampl.bbl tests/xexampl.blg longline.aux longline.bbl \
+ longline.bib longline.blg tests/memtest.bib tests/memtest?.* \
tests/xstory.dvi tests/xpplr.dvi tests/xstory.dvityp \
tests/xpagenum.typ cmr10.dvi tests/xcmr10.dvi cmr10.pk \
tests/xcmr10.pk tests/xcmr10.gft1 tests/xcmr10.gft2 io.tex \
@@ -3161,21 +3177,22 @@ DISTCLEANFILES = CXXLD.sh tangle.c tangle.h tangle.p tangle-web2c \
tests/xcmr10.600gf tests/xcmr10.pktyp badpl.* tests/xcmr10.tfm \
tests/xtexpool.typ badtfm.* tests/xcmr10*.pl badvf.* \
tests/xptmr*.vpl badvpl.* tests/yptmr*.* pooltype.tex ctie.c \
- cweave.c tie.c ctie.outc ctie.outm common.tex common.scn \
- common.idx tie.outc tie.outm $(nodist_tex_SOURCES) \
- tex-final.ch tex-web2c tex.p tex.pool tex-tangle trip.diffs \
- write18-quote.log mftrap.diffs $(nodist_libmf_a_SOURCES) \
- mf-final.ch mf-web2c mf.p mf.pool mf-tangle mfluatrap.diffs \
- $(nodist_libmflua_a_SOURCES) mflua.web mflua.ch mflua-web2c \
- mflua.p mflua.pool mflua-tangle mfluatrap.diffs \
- mfluajittrap.diffs $(nodist_libmfluajit_a_SOURCES) \
- mfluajit.web mfluajit.ch mfluajit-web2c mfluajit.p \
- mfluajit.pool mfluajit-tangle mfluajittrap.diffs \
- $(nodist_mpost_SOURCES) mpxout-tangle mptrap.diffs ptmr.mpx \
- tests/xptmr.mpx tests/xstory.mpx $(nodist_pmpost_SOURCES) \
- pmp.w pmpost.w pmpxout.w ppsout.w psvgout.w ptfmin.w \
- pmp-tangle pmpxout-tangle ppsout-tangle psvgout-tangle \
- pmpsamp.* upmpsamp.* $(nodist_libmplibcore_a_SOURCES) \
+ cweave.c ctwill.c ctwill-refsort.c ctwill-twinx.c tie.c \
+ ctie.outc ctie.outm common.tex common.scn common.idx tie.outc \
+ tie.outm $(nodist_tex_SOURCES) tex-final.ch tex-web2c tex.p \
+ tex.pool tex-tangle trip.diffs write18-quote.log mftrap.diffs \
+ $(nodist_libmf_a_SOURCES) mf-final.ch mf-web2c mf.p mf.pool \
+ mf-tangle mfluatrap.diffs $(nodist_libmflua_a_SOURCES) \
+ mflua.web mflua.ch mflua-web2c mflua.p mflua.pool mflua-tangle \
+ mfluatrap.diffs mfluajittrap.diffs \
+ $(nodist_libmfluajit_a_SOURCES) mfluajit.web mfluajit.ch \
+ mfluajit-web2c mfluajit.p mfluajit.pool mfluajit-tangle \
+ mfluajittrap.diffs $(nodist_mpost_SOURCES) mpxout-tangle \
+ mptrap.diffs ptmr.mpx tests/xptmr.mpx tests/xstory.mpx \
+ $(nodist_pmpost_SOURCES) pmp.w pmpost.w pmpxout.w ppsout.w \
+ psvgout.w ptfmin.w pmp-tangle pmpxout-tangle ppsout-tangle \
+ psvgout-tangle pmpsamp.* upmpsamp.* \
+ $(nodist_libmplibcore_a_SOURCES) \
$(nodist_libmplibextramath_a_SOURCES) \
$(nodist_libmplibbackends_a_SOURCES) mp-tangle mpmath-tangle \
mpmathdecimal-tangle mpmathdouble-tangle mpstrings-tangle \
@@ -3250,7 +3267,9 @@ uninstall_exe_links = $(am__append_13) $(am__append_23) \
$(am__append_32) $(am__append_40) $(am__append_48) \
$(am__append_53) $(am__append_87) $(am__append_92)
NEVER_DIST = `find . $(NEVER_NAMES)` cwebdir/cweave.log \
- cwebdir/cweave.trs ctiedir/ctie.log ctiedir/ctie.trs \
+ cwebdir/cweave.trs cwebdir/ctwill.log cwebdir/ctwill.trs \
+ cwebdir/refsort.log cwebdir/refsort.trs cwebdir/twinx.log \
+ cwebdir/twinx.trs ctiedir/ctie.log ctiedir/ctie.trs \
tiedir/tie.log tiedir/tie.trs
NEVER_NAMES = -name .svn
NEVER_NAMES_SUB = -o -name .deps -o -name .dirstamp -o -name '*.$(OBJEXT)'
@@ -3327,7 +3346,7 @@ nodist_tangle_SOURCES = tangle.c tangle.h
nodist_tangleboot_SOURCES = tangleboot.c tangleboot.h
tangleboot_DEPENDENCIES = $(default_dependencies)
nodist_ctangle_SOURCES = ctangle.c cweb.c
-# ctangle.c and cweb.[ch] are special cases, since they are needed to compile
+# ctangle.c and cweb.c are special cases, since they are needed to compile
# themselves. We depend on ctangleboot, even though we might not use it.
ctangleboot = AM_V_P=$(AM_V_P) $(SHELL) ./ctangleboot-sh $@
nodist_ctangleboot_SOURCES = ctangleboot.c cwebboot.c
@@ -3357,6 +3376,9 @@ nodist_vptovf_SOURCES = vptovf.c vptovf.h
nodist_weave_SOURCES = weave.c weave.h
nodist_ctie_SOURCES = ctie.c
nodist_cweave_SOURCES = cweave.c cweb.c
+nodist_ctwill_SOURCES = ctwill.c cweb.c
+nodist_ctwill_refsort_SOURCES = ctwill-refsort.c
+nodist_ctwill_twinx_SOURCES = ctwill-twinx.c
nodist_tie_SOURCES = tie.c
tie_CPPFLAGS = $(AM_CPPFLAGS) -DNOT_WEB2C
initex_CPPFLAGS = -DEXEPROG=\"tex.exe\"
@@ -6775,6 +6797,18 @@ ctie$(EXEEXT): $(ctie_OBJECTS) $(ctie_DEPENDENCIES) $(EXTRA_ctie_DEPENDENCIES)
@rm -f ctie$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(ctie_OBJECTS) $(ctie_LDADD) $(LIBS)
+ctwill$(EXEEXT): $(ctwill_OBJECTS) $(ctwill_DEPENDENCIES) $(EXTRA_ctwill_DEPENDENCIES)
+ @rm -f ctwill$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(ctwill_OBJECTS) $(ctwill_LDADD) $(LIBS)
+
+ctwill-refsort$(EXEEXT): $(ctwill_refsort_OBJECTS) $(ctwill_refsort_DEPENDENCIES) $(EXTRA_ctwill_refsort_DEPENDENCIES)
+ @rm -f ctwill-refsort$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(ctwill_refsort_OBJECTS) $(ctwill_refsort_LDADD) $(LIBS)
+
+ctwill-twinx$(EXEEXT): $(ctwill_twinx_OBJECTS) $(ctwill_twinx_DEPENDENCIES) $(EXTRA_ctwill_twinx_DEPENDENCIES)
+ @rm -f ctwill-twinx$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(ctwill_twinx_OBJECTS) $(ctwill_twinx_LDADD) $(LIBS)
+
cweave$(EXEEXT): $(cweave_OBJECTS) $(cweave_DEPENDENCIES) $(EXTRA_cweave_DEPENDENCIES)
@rm -f cweave$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(cweave_OBJECTS) $(cweave_LDADD) $(LIBS)
@@ -7155,6 +7189,9 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctangle.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctangleboot.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctie.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctwill-refsort.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctwill-twinx.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctwill.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cweave.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cweb.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cwebboot.Po@am__quote@ # am--include-marker
@@ -16501,6 +16538,9 @@ distclean: distclean-recursive
-rm -f ./$(DEPDIR)/ctangle.Po
-rm -f ./$(DEPDIR)/ctangleboot.Po
-rm -f ./$(DEPDIR)/ctie.Po
+ -rm -f ./$(DEPDIR)/ctwill-refsort.Po
+ -rm -f ./$(DEPDIR)/ctwill-twinx.Po
+ -rm -f ./$(DEPDIR)/ctwill.Po
-rm -f ./$(DEPDIR)/cweave.Po
-rm -f ./$(DEPDIR)/cweb.Po
-rm -f ./$(DEPDIR)/cwebboot.Po
@@ -17149,6 +17189,9 @@ maintainer-clean: maintainer-clean-recursive
-rm -f ./$(DEPDIR)/ctangle.Po
-rm -f ./$(DEPDIR)/ctangleboot.Po
-rm -f ./$(DEPDIR)/ctie.Po
+ -rm -f ./$(DEPDIR)/ctwill-refsort.Po
+ -rm -f ./$(DEPDIR)/ctwill-twinx.Po
+ -rm -f ./$(DEPDIR)/ctwill.Po
-rm -f ./$(DEPDIR)/cweave.Po
-rm -f ./$(DEPDIR)/cweb.Po
-rm -f ./$(DEPDIR)/cwebboot.Po
@@ -17868,15 +17911,14 @@ tangleboot-web2c: tangleboot.p $(web2c_depend)
.pin.p:
$(cp_silent)cp -f $< $@
$(tangleboot_OBJECTS): $(tangleboot_DEPENDENCIES)
-$(ctangle_OBJECTS): cweb.h
-ctangle.c: ctangleboot$(EXEEXT) cwebdir/common.h cwebdir/ctangle.w cwebdir/ctang-w2c.ch ctangleboot-sh
+ctangle.c: ctangleboot$(EXEEXT) cwebdir/comm-w2c.h cwebdir/ctangle.w cwebdir/ctang-w2c.ch ctangleboot-sh
@$(ctangleboot) ctangle ctang-w2c
-cweb.c cweb.h: common-ctangle
+cweb.c: common-ctangle
@$(ctangleboot) common comm-w2c cweb.c
common-ctangle: ctangleboot$(EXEEXT) cwebdir/common.w cwebdir/comm-w2c.ch ctangleboot-sh
@$(ctangleboot) common comm-w2c cweb.c
-$(ctangleboot_OBJECTS): cwebboot.h $(ctangleboot_DEPENDENCIES)
-# ctangleboot.cin and cwebboot.[ch]in are in the distribution
+$(ctangleboot_OBJECTS): $(ctangleboot_DEPENDENCIES)
+# ctangleboot.cin and cwebboot.cin are in the distribution
.cin.c:
$(cp_silent)cp -f $< $@
.hin.h:
@@ -17998,13 +18040,21 @@ weave.p: tangle$(EXEEXT) weave.web weave.ch
weave.log: weave$(EXEEXT)
ctie.c: ctangle$(EXEEXT) ctiedir/ctie.w ctiedir/ctie-k.ch
$(ctangle_silent)CWEBINPUTS=$(srcdir)/ctiedir $(ctangle) ctie.w ctie-k.ch
-$(cweave_OBJECTS): cweb.h
-cweave.c: ctangle$(EXEEXT) cwebdir/common.h cwebdir/cweave.w cwebdir/prod.w cwebdir/cweav-w2c.ch
+cweave.c: ctangle$(EXEEXT) cwebdir/comm-w2c.h cwebdir/cweave.w cwebdir/prod.w cwebdir/cweav-w2c.ch
$(ctangle_silent)CWEBINPUTS=$(srcdir)/cwebdir $(ctangle) cweave cweav-w2c
+ctwill.c: ctangle$(EXEEXT) cwebdir/comm-w2c.h cwebdir/cweave.w cwebdir/prod-twill.w cwebdir/ctwill-w2c.ch
+ $(ctangle_silent)CWEBINPUTS=$(srcdir)/cwebdir $(ctangle) cweave ctwill-w2c ctwill.c
+ctwill-refsort.c: ctangle$(EXEEXT) cwebdir/refsort.w
+ $(ctangle_silent)CWEBINPUTS=$(srcdir)/cwebdir $(ctangle) refsort - ctwill-refsort.c
+ctwill-twinx.c: ctangle$(EXEEXT) cwebdir/twinx.w
+ $(ctangle_silent)CWEBINPUTS=$(srcdir)/cwebdir $(ctangle) twinx - ctwill-twinx.c
tie.c: ctangle$(EXEEXT) tiedir/tie.w tiedir/tie-w2c.ch
$(ctangle_silent)CWEBINPUTS=$(srcdir)/tiedir $(ctangle) tie.w tie-w2c.ch
ctiedir/ctie.log: ctie$(EXEEXT)
cwebdir/cweave.log: cweave$(EXEEXT)
+cwebdir/ctwill.log: ctwill$(EXEEXT)
+cwebdir/ctwill-refsort.log: ctwill-refsort$(EXEEXT)
+cwebdir/ctwill-twinx.log: ctwill-twinx$(EXEEXT)
tiedir/tie.log: tie$(EXEEXT)
$(tex_OBJECTS): $(tex_prereq)
diff --git a/Build/source/texk/web2c/NEWS b/Build/source/texk/web2c/NEWS
index fff05348406..673f331bdee 100644
--- a/Build/source/texk/web2c/NEWS
+++ b/Build/source/texk/web2c/NEWS
@@ -3,10 +3,13 @@ This file records noteworthy changes. (Public domain.)
BibTeX: subsidiary .aux files are looked for in the directory of the
main .aux file, if not found as-is (to work better with -output-directory).
+CWEB: now comes from the CWEBbin package
+(https://github.com/ascherer/cwebbin), with translation capabilities,
+more language support, and more.
+
2018 (for TeX Live 2018, 14 April 2018)
* Directories in the -output-directory do not mask files by the same name.
-
2017 (for TeX Live 2017, 19 May 2017)
2016 (for TeX Live 2016, 21 May 2016)
diff --git a/Build/source/texk/web2c/am/bootstrap.am b/Build/source/texk/web2c/am/bootstrap.am
index f37c6ddbcd6..5199f430e26 100644
--- a/Build/source/texk/web2c/am/bootstrap.am
+++ b/Build/source/texk/web2c/am/bootstrap.am
@@ -56,36 +56,38 @@ EXTRA_DIST += tangleboot.pin
DISTCLEANFILES += tangleboot.c tangleboot.h tangleboot.p tangleboot-web2c
# Bootstrapping ctangle requires making it with itself. We use the opportunity
-# to create an up-to-date ctangleboot.cin and cwebboot.[ch]in as well.
+# to create an up-to-date ctangleboot.cin and cwebboot.cin as well.
bin_PROGRAMS += ctangle
nodist_ctangle_SOURCES = ctangle.c cweb.c
-$(ctangle_OBJECTS): cweb.h
-# ctangle.c and cweb.[ch] are special cases, since they are needed to compile
+# ctangle.c and cweb.c are special cases, since they are needed to compile
# themselves. We depend on ctangleboot, even though we might not use it.
ctangleboot = AM_V_P=$(AM_V_P) $(SHELL) ./ctangleboot-sh $@
-ctangle.c: ctangleboot$(EXEEXT) cwebdir/common.h cwebdir/ctangle.w cwebdir/ctang-w2c.ch ctangleboot-sh
+ctangle.c: ctangleboot$(EXEEXT) cwebdir/comm-w2c.h cwebdir/ctangle.w cwebdir/ctang-w2c.ch ctangleboot-sh
@$(ctangleboot) ctangle ctang-w2c
-cweb.c cweb.h: common-ctangle
+cweb.c: common-ctangle
@$(ctangleboot) common comm-w2c cweb.c
common-ctangle: ctangleboot$(EXEEXT) cwebdir/common.w cwebdir/comm-w2c.ch ctangleboot-sh
@$(ctangleboot) common comm-w2c cweb.c
EXTRA_DIST += cwebdir
NEVER_DIST += cwebdir/cweave.log cwebdir/cweave.trs
+NEVER_DIST += cwebdir/ctwill.log cwebdir/ctwill.trs
+NEVER_DIST += cwebdir/refsort.log cwebdir/refsort.trs
+NEVER_DIST += cwebdir/twinx.log cwebdir/twinx.trs
## We install man/cweb.man, not cwebdir/cweb.1
## nodist_man_MANS += cwebdir/cweb.1
-DISTCLEANFILES += ctangle.c cweb.c cweb.h common-ctangle
+DISTCLEANFILES += ctangle.c cweb.c common-ctangle
noinst_PROGRAMS += ctangleboot
nodist_ctangleboot_SOURCES = ctangleboot.c cwebboot.c
-$(ctangleboot_OBJECTS): cwebboot.h $(ctangleboot_DEPENDENCIES)
-# ctangleboot.cin and cwebboot.[ch]in are in the distribution
+$(ctangleboot_OBJECTS): $(ctangleboot_DEPENDENCIES)
+# ctangleboot.cin and cwebboot.cin are in the distribution
.cin.c:
$(cp_silent)cp -f $< $@
.hin.h:
$(cp_silent)cp -f $< $@
ctangleboot_DEPENDENCIES = $(default_dependencies)
-EXTRA_DIST += ctangleboot.cin cwebboot.cin cwebboot.hin
-DISTCLEANFILES += ctangleboot.c cwebboot.c cwebboot.h
+EXTRA_DIST += ctangleboot.cin cwebboot.cin
+DISTCLEANFILES += ctangleboot.c cwebboot.c
## Tests
##
diff --git a/Build/source/texk/web2c/am/cweb.am b/Build/source/texk/web2c/am/cweb.am
index b55ae163884..90c10db2d67 100644
--- a/Build/source/texk/web2c/am/cweb.am
+++ b/Build/source/texk/web2c/am/cweb.am
@@ -3,7 +3,7 @@
## Copyright (C) 2009-2015 Peter Breitenlohner <tex-live@tug.org>
## You may freely use, modify and/or distribute this file.
-bin_PROGRAMS += ctie cweave tie
+bin_PROGRAMS += ctie cweave ctwill ctwill-refsort ctwill-twinx tie
EXTRA_DIST += ctiedir tiedir
NEVER_DIST += ctiedir/ctie.log ctiedir/ctie.trs tiedir/tie.log tiedir/tie.trs
@@ -15,11 +15,25 @@ ctie.c: ctangle$(EXEEXT) ctiedir/ctie.w ctiedir/ctie-k.ch
DISTCLEANFILES += ctie.c
nodist_cweave_SOURCES = cweave.c cweb.c
-$(cweave_OBJECTS): cweb.h
-cweave.c: ctangle$(EXEEXT) cwebdir/common.h cwebdir/cweave.w cwebdir/prod.w cwebdir/cweav-w2c.ch
+cweave.c: ctangle$(EXEEXT) cwebdir/comm-w2c.h cwebdir/cweave.w cwebdir/prod.w cwebdir/cweav-w2c.ch
$(ctangle_silent)CWEBINPUTS=$(srcdir)/cwebdir $(ctangle) cweave cweav-w2c
DISTCLEANFILES += cweave.c
+nodist_ctwill_SOURCES = ctwill.c cweb.c
+ctwill.c: ctangle$(EXEEXT) cwebdir/comm-w2c.h cwebdir/cweave.w cwebdir/prod-twill.w cwebdir/ctwill-w2c.ch
+ $(ctangle_silent)CWEBINPUTS=$(srcdir)/cwebdir $(ctangle) cweave ctwill-w2c ctwill.c
+DISTCLEANFILES += ctwill.c
+
+nodist_ctwill_refsort_SOURCES = ctwill-refsort.c
+ctwill-refsort.c: ctangle$(EXEEXT) cwebdir/refsort.w
+ $(ctangle_silent)CWEBINPUTS=$(srcdir)/cwebdir $(ctangle) refsort - ctwill-refsort.c
+DISTCLEANFILES += ctwill-refsort.c
+
+nodist_ctwill_twinx_SOURCES = ctwill-twinx.c
+ctwill-twinx.c: ctangle$(EXEEXT) cwebdir/twinx.w
+ $(ctangle_silent)CWEBINPUTS=$(srcdir)/cwebdir $(ctangle) twinx - ctwill-twinx.c
+DISTCLEANFILES += ctwill-twinx.c
+
nodist_tie_SOURCES = tie.c
tie_CPPFLAGS = $(AM_CPPFLAGS) -DNOT_WEB2C
## We install man/tie.man, not tiedir/tie.1
@@ -33,6 +47,9 @@ DISTCLEANFILES += tie.c
TESTS += ctiedir/ctie.test cwebdir/cweave.test tiedir/tie.test
ctiedir/ctie.log: ctie$(EXEEXT)
cwebdir/cweave.log: cweave$(EXEEXT)
+cwebdir/ctwill.log: ctwill$(EXEEXT)
+cwebdir/ctwill-refsort.log: ctwill-refsort$(EXEEXT)
+cwebdir/ctwill-twinx.log: ctwill-twinx$(EXEEXT)
tiedir/tie.log: tie$(EXEEXT)
## ctiedir/ctie.test
diff --git a/Build/source/texk/web2c/ctangleboot-sh.in b/Build/source/texk/web2c/ctangleboot-sh.in
index db5da006b6c..1cc839f058c 100644
--- a/Build/source/texk/web2c/ctangleboot-sh.in
+++ b/Build/source/texk/web2c/ctangleboot-sh.in
@@ -12,7 +12,7 @@
target=$1; shift
base=$1
case $base in
- common) file=cweb; exts='c h';;
+ common) file=cweb; exts=c;;
ctangle) file=ctangle; exts=c;;
*) echo "Usage: $0 TARGET {common|ctangle} [CHANGEFILE]" >&2; exit 1;;
esac
@@ -64,7 +64,6 @@ for ext in $exts; do
src=$file.$ext
dst=@srcdir@/${file}boot.${ext}in
sed -e 's,@srcdir@/cwebdir,cwebdir,' \
- -e 's,^#include "cweb.h",#include "cwebboot.h",' \
$src >$stamp.tmp
if cmp -s $stamp.tmp $dst; then
rm -f $stamp.tmp
diff --git a/Build/source/texk/web2c/ctangleboot.cin b/Build/source/texk/web2c/ctangleboot.cin
index 0a4e286176a..ed118418a3f 100644
--- a/Build/source/texk/web2c/ctangleboot.cin
+++ b/Build/source/texk/web2c/ctangleboot.cin
@@ -1,24 +1,40 @@
/*1:*/
#line 64 "cwebdir/ctangle.w"
-/*5:*/
-#line 35 "cwebdir/common.h"
+/*2:*/
+#line 60 "cwebdir/ctang-w2c.ch"
+
+#include <string.h>
+#line 83 "cwebdir/ctangle.w"
+
+/*:2*//*6:*/
+#line 44 "cwebdir/comm-w2c.h"
+
+#ifndef HAVE_GETTEXT
+#define HAVE_GETTEXT 0
+#endif
+
+#if HAVE_GETTEXT
+#include <libintl.h>
+#else
+#define gettext(A) A
+#endif
-#line 120 "cwebdir/ctang-w2c.ch"
-#include <kpathsea/kpathsea.h>
+#include <stdbool.h>
+#include <stdint.h>
#include <stdio.h>
-#line 37 "cwebdir/common.h"
-/*:5*//*61:*/
+/*:6*//*62:*/
#line 888 "cwebdir/ctangle.w"
-#line 890 "cwebdir/ctangle.w"
+#include <ctype.h>
#include <stdlib.h>
-/*:61*/
+/*:62*/
#line 65 "cwebdir/ctangle.w"
-#define banner "This is CTANGLE, Version 3.64" \
+#define banner _("This is CTANGLE, Version 3.64") \
+ \
#define max_bytes 1000000 \
@@ -32,7 +48,8 @@
#define buf_size 1000 \
#define ctangle 0
-#define cweave 1 \
+#define cweave 1
+#define ctwill 2 \
#define and_and 04
#define lt_lt 020
@@ -40,7 +57,7 @@
#define plus_plus 013
#define minus_minus 01
#define minus_gt 031
-#define not_eq 032
+#define non_eq 032
#define lt_eq 034
#define gt_eq 035
#define eq_eq 036
@@ -57,7 +74,7 @@
#define xisupper(c) (isupper((eight_bits) c) &&((eight_bits) c<0200) )
#define xisxdigit(c) (isxdigit((eight_bits) c) &&((eight_bits) c<0200) ) \
-#define length(c) (c+1) ->byte_start-(c) ->byte_start
+#define length(c) (size_t) ((c+1) ->byte_start-(c) ->byte_start)
#define print_id(c) term_write((c) ->byte_start,length((c) ) )
#define llink link
#define rlink dummy.Rlink
@@ -71,7 +88,8 @@
#define fatal_message 3
#define mark_harmless {if(history==spotless) history= harmless_message;}
#define mark_error history= error_message
-#define confusion(s) fatal("! This can't happen: ",s) \
+#define _(STRING) gettext(STRING)
+#define confusion(s) fatal(_("! This can't happen: ") ,s) \
#define max_file_name_length 1024
#define cur_file file[include_depth]
@@ -81,7 +99,8 @@
#define show_banner flags['b']
#define show_progress flags['p']
-#define show_happiness flags['h'] \
+#define show_happiness flags['h']
+#define make_xrefs flags['x'] \
#define update_terminal fflush(stdout)
#define new_line putchar('\n')
@@ -137,37 +156,40 @@
#define compress(c) if(loc++<=limit) return(c) \
#define macro 0
-#define app_repl(c) {if(tok_ptr==tok_mem_end) overflow("token") ;*tok_ptr++= c;} \
+#define app_repl(c) {if(tok_ptr==tok_mem_end) overflow(_("token") ) ;*tok_ptr++= c;} \
+
+#define max_banner 50 \
#line 66 "cwebdir/ctangle.w"
-/*4:*/
-#line 29 "cwebdir/common.h"
+/*5:*/
+#line 37 "cwebdir/comm-w2c.h"
-#line 31 "cwebdir/common.h"
-typedef char unsigned eight_bits;
-extern boolean program;
+typedef bool boolean;
+typedef uint8_t eight_bits;
+typedef uint16_t sixteen_bits;
+extern int program;
extern int phase;
-/*:4*//*6:*/
-#line 57 "cwebdir/common.h"
+/*:5*//*7:*/
+#line 78 "cwebdir/comm-w2c.h"
char section_text[longest_name+1];
char*section_text_end= section_text+longest_name;
char*id_first;
char*id_loc;
-/*:6*//*7:*/
-#line 72 "cwebdir/common.h"
+/*:7*//*8:*/
+#line 93 "cwebdir/comm-w2c.h"
extern char buffer[];
extern char*buffer_end;
extern char*loc;
extern char*limit;
-/*:7*//*8:*/
-#line 87 "cwebdir/common.h"
+/*:8*//*9:*/
+#line 108 "cwebdir/comm-w2c.h"
typedef struct name_info{
char*byte_start;
@@ -177,7 +199,7 @@ struct name_info*Rlink;
char Ilk;
}dummy;
-char*equiv_or_xref;
+void*equiv_or_xref;
}name_info;
typedef name_info*name_pointer;
typedef name_pointer*hash_pointer;
@@ -190,76 +212,91 @@ extern char*byte_ptr;
extern name_pointer hash[];
extern hash_pointer hash_end;
extern hash_pointer h;
-#line 147 "cwebdir/ctang-w2c.ch"
-#include "cwebboot.h"
-#line 112 "cwebdir/common.h"
+extern boolean names_match(name_pointer,const char*,size_t,eight_bits);
+extern name_pointer id_lookup(const char*,const char*,char);
-/*:8*//*9:*/
-#line 122 "cwebdir/common.h"
+extern name_pointer section_lookup(char*,char*,int);
+extern void init_node(name_pointer);
+extern void init_p(name_pointer,eight_bits);
+extern void print_prefix_name(name_pointer);
+extern void print_section_name(name_pointer);
+extern void sprint_section_name(char*,name_pointer);
+
+/*:9*//*10:*/
+#line 150 "cwebdir/comm-w2c.h"
-#line 159 "cwebdir/ctang-w2c.ch"
extern int history;
-#line 128 "cwebdir/common.h"
+extern int wrap_up(void);
+extern void err_print(const char*);
+extern void fatal(const char*,const char*);
+extern void overflow(const char*);
-/*:9*//*10:*/
-#line 137 "cwebdir/common.h"
+/*:10*//*11:*/
+#line 165 "cwebdir/comm-w2c.h"
-#line 173 "cwebdir/ctang-w2c.ch"
extern int include_depth;
-#line 139 "cwebdir/common.h"
extern FILE*file[];
extern FILE*change_file;
extern char C_file_name[];
extern char tex_file_name[];
extern char idx_file_name[];
extern char scn_file_name[];
+extern char check_file_name[];
extern char file_name[][max_file_name_length];
extern char change_file_name[];
-#line 181 "cwebdir/ctang-w2c.ch"
extern int line[];
extern int change_line;
extern int change_depth;
-#line 151 "cwebdir/common.h"
extern boolean input_has_ended;
extern boolean changing;
extern boolean web_file_open;
-#line 157 "cwebdir/common.h"
+extern boolean get_line(void);
+extern void check_complete(void);
+extern void reset_input(void);
-/*:10*//*11:*/
-#line 159 "cwebdir/common.h"
+/*:11*//*12:*/
+#line 188 "cwebdir/comm-w2c.h"
-typedef unsigned short sixteen_bits;
extern sixteen_bits section_count;
extern boolean changed_section[];
extern boolean change_pending;
extern boolean print_where;
-/*:11*//*12:*/
-#line 171 "cwebdir/common.h"
+/*:12*//*13:*/
+#line 200 "cwebdir/comm-w2c.h"
extern int argc;
extern char**argv;
extern boolean flags[];
-/*:12*//*13:*/
-#line 183 "cwebdir/common.h"
+/*:13*//*14:*/
+#line 212 "cwebdir/comm-w2c.h"
extern FILE*C_file;
extern FILE*tex_file;
extern FILE*idx_file;
extern FILE*scn_file;
+extern FILE*check_file;
extern FILE*active_file;
-/*:13*//*14:*/
-#line 192 "cwebdir/common.h"
+/*:14*//*15:*/
+#line 222 "cwebdir/comm-w2c.h"
+extern void common_init(void);
+extern void print_stats(void);
+extern void cb_show_banner(void);
#line 128 "cwebdir/ctangle.w"
-/*:14*/
+/*:15*//*104:*/
+#line 836 "cwebdir/ctang-w2c.ch"
+
+extern char cb_banner[];
+
+/*:104*/
#line 67 "cwebdir/ctangle.w"
-/*15:*/
+/*16:*/
#line 152 "cwebdir/ctangle.w"
typedef struct{
@@ -268,7 +305,7 @@ sixteen_bits text_link;
}text;
typedef text*text_pointer;
-/*:15*//*26:*/
+/*:16*//*27:*/
#line 296 "cwebdir/ctangle.w"
typedef struct{
@@ -280,10 +317,10 @@ sixteen_bits section_field;
}output_state;
typedef output_state*stack_pointer;
-/*:26*/
+/*:27*/
#line 68 "cwebdir/ctangle.w"
-/*16:*/
+/*17:*/
#line 159 "cwebdir/ctangle.w"
text text_info[max_texts];
@@ -293,12 +330,12 @@ eight_bits tok_mem[max_toks];
eight_bits*tok_mem_end= tok_mem+max_toks-1;
eight_bits*tok_ptr;
-/*:16*//*22:*/
+/*:17*//*23:*/
#line 227 "cwebdir/ctangle.w"
text_pointer last_unnamed;
-/*:22*//*27:*/
+/*:23*//*28:*/
#line 312 "cwebdir/ctangle.w"
output_state cur_state;
@@ -307,18 +344,18 @@ output_state stack[stack_size+1];
stack_pointer stack_ptr;
stack_pointer stack_end= stack+stack_size;
-/*:27*//*31:*/
+/*:28*//*32:*/
#line 384 "cwebdir/ctangle.w"
int cur_val;
-/*:31*//*35:*/
+/*:32*//*36:*/
#line 473 "cwebdir/ctangle.w"
eight_bits out_state;
boolean protect;
-/*:35*//*37:*/
+/*:36*//*38:*/
#line 502 "cwebdir/ctangle.w"
name_pointer output_files[max_files];
@@ -326,118 +363,135 @@ name_pointer*cur_out_file,*end_output_files,*an_output_file;
char cur_section_name_char;
char output_file_name[longest_name];
-/*:37*//*44:*/
+/*:38*//*45:*/
#line 599 "cwebdir/ctangle.w"
boolean output_defs_seen= 0;
-/*:44*//*50:*/
+/*:45*//*51:*/
#line 710 "cwebdir/ctangle.w"
char translit[128][translit_length];
-/*:50*//*55:*/
+/*:51*//*56:*/
#line 789 "cwebdir/ctangle.w"
eight_bits ccode[256];
-/*:55*//*58:*/
+/*:56*//*59:*/
#line 845 "cwebdir/ctangle.w"
boolean comment_continues= 0;
-/*:58*//*60:*/
+/*:59*//*61:*/
#line 884 "cwebdir/ctangle.w"
name_pointer cur_section_name;
int no_where;
-/*:60*//*74:*/
+/*:61*//*75:*/
#line 1195 "cwebdir/ctangle.w"
text_pointer cur_text;
eight_bits next_control;
-/*:74*//*81:*/
+/*:75*//*82:*/
#line 1353 "cwebdir/ctangle.w"
extern sixteen_bits section_count;
-/*:81*/
+/*:82*/
#line 69 "cwebdir/ctangle.w"
-/*40:*/
+/*41:*/
#line 533 "cwebdir/ctangle.w"
-#line 284 "cwebdir/ctang-w2c.ch"
+#line 251 "cwebdir/ctang-w2c.ch"
static void phase_two(void);
#line 535 "cwebdir/ctangle.w"
-/*:40*//*45:*/
+/*:41*//*46:*/
#line 602 "cwebdir/ctangle.w"
-#line 310 "cwebdir/ctang-w2c.ch"
+#line 335 "cwebdir/ctang-w2c.ch"
static void output_defs(void);
#line 604 "cwebdir/ctangle.w"
-/*:45*//*47:*/
+/*:46*//*48:*/
#line 648 "cwebdir/ctangle.w"
-#line 328 "cwebdir/ctang-w2c.ch"
+#line 355 "cwebdir/ctang-w2c.ch"
static void out_char(eight_bits);
#line 650 "cwebdir/ctangle.w"
-/*:47*//*89:*/
+/*:48*//*90:*/
#line 1460 "cwebdir/ctangle.w"
-#line 442 "cwebdir/ctang-w2c.ch"
+#line 651 "cwebdir/ctang-w2c.ch"
static void phase_one(void);
#line 1462 "cwebdir/ctangle.w"
-/*:89*//*91:*/
+/*:90*//*92:*/
#line 1478 "cwebdir/ctangle.w"
-#line 460 "cwebdir/ctang-w2c.ch"
+#line 665 "cwebdir/ctang-w2c.ch"
static void skip_limbo(void);
#line 1480 "cwebdir/ctangle.w"
-/*:91*/
+/*:92*//*97:*/
+#line 752 "cwebdir/ctang-w2c.ch"
+
+static eight_bits get_next(void);
+static eight_bits skip_ahead(void);
+static boolean skip_comment(boolean);
+static void flush_buffer(void);
+static void get_output(void);
+static void pop_level(int);
+static void push_level(name_pointer);
+static void scan_repl(eight_bits);
+static void scan_section(void);
+static void store_two_bytes(sixteen_bits);
+
+/*:97*/
#line 70 "cwebdir/ctangle.w"
-#line 83 "cwebdir/ctangle.w"
-
-/*:1*//*2:*/
+#line 55 "cwebdir/ctang-w2c.ch"
+/*:1*//*3:*/
#line 91 "cwebdir/ctangle.w"
#line 69 "cwebdir/ctang-w2c.ch"
-int main(int ac,char**av)
+int main(
+int ac,
+char**av)
#line 95 "cwebdir/ctangle.w"
{
argc= ac;argv= av;
program= ctangle;
-/*17:*/
+/*18:*/
#line 167 "cwebdir/ctangle.w"
text_info->tok_start= tok_ptr= tok_mem;
text_ptr= text_info+1;text_ptr->tok_start= tok_mem;
-/*:17*//*19:*/
+/*:18*//*20:*/
#line 177 "cwebdir/ctangle.w"
-name_dir->equiv= (char*)text_info;
+#line 130 "cwebdir/ctang-w2c.ch"
+init_node(name_dir);
+#line 179 "cwebdir/ctangle.w"
-/*:19*//*23:*/
+/*:20*//*24:*/
#line 230 "cwebdir/ctangle.w"
last_unnamed= text_info;text_info->text_link= 0;
-/*:23*//*38:*/
+/*:24*//*39:*/
#line 512 "cwebdir/ctangle.w"
cur_out_file= end_output_files= output_files+max_files;
-/*:38*//*51:*/
+/*:39*//*52:*/
#line 713 "cwebdir/ctangle.w"
{
@@ -445,7 +499,7 @@ int i;
for(i= 0;i<128;i++)sprintf(translit[i],"X%02X",(unsigned)(128+i));
}
-/*:51*//*56:*/
+/*:52*//*57:*/
#line 792 "cwebdir/ctangle.w"
{
int c;
@@ -465,72 +519,88 @@ ccode['<']= ccode['(']= section_name;
ccode['\'']= ord;
}
-/*:56*//*70:*/
+/*:57*//*71:*/
#line 1116 "cwebdir/ctangle.w"
section_text[0]= ' ';
-/*:70*/
+/*:71*//*105:*/
+#line 839 "cwebdir/ctang-w2c.ch"
+
+strncpy(cb_banner,banner,max_banner-1);
+
+/*:105*/
#line 98 "cwebdir/ctangle.w"
;
common_init();
-#line 75 "cwebdir/ctang-w2c.ch"
-if(show_banner){
-printf("%s%s\n",banner,versionstring);
-}
+#line 77 "cwebdir/ctang-w2c.ch"
+if(show_banner)cb_show_banner();
#line 101 "cwebdir/ctangle.w"
phase_one();
phase_two();
return wrap_up();
}
-/*:2*//*20:*/
+/*:3*//*21:*/
#line 183 "cwebdir/ctangle.w"
-#line 208 "cwebdir/ctang-w2c.ch"
-int names_match(name_pointer p,const char*first,int l,char t)
-#line 188 "cwebdir/ctangle.w"
-{
+#line 140 "cwebdir/ctang-w2c.ch"
+boolean names_match(
+name_pointer p,
+const char*first,
+size_t l,
+eight_bits t)
+{(void)t;
+#line 189 "cwebdir/ctangle.w"
if(length(p)!=l)return 0;
return!strncmp(first,p->byte_start,l);
}
-/*:20*//*21:*/
+/*:21*//*22:*/
#line 198 "cwebdir/ctangle.w"
+#line 153 "cwebdir/ctang-w2c.ch"
void
-#line 217 "cwebdir/ctang-w2c.ch"
- init_node(name_pointer node)
+init_node(
+name_pointer node)
#line 202 "cwebdir/ctangle.w"
{
-node->equiv= (char*)text_info;
+#line 161 "cwebdir/ctang-w2c.ch"
+node->equiv= (void*)text_info;
+#line 204 "cwebdir/ctangle.w"
}
+#line 168 "cwebdir/ctang-w2c.ch"
void
-#line 223 "cwebdir/ctang-w2c.ch"
- init_p(name_pointer p,char t){}
+init_p(name_pointer p,eight_bits t){(void)p;(void)t;}
#line 207 "cwebdir/ctangle.w"
-/*:21*//*25:*/
+/*:22*//*26:*/
#line 260 "cwebdir/ctangle.w"
-#line 233 "cwebdir/ctang-w2c.ch"
+#line 177 "cwebdir/ctang-w2c.ch"
static void
-store_two_bytes(sixteen_bits x)
+store_two_bytes(
+sixteen_bits x)
#line 264 "cwebdir/ctangle.w"
{
-if(tok_ptr+2> tok_mem_end)overflow("token");
+#line 185 "cwebdir/ctang-w2c.ch"
+if(tok_ptr+2> tok_mem_end)overflow(_("token"));
+#line 266 "cwebdir/ctangle.w"
*tok_ptr++= x>>8;
*tok_ptr++= x&0377;
}
-/*:25*//*29:*/
+/*:26*//*30:*/
#line 336 "cwebdir/ctangle.w"
-#line 244 "cwebdir/ctang-w2c.ch"
+#line 193 "cwebdir/ctang-w2c.ch"
static void
-push_level(name_pointer p)
+push_level(
+name_pointer p)
#line 340 "cwebdir/ctangle.w"
{
-if(stack_ptr==stack_end)overflow("stack");
+#line 201 "cwebdir/ctang-w2c.ch"
+if(stack_ptr==stack_end)overflow(_("stack"));
+#line 342 "cwebdir/ctangle.w"
*stack_ptr= cur_state;
stack_ptr++;
if(p!=NULL){
@@ -540,12 +610,13 @@ cur_section= 0;
}
}
-/*:29*//*30:*/
+/*:30*//*31:*/
#line 355 "cwebdir/ctangle.w"
-#line 255 "cwebdir/ctang-w2c.ch"
+#line 209 "cwebdir/ctang-w2c.ch"
static void
-pop_level(int flag)
+pop_level(
+int flag)
#line 359 "cwebdir/ctangle.w"
{
if(flag&&cur_repl->text_link<section_flag){
@@ -557,10 +628,10 @@ stack_ptr--;
if(stack_ptr> stack)cur_state= *stack_ptr;
}
-/*:30*//*32:*/
+/*:31*//*33:*/
#line 391 "cwebdir/ctangle.w"
-#line 265 "cwebdir/ctang-w2c.ch"
+#line 218 "cwebdir/ctang-w2c.ch"
static void
get_output(void)
#line 394 "cwebdir/ctangle.w"
@@ -582,21 +653,25 @@ a= (a-0200)*0400+*cur_byte++;
switch(a/024000){
case 0:cur_val= a;out_char(identifier);break;
case 1:if(a==output_defs_flag)output_defs();
-else/*33:*/
+else/*34:*/
#line 423 "cwebdir/ctangle.w"
{
a-= 024000;
-if((a+name_dir)->equiv!=(char*)text_info)push_level(a+name_dir);
+#line 225 "cwebdir/ctang-w2c.ch"
+if((a+name_dir)->equiv!=(void*)text_info)push_level(a+name_dir);
+#line 427 "cwebdir/ctangle.w"
else if(a!=0){
-printf("\n! Not present: <");
+#line 231 "cwebdir/ctang-w2c.ch"
+fputs(_("\n! Not present: <"),stdout);
+#line 429 "cwebdir/ctangle.w"
print_section_name(a+name_dir);err_print(">");
}
goto restart;
}
-/*:33*/
+/*:34*/
#line 412 "cwebdir/ctangle.w"
;
break;
@@ -606,10 +681,10 @@ out_char(section_number);
}
}
-/*:32*//*36:*/
+/*:33*//*37:*/
#line 481 "cwebdir/ctangle.w"
-#line 275 "cwebdir/ctang-w2c.ch"
+#line 238 "cwebdir/ctang-w2c.ch"
static void
flush_buffer(void)
#line 484 "cwebdir/ctangle.w"
@@ -623,45 +698,51 @@ update_terminal;
cur_line++;
}
-/*:36*//*41:*/
+/*:37*//*42:*/
#line 536 "cwebdir/ctangle.w"
-#line 293 "cwebdir/ctang-w2c.ch"
+#line 258 "cwebdir/ctang-w2c.ch"
static void
phase_two(void){
#line 539 "cwebdir/ctangle.w"
web_file_open= 0;
cur_line= 1;
-/*28:*/
+/*29:*/
#line 325 "cwebdir/ctangle.w"
stack_ptr= stack+1;cur_name= name_dir;cur_repl= text_info->text_link+text_info;
cur_byte= cur_repl->tok_start;cur_end= (cur_repl+1)->tok_start;cur_section= 0;
-/*:28*/
+/*:29*/
#line 541 "cwebdir/ctangle.w"
;
-/*43:*/
+/*44:*/
#line 595 "cwebdir/ctangle.w"
if(!output_defs_seen)
output_defs();
-/*:43*/
+/*:44*/
#line 542 "cwebdir/ctangle.w"
;
if(text_info->text_link==0&&cur_out_file==end_output_files){
-printf("\n! No program text was specified.");mark_harmless;
+#line 265 "cwebdir/ctang-w2c.ch"
+fputs(_("\n! No program text was specified."),stdout);mark_harmless;
+#line 545 "cwebdir/ctangle.w"
}
else{
if(cur_out_file==end_output_files){
if(show_progress)
-printf("\nWriting the output file (%s):",C_file_name);
+#line 271 "cwebdir/ctang-w2c.ch"
+printf(_("\nWriting the output file (%s):"),C_file_name);
+#line 551 "cwebdir/ctangle.w"
}
else{
if(show_progress){
-printf("\nWriting the output files:");
+#line 277 "cwebdir/ctang-w2c.ch"
+fputs(_("\nWriting the output files:"),stdout);
+#line 555 "cwebdir/ctangle.w"
printf(" (%s)",C_file_name);
update_terminal;
@@ -670,17 +751,68 @@ if(text_info->text_link==0)goto writeloop;
}
while(stack_ptr> stack)get_output();
flush_buffer();
-writeloop:/*42:*/
-#line 572 "cwebdir/ctangle.w"
+writeloop:/*43:*/
+#line 309 "cwebdir/ctang-w2c.ch"
+
+fclose(C_file);C_file= NULL;
+/*98:*/
+#line 772 "cwebdir/ctang-w2c.ch"
+
+if((C_file= fopen(C_file_name,"r"))!=NULL){
+/*99:*/
+#line 779 "cwebdir/ctang-w2c.ch"
+
+char x[BUFSIZ],y[BUFSIZ];
+int x_size,y_size,comparison;
+
+if((check_file= fopen(check_file_name,"r"))==NULL)
+fatal(_("! Cannot open output file "),check_file_name);
+
+
+/*100:*/
+#line 794 "cwebdir/ctang-w2c.ch"
+
+do{
+x_size= fread(x,1,BUFSIZ,C_file);
+y_size= fread(y,1,BUFSIZ,check_file);
+comparison= (x_size==y_size);
+if(comparison)comparison= !memcmp(x,y,x_size);
+}while(comparison&&!feof(C_file)&&!feof(check_file));
+
+/*:100*/
+#line 787 "cwebdir/ctang-w2c.ch"
+
+
+fclose(C_file);C_file= NULL;
+fclose(check_file);check_file= NULL;
+
+/*:99*/
+#line 774 "cwebdir/ctang-w2c.ch"
+
+/*101:*/
+#line 805 "cwebdir/ctang-w2c.ch"
+
+if(comparison)
+remove(check_file_name);
+else{
+remove(C_file_name);
+rename(check_file_name,C_file_name);
+}
+
+/*:101*/
+#line 775 "cwebdir/ctang-w2c.ch"
+
+}else
+rename(check_file_name,C_file_name);
+
+/*:98*/
+#line 311 "cwebdir/ctang-w2c.ch"
for(an_output_file= end_output_files;an_output_file> cur_out_file;){
an_output_file--;
sprint_section_name(output_file_name,*an_output_file);
-fclose(C_file);
-#line 302 "cwebdir/ctang-w2c.ch"
-C_file= fopen(output_file_name,"wb");
-#line 578 "cwebdir/ctangle.w"
-if(C_file==0)fatal("! Cannot open output file:",output_file_name);
+if((C_file= fopen(check_file_name,"wb"))==NULL)
+fatal(_("! Cannot open output file "),check_file_name);
printf("\n(%s)",output_file_name);update_terminal;
cur_line= 1;
@@ -690,20 +822,80 @@ cur_repl= (text_pointer)cur_name->equiv;
cur_byte= cur_repl->tok_start;
cur_end= (cur_repl+1)->tok_start;
while(stack_ptr> stack)get_output();
-flush_buffer();
+flush_buffer();fclose(C_file);C_file= NULL;
+/*102:*/
+#line 813 "cwebdir/ctang-w2c.ch"
+
+if((C_file= fopen(output_file_name,"r"))!=NULL){
+/*99:*/
+#line 779 "cwebdir/ctang-w2c.ch"
+
+char x[BUFSIZ],y[BUFSIZ];
+int x_size,y_size,comparison;
+
+if((check_file= fopen(check_file_name,"r"))==NULL)
+fatal(_("! Cannot open output file "),check_file_name);
+
+
+/*100:*/
+#line 794 "cwebdir/ctang-w2c.ch"
+
+do{
+x_size= fread(x,1,BUFSIZ,C_file);
+y_size= fread(y,1,BUFSIZ,check_file);
+comparison= (x_size==y_size);
+if(comparison)comparison= !memcmp(x,y,x_size);
+}while(comparison&&!feof(C_file)&&!feof(check_file));
+
+/*:100*/
+#line 787 "cwebdir/ctang-w2c.ch"
+
+
+fclose(C_file);C_file= NULL;
+fclose(check_file);check_file= NULL;
+
+/*:99*/
+#line 815 "cwebdir/ctang-w2c.ch"
+
+/*103:*/
+#line 822 "cwebdir/ctang-w2c.ch"
+
+if(comparison)
+remove(check_file_name);
+else{
+remove(output_file_name);
+rename(check_file_name,output_file_name);
+}
+
+/*:103*/
+#line 816 "cwebdir/ctang-w2c.ch"
+
+}else
+rename(check_file_name,output_file_name);
+
+/*:102*/
+#line 327 "cwebdir/ctang-w2c.ch"
+
}
+strcpy(check_file_name,"");
+#line 590 "cwebdir/ctangle.w"
-/*:42*/
+/*:43*/
#line 563 "cwebdir/ctangle.w"
;
-if(show_happiness)printf("\nDone.");
+#line 283 "cwebdir/ctang-w2c.ch"
+if(show_happiness){
+if(show_progress)new_line;
+fputs(_("Done."),stdout);
+}
+#line 565 "cwebdir/ctangle.w"
}
}
-/*:41*//*46:*/
+/*:42*//*47:*/
#line 605 "cwebdir/ctangle.w"
-#line 319 "cwebdir/ctang-w2c.ch"
+#line 342 "cwebdir/ctang-w2c.ch"
static void
output_defs(void)
#line 608 "cwebdir/ctangle.w"
@@ -729,7 +921,9 @@ a= (a-0200)*0400+*cur_byte++;
if(a<024000){
cur_val= a;out_char(identifier);
}
-else if(a<050000){confusion("macro defs have strange char");}
+#line 349 "cwebdir/ctang-w2c.ch"
+else if(a<050000){confusion(_("macro defs have strange char"));}
+#line 631 "cwebdir/ctangle.w"
else{
cur_val= a-050000;cur_section= cur_val;out_char(section_number);
}
@@ -742,12 +936,13 @@ flush_buffer();
pop_level(0);
}
-/*:46*//*48:*/
+/*:47*//*49:*/
#line 651 "cwebdir/ctangle.w"
+#line 363 "cwebdir/ctang-w2c.ch"
static void
-#line 337 "cwebdir/ctang-w2c.ch"
- out_char(eight_bits cur_char)
+out_char(
+eight_bits cur_char)
#line 655 "cwebdir/ctangle.w"
{
char*j,*k;
@@ -756,7 +951,7 @@ switch(cur_char){
case'\n':if(protect&&out_state!=verbatim)C_putc(' ');
if(protect||out_state==verbatim)C_putc('\\');
flush_buffer();if(out_state!=verbatim)out_state= normal;break;
-/*52:*/
+/*53:*/
#line 719 "cwebdir/ctangle.w"
case identifier:
@@ -771,10 +966,10 @@ j++;
}
out_state= num_or_id;break;
-/*:52*/
+/*:53*/
#line 662 "cwebdir/ctangle.w"
;
-/*53:*/
+/*54:*/
#line 732 "cwebdir/ctangle.w"
case section_number:
@@ -801,11 +996,11 @@ C_printf("%s","\"\n");
}
break;
-/*:53*/
+/*:54*/
#line 663 "cwebdir/ctangle.w"
;
-/*49:*/
-#line 681 "cwebdir/ctangle.w"
+/*50:*/
+#line 388 "cwebdir/ctang-w2c.ch"
case plus_plus:C_putc('+');C_putc('+');out_state= normal;break;
case minus_minus:C_putc('-');C_putc('-');out_state= normal;break;
@@ -815,7 +1010,7 @@ case eq_eq:C_putc('=');C_putc('=');out_state= normal;break;
case lt_lt:C_putc('<');C_putc('<');out_state= normal;break;
case gt_eq:C_putc('>');C_putc('=');out_state= normal;break;
case lt_eq:C_putc('<');C_putc('=');out_state= normal;break;
-case not_eq:C_putc('!');C_putc('=');out_state= normal;break;
+case non_eq:C_putc('!');C_putc('=');out_state= normal;break;
case and_and:C_putc('&');C_putc('&');out_state= normal;break;
case or_or:C_putc('|');C_putc('|');out_state= normal;break;
case dot_dot_dot:C_putc('.');C_putc('.');C_putc('.');out_state= normal;
@@ -824,8 +1019,9 @@ case colon_colon:C_putc(':');C_putc(':');out_state= normal;break;
case period_ast:C_putc('.');C_putc('*');out_state= normal;break;
case minus_gt_ast:C_putc('-');C_putc('>');C_putc('*');out_state= normal;
break;
+#line 699 "cwebdir/ctangle.w"
-/*:49*/
+/*:50*/
#line 664 "cwebdir/ctangle.w"
;
case'=':case'>':C_putc(cur_char);C_putc(' ');
@@ -844,10 +1040,11 @@ default:C_putc(cur_char);out_state= normal;break;
}
}
-/*:48*//*57:*/
+#line 388 "cwebdir/ctang-w2c.ch"
+/*:49*//*58:*/
#line 813 "cwebdir/ctangle.w"
-#line 346 "cwebdir/ctang-w2c.ch"
+#line 412 "cwebdir/ctang-w2c.ch"
static eight_bits
skip_ahead(void)
#line 816 "cwebdir/ctangle.w"
@@ -864,12 +1061,12 @@ if(c!=ignore||*(loc-1)=='>')return(c);
}
}
-/*:57*//*59:*/
+/*:58*//*60:*/
#line 848 "cwebdir/ctangle.w"
-#line 356 "cwebdir/ctang-w2c.ch"
-static int
-skip_comment(boolean is_long_comment)
+#line 420 "cwebdir/ctang-w2c.ch"
+static boolean skip_comment(
+boolean is_long_comment)
#line 851 "cwebdir/ctangle.w"
{
char c;
@@ -878,7 +1075,9 @@ if(loc> limit){
if(is_long_comment){
if(get_line())return(comment_continues= 1);
else{
-err_print("! Input ended in mid-comment");
+#line 427 "cwebdir/ctang-w2c.ch"
+err_print(_("! Input ended in mid-comment"));
+#line 859 "cwebdir/ctangle.w"
return(comment_continues= 0);
}
@@ -891,7 +1090,9 @@ loc++;return(comment_continues= 0);
}
if(c=='@'){
if(ccode[(eight_bits)*loc]==new_section){
-err_print("! Section name ended in mid-comment");loc--;
+#line 433 "cwebdir/ctang-w2c.ch"
+err_print(_("! Section name ended in mid-comment"));loc--;
+#line 872 "cwebdir/ctangle.w"
return(comment_continues= 0);
}
@@ -900,10 +1101,10 @@ else loc++;
}
}
-/*:59*//*62:*/
+/*:60*//*63:*/
#line 900 "cwebdir/ctangle.w"
-#line 373 "cwebdir/ctang-w2c.ch"
+#line 440 "cwebdir/ctang-w2c.ch"
static eight_bits
get_next(void)
#line 903 "cwebdir/ctangle.w"
@@ -916,7 +1117,7 @@ if(preprocessing&&*(limit-1)!='\\')preprocessing= 0;
if(get_line()==0)return(new_section);
else if(print_where&&!no_where){
print_where= 0;
-/*76:*/
+/*77:*/
#line 1225 "cwebdir/ctangle.w"
store_two_bytes(0150000);
@@ -928,12 +1129,12 @@ id_first= cur_file_name;
store_two_bytes((sixteen_bits)cur_line);
}
id_loc= id_first+strlen(id_first);
-#line 410 "cwebdir/ctang-w2c.ch"
+#line 582 "cwebdir/ctang-w2c.ch"
{int a_l= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a_l/0400)+0200);
app_repl(a_l%0400);}
#line 1237 "cwebdir/ctangle.w"
-/*:76*/
+/*:77*/
#line 912 "cwebdir/ctangle.w"
;
}
@@ -947,7 +1148,7 @@ if(comment_continues)return('\n');
else continue;
}
loc++;
-if(xisdigit(c)||c=='.')/*65:*/
+if(xisdigit(c)||c=='.')/*66:*/
#line 978 "cwebdir/ctangle.w"
{
id_first= loc-1;
@@ -972,27 +1173,38 @@ id_loc= loc;
return(constant);
}
-/*:65*/
+/*:66*/
#line 924 "cwebdir/ctangle.w"
-else if(c=='\''||c=='"'||(c=='L'&&(*loc=='\''||*loc=='"')))
-/*66:*/
+#line 447 "cwebdir/ctang-w2c.ch"
+else if(c=='\''||c=='"'
+||((c=='L'||c=='u'||c=='U')&&(*loc=='\''||*loc=='"'))
+||((c=='u'&&*loc=='8')&&(*(loc+1)=='\''||*(loc+1)=='"')))
+#line 926 "cwebdir/ctangle.w"
+/*67:*/
#line 1006 "cwebdir/ctangle.w"
{
char delim= c;
id_first= section_text+1;
id_loc= section_text;*++id_loc= delim;
-if(delim=='L'){
+#line 478 "cwebdir/ctang-w2c.ch"
+if(delim=='L'||delim=='u'||delim=='U'){
+if(delim=='u'&&*loc=='8'){*++id_loc= *loc++;}
delim= *loc++;*++id_loc= delim;
}
+#line 1013 "cwebdir/ctangle.w"
while(1){
if(loc>=limit){
if(*(limit-1)!='\\'){
-err_print("! String didn't end");loc= limit;break;
+#line 487 "cwebdir/ctang-w2c.ch"
+err_print(_("! String didn't end"));loc= limit;break;
+#line 1017 "cwebdir/ctangle.w"
}
if(get_line()==0){
-err_print("! Input ended in middle of string");loc= buffer;break;
+#line 493 "cwebdir/ctang-w2c.ch"
+err_print(_("! Input ended in middle of string"));loc= buffer;break;
+#line 1021 "cwebdir/ctangle.w"
}
else if(++id_loc<=section_text_end)*id_loc= '\n';
@@ -1010,7 +1222,9 @@ c= *loc++;
if(++id_loc<=section_text_end)*id_loc= c;
}
if(id_loc>=section_text_end){
-printf("\n! String too long: ");
+#line 499 "cwebdir/ctang-w2c.ch"
+fputs(_("\n! String too long: "),stdout);
+#line 1039 "cwebdir/ctangle.w"
term_write(section_text+1,25);
err_print("...");
@@ -1019,55 +1233,62 @@ id_loc++;
return(string);
}
-/*:66*/
+/*:67*/
#line 926 "cwebdir/ctangle.w"
else if(isalpha(c)||isxalpha(c)||ishigh(c))
-/*64:*/
+/*65:*/
#line 972 "cwebdir/ctangle.w"
{
id_first= --loc;
-#line 390 "cwebdir/ctang-w2c.ch"
-while(isalpha((unsigned char)*++loc)||isdigit((unsigned char)*loc)||isxalpha(*loc)||ishigh(*loc));
+#line 469 "cwebdir/ctang-w2c.ch"
+while(isalpha((eight_bits)*++loc)||isdigit((eight_bits)*loc)
+||isxalpha((eight_bits)*loc)||ishigh((eight_bits)*loc));
#line 975 "cwebdir/ctangle.w"
id_loc= loc;return(identifier);
}
-/*:64*/
+/*:65*/
#line 928 "cwebdir/ctangle.w"
-else if(c=='@')/*67:*/
+else if(c=='@')/*68:*/
#line 1050 "cwebdir/ctangle.w"
{
c= ccode[(eight_bits)*loc++];
switch(c){
case ignore:continue;
-case translit_code:err_print("! Use @l in limbo only");continue;
+#line 505 "cwebdir/ctang-w2c.ch"
+case translit_code:err_print(_("! Use @l in limbo only"));continue;
+#line 1055 "cwebdir/ctangle.w"
case control_text:while((c= skip_ahead())=='@');
if(*(loc-1)!='>')
-err_print("! Double @ should be used in control text");
+#line 511 "cwebdir/ctang-w2c.ch"
+err_print(_("! Double @ should be used in control text"));
+#line 1060 "cwebdir/ctangle.w"
continue;
case section_name:
cur_section_name_char= *(loc-1);
-/*69:*/
+/*70:*/
#line 1098 "cwebdir/ctangle.w"
{
char*k;
-/*71:*/
+/*72:*/
#line 1118 "cwebdir/ctangle.w"
k= section_text;
while(1){
if(loc> limit&&get_line()==0){
-err_print("! Input ended in section name");
+#line 529 "cwebdir/ctang-w2c.ch"
+err_print(_("! Input ended in section name"));
+#line 1123 "cwebdir/ctangle.w"
loc= buffer+1;break;
}
c= *loc;
-/*72:*/
+/*73:*/
#line 1142 "cwebdir/ctangle.w"
if(c=='@'){
@@ -1076,17 +1297,21 @@ if(c=='>'){
loc+= 2;break;
}
if(ccode[(eight_bits)c]==new_section){
-err_print("! Section name didn't end");break;
+#line 541 "cwebdir/ctang-w2c.ch"
+err_print(_("! Section name didn't end"));break;
+#line 1150 "cwebdir/ctangle.w"
}
if(ccode[(eight_bits)c]==section_name){
-err_print("! Nesting of section names not allowed");break;
+#line 547 "cwebdir/ctang-w2c.ch"
+err_print(_("! Nesting of section names not allowed"));break;
+#line 1154 "cwebdir/ctangle.w"
}
*(++k)= '@';loc++;
}
-/*:72*/
+/*:73*/
#line 1127 "cwebdir/ctangle.w"
;
loc++;if(k<section_text_end)k++;
@@ -1096,21 +1321,23 @@ c= ' ';if(*(k-1)==' ')k--;
*k= c;
}
if(k>=section_text_end){
-printf("\n! Section name too long: ");
+#line 535 "cwebdir/ctang-w2c.ch"
+fputs(_("\n! Section name too long: "),stdout);
+#line 1136 "cwebdir/ctangle.w"
term_write(section_text+1,25);
printf("...");mark_harmless;
}
if(*k==' '&&k> section_text)k--;
-/*:71*/
+/*:72*/
#line 1100 "cwebdir/ctangle.w"
;
if(k-section_text> 3&&strncmp(k-2,"...",3)==0)
cur_section_name= section_lookup(section_text+1,k-3,1);
else cur_section_name= section_lookup(section_text+1,k,0);
if(cur_section_name_char=='(')
-/*39:*/
+/*40:*/
#line 516 "cwebdir/ctangle.w"
{
@@ -1121,35 +1348,39 @@ if(an_output_file==end_output_files){
if(cur_out_file> output_files)
*--cur_out_file= cur_section_name;
else{
-overflow("output files");
+#line 245 "cwebdir/ctang-w2c.ch"
+overflow(_("output files"));
+#line 526 "cwebdir/ctangle.w"
}
}
}
-/*:39*/
+/*:40*/
#line 1106 "cwebdir/ctangle.w"
;
return(section_name);
}
-/*:69*/
+/*:70*/
#line 1064 "cwebdir/ctangle.w"
;
-case string:/*73:*/
+case string:/*74:*/
#line 1164 "cwebdir/ctangle.w"
{
id_first= loc++;*(limit+1)= '@';*(limit+2)= '>';
while(*loc!='@'||*(loc+1)!='>')loc++;
-if(loc>=limit)err_print("! Verbatim string didn't end");
+#line 553 "cwebdir/ctang-w2c.ch"
+if(loc>=limit)err_print(_("! Verbatim string didn't end"));
+#line 1168 "cwebdir/ctangle.w"
id_loc= loc;loc+= 2;
return(string);
}
-/*:73*/
+/*:74*/
#line 1065 "cwebdir/ctangle.w"
;
-case ord:/*68:*/
+case ord:/*69:*/
#line 1077 "cwebdir/ctangle.w"
id_first= loc;
@@ -1159,27 +1390,31 @@ if(*++loc=='\'')loc++;
while(*loc!='\''){
if(*loc=='@'){
if(*(loc+1)!='@')
-err_print("! Double @ should be used in ASCII constant");
+#line 517 "cwebdir/ctang-w2c.ch"
+err_print(_("! Double @ should be used in ASCII constant"));
+#line 1086 "cwebdir/ctangle.w"
else loc++;
}
loc++;
if(loc> limit){
-err_print("! String didn't end");loc= limit-1;break;
+#line 523 "cwebdir/ctang-w2c.ch"
+err_print(_("! String didn't end"));loc= limit-1;break;
+#line 1092 "cwebdir/ctangle.w"
}
}
loc++;
return(ord);
-/*:68*/
+/*:69*/
#line 1066 "cwebdir/ctangle.w"
;
default:return(c);
}
}
-/*:67*/
+/*:68*/
#line 929 "cwebdir/ctangle.w"
else if(xisspace(c)){
@@ -1188,15 +1423,15 @@ if(!preprocessing||loc> limit)continue;
else return(' ');
}
else if(c=='#'&&loc==buffer+1)preprocessing= 1;
-mistake:/*63:*/
+mistake:/*64:*/
#line 950 "cwebdir/ctangle.w"
switch(c){
case'+':if(*loc=='+')compress(plus_plus);break;
case'-':if(*loc=='-'){compress(minus_minus);}
-#line 383 "cwebdir/ctang-w2c.ch"
-else if(*loc=='>'){if(*(loc+1)=='*'){loc++;compress(minus_gt_ast);}
-else compress(minus_gt);}break;
+#line 456 "cwebdir/ctang-w2c.ch"
+else{if(*loc=='>'){if(*(loc+1)=='*'){loc++;compress(minus_gt_ast);}
+else compress(minus_gt);}}break;
#line 956 "cwebdir/ctangle.w"
case'.':if(*loc=='*'){compress(period_ast);}
else if(*loc=='.'&&*(loc+1)=='.'){
@@ -1211,26 +1446,29 @@ case'<':if(*loc=='='){compress(lt_eq);}
else if(*loc=='<')compress(lt_lt);break;
case'&':if(*loc=='&')compress(and_and);break;
case'|':if(*loc=='|')compress(or_or);break;
-case'!':if(*loc=='=')compress(not_eq);break;
+#line 463 "cwebdir/ctang-w2c.ch"
+case'!':if(*loc=='=')compress(non_eq);break;
+#line 970 "cwebdir/ctangle.w"
}
-/*:63*/
+/*:64*/
#line 936 "cwebdir/ctangle.w"
return(c);
}
}
-/*:62*//*75:*/
+/*:63*//*76:*/
#line 1199 "cwebdir/ctangle.w"
-#line 400 "cwebdir/ctang-w2c.ch"
+#line 567 "cwebdir/ctang-w2c.ch"
static void
-scan_repl(eight_bits t)
+scan_repl(
+eight_bits t)
#line 1203 "cwebdir/ctangle.w"
{
sixteen_bits a;
-if(t==section_name){/*76:*/
+if(t==section_name){/*77:*/
#line 1225 "cwebdir/ctangle.w"
store_two_bytes(0150000);
@@ -1242,16 +1480,16 @@ id_first= cur_file_name;
store_two_bytes((sixteen_bits)cur_line);
}
id_loc= id_first+strlen(id_first);
-#line 410 "cwebdir/ctang-w2c.ch"
+#line 582 "cwebdir/ctang-w2c.ch"
{int a_l= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a_l/0400)+0200);
app_repl(a_l%0400);}
#line 1237 "cwebdir/ctangle.w"
-/*:76*/
+/*:77*/
#line 1205 "cwebdir/ctangle.w"
;}
while(1)switch(a= get_next()){
-/*77:*/
+/*78:*/
#line 1238 "cwebdir/ctangle.w"
case identifier:a= id_lookup(id_first,id_loc,0)-name_dir;
@@ -1259,26 +1497,28 @@ app_repl((a/0400)+0200);
app_repl(a%0400);break;
case section_name:if(t!=section_name)goto done;
else{
-/*78:*/
+/*79:*/
#line 1271 "cwebdir/ctangle.w"
{
char*try_loc= loc;
while(*try_loc==' '&&try_loc<limit)try_loc++;
if(*try_loc=='+'&&try_loc<limit)try_loc++;
while(*try_loc==' '&&try_loc<limit)try_loc++;
-if(*try_loc=='=')err_print("! Missing `@ ' before a named section");
+#line 601 "cwebdir/ctang-w2c.ch"
+if(*try_loc=='=')err_print(_("! Missing `@ ' before a named section"));
+#line 1277 "cwebdir/ctangle.w"
}
-/*:78*/
+/*:79*/
#line 1244 "cwebdir/ctangle.w"
;
a= cur_section_name-name_dir;
app_repl((a/0400)+0250);
app_repl(a%0400);
-/*76:*/
+/*77:*/
#line 1225 "cwebdir/ctangle.w"
store_two_bytes(0150000);
@@ -1290,23 +1530,25 @@ id_first= cur_file_name;
store_two_bytes((sixteen_bits)cur_line);
}
id_loc= id_first+strlen(id_first);
-#line 410 "cwebdir/ctang-w2c.ch"
+#line 582 "cwebdir/ctang-w2c.ch"
{int a_l= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a_l/0400)+0200);
app_repl(a_l%0400);}
#line 1237 "cwebdir/ctangle.w"
-/*:76*/
+/*:77*/
#line 1248 "cwebdir/ctangle.w"
;break;
}
-case output_defs_code:if(t!=section_name)err_print("! Misplaced @h");
+#line 589 "cwebdir/ctang-w2c.ch"
+case output_defs_code:if(t!=section_name)err_print(_("! Misplaced @h"));
+#line 1251 "cwebdir/ctangle.w"
else{
output_defs_seen= 1;
a= output_defs_flag;
app_repl((a/0400)+0200);
app_repl(a%0400);
-/*76:*/
+/*77:*/
#line 1225 "cwebdir/ctangle.w"
store_two_bytes(0150000);
@@ -1318,36 +1560,38 @@ id_first= cur_file_name;
store_two_bytes((sixteen_bits)cur_line);
}
id_loc= id_first+strlen(id_first);
-#line 410 "cwebdir/ctang-w2c.ch"
+#line 582 "cwebdir/ctang-w2c.ch"
{int a_l= id_lookup(id_first,id_loc,0)-name_dir;app_repl((a_l/0400)+0200);
app_repl(a_l%0400);}
#line 1237 "cwebdir/ctangle.w"
-/*:76*/
+/*:77*/
#line 1257 "cwebdir/ctangle.w"
;
}
break;
case constant:case string:
-/*79:*/
+/*80:*/
#line 1282 "cwebdir/ctangle.w"
app_repl(a);
while(id_first<id_loc){
if(*id_first=='@'){
if(*(id_first+1)=='@')id_first++;
-else err_print("! Double @ should be used in string");
+#line 607 "cwebdir/ctang-w2c.ch"
+else err_print(_("! Double @ should be used in string"));
+#line 1288 "cwebdir/ctangle.w"
}
app_repl(*id_first++);
}
app_repl(a);break;
-/*:79*/
+/*:80*/
#line 1261 "cwebdir/ctangle.w"
;
case ord:
-/*80:*/
+/*81:*/
#line 1298 "cwebdir/ctangle.w"
{
int c= (eight_bits)*id_first;
@@ -1374,22 +1618,24 @@ case'x':
if(xisdigit(*(id_first+1)))c= *(++id_first)-'0';
else if(xisxdigit(*(id_first+1))){
++id_first;
-#line 419 "cwebdir/ctang-w2c.ch"
-c= toupper((unsigned char)*id_first)-'A'+10;
+#line 613 "cwebdir/ctang-w2c.ch"
+c= toupper((eight_bits)*id_first)-'A'+10;
#line 1324 "cwebdir/ctangle.w"
}
if(xisdigit(*(id_first+1)))c= 16*c+*(++id_first)-'0';
else if(xisxdigit(*(id_first+1))){
++id_first;
-#line 424 "cwebdir/ctang-w2c.ch"
-c= 16*c+toupper((unsigned char)*id_first)-'A'+10;
+#line 619 "cwebdir/ctang-w2c.ch"
+c= 16*c+toupper((eight_bits)*id_first)-'A'+10;
#line 1329 "cwebdir/ctangle.w"
}
break;
case'\\':c= '\\';break;
case'\'':c= '\'';break;
case'\"':c= '\"';break;
-default:err_print("! Unrecognized escape sequence");
+#line 625 "cwebdir/ctang-w2c.ch"
+default:err_print(_("! Unrecognized escape sequence"));
+#line 1335 "cwebdir/ctangle.w"
}
}
@@ -1402,17 +1648,19 @@ app_repl(constant);
}
break;
-/*:80*/
+/*:81*/
#line 1263 "cwebdir/ctangle.w"
;
case definition:case format_code:case begin_C:if(t!=section_name)goto done;
else{
-err_print("! @d, @f and @c are ignored in C text");continue;
+#line 595 "cwebdir/ctang-w2c.ch"
+err_print(_("! @d, @f and @c are ignored in C text"));continue;
+#line 1267 "cwebdir/ctangle.w"
}
case new_section:goto done;
-/*:77*/
+/*:78*/
#line 1210 "cwebdir/ctangle.w"
case')':app_repl(a);
@@ -1421,14 +1669,16 @@ break;
default:app_repl(a);
}
done:next_control= (eight_bits)a;
-if(text_ptr> text_info_end)overflow("text");
+#line 575 "cwebdir/ctang-w2c.ch"
+if(text_ptr> text_info_end)overflow(_("text"));
+#line 1218 "cwebdir/ctangle.w"
cur_text= text_ptr;(++text_ptr)->tok_start= tok_ptr;
}
-/*:75*//*82:*/
+/*:76*//*83:*/
#line 1360 "cwebdir/ctangle.w"
-#line 433 "cwebdir/ctang-w2c.ch"
+#line 632 "cwebdir/ctang-w2c.ch"
static void
scan_section(void)
#line 1363 "cwebdir/ctangle.w"
@@ -1442,7 +1692,7 @@ printf("*%d",section_count);update_terminal;
}
next_control= 0;
while(1){
-/*83:*/
+/*84:*/
#line 1399 "cwebdir/ctangle.w"
while(next_control<definition)
@@ -1451,16 +1701,18 @@ if((next_control= skip_ahead())==section_name){
loc-= 2;next_control= get_next();
}
-/*:83*/
+/*:84*/
#line 1374 "cwebdir/ctangle.w"
;
if(next_control==definition){
-/*84:*/
+/*85:*/
#line 1406 "cwebdir/ctangle.w"
{
while((next_control= get_next())=='\n');
if(next_control!=identifier){
-err_print("! Definition flushed, must start with identifier");
+#line 639 "cwebdir/ctang-w2c.ch"
+err_print(_("! Definition flushed, must start with identifier"));
+#line 1410 "cwebdir/ctangle.w"
continue;
}
@@ -1474,7 +1726,7 @@ scan_repl(macro);
cur_text->text_link= 0;
}
-/*:84*/
+/*:85*/
#line 1376 "cwebdir/ctangle.w"
continue;
@@ -1484,14 +1736,14 @@ p= name_dir;break;
}
if(next_control==section_name){
p= cur_section_name;
-/*85:*/
+/*86:*/
#line 1431 "cwebdir/ctangle.w"
while((next_control= get_next())=='+');
if(next_control!='='&&next_control!=eq_eq)
continue;
-/*:85*/
+/*:86*/
#line 1384 "cwebdir/ctangle.w"
;
break;
@@ -1499,26 +1751,28 @@ break;
return;
}
no_where= print_where= 0;
-/*86:*/
+/*87:*/
#line 1436 "cwebdir/ctangle.w"
-/*87:*/
+/*88:*/
#line 1441 "cwebdir/ctangle.w"
store_two_bytes((sixteen_bits)(0150000+section_count));
-/*:87*/
+/*:88*/
#line 1437 "cwebdir/ctangle.w"
;
scan_repl(section_name);
-/*88:*/
+/*89:*/
#line 1445 "cwebdir/ctangle.w"
if(p==name_dir||p==0){
(last_unnamed)->text_link= cur_text-text_info;last_unnamed= cur_text;
}
-else if(p->equiv==(char*)text_info)p->equiv= (char*)cur_text;
+#line 645 "cwebdir/ctang-w2c.ch"
+else if(p->equiv==(void*)text_info)p->equiv= (void*)cur_text;
+#line 1450 "cwebdir/ctangle.w"
else{
q= (text_pointer)p->equiv;
@@ -1529,19 +1783,19 @@ q->text_link= cur_text-text_info;
cur_text->text_link= section_flag;
-/*:88*/
+/*:89*/
#line 1439 "cwebdir/ctangle.w"
;
-/*:86*/
+/*:87*/
#line 1390 "cwebdir/ctangle.w"
;
}
-/*:82*//*90:*/
+/*:83*//*91:*/
#line 1463 "cwebdir/ctangle.w"
-#line 451 "cwebdir/ctang-w2c.ch"
+#line 658 "cwebdir/ctang-w2c.ch"
static void
phase_one(void){
#line 1466 "cwebdir/ctangle.w"
@@ -1554,10 +1808,10 @@ check_complete();
phase= 2;
}
-/*:90*//*92:*/
+/*:91*//*93:*/
#line 1481 "cwebdir/ctangle.w"
-#line 469 "cwebdir/ctang-w2c.ch"
+#line 672 "cwebdir/ctang-w2c.ch"
static void
skip_limbo(void)
#line 1484 "cwebdir/ctangle.w"
@@ -1571,14 +1825,16 @@ if(loc++<=limit){
c= *loc++;
if(ccode[(eight_bits)c]==new_section)break;
switch(ccode[(eight_bits)c]){
-case translit_code:/*93:*/
+case translit_code:/*94:*/
#line 1510 "cwebdir/ctangle.w"
while(xisspace(*loc)&&loc<limit)loc++;
loc+= 3;
if(loc> limit||!xisxdigit(*(loc-3))||!xisxdigit(*(loc-2))
||(*(loc-3)>='0'&&*(loc-3)<='7')||!xisspace(*(loc-1)))
-err_print("! Improper hex number following @l");
+#line 691 "cwebdir/ctang-w2c.ch"
+err_print(_("! Improper hex number following @l"));
+#line 1516 "cwebdir/ctangle.w"
else{
unsigned i;
@@ -1588,48 +1844,58 @@ while(xisspace(*loc)&&loc<limit)loc++;
beg= loc;
while(loc<limit&&(xisalpha(*loc)||xisdigit(*loc)||*loc=='_'))loc++;
if(loc-beg>=translit_length)
-err_print("! Replacement string in @l too long");
+#line 697 "cwebdir/ctang-w2c.ch"
+err_print(_("! Replacement string in @l too long"));
+#line 1526 "cwebdir/ctangle.w"
else{
-strncpy(translit[i-0200],beg,loc-beg);
+#line 703 "cwebdir/ctang-w2c.ch"
+strncpy(translit[i-0200],beg,(size_t)(loc-beg));
+#line 1529 "cwebdir/ctangle.w"
translit[i-0200][loc-beg]= '\0';
}
}
-/*:93*/
+/*:94*/
#line 1494 "cwebdir/ctangle.w"
;break;
case format_code:case'@':break;
case control_text:if(c=='q'||c=='Q'){
while((c= skip_ahead())=='@');
if(*(loc-1)!='>')
-err_print("! Double @ should be used in control text");
+#line 679 "cwebdir/ctang-w2c.ch"
+err_print(_("! Double @ should be used in control text"));
+#line 1500 "cwebdir/ctangle.w"
break;
}
-default:err_print("! Double @ should be used in limbo");
+#line 685 "cwebdir/ctang-w2c.ch"
+default:err_print(_("! Double @ should be used in limbo"));
+#line 1504 "cwebdir/ctangle.w"
}
}
}
}
-/*:92*//*94:*/
+/*:93*//*95:*/
#line 1536 "cwebdir/ctangle.w"
+#line 710 "cwebdir/ctang-w2c.ch"
void
-#line 478 "cwebdir/ctang-w2c.ch"
- print_stats(void){
-#line 1539 "cwebdir/ctangle.w"
-printf("\nMemory usage statistics:\n");
-printf("%ld names (out of %ld)\n",
+print_stats(void){
+#line 724 "cwebdir/ctang-w2c.ch"
+puts(_("\nMemory usage statistics:"));
+printf(_("%ld names (out of %ld)\n"),
(long)(name_ptr-name_dir),(long)max_names);
-printf("%ld replacement texts (out of %ld)\n",
+printf(_("%ld replacement texts (out of %ld)\n"),
(long)(text_ptr-text_info),(long)max_texts);
-printf("%ld bytes (out of %ld)\n",
+printf(_("%ld bytes (out of %ld)\n"),
(long)(byte_ptr-byte_mem),(long)max_bytes);
-printf("%ld tokens (out of %ld)\n",
+printf(_("%ld tokens (out of %ld)\n"),
+#line 1547 "cwebdir/ctangle.w"
(long)(tok_ptr-tok_mem),(long)max_toks);
}
-/*:94*/
+#line 737 "cwebdir/ctang-w2c.ch"
+/*:95*/
diff --git a/Build/source/texk/web2c/cwebboot.cin b/Build/source/texk/web2c/cwebboot.cin
index b8f0a754cf7..1964acd0b63 100644
--- a/Build/source/texk/web2c/cwebboot.cin
+++ b/Build/source/texk/web2c/cwebboot.cin
@@ -4,11 +4,7 @@
/*5:*/
#line 102 "cwebdir/common.w"
-#line 73 "cwebdir/comm-w2c.ch"
-#define CWEB
-#include "cpascal.h"
#include <ctype.h>
-#line 104 "cwebdir/common.w"
/*:5*//*8:*/
#line 165 "cwebdir/common.w"
@@ -18,16 +14,57 @@
/*:8*//*22:*/
#line 471 "cwebdir/common.w"
-#line 212 "cwebdir/comm-w2c.ch"
-#include <kpathsea/kpathsea.h>
#include <stdlib.h>
+
+/*:22*//*81:*/
+#line 1131 "cwebdir/comm-w2c.ch"
+
+#include <string.h>
+#line 1417 "cwebdir/common.w"
+
+#line 1138 "cwebdir/comm-w2c.ch"
+/*:81*//*85:*/
+#line 1177 "cwebdir/comm-w2c.ch"
+
+#include <stddef.h>
+#include <stdbool.h>
+#include <stdint.h>
+
+/*:85*//*88:*/
+#line 1215 "cwebdir/comm-w2c.ch"
+
+#include <locale.h>
+
+#ifndef HAVE_GETTEXT
+#define HAVE_GETTEXT 0
+#endif
+
+#if HAVE_GETTEXT
+#include <libintl.h>
+#else
+#define bindtextdomain(A,B) ""
+#define textdomain(A) ""
+#define gettext(A) A
+#endif
+
+/*:88*//*90:*/
+#line 1272 "cwebdir/comm-w2c.ch"
+
+typedef bool boolean;
+#define HAVE_BOOLEAN
+#include <kpathsea/kpathsea.h>
+#include <w2c/config.h>
+#include <lib/lib.h>
+
+#define CWEB
#include "help.h"
-/*:22*/
+/*:90*/
#line 59 "cwebdir/common.w"
#define ctangle 0
-#define cweave 1 \
+#define cweave 1
+#define ctwill 2 \
#define and_and 04
#define lt_lt 020
@@ -35,7 +72,7 @@
#define plus_plus 013
#define minus_minus 01
#define minus_gt 031
-#define not_eq 032
+#define non_eq 032
#define lt_eq 034
#define gt_eq 035
#define eq_eq 036
@@ -48,8 +85,8 @@
#define buf_size 1000
#define longest_name 10000
#define long_buf_size (buf_size+longest_name)
-#define xisspace(c) (isspace((unsigned char) c) &&((unsigned char) c<0200) )
-#define xisupper(c) (isupper((unsigned char) c) &&((unsigned char) c<0200) ) \
+#define xisspace(c) (isspace((eight_bits) c) &&((eight_bits) c<0200) )
+#define xisupper(c) (isupper((eight_bits) c) &&((eight_bits) c<0200) ) \
#define max_include_depth 10 \
@@ -61,7 +98,7 @@
#define web_file_name file_name[0] \
#define lines_dont_match (change_limit-change_buffer!=limit-buffer|| \
-strncmp(buffer,change_buffer,limit-buffer) ) \
+strncmp(buffer,change_buffer,(size_t) (limit-buffer) ) ) \
#define if_section_start_make_pending(b) {*limit= '!'; \
for(loc= buffer;xisspace(*loc) ;loc++) ; \
@@ -73,16 +110,14 @@ if(*loc=='@'&&(xisspace(*(loc+1) ) ||*(loc+1) =='*') ) change_pending= b; \
\
#define too_long() {include_depth--; \
-err_print("! Include file name too long") ;goto restart;} \
-
-#define kpse_find_cweb(name) kpse_find_file(name,kpse_cweb_format,true) \
+err_print(_("! Include file name too long") ) ;goto restart;} \
#define max_bytes 1000000 \
#define max_names 10239 \
\
-#define length(c) (c+1) ->byte_start-(c) ->byte_start
+#define length(c) (size_t) ((c+1) ->byte_start-(c) ->byte_start)
#define print_id(c) term_write((c) ->byte_start,length((c) ) ) \
#define hash_size 8501 \
@@ -113,7 +148,12 @@ err_print("! Include file name too long") ;goto restart;} \
#define mark_harmless {if(history==spotless) history= harmless_message;}
#define mark_error history= error_message \
-#define confusion(s) fatal("! This can't happen: ",s) \
+#define RETURN_OK 0
+#define RETURN_WARN 5
+#define RETURN_ERROR 10
+#define RETURN_FAIL 20 \
+
+#define confusion(s) fatal(_("! This can't happen: ") ,s) \
\
#define show_banner flags['b']
@@ -121,8 +161,10 @@ err_print("! Include file name too long") ;goto restart;} \
#define show_stats flags['s']
#define show_happiness flags['h']
#define show_kpathsea_debug flags['d'] \
- \
+#define make_xrefs flags['x'] \
+
+#define flag_change (**argv!='-')
#define update_terminal fflush(stdout) \
#define new_line putchar('\n')
@@ -131,8 +173,15 @@ err_print("! Include file name too long") ;goto restart;} \
#define C_printf(c,a) fprintf(C_file,c,a)
#define C_putc(c) putc(c,C_file) \
-#define ctangle_banner "This is CTANGLE, Version 3.64"
-#define cweave_banner "This is CWEAVE, Version 3.64" \
+#define PATH_SEPARATOR separators[0]
+#define DIR_SEPARATOR separators[1]
+#define DEVICE_SEPARATOR separators[2] \
+
+#define max_banner 50 \
+
+#define _(STRING) gettext(STRING) \
+
+#define kpse_find_cweb(name) kpse_find_file(name,kpse_cweb_format,true) \
#line 60 "cwebdir/common.w"
@@ -140,8 +189,9 @@ err_print("! Include file name too long") ;goto restart;} \
/*2:*/
#line 73 "cwebdir/common.w"
-#line 75 "cwebdir/common.w"
-boolean program;
+#line 56 "cwebdir/comm-w2c.ch"
+int program;
+#line 76 "cwebdir/common.w"
/*:2*//*7:*/
#line 159 "cwebdir/common.w"
@@ -171,24 +221,27 @@ boolean web_file_open= 0;
/*:10*//*20:*/
#line 418 "cwebdir/common.w"
-typedef unsigned short sixteen_bits;
+#line 262 "cwebdir/comm-w2c.ch"
+typedef uint8_t eight_bits;
+typedef uint16_t sixteen_bits;
+#line 420 "cwebdir/common.w"
sixteen_bits section_count;
boolean changed_section[max_sections];
boolean change_pending;
boolean print_where= 0;
-/*:20*//*29:*/
+/*:20*//*27:*/
#line 594 "cwebdir/common.w"
typedef struct name_info{
char*byte_start;
-/*33:*/
+/*31:*/
#line 631 "cwebdir/common.w"
struct name_info*link;
-/*:33*//*42:*/
+/*:31*//*40:*/
#line 730 "cwebdir/common.w"
union{
@@ -197,12 +250,13 @@ struct name_info*Rlink;
char Ilk;
}dummy;
-/*:42*//*57:*/
-#line 1062 "cwebdir/common.w"
+/*:40*//*55:*/
+#line 701 "cwebdir/comm-w2c.ch"
-char*equiv_or_xref;
+void*equiv_or_xref;
+#line 1064 "cwebdir/common.w"
-/*:57*/
+/*:55*/
#line 597 "cwebdir/common.w"
}name_info;
@@ -212,13 +266,13 @@ char*byte_mem_end= byte_mem+max_bytes-1;
name_info name_dir[max_names];
name_pointer name_dir_end= name_dir+max_names-1;
-/*:29*//*31:*/
+/*:27*//*29:*/
#line 617 "cwebdir/common.w"
name_pointer name_ptr;
char*byte_ptr;
-/*:31*//*34:*/
+/*:29*//*32:*/
#line 644 "cwebdir/common.w"
typedef name_pointer*hash_pointer;
@@ -226,13 +280,12 @@ name_pointer hash[hash_size];
hash_pointer hash_end= hash+hash_size-1;
hash_pointer h;
-#line 344 "cwebdir/comm-w2c.ch"
-/*:34*//*58:*/
+/*:32*//*56:*/
#line 1082 "cwebdir/common.w"
int history= spotless;
-/*:58*//*69:*/
+/*:56*//*67:*/
#line 1220 "cwebdir/common.w"
int argc;
@@ -240,22 +293,30 @@ char**argv;
char C_file_name[max_file_name_length];
char tex_file_name[max_file_name_length];
char idx_file_name[max_file_name_length];
+#line 887 "cwebdir/comm-w2c.ch"
char scn_file_name[max_file_name_length];
+char check_file_name[max_file_name_length];
+#line 894 "cwebdir/comm-w2c.ch"
boolean flags[128];
+const char*use_language= "";
+#line 1228 "cwebdir/common.w"
-/*:69*//*79:*/
+/*:67*//*77:*/
#line 1370 "cwebdir/common.w"
FILE*C_file;
FILE*tex_file;
FILE*idx_file;
+#line 1064 "cwebdir/comm-w2c.ch"
FILE*scn_file;
-#line 736 "cwebdir/comm-w2c.ch"
+FILE*check_file;
+#line 1071 "cwebdir/comm-w2c.ch"
FILE*active_file;
char*found_filename;
#line 1376 "cwebdir/common.w"
-/*:79*/
+#line 1088 "cwebdir/comm-w2c.ch"
+/*:77*/
#line 61 "cwebdir/common.w"
/*3:*/
@@ -268,107 +329,208 @@ int phase;
char change_buffer[buf_size];
char*change_limit;
-/*:11*/
+/*:11*//*86:*/
+#line 1190 "cwebdir/comm-w2c.ch"
+
+char cb_banner[max_banner];
+#ifndef SEPARATORS
+#define SEPARATORS "://"
+#endif
+char separators[]= SEPARATORS;
+
+/*:86*/
#line 62 "cwebdir/common.w"
-#line 37 "cwebdir/comm-w2c.ch"
-#include "cwebboot.h"
-/*55:*/
+/*33:*/
+#line 650 "cwebdir/common.w"
+
+#line 430 "cwebdir/comm-w2c.ch"
+extern boolean names_match(name_pointer,const char*,size_t,eight_bits);
+#line 652 "cwebdir/common.w"
+
+/*:33*//*38:*/
+#line 703 "cwebdir/common.w"
+
+#line 460 "cwebdir/comm-w2c.ch"
+extern void init_p(name_pointer,eight_bits);
+#line 705 "cwebdir/common.w"
+
+/*:38*//*46:*/
+#line 852 "cwebdir/common.w"
+
+#line 540 "cwebdir/comm-w2c.ch"
+extern void init_node(name_pointer);
+#line 854 "cwebdir/common.w"
+
+/*:46*//*53:*/
#line 1017 "cwebdir/common.w"
-#line 518 "cwebdir/comm-w2c.ch"
+#line 666 "cwebdir/comm-w2c.ch"
static int section_name_cmp(char**,int,name_pointer);
#line 1019 "cwebdir/common.w"
-/*:55*//*71:*/
+/*:53*//*57:*/
+#line 1092 "cwebdir/common.w"
+
+#line 708 "cwebdir/comm-w2c.ch"
+extern void err_print(const char*);
+#line 1094 "cwebdir/common.w"
+
+/*:57*//*60:*/
+#line 1140 "cwebdir/common.w"
+
+#line 735 "cwebdir/comm-w2c.ch"
+extern int wrap_up(void);
+extern void print_stats(void);
+#line 1143 "cwebdir/common.w"
+
+#line 746 "cwebdir/comm-w2c.ch"
+/*:60*//*63:*/
+#line 1173 "cwebdir/common.w"
+
+#line 809 "cwebdir/comm-w2c.ch"
+extern void fatal(const char*,const char*);
+extern void overflow(const char*);
+#line 1175 "cwebdir/common.w"
+
+/*:63*//*69:*/
#line 1251 "cwebdir/common.w"
-#line 653 "cwebdir/comm-w2c.ch"
+#line 915 "cwebdir/comm-w2c.ch"
static void scan_args(void);
#line 1253 "cwebdir/common.w"
-/*:71*/
-#line 38 "cwebdir/comm-w2c.ch"
+/*:69*//*83:*/
+#line 1153 "cwebdir/comm-w2c.ch"
+
+boolean get_line(void);
+name_pointer id_lookup(const char*,const char*,char);
+name_pointer section_lookup(char*,char*,int);
+void check_complete(void);
+void common_init(void);
+void print_prefix_name(name_pointer);
+void print_section_name(name_pointer);
+void reset_input(void);
+void sprint_section_name(char*,name_pointer);
+
+/*:83*//*84:*/
+#line 1166 "cwebdir/comm-w2c.ch"
+
+static boolean input_ln(FILE*);
+static int web_strcmp(char*,int,char*,int);
+static name_pointer add_section_name(name_pointer,int,char*,char*,int);
+static void extend_section_name(name_pointer,char*,char*,int);
+static void check_change(void);
+static void prime_the_change_buffer(void);
+
+/*:84*//*94:*/
+#line 1307 "cwebdir/comm-w2c.ch"
+
+void cb_show_banner(void);
+static void cb_usage(const_string str);
+static void cb_usagehelp(const_string*message,const_string bug_email);
+
+/*:94*/
+#line 63 "cwebdir/common.w"
-#line 64 "cwebdir/common.w"
/*:1*//*4:*/
#line 89 "cwebdir/common.w"
+#line 63 "cwebdir/comm-w2c.ch"
void
-#line 58 "cwebdir/comm-w2c.ch"
- common_init(void)
+common_init(void)
#line 92 "cwebdir/common.w"
{
-#line 64 "cwebdir/comm-w2c.ch"
-/*32:*/
+#line 72 "cwebdir/comm-w2c.ch"
+/*30:*/
#line 621 "cwebdir/common.w"
name_dir->byte_start= byte_ptr= byte_mem;
name_ptr= name_dir+1;
name_ptr->byte_start= byte_mem;
-/*:32*//*36:*/
+/*:30*//*34:*/
#line 655 "cwebdir/common.w"
for(h= hash;h<=hash_end;*h++= NULL);
-/*:36*//*43:*/
+/*:34*//*41:*/
#line 737 "cwebdir/common.w"
root= NULL;
-/*:43*/
-#line 64 "cwebdir/comm-w2c.ch"
-;
-/*24:*/
-#line 247 "cwebdir/comm-w2c.ch"
+/*:41*/
+#line 72 "cwebdir/comm-w2c.ch"
+
+/*91:*/
+#line 1293 "cwebdir/comm-w2c.ch"
kpse_set_program_name(argv[0],"cweb");
-#line 473 "cwebdir/common.w"
-/*:24*/
-#line 65 "cwebdir/comm-w2c.ch"
-;
-#line 94 "cwebdir/common.w"
-/*70:*/
+/*:91*/
+#line 73 "cwebdir/comm-w2c.ch"
+
+/*89:*/
+#line 1246 "cwebdir/comm-w2c.ch"
+
+setlocale(LC_MESSAGES,setlocale(LC_CTYPE,""));
+bindtextdomain("cweb","/usr/share/locale/");
+bindtextdomain("cweb-tl","/usr/share/locale/");
+bindtextdomain("web2c-help","/usr/share/locale/");
+textdomain("cweb");
+
+
+/*:89*/
+#line 74 "cwebdir/comm-w2c.ch"
+
+/*68:*/
#line 1233 "cwebdir/common.w"
-#line 645 "cwebdir/comm-w2c.ch"
-show_banner= show_happiness= show_progress= 1;
#line 1235 "cwebdir/common.w"
-/*:70*/
-#line 94 "cwebdir/common.w"
-;
-/*80:*/
-#line 1377 "cwebdir/common.w"
+/*:68*/
+#line 75 "cwebdir/comm-w2c.ch"
+
+/*78:*/
+#line 1088 "cwebdir/comm-w2c.ch"
scan_args();
if(program==ctangle){
-#line 745 "cwebdir/comm-w2c.ch"
-if((C_file= fopen(C_file_name,"wb"))==NULL)
-#line 1381 "cwebdir/common.w"
-fatal("! Cannot open output file ",C_file_name);
+strcpy(check_file_name,C_file_name);
+if(check_file_name[0]!='\0'){
+char*dot_pos= strrchr(check_file_name,'.');
+if(dot_pos==NULL)strcat(check_file_name,".ttp");
+else strcpy(dot_pos,".ttp");
+}
+if((C_file= fopen(check_file_name,"wb"))==NULL)
+fatal(_("! Cannot open output file "),check_file_name);
}
else{
-#line 751 "cwebdir/comm-w2c.ch"
-if((tex_file= fopen(tex_file_name,"wb"))==NULL)
-#line 1386 "cwebdir/common.w"
-fatal("! Cannot open output file ",tex_file_name);
+strcpy(check_file_name,tex_file_name);
+if(check_file_name[0]!='\0'){
+char*dot_pos= strrchr(check_file_name,'.');
+if(dot_pos==NULL)strcat(check_file_name,".wtp");
+else strcpy(dot_pos,".wtp");
+}
+if((tex_file= fopen(check_file_name,"wb"))==NULL)
+fatal(_("! Cannot open output file "),check_file_name);
}
+#line 1388 "cwebdir/common.w"
-/*:80*/
-#line 95 "cwebdir/common.w"
-;
+/*:78*/
+#line 76 "cwebdir/comm-w2c.ch"
+
+#line 96 "cwebdir/common.w"
}
/*:4*//*9:*/
#line 172 "cwebdir/common.w"
-#line 100 "cwebdir/comm-w2c.ch"
-int input_ln(FILE*fp)
+#line 103 "cwebdir/comm-w2c.ch"
+static boolean input_ln(
+FILE*fp)
#line 175 "cwebdir/common.w"
{
register int c= EOF;
@@ -376,12 +538,14 @@ register char*k;
if(feof(fp))return(0);
limit= k= buffer;
while(k<=buffer_end&&(c= getc(fp))!=EOF&&c!='\n')
-#line 106 "cwebdir/comm-w2c.ch"
+#line 110 "cwebdir/comm-w2c.ch"
if((*(k++)= c)!=' '&&c!='\r')limit= k;
#line 182 "cwebdir/common.w"
if(k> buffer_end)
if((c= getc(fp))!=EOF&&c!='\n'){
-ungetc(c,fp);loc= buffer;err_print("! Input line too long");
+#line 116 "cwebdir/comm-w2c.ch"
+ungetc(c,fp);loc= buffer;err_print(_("! Input line too long"));
+#line 185 "cwebdir/common.w"
}
if(c==EOF&&limit==buffer)return(0);
@@ -392,7 +556,7 @@ return(1);
/*:9*//*12:*/
#line 251 "cwebdir/common.w"
-#line 128 "cwebdir/comm-w2c.ch"
+#line 142 "cwebdir/comm-w2c.ch"
static void
prime_the_change_buffer(void)
#line 254 "cwebdir/common.w"
@@ -406,13 +570,15 @@ change_line++;
if(!input_ln(change_file))return;
if(limit<buffer+2)continue;
if(buffer[0]!='@')continue;
-#line 135 "cwebdir/comm-w2c.ch"
-if(xisupper(buffer[1]))buffer[1]= tolower((unsigned char)buffer[1]);
+#line 149 "cwebdir/comm-w2c.ch"
+if(xisupper(buffer[1]))buffer[1]= tolower((eight_bits)buffer[1]);
#line 272 "cwebdir/common.w"
if(buffer[1]=='x')break;
if(buffer[1]=='y'||buffer[1]=='z'||buffer[1]=='i'){
loc= buffer+2;
-err_print("! Missing @x in change file");
+#line 155 "cwebdir/comm-w2c.ch"
+err_print(_("! Missing @x in change file"));
+#line 276 "cwebdir/common.w"
}
}
@@ -426,7 +592,9 @@ err_print("! Missing @x in change file");
do{
change_line++;
if(!input_ln(change_file)){
-err_print("! Change file ended after @x");
+#line 161 "cwebdir/comm-w2c.ch"
+err_print(_("! Change file ended after @x"));
+#line 287 "cwebdir/common.w"
return;
}
@@ -439,8 +607,10 @@ return;
#line 292 "cwebdir/common.w"
{
-change_limit= change_buffer+(limit-buffer);
-strncpy(change_buffer,buffer,limit-buffer+1);
+#line 168 "cwebdir/comm-w2c.ch"
+change_limit= change_buffer+(ptrdiff_t)(limit-buffer);
+strncpy(change_buffer,buffer,(size_t)(limit-buffer+1));
+#line 296 "cwebdir/common.w"
}
/*:15*/
@@ -451,7 +621,7 @@ strncpy(change_buffer,buffer,limit-buffer+1);
/*:12*//*16:*/
#line 320 "cwebdir/common.w"
-#line 144 "cwebdir/comm-w2c.ch"
+#line 176 "cwebdir/comm-w2c.ch"
static void
check_change(void)
#line 323 "cwebdir/common.w"
@@ -466,27 +636,33 @@ if(!change_pending)changed_section[section_count]= 1;
while(1){
changing= 1;print_where= 1;change_line++;
if(!input_ln(change_file)){
-err_print("! Change file ended before @y");
+#line 183 "cwebdir/comm-w2c.ch"
+err_print(_("! Change file ended before @y"));
+#line 335 "cwebdir/common.w"
change_limit= change_buffer;changing= 0;
return;
}
if(limit> buffer+1&&buffer[0]=='@'){
-#line 151 "cwebdir/comm-w2c.ch"
-char xyz_code= xisupper(buffer[1])?tolower((unsigned char)buffer[1]):buffer[1];
+#line 189 "cwebdir/comm-w2c.ch"
+char xyz_code= xisupper(buffer[1])?tolower((eight_bits)buffer[1]):buffer[1];
#line 341 "cwebdir/common.w"
/*17:*/
#line 358 "cwebdir/common.w"
if(xyz_code=='x'||xyz_code=='z'){
-loc= buffer+2;err_print("! Where is the matching @y?");
+#line 201 "cwebdir/comm-w2c.ch"
+loc= buffer+2;err_print(_("! Where is the matching @y?"));
+#line 361 "cwebdir/common.w"
}
else if(xyz_code=='y'){
if(n> 0){
loc= buffer+2;
printf("\n! Hmm... %d ",n);
-err_print("of the preceding lines failed to match");
+#line 207 "cwebdir/comm-w2c.ch"
+err_print(_("of the preceding lines failed to match"));
+#line 368 "cwebdir/common.w"
}
change_depth= include_depth;
@@ -501,8 +677,10 @@ return;
#line 292 "cwebdir/common.w"
{
-change_limit= change_buffer+(limit-buffer);
-strncpy(change_buffer,buffer,limit-buffer+1);
+#line 168 "cwebdir/comm-w2c.ch"
+change_limit= change_buffer+(ptrdiff_t)(limit-buffer);
+strncpy(change_buffer,buffer,(size_t)(limit-buffer+1));
+#line 296 "cwebdir/common.w"
}
/*:15*/
@@ -511,7 +689,9 @@ strncpy(change_buffer,buffer,limit-buffer+1);
changing= 0;cur_line++;
while(!input_ln(cur_file)){
if(include_depth==0){
-err_print("! CWEB file ended during a change");
+#line 195 "cwebdir/comm-w2c.ch"
+err_print(_("! CWEB file ended during a change"));
+#line 349 "cwebdir/common.w"
input_has_ended= 1;return;
}
@@ -524,35 +704,39 @@ if(lines_dont_match)n++;
/*:16*//*18:*/
#line 378 "cwebdir/common.w"
+#line 214 "cwebdir/comm-w2c.ch"
void
-#line 159 "cwebdir/comm-w2c.ch"
- reset_input(void)
+reset_input(void)
#line 381 "cwebdir/common.w"
{
limit= buffer;loc= buffer+1;buffer[0]= ' ';
/*19:*/
#line 393 "cwebdir/common.w"
-#line 171 "cwebdir/comm-w2c.ch"
+#line 225 "cwebdir/comm-w2c.ch"
if((found_filename= kpse_find_cweb(web_file_name))==NULL||
(web_file= fopen(found_filename,"r"))==NULL){
-fatal("! Cannot open input file ",web_file_name);
+fatal(_("! Cannot open input file "),web_file_name);
}else if(strlen(found_filename)<max_file_name_length){
-strcpy(web_file_name,found_filename);
+if(strcmp(web_file_name,found_filename))
+strcpy(web_file_name,found_filename+
+((found_filename[0]=='.'&&found_filename[1]=='/')?2:0));
free(found_filename);
-}
+}else fatal(_("! Filename too long\n"),found_filename);
#line 399 "cwebdir/common.w"
web_file_open= 1;
-#line 184 "cwebdir/comm-w2c.ch"
+#line 240 "cwebdir/comm-w2c.ch"
if((found_filename= kpse_find_cweb(change_file_name))==NULL||
(change_file= fopen(found_filename,"r"))==NULL){
-fatal("! Cannot open change file ",change_file_name);
+fatal(_("! Cannot open change file "),change_file_name);
}else if(strlen(found_filename)<max_file_name_length){
-strcpy(change_file_name,found_filename);
+if(strcmp(change_file_name,found_filename))
+strcpy(change_file_name,found_filename+
+((found_filename[0]=='.'&&found_filename[1]=='/')?2:0));
free(found_filename);
-}
+}else fatal(_("! Filename too long\n"),found_filename);
#line 404 "cwebdir/common.w"
/*:19*/
@@ -567,18 +751,20 @@ limit= buffer;loc= buffer+1;buffer[0]= ' ';input_has_ended= 0;
/*:18*//*21:*/
#line 426 "cwebdir/common.w"
-#line 204 "cwebdir/comm-w2c.ch"
-int get_line(void)
+#line 269 "cwebdir/comm-w2c.ch"
+boolean get_line(void)
#line 428 "cwebdir/common.w"
{
restart:
if(changing&&include_depth==change_depth)
-/*27:*/
+/*25:*/
#line 537 "cwebdir/common.w"
{
change_line++;
if(!input_ln(change_file)){
-err_print("! Change file ended without @z");
+#line 368 "cwebdir/comm-w2c.ch"
+err_print(_("! Change file ended without @z"));
+#line 541 "cwebdir/common.w"
buffer[0]= '@';buffer[1]= 'z';limit= buffer+2;
}
@@ -591,12 +777,14 @@ changed_section[section_count]= 1;change_pending= 0;
}
*limit= ' ';
if(buffer[0]=='@'){
-#line 311 "cwebdir/comm-w2c.ch"
-if(xisupper(buffer[1]))buffer[1]= tolower((unsigned char)buffer[1]);
+#line 374 "cwebdir/comm-w2c.ch"
+if(xisupper(buffer[1]))buffer[1]= tolower((eight_bits)buffer[1]);
#line 554 "cwebdir/common.w"
if(buffer[1]=='x'||buffer[1]=='y'){
loc= buffer+2;
-err_print("! Where is the matching @z?");
+#line 380 "cwebdir/comm-w2c.ch"
+err_print(_("! Where is the matching @z?"));
+#line 557 "cwebdir/common.w"
}
else if(buffer[1]=='z'){
@@ -606,11 +794,11 @@ prime_the_change_buffer();changing= !changing;print_where= 1;
}
}
-/*:27*/
+/*:25*/
#line 431 "cwebdir/common.w"
;
if(!changing||include_depth> change_depth){
-/*26:*/
+/*24:*/
#line 520 "cwebdir/common.w"
{
cur_line++;
@@ -629,7 +817,7 @@ if(buffer[0]==change_buffer[0])
if(change_limit> change_buffer)check_change();
}
-/*:26*/
+/*:24*/
#line 433 "cwebdir/common.w"
;
if(changing&&include_depth==change_depth)goto restart;
@@ -640,20 +828,24 @@ if(buffer[0]=='@'&&(buffer[1]=='i'||buffer[1]=='I')){
loc= buffer+2;*limit= '"';
while(*loc==' '||*loc=='\t')loc++;
if(loc>=limit){
-err_print("! Include file name not given");
+#line 275 "cwebdir/comm-w2c.ch"
+err_print(_("! Include file name not given"));
+#line 443 "cwebdir/common.w"
goto restart;
}
if(include_depth>=max_include_depth-1){
-err_print("! Too many nested includes");
+#line 281 "cwebdir/comm-w2c.ch"
+err_print(_("! Too many nested includes"));
+#line 448 "cwebdir/common.w"
goto restart;
}
include_depth++;
-/*25:*/
+/*23:*/
#line 474 "cwebdir/common.w"
{
-#line 260 "cwebdir/comm-w2c.ch"
+#line 317 "cwebdir/comm-w2c.ch"
char*cur_file_name_end= cur_file_name+max_file_name_length-1;
char*k= cur_file_name;
#line 479 "cwebdir/common.w"
@@ -667,114 +859,120 @@ while(*loc!=' '&&*loc!='\t'&&*loc!='"'&&k<=cur_file_name_end)*k++= *loc++;
if(k> cur_file_name_end)too_long();
*k= '\0';
-#line 267 "cwebdir/comm-w2c.ch"
+#line 324 "cwebdir/comm-w2c.ch"
if((found_filename= kpse_find_cweb(cur_file_name))!=NULL&&
(cur_file= fopen(found_filename,"r"))!=NULL){
if(strlen(found_filename)<max_file_name_length){
-strcpy(cur_file_name,found_filename);
+if(strcmp(cur_file_name,found_filename))
+strcpy(cur_file_name,found_filename+
+((found_filename[0]=='.'&&found_filename[1]=='/')?2:0));
free(found_filename);
-}
+}else fatal(_("! Filename too long\n"),found_filename);
#line 490 "cwebdir/common.w"
cur_line= 0;print_where= 1;
goto restart;
}
-#line 517 "cwebdir/common.w"
-include_depth--;err_print("! Cannot open include file");goto restart;
+#line 362 "cwebdir/comm-w2c.ch"
+include_depth--;err_print(_("! Cannot open include file"));goto restart;
+#line 518 "cwebdir/common.w"
}
-/*:25*/
+/*:23*/
#line 452 "cwebdir/common.w"
;
}
return 1;
}
-/*:21*//*28:*/
+#line 296 "cwebdir/comm-w2c.ch"
+/*:21*//*26:*/
#line 569 "cwebdir/common.w"
+#line 390 "cwebdir/comm-w2c.ch"
void
-#line 317 "cwebdir/comm-w2c.ch"
- check_complete(void){
-#line 572 "cwebdir/common.w"
+check_complete(void){
if(change_limit!=change_buffer){
-strncpy(buffer,change_buffer,change_limit-change_buffer+1);
-limit= buffer+(int)(change_limit-change_buffer);
+strncpy(buffer,change_buffer,(size_t)(change_limit-change_buffer+1));
+limit= buffer+(ptrdiff_t)(change_limit-change_buffer);
+#line 575 "cwebdir/common.w"
changing= 1;change_depth= include_depth;loc= buffer;
-err_print("! Change file entry did not match");
+#line 400 "cwebdir/comm-w2c.ch"
+err_print(_("! Change file entry did not match"));
+#line 577 "cwebdir/common.w"
}
}
-/*:28*//*37:*/
+/*:26*//*35:*/
#line 660 "cwebdir/common.w"
+#line 442 "cwebdir/comm-w2c.ch"
name_pointer
-#line 356 "cwebdir/comm-w2c.ch"
-
-id_lookup(const char*first,const char*last,char t)
-#line 666 "cwebdir/common.w"
+id_lookup(
+const char*first,
+const char*last,
+char t)
{
-#line 363 "cwebdir/comm-w2c.ch"
const char*i= first;
-#line 369 "cwebdir/comm-w2c.ch"
+#line 668 "cwebdir/common.w"
int h;
-#line 669 "cwebdir/common.w"
int l;
name_pointer p;
if(last==NULL)for(last= first;*last!='\0';last++);
-l= last-first;
-/*38:*/
+#line 454 "cwebdir/comm-w2c.ch"
+l= (int)(last-first);
+#line 673 "cwebdir/common.w"
+/*36:*/
#line 683 "cwebdir/common.w"
-#line 378 "cwebdir/comm-w2c.ch"
h= (unsigned char)*i;
while(++i<last)h= (h+h+(int)((unsigned char)*i))%hash_size;
-#line 686 "cwebdir/common.w"
-/*:38*/
+/*:36*/
#line 673 "cwebdir/common.w"
;
-/*39:*/
+/*37:*/
#line 691 "cwebdir/common.w"
-#line 387 "cwebdir/comm-w2c.ch"
p= hash[h];
-#line 693 "cwebdir/common.w"
while(p&&!names_match(p,first,l,t))p= p->link;
if(p==NULL){
p= name_ptr;
-#line 393 "cwebdir/comm-w2c.ch"
p->link= hash[h];hash[h]= p;
-#line 697 "cwebdir/common.w"
}
-/*:39*/
+/*:37*/
#line 674 "cwebdir/common.w"
;
-if(p==name_ptr)/*41:*/
+if(p==name_ptr)/*39:*/
#line 706 "cwebdir/common.w"
{
-if(byte_ptr+l> byte_mem_end)overflow("byte memory");
-if(name_ptr>=name_dir_end)overflow("name");
+#line 467 "cwebdir/comm-w2c.ch"
+if(byte_ptr+l> byte_mem_end)overflow(_("byte memory"));
+if(name_ptr>=name_dir_end)overflow(_("name"));
+#line 709 "cwebdir/common.w"
strncpy(byte_ptr,first,l);
(++name_ptr)->byte_start= byte_ptr+= l;
-if(program==cweave)init_p(p,t);
+#line 474 "cwebdir/comm-w2c.ch"
+init_p(p,t);
+#line 712 "cwebdir/common.w"
}
-/*:41*/
+/*:39*/
#line 675 "cwebdir/common.w"
;
return(p);
}
-/*:37*//*44:*/
+/*:35*//*42:*/
#line 764 "cwebdir/common.w"
+#line 482 "cwebdir/comm-w2c.ch"
void
-#line 412 "cwebdir/comm-w2c.ch"
- print_section_name(name_pointer p)
+print_section_name(
+name_pointer p)
#line 768 "cwebdir/common.w"
{
char*ss,*s= first_chunk(p);
@@ -782,21 +980,25 @@ name_pointer q= p+1;
while(p!=name_dir){
ss= (p+1)->byte_start-1;
if(*ss==' '&&ss>=s){
-term_write(s,ss-s);p= q->link;q= p;
+#line 492 "cwebdir/comm-w2c.ch"
+term_write(s,(size_t)(ss-s));p= q->link;q= p;
}else{
-term_write(s,ss+1-s);p= name_dir;q= NULL;
+term_write(s,(size_t)(ss+1-s));p= name_dir;q= NULL;
+#line 777 "cwebdir/common.w"
}
s= p->byte_start;
}
if(q)term_write("...",3);
}
-/*:44*//*45:*/
+/*:42*//*43:*/
#line 783 "cwebdir/common.w"
+#line 503 "cwebdir/comm-w2c.ch"
void
-#line 422 "cwebdir/comm-w2c.ch"
- sprint_section_name(char*dest,name_pointer p)
+sprint_section_name(
+char*dest,
+name_pointer p)
#line 788 "cwebdir/common.w"
{
char*ss,*s= first_chunk(p);
@@ -808,18 +1010,21 @@ p= q->link;q= p;
}else{
ss++;p= name_dir;
}
-strncpy(dest,s,ss-s),dest+= ss-s;
+#line 512 "cwebdir/comm-w2c.ch"
+strncpy(dest,s,(size_t)(ss-s)),dest+= ss-s;
+#line 799 "cwebdir/common.w"
s= p->byte_start;
}
*dest= '\0';
}
-/*:45*//*46:*/
+/*:43*//*44:*/
#line 804 "cwebdir/common.w"
-#line 432 "cwebdir/comm-w2c.ch"
-static void
-print_prefix_name(name_pointer p)
+#line 520 "cwebdir/comm-w2c.ch"
+void
+print_prefix_name(
+name_pointer p)
#line 808 "cwebdir/common.w"
{
char*s= first_chunk(p);
@@ -828,40 +1033,47 @@ term_write(s,l);
if(s+l<(p+1)->byte_start)term_write("...",3);
}
-/*:46*//*47:*/
+/*:44*//*45:*/
#line 825 "cwebdir/common.w"
-#line 443 "cwebdir/comm-w2c.ch"
-
-static int
-web_strcmp(char*j,int j_len,char*k,int k_len)
+#line 530 "cwebdir/comm-w2c.ch"
+static int web_strcmp(
+char*j,
+int j_len,
+char*k,
+int k_len)
#line 829 "cwebdir/common.w"
{
-#line 455 "cwebdir/comm-w2c.ch"
char*j1= j+j_len,*k1= k+k_len;
while(k<k1&&j<j1&&*j==*k)k++,j++;
if(k==k1)if(j==j1)return equal;
else return extension;
else if(j==j1)return prefix;
-#line 835 "cwebdir/common.w"
else if(*j<*k)return less;
else return greater;
}
-/*:47*//*49:*/
+/*:45*//*47:*/
#line 855 "cwebdir/common.w"
-#line 483 "cwebdir/comm-w2c.ch"
+#line 552 "cwebdir/comm-w2c.ch"
static name_pointer
-add_section_name(name_pointer par,int c,char*first,char*last,
+add_section_name(
+name_pointer par,
+int c,
+char*first,
+char*last,
int ispref)
#line 863 "cwebdir/common.w"
{
name_pointer p= name_ptr;
char*s= first_chunk(p);
-int name_len= last-first+ispref;
-if(s+name_len> byte_mem_end)overflow("byte memory");
-if(name_ptr+1>=name_dir_end)overflow("name");
+#line 564 "cwebdir/comm-w2c.ch"
+int name_len= (int)(last-first)+ispref;
+#line 571 "cwebdir/comm-w2c.ch"
+if(s+name_len> byte_mem_end)overflow(_("byte memory"));
+if(name_ptr+1>=name_dir_end)overflow(_("name"));
+#line 869 "cwebdir/common.w"
(++name_ptr)->byte_start= byte_ptr= s+name_len;
if(ispref){
*(byte_ptr-1)= ' ';
@@ -877,35 +1089,45 @@ init_node(p);
return par==NULL?(root= p):c==less?(par->llink= p):(par->rlink= p);
}
-/*:49*//*50:*/
+/*:47*//*48:*/
#line 884 "cwebdir/common.w"
-#line 498 "cwebdir/comm-w2c.ch"
+#line 583 "cwebdir/comm-w2c.ch"
static void
-extend_section_name(name_pointer p,char*first,char*last,int ispref)
+extend_section_name(
+name_pointer p,
+char*first,
+char*last,
+int ispref)
#line 891 "cwebdir/common.w"
{
char*s;
name_pointer q= p+1;
-int name_len= last-first+ispref;
-if(name_ptr>=name_dir_end)overflow("name");
+#line 594 "cwebdir/comm-w2c.ch"
+int name_len= (int)(last-first)+ispref;
+#line 600 "cwebdir/comm-w2c.ch"
+if(name_ptr>=name_dir_end)overflow(_("name"));
+#line 896 "cwebdir/common.w"
while(q->link!=name_dir)q= q->link;
q->link= name_ptr;
s= name_ptr->byte_start;
name_ptr->link= name_dir;
-if(s+name_len> byte_mem_end)overflow("byte memory");
+#line 606 "cwebdir/comm-w2c.ch"
+if(s+name_len> byte_mem_end)overflow(_("byte memory"));
+#line 901 "cwebdir/common.w"
(++name_ptr)->byte_start= byte_ptr= s+name_len;
strncpy(s,first,name_len);
if(ispref)*(byte_ptr-1)= ' ';
}
-/*:50*//*51:*/
+/*:48*//*49:*/
#line 912 "cwebdir/common.w"
+#line 615 "cwebdir/comm-w2c.ch"
name_pointer
-#line 509 "cwebdir/comm-w2c.ch"
-
-section_lookup(char*first,char*last,int ispref)
+section_lookup(
+char*first,char*last,
+int ispref)
#line 917 "cwebdir/common.w"
{
int c= 0;
@@ -914,8 +1136,10 @@ name_pointer q= NULL;
name_pointer r= NULL;
name_pointer par= NULL;
-int name_len= last-first+1;
-/*52:*/
+#line 624 "cwebdir/comm-w2c.ch"
+int name_len= (int)(last-first)+1;
+#line 925 "cwebdir/common.w"
+/*50:*/
#line 936 "cwebdir/common.w"
while(p){
@@ -926,10 +1150,14 @@ par= p;
p= (c==less?p->llink:p->rlink);
}else{
if(r!=NULL){
-printf("\n! Ambiguous prefix: matches <");
+#line 630 "cwebdir/comm-w2c.ch"
+fputs(_("\n! Ambiguous prefix: matches <"),stdout);
+#line 946 "cwebdir/common.w"
print_prefix_name(p);
-printf(">\n and <");
+#line 636 "cwebdir/comm-w2c.ch"
+fputs(_(">\n and <"),stdout);
+#line 949 "cwebdir/common.w"
print_prefix_name(r);
err_print(">");
return name_dir;
@@ -942,26 +1170,28 @@ if(p==NULL)
p= q,q= NULL;
}
-/*:52*/
+/*:50*/
#line 926 "cwebdir/common.w"
;
-/*53:*/
+/*51:*/
#line 961 "cwebdir/common.w"
if(r==NULL)
return add_section_name(par,c,first,last+1,ispref);
-/*:53*/
+/*:51*/
#line 927 "cwebdir/common.w"
;
-/*54:*/
+/*52:*/
#line 969 "cwebdir/common.w"
switch(section_name_cmp(&first,name_len,r)){
case prefix:
if(!ispref){
-printf("\n! New name is a prefix of <");
+#line 642 "cwebdir/comm-w2c.ch"
+fputs(_("\n! New name is a prefix of <"),stdout);
+#line 975 "cwebdir/common.w"
print_section_name(r);
err_print(">");
@@ -973,32 +1203,40 @@ case extension:if(!ispref||first<=last)
extend_section_name(r,first,last+1,ispref);
return r;
case bad_extension:
-printf("\n! New name extends <");
+#line 648 "cwebdir/comm-w2c.ch"
+fputs(_("\n! New name extends <"),stdout);
+#line 987 "cwebdir/common.w"
print_section_name(r);
err_print(">");
return r;
default:
-printf("\n! Section name incompatible with <");
+#line 654 "cwebdir/comm-w2c.ch"
+fputs(_("\n! Section name incompatible with <"),stdout);
+#line 993 "cwebdir/common.w"
print_prefix_name(r);
-printf(">,\n which abbreviates <");
+#line 660 "cwebdir/comm-w2c.ch"
+fputs(_(">,\n which abbreviates <"),stdout);
+#line 996 "cwebdir/common.w"
print_section_name(r);
err_print(">");
return r;
}
-/*:54*/
+/*:52*/
#line 928 "cwebdir/common.w"
;
}
-/*:51*//*56:*/
+/*:49*//*54:*/
#line 1020 "cwebdir/common.w"
-#line 529 "cwebdir/comm-w2c.ch"
-static int
-section_name_cmp(char**pfirst,int len,name_pointer r)
+#line 675 "cwebdir/comm-w2c.ch"
+static int section_name_cmp(
+char**pfirst,
+int len,
+name_pointer r)
#line 1025 "cwebdir/common.w"
{
char*first= *pfirst;
@@ -1013,37 +1251,44 @@ else ispref= 0,ss++,q= name_dir;
switch(c= web_strcmp(first,len,s,ss-s)){
case equal:if(q==name_dir)
if(ispref){
-*pfirst= first+(ss-s);
+#line 684 "cwebdir/comm-w2c.ch"
+*pfirst= first+(ptrdiff_t)(ss-s);
+#line 1039 "cwebdir/common.w"
return extension;
}else return equal;
else return(q->byte_start==(q+1)->byte_start)?equal:prefix;
case extension:
if(!ispref)return bad_extension;
first+= ss-s;
-if(q!=name_dir){len-= ss-s;s= q->byte_start;r= q;continue;}
+#line 690 "cwebdir/comm-w2c.ch"
+if(q!=name_dir){len-= (int)(ss-s);s= q->byte_start;r= q;continue;}
+#line 1046 "cwebdir/common.w"
*pfirst= first;return extension;
default:return c;
}
}
}
-/*:56*//*60:*/
+/*:54*//*58:*/
#line 1095 "cwebdir/common.w"
+#line 716 "cwebdir/comm-w2c.ch"
void
-#line 549 "cwebdir/comm-w2c.ch"
- err_print(const char*s)
+err_print(
+const char*s)
#line 1099 "cwebdir/common.w"
{
char*k,*l;
printf(*s=='!'?"\n%s":"%s",s);
-if(web_file_open)/*61:*/
+if(web_file_open)/*59:*/
#line 1115 "cwebdir/common.w"
{if(changing&&include_depth==change_depth)
-printf(". (l. %d of change file)\n",change_line);
-else if(include_depth==0)printf(". (l. %d)\n",cur_line);
-else printf(". (l. %d of include file %s)\n",cur_line,cur_file_name);
+#line 726 "cwebdir/comm-w2c.ch"
+printf(_(". (l. %d of change file)\n"),change_line);
+else if(include_depth==0)printf(_(". (l. %d)\n"),cur_line);
+else printf(_(". (l. %d of include file %s)\n"),cur_line,cur_file_name);
+#line 1120 "cwebdir/common.w"
l= (loc>=limit?limit:loc);
if(l> buffer){
for(k= buffer;k<l;k++)
@@ -1057,69 +1302,94 @@ if(*limit=='|')putchar('|');
putchar(' ');
}
-/*:61*/
+/*:59*/
#line 1102 "cwebdir/common.w"
;
update_terminal;mark_error;
}
-/*:60*//*63:*/
+/*:58*//*61:*/
#line 1150 "cwebdir/common.w"
-#line 569 "cwebdir/comm-w2c.ch"
+#line 765 "cwebdir/comm-w2c.ch"
int wrap_up(void){
-#line 1152 "cwebdir/common.w"
-putchar('\n');
+if(show_progress)new_line;
+#line 1153 "cwebdir/common.w"
if(show_stats)
print_stats();
-/*64:*/
+#line 772 "cwebdir/comm-w2c.ch"
+/*62:*/
#line 1160 "cwebdir/common.w"
switch(history){
-case spotless:if(show_happiness)printf("(No errors were found.)\n");break;
+#line 796 "cwebdir/comm-w2c.ch"
+case spotless:
+if(show_happiness)puts(_("(No errors were found.)"));break;
case harmless_message:
-printf("(Did you see the warning message above?)\n");break;
+puts(_("(Did you see the warning message above?)"));break;
case error_message:
-printf("(Pardon me, but I think I spotted something wrong.)\n");break;
-case fatal_message:printf("(That was a fatal error, my friend.)\n");
+puts(_("(Pardon me, but I think I spotted something wrong.)"));break;
+case fatal_message:
+puts(_("(That was a fatal error, my friend.)"));
+#line 1168 "cwebdir/common.w"
}
-/*:64*/
-#line 1155 "cwebdir/common.w"
-;
-if(history> harmless_message)return(1);
-else return(0);
+/*:62*/
+#line 772 "cwebdir/comm-w2c.ch"
+
+/*87:*/
+#line 1200 "cwebdir/comm-w2c.ch"
+
+if(C_file)fclose(C_file);
+if(tex_file)fclose(tex_file);
+if(check_file)fclose(check_file);
+if(strlen(check_file_name))
+remove(check_file_name);
+
+/*:87*/
+#line 773 "cwebdir/comm-w2c.ch"
+
+#line 780 "cwebdir/comm-w2c.ch"
+switch(history){
+case harmless_message:return RETURN_WARN;
+case error_message:return RETURN_ERROR;
+case fatal_message:return RETURN_FAIL;
+default:return RETURN_OK;
+}
+#line 1158 "cwebdir/common.w"
}
-/*:63*//*66:*/
-#line 1179 "cwebdir/common.w"
+/*:61*//*64:*/
+#line 818 "cwebdir/comm-w2c.ch"
void
-#line 589 "cwebdir/comm-w2c.ch"
- fatal(const char*s,const char*t)
+fatal(
+const char*s,const char*t)
#line 1182 "cwebdir/common.w"
{
-#line 595 "cwebdir/comm-w2c.ch"
-if(*s)printf("%s",s);
+#line 826 "cwebdir/comm-w2c.ch"
+if(*s)fputs(s,stdout);
#line 1184 "cwebdir/common.w"
err_print(t);
history= fatal_message;exit(wrap_up());
}
-/*:66*//*67:*/
-#line 1190 "cwebdir/common.w"
+/*:64*//*65:*/
+#line 834 "cwebdir/comm-w2c.ch"
void
-#line 604 "cwebdir/comm-w2c.ch"
- overflow(const char*t)
+overflow(
+const char*t)
#line 1193 "cwebdir/common.w"
{
-printf("\n! Sorry, %s capacity exceeded",t);fatal("","");
+#line 842 "cwebdir/comm-w2c.ch"
+printf(_("\n! Sorry, %s capacity exceeded"),t);fatal("","");
+#line 1195 "cwebdir/common.w"
}
-/*:67*//*72:*/
+/*:65*//*70:*/
#line 1254 "cwebdir/common.w"
-#line 663 "cwebdir/comm-w2c.ch"
+#line 922 "cwebdir/comm-w2c.ch"
static void
scan_args(void)
#line 1257 "cwebdir/common.w"
@@ -1129,85 +1399,103 @@ char*name_pos;
register char*s;
boolean found_web= 0,found_change= 0,found_out= 0;
-boolean flag_change;
+#line 1264 "cwebdir/common.w"
+
+#line 934 "cwebdir/comm-w2c.ch"
+
+#if defined DEV_NULL
+strncpy(change_file_name,DEV_NULL,max_file_name_length-2);
+change_file_name[max_file_name_length-2]= '\0';
+#elif defined _DEV_NULL
+strncpy(change_file_name,_DEV_NULL,max_file_name_length-2);
+change_file_name[max_file_name_length-2]= '\0';
+#else
+strcpy(change_file_name,"/dev/null");
+#endif
while(--argc> 0){
-if((**(++argv)=='-'||**argv=='+')&&*(*argv+1))/*76:*/
-#line 688 "cwebdir/comm-w2c.ch"
+#line 1266 "cwebdir/common.w"
+if((**(++argv)=='-'||**argv=='+')&&*(*argv+1))/*74:*/
+#line 1017 "cwebdir/comm-w2c.ch"
{
if(strcmp("-help",*argv)==0||strcmp("--help",*argv)==0)
-/*86:*/
-#line 803 "cwebdir/comm-w2c.ch"
-usagehelp(program==ctangle?CTANGLEHELP:CWEAVEHELP,NULL);
+/*93:*/
+#line 1300 "cwebdir/comm-w2c.ch"
+cb_usagehelp(program==ctangle?CTANGLEHELP:
+program==cweave?CWEAVEHELP:CTWILLHELP,NULL);
+
+
+/*:93*/
+#line 1021 "cwebdir/comm-w2c.ch"
-/*:86*/
-#line 691 "cwebdir/comm-w2c.ch"
-;
if(strcmp("-version",*argv)==0||strcmp("--version",*argv)==0)
-/*87:*/
-#line 812 "cwebdir/comm-w2c.ch"
-printversionandexit((program==ctangle?ctangle_banner:cweave_banner),
-"Silvio Levy and Donald E. Knuth",NULL,NULL);
+/*96:*/
+#line 1356 "cwebdir/comm-w2c.ch"
+printversionandexit(cb_banner,
+program==ctwill?"Donald E. Knuth":"Silvio Levy and Donald E. Knuth",
+NULL,NULL);
-/*:87*/
-#line 693 "cwebdir/comm-w2c.ch"
-;
-#line 1346 "cwebdir/common.w"
-if(**argv=='-')flag_change= 0;
-#line 699 "cwebdir/comm-w2c.ch"
-else flag_change= 1;
-if(*(*argv+1)=='d')
-if(sscanf(*argv+2,"%u",&kpathsea_debug)!=1)/*77:*/
+
+/*:96*/
+#line 1024 "cwebdir/comm-w2c.ch"
+
+for(dot_pos= *argv+1;*dot_pos> '\0';dot_pos++)
+if(*dot_pos=='d'){
+if(sscanf(*argv+2,"%u",&kpathsea_debug)!=1)/*75:*/
#line 1352 "cwebdir/common.w"
{
-#line 722 "cwebdir/comm-w2c.ch"
-if(program==ctangle){
-fprintf(stderr,"ctangle: Need one to three file arguments.\n");
-usage("ctangle");
-}else{
-fprintf(stderr,"cweave: Need one to three file arguments.\n");
-usage("cweave");
-}
+#line 1051 "cwebdir/comm-w2c.ch"
+cb_usage(program==ctangle?"ctangle":program==cweave?"cweave":"ctwill");
+
#line 1362 "cwebdir/common.w"
}
-/*:77*/
-#line 701 "cwebdir/comm-w2c.ch"
-;
-#line 1348 "cwebdir/common.w"
-for(dot_pos= *argv+1;*dot_pos> '\0';dot_pos++)
-#line 707 "cwebdir/comm-w2c.ch"
-flags[(unsigned char)*dot_pos]= flag_change;
+#line 1058 "cwebdir/comm-w2c.ch"
+/*:75*/
+#line 1027 "cwebdir/comm-w2c.ch"
+
+}else
+if(*dot_pos=='l'){
+use_language= ++dot_pos;
+break;
+}else
+#line 1038 "cwebdir/comm-w2c.ch"
+ flags[(eight_bits)*dot_pos]= flag_change;
#line 1350 "cwebdir/common.w"
}
-/*:76*/
+/*:74*/
#line 1266 "cwebdir/common.w"
else{
s= name_pos= *argv;dot_pos= NULL;
+#line 955 "cwebdir/comm-w2c.ch"
while(*s){
if(*s=='.')dot_pos= s++;
-else if(*s=='/')dot_pos= NULL,name_pos= ++s;
+else if(*s==DIR_SEPARATOR||*s==DEVICE_SEPARATOR||*s=='/')
+dot_pos= NULL,name_pos= ++s;
else s++;
}
-if(!found_web)/*73:*/
+
+#line 1274 "cwebdir/common.w"
+if(!found_web)/*71:*/
#line 1292 "cwebdir/common.w"
{
if(s-*argv> max_file_name_length-5)
-/*78:*/
-#line 1364 "cwebdir/common.w"
-fatal("! Filename too long\n",*argv);
+/*76:*/
+#line 1058 "cwebdir/comm-w2c.ch"
+fatal(_("! Filename too long\n"),*argv);
+#line 1365 "cwebdir/common.w"
-/*:78*/
+/*:76*/
#line 1295 "cwebdir/common.w"
;
if(dot_pos==NULL)
@@ -1224,45 +1512,50 @@ sprintf(C_file_name,"%s.c",name_pos);
found_web= 1;
}
-/*:73*/
+/*:71*/
#line 1275 "cwebdir/common.w"
-else if(!found_change)/*74:*/
+else if(!found_change)/*72:*/
#line 1310 "cwebdir/common.w"
{
-if(strcmp(*argv,"-")==0)found_change= -1;
-else{
+#line 992 "cwebdir/comm-w2c.ch"
+if(strcmp(*argv,"-")!=0){
+#line 1314 "cwebdir/common.w"
if(s-*argv> max_file_name_length-4)
-/*78:*/
-#line 1364 "cwebdir/common.w"
-fatal("! Filename too long\n",*argv);
+/*76:*/
+#line 1058 "cwebdir/comm-w2c.ch"
+fatal(_("! Filename too long\n"),*argv);
+#line 1365 "cwebdir/common.w"
-/*:78*/
+/*:76*/
#line 1315 "cwebdir/common.w"
;
if(dot_pos==NULL)
sprintf(change_file_name,"%s.ch",*argv);
else strcpy(change_file_name,*argv);
-found_change= 1;
+#line 999 "cwebdir/comm-w2c.ch"
}
+found_change= 1;
+#line 1321 "cwebdir/common.w"
}
-/*:74*/
+/*:72*/
#line 1276 "cwebdir/common.w"
-else if(!found_out)/*75:*/
+else if(!found_out)/*73:*/
#line 1323 "cwebdir/common.w"
{
if(s-*argv> max_file_name_length-5)
-/*78:*/
-#line 1364 "cwebdir/common.w"
-fatal("! Filename too long\n",*argv);
+/*76:*/
+#line 1058 "cwebdir/comm-w2c.ch"
+fatal(_("! Filename too long\n"),*argv);
+#line 1365 "cwebdir/common.w"
-/*:78*/
+/*:76*/
#line 1326 "cwebdir/common.w"
;
if(dot_pos==NULL){
@@ -1273,7 +1566,9 @@ sprintf(C_file_name,"%s.c",*argv);
}else{
strcpy(tex_file_name,*argv);
strcpy(C_file_name,*argv);
-if(flags['x']){
+#line 1006 "cwebdir/comm-w2c.ch"
+if(make_xrefs){
+#line 1336 "cwebdir/common.w"
*dot_pos= 0;
sprintf(idx_file_name,"%s.idx",*argv);
sprintf(scn_file_name,"%s.scn",*argv);
@@ -1282,51 +1577,84 @@ sprintf(scn_file_name,"%s.scn",*argv);
found_out= 1;
}
-#line 688 "cwebdir/comm-w2c.ch"
-/*:75*/
+#line 1016 "cwebdir/comm-w2c.ch"
+/*:73*/
#line 1277 "cwebdir/common.w"
-else/*77:*/
+else/*75:*/
#line 1352 "cwebdir/common.w"
{
-#line 722 "cwebdir/comm-w2c.ch"
-if(program==ctangle){
-fprintf(stderr,"ctangle: Need one to three file arguments.\n");
-usage("ctangle");
-}else{
-fprintf(stderr,"cweave: Need one to three file arguments.\n");
-usage("cweave");
-}
+#line 1051 "cwebdir/comm-w2c.ch"
+cb_usage(program==ctangle?"ctangle":program==cweave?"cweave":"ctwill");
+
#line 1362 "cwebdir/common.w"
}
-/*:77*/
+#line 1058 "cwebdir/comm-w2c.ch"
+/*:75*/
#line 1278 "cwebdir/common.w"
;
}
}
-if(!found_web)/*77:*/
+if(!found_web)/*75:*/
#line 1352 "cwebdir/common.w"
{
-#line 722 "cwebdir/comm-w2c.ch"
-if(program==ctangle){
-fprintf(stderr,"ctangle: Need one to three file arguments.\n");
-usage("ctangle");
-}else{
-fprintf(stderr,"cweave: Need one to three file arguments.\n");
-usage("cweave");
-}
+#line 1051 "cwebdir/comm-w2c.ch"
+cb_usage(program==ctangle?"ctangle":program==cweave?"cweave":"ctwill");
+
#line 1362 "cwebdir/common.w"
}
-/*:77*/
+#line 1058 "cwebdir/comm-w2c.ch"
+/*:75*/
#line 1281 "cwebdir/common.w"
;
-#line 673 "cwebdir/comm-w2c.ch"
-if(found_change<=0)strcpy(change_file_name,DEV_NULL);
#line 1283 "cwebdir/common.w"
}
-/*:72*/
+#line 977 "cwebdir/comm-w2c.ch"
+/*:70*//*95:*/
+#line 1314 "cwebdir/comm-w2c.ch"
+
+void cb_show_banner(void)
+{
+textdomain("cweb-tl");
+
+printf("%s%s\n",cb_banner,versionstring);
+textdomain("cweb");
+
+}
+
+static void cb_usage(const_string str)
+{
+textdomain("cweb-tl");
+
+fprintf(stderr,_("%s: Need one to three file arguments.\n"),str);
+fprintf(stderr,_("Try `%s --help' for more information.\n"),str);
+
+textdomain("cweb");
+
+history= fatal_message;exit(wrap_up());
+}
+
+static void cb_usagehelp(const_string*message,const_string bug_email)
+{
+if(!bug_email)
+bug_email= "tex-k@tug.org";
+textdomain("web2c-help");
+
+while(*message){
+printf("%s\n",strcmp("",*message)?_(*message):*message);
+++message;
+}
+textdomain("cweb-tl");
+
+printf(_("\nEmail bug reports to %s.\n"),bug_email);
+textdomain("cweb");
+
+history= spotless;exit(wrap_up());
+}
+
+/*:95*/
diff --git a/Build/source/texk/web2c/cwebboot.hin b/Build/source/texk/web2c/cwebboot.hin
deleted file mode 100644
index 23678f6d029..00000000000
--- a/Build/source/texk/web2c/cwebboot.hin
+++ /dev/null
@@ -1,65 +0,0 @@
-/*84:*/
-#line 792 "cwebdir/comm-w2c.ch"
-
-/* Prototypes for functions, either
- * declared in common.w and used in ctangle.w and cweave.w, or
- * used in common.w and declared in ctangle.w and cweave.w. */
-/*35:*/
-#line 344 "cwebdir/comm-w2c.ch"
-
-extern int names_match(name_pointer,const char*,int,char);
-#line 652 "cwebdir/common.w"
-
-/*:35*//*40:*/
-#line 402 "cwebdir/comm-w2c.ch"
-
-extern void init_p(name_pointer p,char t);
-#line 705 "cwebdir/common.w"
-
-/*:40*//*48:*/
-#line 468 "cwebdir/comm-w2c.ch"
-
-extern void init_node(name_pointer node);
-#line 854 "cwebdir/common.w"
-
-/*:48*//*59:*/
-#line 539 "cwebdir/comm-w2c.ch"
-
-extern void err_print(const char*);
-#line 1094 "cwebdir/common.w"
-
-/*:59*//*62:*/
-#line 559 "cwebdir/comm-w2c.ch"
-
-extern int wrap_up(void);
-extern void print_stats(void);
-#line 1143 "cwebdir/common.w"
-
-/*:62*//*65:*/
-#line 578 "cwebdir/comm-w2c.ch"
-
-extern void fatal(const char*,const char*);
-extern void overflow(const char*);
-#line 1175 "cwebdir/common.w"
-
-/*:65*//*83:*/
-#line 773 "cwebdir/comm-w2c.ch"
-
-extern void common_init(void);
-extern int input_ln(FILE*fp);
-extern void reset_input(void);
-extern int get_line(void);
-extern void check_complete(void);
-extern name_pointer id_lookup(const char*first,const char*last,char t);
-extern void print_section_name(name_pointer p);
-extern void sprint_section_name(char*dest,name_pointer p);
-extern name_pointer section_lookup(char*first,char*last,int ispref);
-#line 1417 "cwebdir/common.w"
-
-#line 788 "cwebdir/comm-w2c.ch"
-/*:83*/
-#line 796 "cwebdir/comm-w2c.ch"
-
-extern const char*versionstring;
-
-/*:84*/
diff --git a/Build/source/texk/web2c/cwebdir/ChangeLog b/Build/source/texk/web2c/cwebdir/ChangeLog
index e982318a2f4..a3f9281f5f9 100644
--- a/Build/source/texk/web2c/cwebdir/ChangeLog
+++ b/Build/source/texk/web2c/cwebdir/ChangeLog
@@ -1,3 +1,29 @@
+2019-01-05 Andreas Scherer <https://ascherer.github.io>
+
+ Integration of CWEBbin as the new CWEB in TeX Live,
+ https://github.com/ascherer/cwebbin.
+
+ Purge cwebboot.h[in] from CWEB build process;
+ see ../ChangeLog for more changes in ../am/, etc.
+
+ * comm-w2c.h: new file.
+ * ctang-w2c.ch,
+ * cweav-w2c.ch: cwebbin changes for translations and everything else.
+
+ * ctproofmac.tex,
+ * cttwinxmac.tex,
+ * ctwimac.tex: new macro files.
+
+ * po/: new subdirectory for translations.
+ * cwebinputs,
+ * texinputs: new subdirs to include entire original cweb distribution.
+
+ Add CTWILL material on top of CWEAVE.
+ * prod-twill.w,
+ * refsort.w,
+ * twinx.w,
+ * ctwill-w2c.ch: new files.
+
2018-12-30 Andreas Scherer <https://ascherer.github.io>
* cweave.w,
diff --git a/Build/source/texk/web2c/cwebdir/comm-w2c.ch b/Build/source/texk/web2c/cwebdir/comm-w2c.ch
index d1ed2df5b18..84ad9ada53a 100644
--- a/Build/source/texk/web2c/cwebdir/comm-w2c.ch
+++ b/Build/source/texk/web2c/cwebdir/comm-w2c.ch
@@ -1,257 +1,314 @@
-% Original Kpathsea changes for CWEB by Wlodek Bzyl and Olaf Weber
-% This file is in the Public Domain.
+@q Changes for CWEB in TeX Live from numerous contributors. @>
+@q This file is in the Public Domain. @>
-@x l.20
+@q Most of the original Kpathsea changes by Wlodek Bzyl and Olaf Weber @>
+@q were merged with the set of change files of the CWEBbin project; @>
+@q see https://github.com/ascherer/cwebbin for the original parts. @>
+
+@q This stripped change file {comm,ctang,cweav,ctwill}-w2c.ch has been @>
+@q created from the set of change files {comm,ctang,cweav}-patch.ch, @>
+@q {comm,ctang,cweav}-ansi.ch, {comm,ctang,cweav}-extensions.ch, @>
+@q {comm,ctang,cweav}-output.ch, {comm,ctang,cweav}-i18n.ch, and @>
+@q cweav-twill.ch for CTWILL, and {comm,ctang,cweav,ctwill}-texlive.ch @>
+@q with the 'tie' processor and is used as a monolithic changefile for @>
+@q {common,ctangle,cweave}.w in TeX Live. @>
+
+@q Please send comments, suggestions, etc. to tex-k@@tug.org. @>
+
+@x
\def\title{Common code for CTANGLE and CWEAVE (Version 3.64)}
-\def\topofcontents{\null\vfill
- \centerline{\titlefont Common code for {\ttitlefont CTANGLE} and
- {\ttitlefont CWEAVE}}
- \vskip 15pt
- \centerline{(Version 3.64)}
- \vfill}
@y
\def\Kpathsea/{{\mc KPATHSEA\spacefactor1000}}
-\def\title{Common code for CTANGLE and CWEAVE (Version 3.64k)}
-\def\topofcontents{\null\vfill
- \centerline{\titlefont Common code for {\ttitlefont CTANGLE} and
- {\ttitlefont CWEAVE}}
- \vskip 15pt
- \centerline{(Version 3.64k)}
- \vfill}
+\def\title{Common code for CTANGLE and CWEAVE (\TeX~Live)}
@z
-This change can not be applied when `tie' is used
-(TOC file can not be typeset).
-
-%@x l.42
-%\let\maybe=\iftrue
-%@y
-%\let\maybe=\iffalse % print only changed modules
-%@z
-
-Section 1.
+@x
+ \centerline{(Version 3.64)}
+@y
+ \centerline{(Version 3.64 [\TeX~Live])}
+@z
-@x l.63
-@<Predeclaration of procedures@>@/
+@x
+@s not_eq normal @q unreserve a C++ keyword @>
@y
-#include "cweb.h"
-@<Predeclaration of procedures@>@/
+@s boolean int
+@s uint8_t int
+@s uint16_t int
@z
-Section 2.
-We use the definition from `kpathsea/types.h':
+@x
+|program|.
- typedef enum { false = 0, true = 1 } boolean;
+@d ctangle 0
+@d cweave 1
+@y
+|program|. And \.{CTWILL} adds some extra twists.
-Note that this definition also occurs in common.h.
-@x l.74
+@d ctangle 0
+@d cweave 1
+@d ctwill 2
+@z
+
+@x
typedef short boolean;
+boolean program; /* \.{CWEAVE} or \.{CTANGLE}? */
@y
+int program; /* \.{CWEAVE} or \.{CTANGLE} or \.{CTWILL}? */
@z
-
-Section 4.
-
-@x l.91
+@x
+void
common_init()
@y
-common_init (void)
+void
+common_init(void)
@z
-@x l.93
+@x
@<Initialize pointers@>;
+ @<Set the default options common to \.{CTANGLE} and \.{CWEAVE}@>;
+ @<Scan arguments and open output files@>;
@y
- @<Initialize pointers@>;
- @<Set up |PROGNAME| feature and initialize the search path mechanism@>;
+ @<Initialize pointers@>@;
+ @<Set up |PROGNAME| feature and initialize the search path mechanism@>@;
+ @<Set locale and bind language catalogs@>@;
+ @<Set the default options common to \.{CTANGLE} and \.{CWEAVE}@>@;
+ @<Scan arguments and open output files@>@;
@z
-Section 5.
-
-@x l.103
-#include <ctype.h>
+@x
+@d not_eq 032 /* `\.{!=}'\,; corresponds to MIT's {\tentex\char'32} */
@y
-#define CWEB
-#include "cpascal.h"
-#include <ctype.h>
+@d non_eq 032 /* `\.{!=}'\,; corresponds to MIT's {\tentex\char'32} */
@z
-Section 7.
-
-@x l.153
+@x
@d buf_size 100 /* for \.{CWEAVE} and \.{CTANGLE} */
@y
@d buf_size 1000 /* for \.{CWEAVE} and \.{CTANGLE} */
@z
-@x l.156
+@x
@d xisspace(c) (isspace(c)&&((unsigned char)c<0200))
@d xisupper(c) (isupper(c)&&((unsigned char)c<0200))
@y
-@d xisspace(c) (isspace((unsigned char)c)&&((unsigned char)c<0200))
-@d xisupper(c) (isupper((unsigned char)c)&&((unsigned char)c<0200))
+@d xisspace(c) (isspace((eight_bits)c)&&((eight_bits)c<0200))
+@d xisupper(c) (isupper((eight_bits)c)&&((eight_bits)c<0200))
@z
-Section 9.
-
-@x l.173
+@x
int input_ln(fp) /* copies a line into |buffer| or returns 0 */
FILE *fp; /* what file to read from */
@y
-int input_ln (FILE *fp) /* copies a line into |buffer| or returns 0 */
+static boolean input_ln(@t\1\1@> /* copies a line into |buffer| or returns 0 */
+FILE *fp@t\2\2@>) /* what file to read from */
@z
-@x l.181
+@x
if ((*(k++) = c) != ' ') limit = k;
@y
- if ((*(k++) = c) != ' ' && c!='\r') limit = k;
+ if ((*(k++) = c) != ' ' && c != '\r') limit = k;
@z
-Section 10.
+@x
+ ungetc(c,fp); loc=buffer; err_print("! Input line too long");
+@y
+ ungetc(c,fp); loc=buffer; err_print(_("! Input line too long"));
+@z
-@x l.207 - max_file_name_length is way too small.
+@x
@d max_file_name_length 60
@y
@d max_file_name_length 1024
@z
-@x l.221 - no alt_web_file_name needed.
+@x
char alt_web_file_name[max_file_name_length]; /* alternate name to try */
@y
@z
-Section 12.
+@x
+@d lines_dont_match (change_limit-change_buffer != limit-buffer ||
+ strncmp(buffer, change_buffer, limit-buffer))
+@y
+@d lines_dont_match (change_limit-change_buffer != limit-buffer || @|
+ strncmp(buffer, change_buffer, (size_t)(limit-buffer)))
+@z
-@x l.252
+@x
void
prime_the_change_buffer()
@y
static void
-prime_the_change_buffer (void)
+prime_the_change_buffer(void)
@z
-@x l.271
+@x
if (xisupper(buffer[1])) buffer[1]=tolower(buffer[1]);
@y
- if (xisupper(buffer[1])) buffer[1]=tolower((unsigned char)buffer[1]);
+ if (xisupper(buffer[1])) buffer[1]=tolower((eight_bits)buffer[1]);
+@z
+
+@x
+ err_print("! Missing @@x in change file");
+@y
+ err_print(_("! Missing @@x in change file"));
@z
-Section 16.
+@x
+ err_print("! Change file ended after @@x");
+@y
+ err_print(_("! Change file ended after @@x"));
+@z
+
+@x
+ change_limit=change_buffer+(limit-buffer);
+ strncpy(change_buffer,buffer,limit-buffer+1);
+@y
+ change_limit=change_buffer+(ptrdiff_t)(limit-buffer);
+ strncpy(change_buffer,buffer,(size_t)(limit-buffer+1));
+@z
-@x l.321
+@x
void
check_change() /* switches to |change_file| if the buffers match */
@y
static void
-check_change (void) /* switches to |change_file| if the buffers match */
+check_change(void) /* switches to |change_file| if the buffers match */
@z
-@x l.340
+@x
+ err_print("! Change file ended before @@y");
+@y
+ err_print(_("! Change file ended before @@y"));
+@z
+
+@x
char xyz_code=xisupper(buffer[1])? tolower(buffer[1]): buffer[1];
@y
- char xyz_code=xisupper(buffer[1])? tolower((unsigned char)buffer[1]): buffer[1];
+ char xyz_code=xisupper(buffer[1])? tolower((eight_bits)buffer[1]): buffer[1];
@z
-Section 18.
+@x
+ err_print("! CWEB file ended during a change");
+@y
+ err_print(_("! CWEB file ended during a change"));
+@z
-@x l.380
-reset_input()
+@x
+ loc=buffer+2; err_print("! Where is the matching @@y?");
@y
-reset_input (void)
+ loc=buffer+2; err_print(_("! Where is the matching @@y?"));
@z
-Section 19.
+@x
+ err_print("of the preceding lines failed to match");
+@y
+ err_print(_("of the preceding lines failed to match"));
+@z
-@x l.394
+@x
+void
+reset_input()
+@y
+void
+reset_input(void)
+@z
+
+@x
if ((web_file=fopen(web_file_name,"r"))==NULL) {
strcpy(web_file_name,alt_web_file_name);
if ((web_file=fopen(web_file_name,"r"))==NULL)
fatal("! Cannot open input file ", web_file_name);
}
@y
-if ((found_filename=kpse_find_cweb(web_file_name))==NULL ||
+if ((found_filename=kpse_find_cweb(web_file_name))==NULL || @|
(web_file=fopen(found_filename,"r"))==NULL) {
- fatal("! Cannot open input file ", web_file_name);
+ fatal(_("! Cannot open input file "), web_file_name);
} else if (strlen(found_filename) < max_file_name_length) {
- strcpy(web_file_name, found_filename);
+ if (strcmp(web_file_name, found_filename))
+ strcpy(web_file_name, found_filename +
+ ((found_filename[0]=='.' && found_filename[1]=='/') ? 2 : 0));
free(found_filename);
-}
+} else fatal(_("! Filename too long\n"), found_filename);
@z
-@x l.402
+@x
if ((change_file=fopen(change_file_name,"r"))==NULL)
fatal("! Cannot open change file ", change_file_name);
@y
-if ((found_filename=kpse_find_cweb(change_file_name))==NULL ||
+if ((found_filename=kpse_find_cweb(change_file_name))==NULL || @|
(change_file=fopen(found_filename,"r"))==NULL) {
- fatal("! Cannot open change file ", change_file_name);
+ fatal(_("! Cannot open change file "), change_file_name);
} else if (strlen(found_filename) < max_file_name_length) {
- strcpy(change_file_name, found_filename);
+ if (strcmp(change_file_name, found_filename))
+ strcpy(change_file_name, found_filename +
+ ((found_filename[0]=='.' && found_filename[1]=='/') ? 2 : 0));
free(found_filename);
-}
+} else fatal(_("! Filename too long\n"), found_filename);
@z
-@x l.415
+@x
@d max_sections 2000 /* number of identifiers, strings, section names;
+ must be less than 10240 */
@y
@d max_sections 10239 /* number of identifiers, strings, section names;
+ must be less than 10240 */
@z
-Section 21.
+@x
+typedef unsigned short sixteen_bits;
+@y
+typedef uint8_t eight_bits;
+typedef uint16_t sixteen_bits;
+@z
-@x l.427
+@x
int get_line() /* inputs the next line */
@y
-int get_line (void) /* inputs the next line */
+boolean get_line(void) /* inputs the next line */
@z
-Section 22.
-
-@x l.472
-#include <stdlib.h> /* declaration of |getenv| and |exit| */
+@x
+ err_print("! Include file name not given");
@y
-#include <kpathsea/kpathsea.h> /* include every \Kpathsea/ header */
-#include <stdlib.h> /* declaration of |getenv| and |exit| */
-#include "help.h"
-
-@ The \.{ctangle} and \.{cweave} programs from the original \.{CWEB}
-package use the compile-time default directory or the value of the
-environment variable \.{CWEBINPUTS} as an alternative place to be
-searched for files, if they could not be found in the current
-directory.
-
-This version uses the \Kpathsea/ mechanism for searching files.
-The directories to be searched for come from three sources:
-
- (a)~a user-set environment variable \.{CWEBINPUTS}
- (overriden by \.{CWEBINPUTS\_cweb});\par
- (b)~a line in \Kpathsea/ configuration file \.{texmf.cnf},\hfil\break
- e.g. \.{CWEBINPUTS=.:$TEXMF/texmf/cweb//}
- or \.{CWEBINPUTS.cweb=.:$TEXMF/texmf/cweb//};\hangindent=2\parindent\par
- (c)~compile-time default directories \.{.:$TEXMF/texmf/cweb//}
- (specified in \.{texmf.in}).
-
-
-@d kpse_find_cweb(name) kpse_find_file(name,kpse_cweb_format,true)
-
-@ The simple file searching is replaced by `path searching' mechanism
-that \Kpathsea/ library provides.
-
-We set |kpse_program_name| to a |"cweb"|. This means if the
-variable |CWEBINPUTS.cweb| is present in \.{texmf.cnf} (or |CWEBINPUTS_cweb|
-in the environment) its value will be used as the search path for
-filenames. This allows different flavors of \.{CWEB} to have
-different search paths.
-
-FIXME: Not sure this is the best way to go about this.
+ err_print(_("! Include file name not given"));
+@z
-@<Set up |PROGNAME| feature and initialize the search path mechanism@>=
-kpse_set_program_name(argv[0], "cweb");
+@x
+ err_print("! Too many nested includes");
+@y
+ err_print(_("! Too many nested includes"));
@z
+@x
+@ When an \.{@@i} line is found in the |cur_file|, we must temporarily
+stop reading it and start reading from the named include file. The
+\.{@@i} line should give a complete file name with or without
+double quotes.
+If the environment variable \.{CWEBINPUTS} is set, or if the compiler flag
+of the same name was defined at compile time,
+\.{CWEB} will look for include files in the directory thus named, if
+it cannot find them in the current directory.
+(Colon-separated paths are not supported.)
+The remainder of the \.{@@i} line after the file name is ignored.
+@y
+@ When an \.{@@i} line is found in the |cur_file|, we must temporarily
+stop reading it and start reading from the named include file. The
+\.{@@i} line should give a complete file name with or without
+double quotes.
+The actual file lookup is done with the help of the \Kpathsea/ library;
+see section~\X90:File lookup with \Kpathsea/\X~for details. % FIXME
+The remainder of the \.{@@i} line after the file name is ignored.
+@z
-Section 23.
+@x
+ err_print("! Include file name too long"); goto restart;}
+@y
+ err_print(_("! Include file name too long")); goto restart;}
+@z
-@x l.475
+@x
char temp_file_name[max_file_name_length];
char *cur_file_name_end=cur_file_name+max_file_name_length-1;
char *k=cur_file_name, *kk;
@@ -261,21 +318,21 @@ Section 23.
char *k=cur_file_name;
@z
-@x l.489
+@x
if ((cur_file=fopen(cur_file_name,"r"))!=NULL) {
@y
- if ((found_filename=kpse_find_cweb(cur_file_name))!=NULL &&
+ if ((found_filename=kpse_find_cweb(cur_file_name))!=NULL && @|
(cur_file=fopen(found_filename,"r"))!=NULL) {
- /* Copy name for #line directives. */
+ /* Copy name for |#line| directives. */
if (strlen(found_filename) < max_file_name_length) {
- strcpy(cur_file_name, found_filename);
+ if (strcmp(cur_file_name, found_filename))
+ strcpy(cur_file_name, found_filename +
+ ((found_filename[0]=='.' && found_filename[1]=='/') ? 2 : 0));
free(found_filename);
- }
+ } else fatal(_("! Filename too long\n"), found_filename);
@z
-Replaced by Kpathsea `kpse_find_file'
-
-@x l.493
+@x
kk=getenv("CWEBINPUTS");
if (kk!=NULL) {
if ((l=strlen(kk))>max_file_name_length-2) too_long();
@@ -300,178 +357,190 @@ Replaced by Kpathsea `kpse_find_file'
goto restart; /* success */
}
}
+ include_depth--; err_print("! Cannot open include file"); goto restart;
@y
+ include_depth--; err_print(_("! Cannot open include file")); goto restart;
@z
-Section 26.
+@x
+ err_print("! Change file ended without @@z");
+@y
+ err_print(_("! Change file ended without @@z"));
+@z
-@x l.553
+@x
if (xisupper(buffer[1])) buffer[1]=tolower(buffer[1]);
@y
- if (xisupper(buffer[1])) buffer[1]=tolower((unsigned char)buffer[1]);
+ if (xisupper(buffer[1])) buffer[1]=tolower((eight_bits)buffer[1]);
+@z
+
+@x
+ err_print("! Where is the matching @@z?");
+@y
+ err_print(_("! Where is the matching @@z?"));
@z
-@x l.571
+@x
+void
check_complete(){
+ if (change_limit!=change_buffer) { /* |changing| is 0 */
+ strncpy(buffer,change_buffer,change_limit-change_buffer+1);
+ limit=buffer+(int)(change_limit-change_buffer);
@y
-check_complete (void) {
+void
+check_complete(void) {
+ if (change_limit!=change_buffer) { /* |changing| is 0 */
+ strncpy(buffer,change_buffer,(size_t)(change_limit-change_buffer+1));
+ limit=buffer+(ptrdiff_t)(change_limit-change_buffer);
@z
-@x l.589
-@d max_bytes 90000 /* the number of bytes in identifiers,
+@x
+ err_print("! Change file entry did not match");
@y
-@d max_bytes 1000000 /* the number of bytes in identifiers,
+ err_print(_("! Change file entry did not match"));
@z
-@x l.591
+@x
+@d max_bytes 90000 /* the number of bytes in identifiers,
+ index entries, and section names; must be less than $2^{24}$ */
@d max_names 4000 /* number of identifiers, strings, section names;
+ must be less than 10240 */
@y
+@d max_bytes 1000000 /* the number of bytes in identifiers,
+ index entries, and section names; must be less than $2^{24}$ */
@d max_names 10239 /* number of identifiers, strings, section names;
+ must be less than 10240 */
+@z
+
+@x
+@d length(c) (c+1)->byte_start-(c)->byte_start /* the length of a name */
+@y
+@d length(c) (size_t)((c+1)->byte_start-(c)->byte_start) /* the length of a name */
@z
-@x l.642
+@x
@d hash_size 353 /* should be prime */
@y
@d hash_size 8501 /* should be prime */
@z
-Section 33.
-
-@x l.650
-@ @<Predec...@>=
+@x
extern int names_match();
@y
-@ @<External functions@>=
-extern int names_match (name_pointer, const char*, int, char);
+extern boolean names_match(name_pointer,const char *,size_t,eight_bits);@/
@z
-Section 35.
-
-@x l.661
+@x
+name_pointer
id_lookup(first,last,t) /* looks up a string in the identifier table */
char *first; /* first character of string */
char *last; /* last character of string plus one */
char t; /* the |ilk|; used by \.{CWEAVE} only */
-@y
-/* looks up a string in the identifier table */
-id_lookup (const char *first, const char *last, char t)
-@z
-
-@x l.667
+{
char *i=first; /* position in |buffer| */
@y
+name_pointer
+id_lookup(@t\1\1@> /* looks up a string in the identifier table */
+const char *first, /* first character of string */
+const char *last, /* last character of string plus one */
+char t@t\2\2@>) /* the |ilk|; used by \.{CWEAVE} only */
+{
const char *i=first; /* position in |buffer| */
@z
-@x l.668 - rename local var, not to shadow global
- int h; /* hash code */
-@y
- int h; /* hash code */
-@z
-
-Section 36.
-
-@x l.684 - use renamed local var
-h=(unsigned char)*i;
-while (++i<last) h=(h+h+(int)((unsigned char)*i)) % hash_size;
+@x
+ l=last-first; /* compute the length */
@y
-h=(unsigned char)*i;
-while (++i<last) h=(h+h+(int)((unsigned char)*i)) % hash_size;
+ l=(int)(last-first); /* compute the length */
@z
-Section 37.
-
-@x l.692 - use renamed local var
-p=hash[h];
+@x
+void init_p();
@y
-p=hash[h];
+extern void init_p(name_pointer,eight_bits);@/
@z
-@x l.696 - use renamed local var
- p->link=hash[h]; hash[h]=p; /* insert |p| at beginning of hash list */
+@x
+ if (byte_ptr+l>byte_mem_end) overflow("byte memory");
+ if (name_ptr>=name_dir_end) overflow("name");
@y
- p->link=hash[h]; hash[h]=p; /* insert |p| at beginning of hash list */
+ if (byte_ptr+l>byte_mem_end) overflow(_("byte memory"));
+ if (name_ptr>=name_dir_end) overflow(_("name"));
@z
-Section 38.
-
-@x l.703
-@<Pred...@>=
-void init_p();
+@x
+ if (program==cweave) init_p(p,t);
@y
-@<External functions@>=
-extern void init_p (name_pointer p, char t);
+ init_p(p,t);
@z
-Section 42.
-
-@x l.766
+@x
+void
print_section_name(p)
name_pointer p;
@y
-print_section_name (name_pointer p)
+void
+print_section_name(
+name_pointer p)
@z
-Section 43.
+@x
+ term_write(s,ss-s); p=q->link; q=p;
+ } else {
+ term_write(s,ss+1-s); p=name_dir; q=NULL;
+@y
+ term_write(s,(size_t)(ss-s)); p=q->link; q=p;
+ } else {
+ term_write(s,(size_t)(ss+1-s)); p=name_dir; q=NULL;
+@z
-@x l.785
+@x
+void
sprint_section_name(dest,p)
char*dest;
name_pointer p;
@y
-sprint_section_name (char *dest, name_pointer p)
+void
+sprint_section_name(
+ char *dest,
+ name_pointer p)
@z
-Section 44.
+@x
+ strncpy(dest,s,ss-s), dest+=ss-s;
+@y
+ strncpy(dest,s,(size_t)(ss-s)), dest+=ss-s;
+@z
-@x l.805
+@x
void
print_prefix_name(p)
name_pointer p;
@y
-static void
-print_prefix_name (name_pointer p)
+void
+print_prefix_name(
+name_pointer p)
@z
-Section 45.
-
-@x l.826
+@x
int web_strcmp(j,j_len,k,k_len) /* fuller comparison than |strcmp| */
char *j, *k; /* beginning of first and second strings */
int j_len, k_len; /* length of strings */
@y
-/* fuller comparison than |strcmp| */
-static int
-web_strcmp (char *j, int j_len, char *k, int k_len)
-@z
-
-@x l.830 -- rename local vars, not to shadow math function
- char *j1=j+j_len, *k1=k+k_len;
- while (k<k1 && j<j1 && *j==*k) k++, j++;
- if (k==k1) if (j==j1) return equal;
- else return extension;
- else if (j==j1) return prefix;
-@y
- char *j1=j+j_len, *k1=k+k_len;
- while (k<k1 && j<j1 && *j==*k) k++, j++;
- if (k==k1) if (j==j1) return equal;
- else return extension;
- else if (j==j1) return prefix;
+static int web_strcmp(@t\1\1@> /* fuller comparison than |strcmp| */
+ char *j, /* beginning of first string */
+ int j_len, /* length of first string */
+ char *k, /* beginning of second string */
+ int k_len@t\2\2@>) /* length of second string */
@z
-Section 46.
-
-@x l.852
-@<Prede...@>=
+@x
extern void init_node();
@y
-@<External functions@>=
-extern void init_node (name_pointer node);
+extern void init_node(name_pointer);@/
@z
-Section 47.
-
-@x l.856
+@x
name_pointer
add_section_name(par,c,first,last,ispref) /* install a new node in the tree */
name_pointer par; /* parent of new node */
@@ -481,13 +550,29 @@ char *last; /* last character of section name, plus one */
int ispref; /* are we adding a prefix or a full name? */
@y
static name_pointer
-add_section_name (name_pointer par, int c, char *first, char *last,
- int ispref) /* install a new node in the tree */
+add_section_name(@t\1\1@> /* install a new node in the tree */
+name_pointer par, /* parent of new node */
+int c, /* right or left? */
+char *first, /* first character of section name */
+char *last, /* last character of section name, plus one */
+int ispref@t\2\2@>) /* are we adding a prefix or a full name? */
@z
-Section 48.
+@x
+ int name_len=last-first+ispref; /* length of section name */
+@y
+ int name_len=(int)(last-first)+ispref; /* length of section name */
+@z
-@x l.885
+@x
+ if (s+name_len>byte_mem_end) overflow("byte memory");
+ if (name_ptr+1>=name_dir_end) overflow("name");
+@y
+ if (s+name_len>byte_mem_end) overflow(_("byte memory"));
+ if (name_ptr+1>=name_dir_end) overflow(_("name"));
+@z
+
+@x
void
extend_section_name(p,first,last,ispref)
name_pointer p; /* name to be extended */
@@ -496,129 +581,285 @@ char *last; /* one beyond end of extension text */
int ispref; /* are we adding a prefix or a full name? */
@y
static void
-extend_section_name (name_pointer p, char *first, char *last, int ispref)
+extend_section_name(@t\1\1@>
+name_pointer p, /* name to be extended */
+char *first, /* beginning of extension text */
+char *last, /* one beyond end of extension text */
+int ispref@t\2\2@>) /* are we adding a prefix or a full name? */
+@z
+
+@x
+ int name_len=last-first+ispref;
+@y
+ int name_len=(int)(last-first)+ispref;
@z
-Section 49.
+@x
+ if (name_ptr>=name_dir_end) overflow("name");
+@y
+ if (name_ptr>=name_dir_end) overflow(_("name"));
+@z
-@x l.914
+@x
+ if (s+name_len>byte_mem_end) overflow("byte memory");
+@y
+ if (s+name_len>byte_mem_end) overflow(_("byte memory"));
+@z
+
+@x
+name_pointer
section_lookup(first,last,ispref) /* find or install section name in tree */
char *first, *last; /* first and last characters of new name */
int ispref; /* is the new name a prefix or a full name? */
@y
-/* find or install section name in tree */
-section_lookup (char *first, char *last, int ispref)
+name_pointer
+section_lookup(@t\1\1@> /* find or install section name in tree */
+char *first,char *last, /* first and last characters of new name */
+int ispref@t\2\2@>) /* is the new name a prefix or a full name? */
@z
-Section 53.
+@x
+ int name_len=last-first+1;
+@y
+ int name_len=(int)(last-first)+1;
+@z
-@x l.1018
-int section_name_cmp();
+@x
+ printf("\n! Ambiguous prefix: matches <");
+@y
+ fputs(_("\n! Ambiguous prefix: matches <"),stdout);
+@z
+
+@x
+ printf(">\n and <");
@y
-static int section_name_cmp (char**, int, name_pointer);
+ fputs(_(">\n and <"),stdout);
@z
-Section 54.
+@x
+ printf("\n! New name is a prefix of <");
+@y
+ fputs(_("\n! New name is a prefix of <"),stdout);
+@z
-@x l.1021
+@x
+ printf("\n! New name extends <");
+@y
+ fputs(_("\n! New name extends <"),stdout);
+@z
+
+@x
+ printf("\n! Section name incompatible with <");
+@y
+ fputs(_("\n! Section name incompatible with <"),stdout);
+@z
+
+@x
+ printf(">,\n which abbreviates <");
+@y
+ fputs(_(">,\n which abbreviates <"),stdout);
+@z
+
+@x
+int section_name_cmp();
+@y
+static int section_name_cmp(char **,int,name_pointer);@/
+@z
+
+@x
int section_name_cmp(pfirst,len,r)
char **pfirst; /* pointer to beginning of comparison string */
int len; /* length of string */
name_pointer r; /* section name being compared */
@y
-static int
-section_name_cmp (char **pfirst, int len, name_pointer r)
+static int section_name_cmp(@t\1\1@>
+char **pfirst, /* pointer to beginning of comparison string */
+int len, /* length of string */
+name_pointer r@t\2\2@>) /* section name being compared */
@z
-Section 57.
+@x
+ *pfirst=first+(ss-s);
+@y
+ *pfirst=first+(ptrdiff_t)(ss-s);
+@z
-@x l.1092
-@<Predecl...@>=
-void err_print();
+@x
+ if (q!=name_dir) {len -= ss-s; s=q->byte_start; r=q; continue;}
+@y
+ if (q!=name_dir) {len -= (int)(ss-s); s=q->byte_start; r=q; continue;}
+@z
+
+@x
+|equiv_or_xref| as a pointer to a |char|.
+
+@<More elements of |name...@>=
+char *equiv_or_xref; /* info corresponding to names */
@y
-@<External functions@>=
-extern void err_print (const char*);
+|equiv_or_xref| as a pointer to |void|.
+
+@<More elements of |name...@>=
+void *equiv_or_xref; /* info corresponding to names */
@z
-Section 58.
+@x
+void err_print();
+@y
+extern void err_print(const char *);@/
+@z
-@x l.1098
+@x
+void
err_print(s) /* prints `\..' and location of error message */
char *s;
@y
-err_print (const char *s) /* prints `\..' and location of error message */
+void
+err_print(@t\1\1@> /* prints `\..' and location of error message */
+const char *s@t\2\2@>)
@z
-Section 60.
+@x
+ printf(". (l. %d of change file)\n", change_line);
+else if (include_depth==0) printf(". (l. %d)\n", cur_line);
+ else printf(". (l. %d of include file %s)\n", cur_line, cur_file_name);
+@y
+ printf(_(". (l. %d of change file)\n"), change_line);
+else if (include_depth==0) printf(_(". (l. %d)\n"), cur_line);
+ else printf(_(". (l. %d of include file %s)\n"), cur_line, cur_file_name);
+@z
-@x l.1140
-@<Prede...@>=
+@x
int wrap_up();
extern void print_stats();
@y
-@<External functions@>=
-extern int wrap_up (void);
-extern void print_stats (void);
+extern int wrap_up(void);@/
+extern void print_stats(void);@/
@z
-Section 61.
+@x
+@ Some implementations may wish to pass the |history| value to the
+operating system so that it can be used to govern whether or not other
+programs are started. Here, for instance, we pass the operating system
+a status of 0 if and only if only harmless messages were printed.
+@^system dependencies@>
+@y
+@ On multi-tasking systems like the {\mc AMIGA} it is very convenient to
+know a little bit more about the reasons why a program failed. The four
+levels of return indicated by the |history| value are very suitable for
+this purpose. Here, for instance, we pass the operating system a status
+of~0 if and only if the run was a complete success. Any warning or error
+message will result in a higher return value, so that {\mc AREXX} scripts
+can be made sensitive to these conditions.
+@^system dependencies@>
+
+@d RETURN_OK 0 /* No problems, success */
+@d RETURN_WARN 5 /* A warning only */
+@d RETURN_ERROR 10 /* Something wrong */
+@d RETURN_FAIL 20 /* Complete or severe failure */
+@z
-@x l.1151
+@x
int wrap_up() {
+ putchar('\n');
+@y
+int wrap_up(void) {
+ if (show_progress) new_line;
+@z
+
+@x
+ @<Print the job |history|@>;
@y
-int wrap_up (void) {
+ @<Print the job |history|@>@;
+ @<Remove the temporary file if not already done@>@;
@z
-Section 63.
+@x
+ if (history > harmless_message) return(1);
+ else return(0);
+@y
+ switch(history) {
+ case harmless_message: return RETURN_WARN;
+ case error_message: return RETURN_ERROR;
+ case fatal_message: return RETURN_FAIL;
+ default: return RETURN_OK;
+ }
+@z
+
+@x
+case spotless: if (show_happiness) printf("(No errors were found.)\n"); break;
+case harmless_message:
+ printf("(Did you see the warning message above?)\n"); break;
+case error_message:
+ printf("(Pardon me, but I think I spotted something wrong.)\n"); break;
+case fatal_message: printf("(That was a fatal error, my friend.)\n");
+@y
+case spotless:
+ if (show_happiness) puts(_("(No errors were found.)")); break;
+case harmless_message:
+ puts(_("(Did you see the warning message above?)")); break;
+case error_message:
+ puts(_("(Pardon me, but I think I spotted something wrong.)")); break;
+case fatal_message:
+ puts(_("(That was a fatal error, my friend.)"));
+@z
-@x l.1173
-@<Predec...@>=
+@x
void fatal(), overflow();
@y
-@<External functions@>=
-extern void fatal (const char*, const char*);
-extern void overflow (const char*);
+extern void fatal(const char *,const char *);@/
+extern void overflow(const char *);@/
@z
-Section 64.
-
-@x l.1180
+@x
+@c void
fatal(s,t)
char *s,*t;
@y
-fatal (const char *s, const char *t)
+@c void
+fatal(
+ const char *s,const char *t)
@z
-@x l.1183
+@x
if (*s) printf(s);
@y
- if (*s) printf("%s",s);
+ if (*s) fputs(s,stdout);
@z
-Section 65.
-
-@x l.1191
+@x
+@c void
overflow(t)
char *t;
@y
-overflow (const char *t)
+@c void
+overflow(
+ const char *t)
@z
-Section 67.
+@x
+ printf("\n! Sorry, %s capacity exceeded",t); fatal("","");
+@y
+ printf(_("\n! Sorry, %s capacity exceeded"),t); fatal("","");
+@z
+
+@x
+@d confusion(s) fatal("! This can't happen: ",s)
+@y
+@d confusion(s) fatal(_("! This can't happen: "),s)
+@z
-@x l.1212
+@x
the names of those files. Most of the 128 flags are undefined but available
for future extensions.
@y
the names of those files. Most of the 128 flags are undefined but available
for future extensions.
-We use `kpathsea' library functions to find literate sources and
-NLS configuration files. When the files you expect are not
-being found, the thing to do is to enable `kpathsea' runtime
-debugging by assigning to |kpathsea_debug| variable a small number
-via `\.{-d}' option. The meaning of number is shown below. To set
-more than one debugging options sum the corresponding numbers.
+We use `kpathsea' library functions to find literate sources. When the files
+you expect are not found, the thing to do is to enable `kpathsea' runtime
+debugging by assigning to the |kpathsea_debug| variable a small number via the
+`\.{-d}' option. The meaning of this number is shown below. To set more than
+one debugging option, simply sum the corresponding numbers.
$$\halign{\hskip5em\tt\hfil#&&\qquad\tt#\cr
1&report `\.{stat}' calls\cr
2&report lookups in all hash tables\cr
@@ -631,85 +872,173 @@ Debugging output is always written to |stderr|, and begins with the string
`\.{kdebug:}'.
@z
-@x l.1218
+@x
@d show_happiness flags['h'] /* should lack of errors be announced? */
@y
@d show_happiness flags['h'] /* should lack of errors be announced? */
@d show_kpathsea_debug flags['d']
/* should results of file searching be shown? */
+@d make_xrefs flags['x'] /* should cross references be output? */
@z
-@x l.1234
-show_banner=show_happiness=show_progress=1;
+@x
+char scn_file_name[max_file_name_length]; /* name of |scn_file| */
@y
-show_banner=show_happiness=show_progress=1;
+char scn_file_name[max_file_name_length]; /* name of |scn_file| */
+char check_file_name[max_file_name_length]; /* name of |check_file| */
@z
-Section 69.
+@x
+boolean flags[128]; /* an option for each 7-bit code */
+@y
+boolean flags[128]; /* an option for each 7-bit code */
+const char *use_language=""; /* prefix of \.{cwebmac.tex} in \TEX/ output */
+@z
-@x l.1252
-void scan_args();
+@x
+show_banner=show_happiness=show_progress=1;
@y
-static void scan_args (void);
@z
+@x
+An omitted change file argument means that |"/dev/null"| should be used,
+when no changes are desired.
+@y
+An omitted change file argument means that |"/dev/null"| or---on non-\UNIX/
+systems the contents of the compile-time variable |DEV_NULL| (\TeX~Live) or
+|_DEV_NULL| (Amiga)---should be used, when no changes are desired.
+@z
-Section 70.
+@x
+void scan_args();
+@y
+static void scan_args(void);@/
+@z
-@x l.1255
+@x
void
scan_args()
@y
static void
-scan_args (void)
+scan_args(void)
@z
+@x
+ boolean flag_change;
+@y
+@z
+
+@x
+ while (--argc > 0) {
+@y
+@#
+#if defined DEV_NULL
+ strncpy(change_file_name,DEV_NULL,max_file_name_length-2);
+ change_file_name[max_file_name_length-2]='\0';
+#elif defined _DEV_NULL
+ strncpy(change_file_name,_DEV_NULL,max_file_name_length-2);
+ change_file_name[max_file_name_length-2]='\0';
+#else
+ strcpy(change_file_name,"/dev/null");
+#endif
+@^system dependencies@>
+ while (--argc > 0) {
+@z
-Section 71.
+@x
+ while (*s) {
+ if (*s=='.') dot_pos=s++;
+ else if (*s=='/') dot_pos=NULL,name_pos=++s;
+ else s++;
+ }
+@y
+ while (*s) {
+ if (*s=='.') dot_pos=s++;
+ else if (*s==DIR_SEPARATOR || *s==DEVICE_SEPARATOR || *s=='/')
+ dot_pos=NULL,name_pos=++s;
+ else s++;
+ }
+@^system dependencies@>
+@z
-@x l.1282 - use a define for /dev/null
+@x
if (found_change<=0) strcpy(change_file_name,"/dev/null");
@y
- if (found_change<=0) strcpy(change_file_name,DEV_NULL);
@z
-@x l.1302 - no alt_web_file_name
+@x
+@ We use all of |*argv| for the |web_file_name| if there is a |'.'| in it,
+otherwise we add |".w"|. If this file can't be opened, we prepare an
+|alt_web_file_name| by adding |"web"| after the dot.
+The other file names come from adding other things
+after the dot. We must check that there is enough room in
+|web_file_name| and the other arrays for the argument.
+@y
+@ We use all of |*argv| for the |web_file_name| if there is a |'.'| in it,
+otherwise we add |".w"|. The other file names come from adding other things
+after the dot. We must check that there is enough room in |web_file_name| and
+the other arrays for the argument.
+@z
+
+@x
sprintf(alt_web_file_name,"%s.web",*argv);
@y
@z
+@x
+ if (strcmp(*argv,"-")==0) found_change=-1;
+ else {
+@y
+ if (strcmp(*argv,"-")!=0) {
+@z
-Section 74.
+@x
+ found_change=1;
+ }
+@y
+ }
+ found_change=1;
+@z
-@x l.1344
+@x
+ if (flags['x']) { /* indexes will be generated */
+@y
+ if (make_xrefs) { /* indexes will be generated */
+@z
+
+@x
@ @<Handle flag...@>=
{
+ if (**argv=='-') flag_change=0;
+ else flag_change=1;
+ for(dot_pos=*argv+1;*dot_pos>'\0';dot_pos++)
@y
-@ @<Handle flag...@>=
+@ @d flag_change (**argv!='-')
+@<Handle flag...@>=
{
if (strcmp("-help",*argv)==0 || strcmp("--help",*argv)==0)
- @<Display help message and exit@>;
+@.--help@>
+ @<Display help message and exit@>@;
if (strcmp("-version",*argv)==0 || strcmp("--version",*argv)==0)
- @<Display version information and exit@>;
-@z
-
-@x l.1347
- else flag_change=1;
-@y
- else flag_change=1;
- if (*(*argv+1)=='d')
- if (sscanf(*argv+2,"%u",&kpathsea_debug)!=1) @<Print usage error...@>;
+@.--version@>
+ @<Display version information and exit@>@;
+ for(dot_pos=*argv+1;*dot_pos>'\0';dot_pos++)
+ if (*dot_pos=='d') {
+ if (sscanf(*argv+2,"%u",&kpathsea_debug)!=1) @<Print usage error...@>@;
+ } else
+ if(*dot_pos=='l') {
+ use_language=++dot_pos;
+ break;
+ } else
@z
-@x l.1349
+@x
flags[*dot_pos]=flag_change;
@y
- flags[(unsigned char)*dot_pos]=flag_change;
+ flags[(eight_bits)*dot_pos]=flag_change;
@z
-Section 75.
-
-@x l.1354
+@x
if (program==ctangle)
fatal(
"! Usage: ctangle [options] webfile[.w] [{changefile[.ch]|-} [outfile[.c]]]\n"
@@ -719,42 +1048,69 @@ else fatal(
"! Usage: cweave [options] webfile[.w] [{changefile[.ch]|-} [outfile[.tex]]]\n"
,"");
@y
-if (program==ctangle) {
- fprintf(stderr, "ctangle: Need one to three file arguments.\n");
- usage("ctangle");
-} else {
- fprintf(stderr, "cweave: Need one to three file arguments.\n");
- usage("cweave");
-}
+cb_usage(program==ctangle ? "ctangle" : program==cweave ? "cweave" : "ctwill");
+@.Usage:@>
+@z
+
+@x
+@ @<Complain about arg...@>= fatal("! Filename too long\n", *argv);
+@y
+@ @<Complain about arg...@>= fatal(_("! Filename too long\n"), *argv);
@z
-Section 77.
+@x
+FILE *scn_file; /* where list of sections from \.{CWEAVE} goes */
+@y
+FILE *scn_file; /* where list of sections from \.{CWEAVE} goes */
+FILE *check_file; /* temporary output file */
+@z
-@x l.1375
+@x
FILE *active_file; /* currently active file for \.{CWEAVE} output */
@y
FILE *active_file; /* currently active file for \.{CWEAVE} output */
char *found_filename; /* filename found by |kpse_find_file| */
@z
-Section 78.
-
-@x l.1380 Use binary mode for output files
+@x
+@ @<Scan arguments and open output files@>=
+scan_args();
+if (program==ctangle) {
if ((C_file=fopen(C_file_name,"w"))==NULL)
-@y
- if ((C_file=fopen(C_file_name,"wb"))==NULL)
-@z
-
-@x l.1386 Use binary mode for output files
+ fatal("! Cannot open output file ", C_file_name);
+@.Cannot open output file@>
+}
+else {
if ((tex_file=fopen(tex_file_name,"w"))==NULL)
+ fatal("! Cannot open output file ", tex_file_name);
+}
@y
- if ((tex_file=fopen(tex_file_name,"wb"))==NULL)
+@ @<Scan arguments and open output files@>=
+scan_args();
+if (program==ctangle) {
+ strcpy(check_file_name,C_file_name);
+ if(check_file_name[0]!='\0') {
+ char *dot_pos=strrchr(check_file_name,'.');
+ if(dot_pos==NULL) strcat(check_file_name,".ttp");
+ else strcpy(dot_pos,".ttp");
+ }
+ if ((C_file=fopen(check_file_name,"wb"))==NULL)
+ fatal(_("! Cannot open output file "), check_file_name);
+@.Cannot open output file@>
+}
+else {
+ strcpy(check_file_name,tex_file_name);
+ if(check_file_name[0]!='\0') {
+ char *dot_pos=strrchr(check_file_name,'.');
+ if(dot_pos==NULL) strcat(check_file_name,".wtp");
+ else strcpy(dot_pos,".wtp");
+ }
+ if ((tex_file=fopen(check_file_name,"wb"))==NULL)
+ fatal(_("! Cannot open output file "), check_file_name);
+}
@z
-
-Section 81. (reused)
-
-@x l.1403
+@x
@ We predeclare several standard system functions here instead of including
their system header files, because the names of the header files are not as
standard as the names of the functions. (For example, some \CEE/ environments
@@ -767,51 +1123,240 @@ extern char* strcpy(); /* copy one string to another */
extern int strncmp(); /* compare up to $n$ string characters */
extern char* strncpy(); /* copy up to $n$ string characters */
@y
-@ We declare some more prototypes for exported function in cases where this
-could not be done easily without changing section numbers.
+@ For string handling we include the {\mc ANSI C} system header file instead
+of predeclaring the standard system functions |strlen|, |strcmp|, |strcpy|,
+|strncmp|, and |strncpy|.
+@^system dependencies@>
-@<External functions@>=
-extern void common_init (void);
-extern int input_ln (FILE *fp);
-extern void reset_input (void);
-extern int get_line (void);
-extern void check_complete (void);
-extern name_pointer id_lookup (const char *first, const char *last, char t);
-extern void print_section_name (name_pointer p);
-extern void sprint_section_name (char *dest, name_pointer p);
-extern name_pointer section_lookup (char *first, char *last, int ispref);
+@<Include...@>=
+#include <string.h>
@z
@x
@** Index.
@y
-@** External functions. In order to allow for type checking we create a
-header file \.{cweb.h} containing the declaration of all functions defined
-in \.{common.w} and used in \.{ctangle.w} and \.{cweave.w} or vice versa.
+@** Extensions for modern \.{CWEB}.
+
+The following sections introduce code changes and extensions that have been
+created by numerous contributors over the course of a quarter century. They
+make \.{CWEB} adhere to modern coding standards and introduce new or improved
+features.
+
+Care has been taken to keep the original section numbering intact, so this new
+section should have the same number as the original ``\&{82.~Index},'' and
+additional material follows below.
+
+@* Function declarations. Here are declarations---conforming to
+{\mc ANSI~C}---of all functions in this code that appear in |"common.h"|
+and thus should agree with \.{CTANGLE} and \.{CWEAVE}.
+
+@<Predecl...@>=
+boolean get_line(void);@/
+name_pointer id_lookup(const char *,const char *,char);@/
+name_pointer section_lookup(char *,char *,int);@/
+void check_complete(void);@/
+void common_init(void);@/
+void print_prefix_name(name_pointer);@/
+void print_section_name(name_pointer);@/
+void reset_input(void);@/
+void sprint_section_name(char *,name_pointer);@/
+
+@ The following functions are private to |"common.w"|.
+
+@<Predecl...@>=
+static boolean input_ln(FILE *);@/
+static int web_strcmp(char *,int,char *,int);@/
+static name_pointer add_section_name(name_pointer,int,char *,char *,int);@/
+static void extend_section_name(name_pointer,char *,char *,int);@/
+static void check_change(void);@/
+static void prime_the_change_buffer(void);@/
+
+@* Standard C library interfaces. This updated version of \.{CWEB} uses
+standard C types for pointers, boolean values, and objects with fixed sizes.
+
+@<Include files@>=
+#include <stddef.h> /* type definition of |ptrdiff_t| */
+#include <stdbool.h> /* type definition of |bool| */
+#include <stdint.h> /* type definition of |uint8_t| et al. */
+
+@ The |scan_args| and |cb_show_banner| routines need a few extra variables.
+
+@d PATH_SEPARATOR separators[0]
+@d DIR_SEPARATOR separators[1]
+@d DEVICE_SEPARATOR separators[2]
+
+@d max_banner 50
+
+@<Other...@>=
+char cb_banner[max_banner];
+#ifndef SEPARATORS
+#define SEPARATORS "://"
+#endif
+char separators[]=SEPARATORS;
+
+@* Temporary file output. Before we leave the program we have to make
+sure that the output files are correctly written.
+
+@<Remove the temporary file...@>=
+if(C_file) fclose(C_file);
+if(tex_file) fclose(tex_file);
+if(check_file) fclose(check_file);
+if(strlen(check_file_name)) /* Delete the temporary file in case of a break */
+ remove(check_file_name);
+
+@* Internationalization. You may have noticed that almost all \.{"strings"}
+in the \.{CWEB} sources are placed in the context of the `|_|'~macro.
+This is just a shortcut for the `|gettext|' function from the ``GNU~gettext
+utilities.'' For systems that do not have this library installed, we wrap
+things for neutral behavior without internationalization.
+
+@d _(STRING) gettext(STRING)
+
+@<Include files@>=
+#include <locale.h>
+@#
+#ifndef HAVE_GETTEXT
+#define HAVE_GETTEXT 0
+#endif
+@#
+#if HAVE_GETTEXT
+#include <libintl.h>
+#else
+#define bindtextdomain(A,B) ""
+#define textdomain(A) ""
+#define gettext(A) A
+#endif
+
+@ If translation catalogs for your personal \.{LANGUAGE} are installed at the
+appropriate place, \.{CTANGLE} and \.{CWEAVE} will talk to you in your favorite
+language. Catalog \.{cweb} contains all strings from ``plain \.{CWEB},''
+catalog \.{cweb-tl} contains a few extra strings specific to the \TeX~Live
+interface, and catalog \.{web2c-help} contains the ``\.{--help}'' texts for
+\.{CTANGLE} and \.{CWEAVE}.
+@.cweb.mo@>
+@.cweb-tl.mo@>
+@.web2c-help.mo@>
+@.--help@>
+
+If such translation files are not available you may want to improve this system
+by checking out the sources and translating the strings in files \.{cweb.pot},
+\.{cweb-tl.pot}, and \.{web2c-help.pot}, and submitting the resulting \.{*.po}
+files to the maintainers at \.{tex-k@@tug.org}.
+
+@<Set locale...@>=
+setlocale(LC_MESSAGES, setlocale(LC_CTYPE, ""));
+bindtextdomain("cweb", "/usr/share/locale/");
+bindtextdomain("cweb-tl", "/usr/share/locale/");
+bindtextdomain("web2c-help", "/usr/share/locale/");
+textdomain("cweb"); /* the majority of |"strings"| come from ``plain \.{CWEB}'' */
+@.cweb.mo@>
+
+@* File lookup with \Kpathsea/. The \.{CTANGLE} and \.{CWEAVE} programs from
+the original \.{CWEB} package use the compile-time default directory or the
+value of the environment variable \.{CWEBINPUTS} as an alternative place to be
+searched for files, if they could not be found in the current directory.
+
+This version uses the \Kpathsea/ mechanism for searching files.
+The directories to be searched for come from three sources:
+
+ (a)~a user-set environment variable \.{CWEBINPUTS}
+ (overriden by \.{CWEBINPUTS\_cweb});\par
+ (b)~a line in \Kpathsea/ configuration file \.{texmf.cnf},\hfil\break
+ e.g. \.{CWEBINPUTS=.:\$TEXMF/texmf/cweb//}
+ or \.{CWEBINPUTS.cweb=.:\$TEXMF/texmf/cweb//};\hangindent=2\parindent\par
+ (c)~compile-time default directories \.{.:\$TEXMF/texmf/cweb//}
+ (specified in \.{texmf.in}).
+
+@d kpse_find_cweb(name) kpse_find_file(name,kpse_cweb_format,true)
-@(cweb.h@>=
-@=/* Prototypes for functions, either@>
-@= * declared in common.w and used in ctangle.w and cweave.w, or@>
-@= * used in common.w and declared in ctangle.w and cweave.w. */@>
-@<External functions@>@;
-extern const char *versionstring;
+@<Include files@>=
+typedef bool boolean;
+#define HAVE_BOOLEAN
+#include <kpathsea/kpathsea.h> /* include every \Kpathsea/ header */
+#include <w2c/config.h> /* \&{integer} */
+#include <lib/lib.h> /* |versionstring| */
+@#
+#define CWEB
+#include "help.h"
-@** System dependent changes.
+@ The simple file searching is replaced by the ``path searching'' mechanism
+that the \Kpathsea/ library provides.
+
+We set |kpse_program_name| to `\.{cweb}'. This means if the variable
+\.{CWEBINPUTS.cweb} is present in \.{texmf.cnf} (or \.{CWEBINPUTS\_cweb}
+in the environment) its value will be used as the search path for
+filenames. This allows different flavors of \.{CWEB} to have
+different search paths.
+
+\&{FIXME}: Not sure this is the best way to go about this.
+
+@<Set up |PROGNAME| feature and initialize the search path mechanism@>=
+kpse_set_program_name(argv[0], "cweb");
+
+@* System dependent changes. The most volatile stuff comes at the very end.
@ Modules for dealing with help messages and version info.
@<Display help message and exit@>=
-usagehelp(program==ctangle ? CTANGLEHELP : CWEAVEHELP, NULL);
+cb_usagehelp(program==ctangle ? CTANGLEHELP :
+ program==cweave ? CWEAVEHELP : CTWILLHELP, NULL);
+@.--help@>
+
+@ Special variants from \Kpathsea/ for i18n/t10n.
+
+@<Predecl...@>=
+void cb_show_banner (void); /* |extern| for option \.{+b} */
+static void cb_usage (const_string str);@/
+static void cb_usagehelp (const_string *message, const_string bug_email);@/
+
+@ We simply filter the strings through the catalog (if available).
+
+@c
+void cb_show_banner (void)
+{
+ textdomain("cweb-tl");
+@.cweb-tl.mo@>
+ printf("%s%s\n", cb_banner, versionstring);
+ textdomain("cweb");
+@.cweb.mo@>
+}
+
+static void cb_usage (const_string str)
+{
+ textdomain("cweb-tl");
+@.cweb-tl.mo@>
+ fprintf(stderr, _("%s: Need one to three file arguments.\n"), str);
+ fprintf(stderr, _("Try `%s --help' for more information.\n"), str);
@.--help@>
+ textdomain("cweb");
+@.cweb.mo@>
+ history=fatal_message; exit(wrap_up());
+}
-@ Will have to change these if the version numbers change (ouch).
+static void cb_usagehelp (const_string *message, const_string bug_email)
+{
+ if (!bug_email)
+ bug_email = "tex-k@@tug.org";
+ textdomain("web2c-help");
+@.web2c-help.mo@>
+ while (*message) {
+ printf("%s\n", strcmp("", *message) ? _(*message) : *message);
+ ++message;
+ }
+ textdomain("cweb-tl");
+@.cweb-tl.mo@>
+ printf(_("\nEmail bug reports to %s.\n"), bug_email);
+ textdomain("cweb");
+@.cweb.mo@>
+ history=spotless; exit(wrap_up());
+}
-@d ctangle_banner "This is CTANGLE, Version 3.64"
-@d cweave_banner "This is CWEAVE, Version 3.64"
+@ The version information will not be translated.
@<Display version information and exit@>=
-printversionandexit((program==ctangle ? ctangle_banner : cweave_banner),
- "Silvio Levy and Donald E. Knuth", NULL, NULL);
+printversionandexit(cb_banner,
+ program == ctwill ? "Donald E. Knuth" : "Silvio Levy and Donald E. Knuth",
+ NULL, NULL);
@.--version@>
@** Index.
diff --git a/Build/source/texk/web2c/cwebdir/comm-w2c.h b/Build/source/texk/web2c/cwebdir/comm-w2c.h
new file mode 100644
index 00000000000..d0b99f5db03
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/comm-w2c.h
@@ -0,0 +1,225 @@
+% This file is part of CWEB.
+% This program by Silvio Levy and Donald E. Knuth
+% is based on a program by Knuth.
+% It is distributed WITHOUT ANY WARRANTY, express or implied.
+% Version 3.64 --- February 2017 (works also with later versions)
+
+% Copyright (C) 1987,1990,1993 Silvio Levy and Donald E. Knuth
+
+% Permission is granted to make and distribute verbatim copies of this
+% document provided that the copyright notice and this permission notice
+% are preserved on all copies.
+
+% Permission is granted to copy and distribute modified versions of this
+% document under the conditions for verbatim copying, provided that the
+% entire resulting derived work is distributed under the terms of a
+% permission notice identical to this one.
+
+% Amendments to 'common.h' resulting in this extended 'comm-foo.h' were
+% created by numerous collaborators over the course of many years.
+
+% Please send comments, suggestions, etc. to tex-k@@tug.org.
+
+% The next few sections contain stuff from the file |"common.w"| that has
+% to be included in both |"ctangle.w"| and |"cweave.w"|. It appears in this
+% file |"common.h"|, which needs to be updated when |"common.w"| changes.
+
+First comes general stuff:
+
+@d ctangle 0
+@d cweave 1
+@d ctwill 2
+
+@s boolean int
+@s uint8_t int
+@s uint16_t int
+
+@<Common code for \.{CWEAVE} and \.{CTANGLE}@>=
+typedef bool boolean;
+typedef uint8_t eight_bits;
+typedef uint16_t sixteen_bits;
+extern int program; /* \.{CWEAVE} or \.{CTANGLE} or \.{CTWILL}? */
+extern int phase; /* which phase are we in? */
+
+@ @<Include files@>=
+#ifndef HAVE_GETTEXT
+#define HAVE_GETTEXT 0
+#endif
+@#
+#if HAVE_GETTEXT
+#include <libintl.h>
+#else
+#define gettext(A) A
+#endif
+@#
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+
+@ Code related to the character set:
+@^ASCII code dependencies@>
+
+@d and_and 04 /* `\.{\&\&}'\,; corresponds to MIT's {\tentex\char'4} */
+@d lt_lt 020 /* `\.{<<}'\,; corresponds to MIT's {\tentex\char'20} */
+@d gt_gt 021 /* `\.{>>}'\,; corresponds to MIT's {\tentex\char'21} */
+@d plus_plus 013 /* `\.{++}'\,; corresponds to MIT's {\tentex\char'13} */
+@d minus_minus 01 /* `\.{--}'\,; corresponds to MIT's {\tentex\char'1} */
+@d minus_gt 031 /* `\.{->}'\,; corresponds to MIT's {\tentex\char'31} */
+@d non_eq 032 /* `\.{!=}'\,; corresponds to MIT's {\tentex\char'32} */
+@d lt_eq 034 /* `\.{<=}'\,; corresponds to MIT's {\tentex\char'34} */
+@d gt_eq 035 /* `\.{>=}'\,; corresponds to MIT's {\tentex\char'35} */
+@d eq_eq 036 /* `\.{==}'\,; corresponds to MIT's {\tentex\char'36} */
+@d or_or 037 /* `\.{\v\v}'\,; corresponds to MIT's {\tentex\char'37} */
+@d dot_dot_dot 016 /* `\.{...}'\,; corresponds to MIT's {\tentex\char'16} */
+@d colon_colon 06 /* `\.{::}'\,; corresponds to MIT's {\tentex\char'6} */
+@d period_ast 026 /* `\.{.*}'\,; corresponds to MIT's {\tentex\char'26} */
+@d minus_gt_ast 027 /* `\.{->*}'\,; corresponds to MIT's {\tentex\char'27} */
+
+@<Common code...@>=
+char section_text[longest_name+1]; /* name being sought for */
+char *section_text_end = section_text+longest_name; /* end of |section_text| */
+char *id_first; /* where the current identifier begins in the buffer */
+char *id_loc; /* just after the current identifier in the buffer */
+
+@ Code related to input routines:
+
+@d xisalpha(c) (isalpha((eight_bits)c)&&((eight_bits)c<0200))
+@d xisdigit(c) (isdigit((eight_bits)c)&&((eight_bits)c<0200))
+@d xisspace(c) (isspace((eight_bits)c)&&((eight_bits)c<0200))
+@d xislower(c) (islower((eight_bits)c)&&((eight_bits)c<0200))
+@d xisupper(c) (isupper((eight_bits)c)&&((eight_bits)c<0200))
+@d xisxdigit(c) (isxdigit((eight_bits)c)&&((eight_bits)c<0200))
+
+@<Common code...@>=
+extern char buffer[]; /* where each line of input goes */
+extern char *buffer_end; /* end of |buffer| */
+extern char *loc; /* points to the next character to be read from the buffer*/
+extern char *limit; /* points to the last character in the buffer */
+
+@ Code related to identifier and section name storage:
+@d length(c) (size_t)((c+1)->byte_start-(c)->byte_start) /* the length of a name */
+@d print_id(c) term_write((c)->byte_start,length((c))) /* print identifier */
+@d llink link /* left link in binary search tree for section names */
+@d rlink dummy.Rlink /* right link in binary search tree for section names */
+@d root name_dir->rlink /* the root of the binary search tree
+ for section names */
+@d chunk_marker 0
+
+@<Common code...@>=
+typedef struct name_info {
+ char *byte_start; /* beginning of the name in |byte_mem| */
+ struct name_info *link;
+ union {
+ struct name_info *Rlink; /* right link in binary search tree for section
+ names */
+ char Ilk; /* used by identifiers in \.{CWEAVE} only */
+ } dummy;
+ void *equiv_or_xref; /* info corresponding to names */
+} name_info; /* contains information about an identifier or section name */
+typedef name_info *name_pointer; /* pointer into array of \&{name\_info}s */
+typedef name_pointer *hash_pointer;
+extern char byte_mem[]; /* characters of names */
+extern char *byte_mem_end; /* end of |byte_mem| */
+extern name_info name_dir[]; /* information about names */
+extern name_pointer name_dir_end; /* end of |name_dir| */
+extern name_pointer name_ptr; /* first unused position in |name_dir| */
+extern char *byte_ptr; /* first unused position in |byte_mem| */
+extern name_pointer hash[]; /* heads of hash lists */
+extern hash_pointer hash_end; /* end of |hash| */
+extern hash_pointer h; /* index into hash-head array */
+extern boolean names_match(name_pointer,const char *,size_t,eight_bits);@/
+extern name_pointer id_lookup(const char *,const char *,char);
+ /* looks up a string in the identifier table */
+extern name_pointer section_lookup(char *,char *,int); /* finds section name */
+extern void init_node(name_pointer);@/
+extern void init_p(name_pointer,eight_bits);@/
+extern void print_prefix_name(name_pointer);@/
+extern void print_section_name(name_pointer);@/
+extern void sprint_section_name(char *,name_pointer);@/
+
+@ Code related to error handling:
+@d spotless 0 /* |history| value for normal jobs */
+@d harmless_message 1 /* |history| value when non-serious info was printed */
+@d error_message 2 /* |history| value when an error was noted */
+@d fatal_message 3 /* |history| value when we had to stop prematurely */
+@d mark_harmless {if (history==spotless) history=harmless_message;}
+@d mark_error history=error_message
+@d _(STRING) gettext(STRING)
+@d confusion(s) fatal(_("! This can't happen: "),s)
+
+@<Common...@>=
+extern int history; /* indicates how bad this run was */
+extern int wrap_up(void); /* indicate |history| and exit */
+extern void err_print(const char *); /* print error message and context */
+extern void fatal(const char *,const char *); /* issue error message and die */
+extern void overflow(const char *); /* succumb because a table has overflowed */
+
+@ Code related to file handling:
+@f line x /* make |line| an unreserved word */
+@d max_file_name_length 1024
+@d cur_file file[include_depth] /* current file */
+@d cur_file_name file_name[include_depth] /* current file name */
+@d web_file_name file_name[0] /* main source file name */
+@d cur_line line[include_depth] /* number of current line in current file */
+
+@<Common code...@>=
+extern int include_depth; /* current level of nesting */
+extern FILE *file[]; /* stack of non-change files */
+extern FILE *change_file; /* change file */
+extern char C_file_name[]; /* name of |C_file| */
+extern char tex_file_name[]; /* name of |tex_file| */
+extern char idx_file_name[]; /* name of |idx_file| */
+extern char scn_file_name[]; /* name of |scn_file| */
+extern char check_file_name[]; /* name of |check_file| */
+extern char file_name[][max_file_name_length];
+ /* stack of non-change file names */
+extern char change_file_name[]; /* name of change file */
+extern int line[]; /* number of current line in the stacked files */
+extern int change_line; /* number of current line in change file */
+extern int change_depth; /* where \.{@@y} originated during a change */
+extern boolean input_has_ended; /* if there is no more input */
+extern boolean changing; /* if the current line is from |change_file| */
+extern boolean web_file_open; /* if the web file is being read */
+extern boolean get_line(void); /* inputs the next line */
+extern void check_complete(void); /* checks that all changes were picked up */
+extern void reset_input(void); /* initialize to read the web file and change file */
+
+@ Code related to section numbers:
+@<Common code...@>=
+extern sixteen_bits section_count; /* the current section number */
+extern boolean changed_section[]; /* is the section changed? */
+extern boolean change_pending; /* is a decision about change still unclear? */
+extern boolean print_where; /* tells \.{CTANGLE} to print line and file info */
+
+@ Code related to command line arguments:
+@d show_banner flags['b'] /* should the banner line be printed? */
+@d show_progress flags['p'] /* should progress reports be printed? */
+@d show_happiness flags['h'] /* should lack of errors be announced? */
+@d make_xrefs flags['x'] /* should cross references be output? */
+
+@<Common code...@>=
+extern int argc; /* copy of |ac| parameter to |main| */
+extern char **argv; /* copy of |av| parameter to |main| */
+extern boolean flags[]; /* an option for each 7-bit code */
+
+@ Code relating to output:
+@d update_terminal fflush(stdout) /* empty the terminal output buffer */
+@d new_line putchar('\n') @d putxchar putchar
+@d term_write(a,b) fflush(stdout),fwrite(a,sizeof(char),b,stdout)
+@d C_printf(c,a) fprintf(C_file,c,a)
+@d C_putc(c) putc(c,C_file)
+
+@<Common code...@>=
+extern FILE *C_file; /* where output of \.{CTANGLE} goes */
+extern FILE *tex_file; /* where output of \.{CWEAVE} goes */
+extern FILE *idx_file; /* where index from \.{CWEAVE} goes */
+extern FILE *scn_file; /* where list of sections from \.{CWEAVE} goes */
+extern FILE *check_file; /* temporary output file */
+extern FILE *active_file; /* currently active file for \.{CWEAVE} output */
+
+@ The procedure that gets everything rolling:
+
+@<Common code...@>=
+extern void common_init(void);@/
+extern void print_stats(void);@/
+extern void cb_show_banner(void);@/
diff --git a/Build/source/texk/web2c/cwebdir/ctang-w2c.ch b/Build/source/texk/web2c/cwebdir/ctang-w2c.ch
index 133509afb37..755020f2613 100644
--- a/Build/source/texk/web2c/cwebdir/ctang-w2c.ch
+++ b/Build/source/texk/web2c/cwebdir/ctang-w2c.ch
@@ -1,50 +1,45 @@
-% Original Kpathsea changes for CWEB by Wlodek Bzyl and Olaf Weber
-% This file is in the Public Domain.
+@q Changes for CWEB in TeX Live from numerous contributors. @>
+@q This file is in the Public Domain. @>
-@x l.27
-\def\title{CTANGLE (Version 3.64)}
-\def\topofcontents{\null\vfill
- \centerline{\titlefont The {\ttitlefont CTANGLE} processor}
- \vskip 15pt
- \centerline{(Version 3.64)}
- \vfill}
-@y
-\def\title{CTANGLE (Version 3.64k)}
-\def\topofcontents{\null\vfill
- \centerline{\titlefont The {\ttitlefont CTANGLE} processor}
- \vskip 15pt
- \centerline{(Version 3.64k)}
- \vfill}
-@z
+@q Most of the original Kpathsea changes by Wlodek Bzyl and Olaf Weber @>
+@q were merged with the set of change files of the CWEBbin project; @>
+@q see https://github.com/ascherer/cwebbin for the original parts. @>
-This change can not be applied when `tie' is used
-(TOC file can not be typeset).
+@q This stripped change file {comm,ctang,cweav,ctwill}-w2c.ch has been @>
+@q created from the set of change files {comm,ctang,cweav}-patch.ch, @>
+@q {comm,ctang,cweav}-ansi.ch, {comm,ctang,cweav}-extensions.ch, @>
+@q {comm,ctang,cweav}-output.ch, {comm,ctang,cweav}-i18n.ch, and @>
+@q cweav-twill.ch for CTWILL, and {comm,ctang,cweav,ctwill}-texlive.ch @>
+@q with the 'tie' processor and is used as a monolithic changefile for @>
+@q {common,ctangle,cweave}.w in TeX Live. @>
-%@x l.48
-%\let\maybe=\iftrue
-%@y
-%\let\maybe=\iffalse % print only sections that change
-%@z
+@q Please send comments, suggestions, etc. to tex-k@@tug.org. @>
+@x
+\def\title{CTANGLE (Version 3.64)}
+@y
+\def\title{CTANGLE (Version 3.64 [\TeX~Live])}
+@z
-Section 1.
+@x
+ \centerline{(Version 3.64)}
+@y
+ \centerline{(Version 3.64 [\TeX~Live])}
+@z
-@x l.49
-The ``banner line'' defined here should be changed whenever \.{CTANGLE}
-is modified.
+@x
+@s not_eq normal @q unreserve a C++ keyword @>
+@y
+@z
+@x
@d banner "This is CTANGLE (Version 3.64)\n"
@y
-The ``banner line'' defined here should be changed whenever \.{CTANGLE}
-is modified.
-
-@d banner "This is CTANGLE, Version 3.64"
+@d banner _("This is CTANGLE, Version 3.64")
+ /* will be extended by the \TeX~Live |versionstring| */
@z
-
-Section 2.
-
-@x l.72
+@x
@ We predeclare several standard system functions here instead of including
their system header files, because the names of the header files are not as
standard as the names of the functions. (For example, some \CEE/ environments
@@ -57,33 +52,38 @@ extern char* strcpy(); /* copy one string to another */
extern int strncmp(); /* compare up to $n$ string characters */
extern char* strncpy(); /* copy up to $n$ string characters */
@y
-@z
+@ For string handling we include the {\mc ANSI C} system header file instead
+of predeclaring the standard system functions |strlen|, |strcmp|, |strcpy|,
+|strncmp|, and |strncpy|.
+@^system dependencies@>
-Section 3.
+@<Include files@>=
+#include <string.h>
+@z
-@x l.92
+@x
int main (ac, av)
int ac;
char **av;
@y
-int main (int ac, char **av)
+int main (
+int ac,
+char **av)
@z
-@x l.100 - Add Web2C version to banner.
+@x
if (show_banner) printf(banner); /* print a ``banner line'' */
@y
- if (show_banner) {
- printf("%s%s\n", banner, versionstring); /* print a ``banner line'' */
- }
+ if (show_banner) cb_show_banner(); /* print a ``banner line'' */
@z
-@x l.112
+@x
@d max_bytes 90000 /* the number of bytes in identifiers,
@y
@d max_bytes 1000000 /* the number of bytes in identifiers,
@z
-@x l.114
+@x
@d max_toks 270000 /* number of bytes in compressed \CEE/ code */
@d max_names 4000 /* number of identifiers, strings, section names;
@y
@@ -91,7 +91,7 @@ int main (int ac, char **av)
@d max_names 10239 /* number of identifiers, strings, section names;
@z
-@x l.117
+@x
@d max_texts 2500 /* number of replacement texts, must be less than 10240 */
@d hash_size 353 /* should be prime; used in |"common.w"| */
@y
@@ -99,194 +99,159 @@ int main (int ac, char **av)
@d hash_size 8501 /* should be prime; used in |"common.w"| */
@z
-@x l.121
+@x
@d buf_size 100 /* for \.{CWEAVE} and \.{CTANGLE} */
@y
@d buf_size 1000 /* for \.{CWEAVE} and \.{CTANGLE} */
@z
-Section 5.
-
-@x common.h l.30 - boolean comes from kpathsea.
-typedef short boolean;
+@x
+@i common.h
@y
+@i comm-w2c.h
@z
-Section 6.
-
-@x common.h l.36
-#include <stdio.h>
+@x
+the array |text_info|, and we use a |text_pointer| variable to refer
@y
-#include <kpathsea/kpathsea.h>
-#include <stdio.h>
+the array |text_info|, and we use a \&{text\_pointer} variable to refer
@z
-@x common.h l.65
-@d xisalpha(c) (isalpha(c)&&((eight_bits)c<0200))
-@d xisdigit(c) (isdigit(c)&&((eight_bits)c<0200))
-@d xisspace(c) (isspace(c)&&((eight_bits)c<0200))
-@d xislower(c) (islower(c)&&((eight_bits)c<0200))
-@d xisupper(c) (isupper(c)&&((eight_bits)c<0200))
-@d xisxdigit(c) (isxdigit(c)&&((eight_bits)c<0200))
+@x
+If your machine does not support |unsigned char| you should change
+the definition of \&{eight\_bits} to |unsigned short|.
+@^system dependencies@>
@y
-@d xisalpha(c) (isalpha((eight_bits)c)&&((eight_bits)c<0200))
-@d xisdigit(c) (isdigit((eight_bits)c)&&((eight_bits)c<0200))
-@d xisspace(c) (isspace((eight_bits)c)&&((eight_bits)c<0200))
-@d xislower(c) (islower((eight_bits)c)&&((eight_bits)c<0200))
-@d xisupper(c) (isupper((eight_bits)c)&&((eight_bits)c<0200))
-@d xisxdigit(c) (isxdigit((eight_bits)c)&&((eight_bits)c<0200))
@z
-Section 9.
-
-@x common.h l.109 - protos now all in cweb.h.
-extern name_pointer id_lookup(); /* looks up a string in the identifier table */
-extern name_pointer section_lookup(); /* finds section name */
-extern void print_section_name(), sprint_section_name();
+@x
+name_dir->equiv=(char *)text_info; /* the undefined section has no replacement text */
@y
-#include "cweb.h"
+init_node(name_dir); /* the undefined section has no replacement text */
@z
-Section 10.
-
-@x common.h l.123 - explicit types, protos now all in cweb.h.
-extern history; /* indicates how bad this run was */
-extern err_print(); /* print error message and context */
-extern wrap_up(); /* indicate |history| and exit */
-extern void fatal(); /* issue error message and die */
-extern void overflow(); /* succumb because a table has overflowed */
-@y
-extern int history; /* indicates how bad this run was */
-@z
-
-Section 11.
-
-@x common.h l.131 - max_file_name_length is way too small.
-@d max_file_name_length 60
-@y
-@d max_file_name_length 1024
-@z
-
-@x common.h l.138 - explicit types.
-extern include_depth; /* current level of nesting */
-@y
-extern int include_depth; /* current level of nesting */
-@z
-
-@x common.h l.148 - explicit types.
-extern line[]; /* number of current line in the stacked files */
-extern change_line; /* number of current line in change file */
-extern change_depth; /* where \.{@@y} originated during a change */
-@y
-extern int line[]; /* number of current line in the stacked files */
-extern int change_line; /* number of current line in change file */
-extern int change_depth; /* where \.{@@y} originated during a change */
-@z
-
-@x common.h l.153 - protos now all in cweb.h.
-extern reset_input(); /* initialize to read the web file and change file */
-extern get_line(); /* inputs the next line */
-extern check_complete(); /* checks that all changes were picked up */
-@y
-@z
-
-Section 15.
-
-@x common.h l.192 - protos now all in cweb.h.
-extern void common_init();
-@y
-@z
-
-Section 21.
-
-@x l.184
+@x
int names_match(p,first,l)
name_pointer p; /* points to the proposed match */
char *first; /* position of first character of string */
int l; /* length of identifier */
+{
@y
-int names_match (name_pointer p, const char *first, int l, char t)
+boolean names_match(@t\1\1@>
+name_pointer p, /* points to the proposed match */
+const char *first, /* position of first character of string */
+size_t l, /* length of identifier */
+eight_bits t@t\2\2@>) /* not used by \.{TANGLE} */
+{@+(void)t;
@z
-Section 22.
-
-@x l.200
+@x
+void
init_node(node)
name_pointer node;
@y
-init_node (name_pointer node)
+void
+init_node(
+name_pointer node)
@z
-@x l.207
-init_p() {}
+@x
+ node->equiv=(char *)text_info;
@y
-init_p (name_pointer p, char t) {}
+ node->equiv=(void *)text_info;
@z
-Section 26.
+@x
+void
+init_p() {}
+@y
+void
+init_p(name_pointer p,eight_bits t) {@+(void)p;@+(void)t;@+}
+@z
-@x l.261
+@x
void
store_two_bytes(x)
sixteen_bits x;
@y
static void
-store_two_bytes (sixteen_bits x)
+store_two_bytes(
+sixteen_bits x)
@z
-Section 30.
+@x
+ if (tok_ptr+2>tok_mem_end) overflow("token");
+@y
+ if (tok_ptr+2>tok_mem_end) overflow(_("token"));
+@z
-@x l.337
+@x
void
push_level(p) /* suspends the current level */
name_pointer p;
@y
static void
-push_level (name_pointer p) /* suspends the current level */
+push_level(@t\1\1@> /* suspends the current level */
+name_pointer p@t\2\2@>)
@z
-Section 31.
+@x
+ if (stack_ptr==stack_end) overflow("stack");
+@y
+ if (stack_ptr==stack_end) overflow(_("stack"));
+@z
-@x l.356
+@x
void
pop_level(flag) /* do this when |cur_byte| reaches |cur_end| */
int flag; /* |flag==0| means we are in |output_defs| */
@y
static void
-pop_level (int flag) /* do this when |cur_byte| reaches |cur_end| */
+pop_level(@t\1\1@> /* do this when |cur_byte| reaches |cur_end| */
+int flag@t\2\2@>) /* |flag==0| means we are in |output_defs| */
@z
-Section 33.
-
-@x l.392
+@x
void
get_output() /* sends next token to |out_char| */
@y
static void
-get_output (void) /* sends next token to |out_char| */
+get_output(void) /* sends next token to |out_char| */
+@z
+
+@x
+ if ((a+name_dir)->equiv!=(char *)text_info) push_level(a+name_dir);
+@y
+ if ((a+name_dir)->equiv!=(void *)text_info) push_level(a+name_dir);
@z
-Section 37.
+@x
+ printf("\n! Not present: <");
+@y
+ fputs(_("\n! Not present: <"),stdout);
+@z
-@x l.482
+@x
void
flush_buffer() /* writes one line to output file */
@y
static void
-flush_buffer (void) /* writes one line to output file */
+flush_buffer(void) /* writes one line to output file */
@z
-Section 41.
+@x
+ overflow("output files");
+@y
+ overflow(_("output files"));
+@z
-@x l.534
+@x
void phase_two();
@y
-static void phase_two (void);
+static void phase_two(void);@/
@z
-Section 42.
-
-@x l.537
+@x
void
phase_two () {
@y
@@ -294,116 +259,323 @@ static void
phase_two (void) {
@z
-Section 43.
+@x
+ printf("\n! No program text was specified."); mark_harmless;
+@y
+ fputs(_("\n! No program text was specified."),stdout); mark_harmless;
+@z
-@x l.577 Use binary mode for output files
- C_file=fopen(output_file_name,"w");
+@x
+ printf("\nWriting the output file (%s):",C_file_name);
@y
- C_file=fopen(output_file_name,"wb");
+ printf(_("\nWriting the output file (%s):"),C_file_name);
@z
-Section 46.
+@x
+ printf("\nWriting the output files:");
+@y
+ fputs(_("\nWriting the output files:"),stdout);
+@z
-@x l.603
-void output_defs();
+@x
+ if(show_happiness) printf("\nDone.");
@y
-static void output_defs (void);
+ if (show_happiness) {
+ if (show_progress) new_line;
+ fputs(_("Done."),stdout);
+ }
@z
-Section 47.
+@x
+@<Write all the named output files@>=
+for (an_output_file=end_output_files; an_output_file>cur_out_file;) {
+ an_output_file--;
+ sprint_section_name(output_file_name,*an_output_file);
+ fclose(C_file);
+ C_file=fopen(output_file_name,"w");
+ if (C_file ==0) fatal("! Cannot open output file:",output_file_name);
+@.Cannot open output file@>
+ printf("\n(%s)",output_file_name); update_terminal;
+ cur_line=1;
+ stack_ptr=stack+1;
+ cur_name= (*an_output_file);
+ cur_repl= (text_pointer)cur_name->equiv;
+ cur_byte=cur_repl->tok_start;
+ cur_end=(cur_repl+1)->tok_start;
+ while (stack_ptr > stack) get_output();
+ flush_buffer();
+}
+@y
+@<Write all the named output files@>=
+fclose(C_file); C_file=NULL;
+@<Update the primary result when it has changed@>@;
+for (an_output_file=end_output_files; an_output_file>cur_out_file;) {
+ an_output_file--;
+ sprint_section_name(output_file_name,*an_output_file);
+ if((C_file=fopen(check_file_name,"wb"))==NULL)
+ fatal(_("! Cannot open output file "),check_file_name);
+@.Cannot open output file@>
+ printf("\n(%s)",output_file_name); update_terminal;
+ cur_line=1;
+ stack_ptr=stack+1;
+ cur_name= (*an_output_file);
+ cur_repl= (text_pointer)cur_name->equiv;
+ cur_byte=cur_repl->tok_start;
+ cur_end=(cur_repl+1)->tok_start;
+ while (stack_ptr > stack) get_output();
+ flush_buffer(); fclose(C_file); C_file=NULL;
+ @<Update the secondary results when they have changed@>@;
+}
+strcpy(check_file_name,""); /* We want to get rid of the temporary file */
+@z
+
+@x
+void output_defs();
+@y
+static void output_defs(void);@/
+@z
-@x l.606
+@x
void
output_defs()
@y
static void
-output_defs (void)
+output_defs(void)
@z
-Section 48.
+@x
+ else if (a<050000) { confusion("macro defs have strange char");}
+@y
+ else if (a<050000) { confusion(_("macro defs have strange char"));}
+@z
-@x l.649
+@x
static void out_char();
@y
-static void out_char (eight_bits);
+static void out_char(eight_bits);@/
@z
-Section 49.
-
-@x l.653
+@x
+static void
out_char(cur_char)
eight_bits cur_char;
@y
-out_char (eight_bits cur_char)
-@z
-
-Section 58.
-
-@x l.814
+static void
+out_char(
+eight_bits cur_char)
+@z
+
+@x
+@ @<Cases like \.{!=}@>=
+case plus_plus: C_putc('+'); C_putc('+'); out_state=normal; break;
+case minus_minus: C_putc('-'); C_putc('-'); out_state=normal; break;
+case minus_gt: C_putc('-'); C_putc('>'); out_state=normal; break;
+case gt_gt: C_putc('>'); C_putc('>'); out_state=normal; break;
+case eq_eq: C_putc('='); C_putc('='); out_state=normal; break;
+case lt_lt: C_putc('<'); C_putc('<'); out_state=normal; break;
+case gt_eq: C_putc('>'); C_putc('='); out_state=normal; break;
+case lt_eq: C_putc('<'); C_putc('='); out_state=normal; break;
+case not_eq: C_putc('!'); C_putc('='); out_state=normal; break;
+case and_and: C_putc('&'); C_putc('&'); out_state=normal; break;
+case or_or: C_putc('|'); C_putc('|'); out_state=normal; break;
+case dot_dot_dot: C_putc('.'); C_putc('.'); C_putc('.'); out_state=normal;
+ break;
+case colon_colon: C_putc(':'); C_putc(':'); out_state=normal; break;
+case period_ast: C_putc('.'); C_putc('*'); out_state=normal; break;
+case minus_gt_ast: C_putc('-'); C_putc('>'); C_putc('*'); out_state=normal;
+ break;
+@y
+@ @<Cases like \.{!=}@>=
+case plus_plus: C_putc('+');@+C_putc('+'); out_state=normal; break;
+case minus_minus: C_putc('-');@+C_putc('-'); out_state=normal; break;
+case minus_gt: C_putc('-');@+C_putc('>'); out_state=normal; break;
+case gt_gt: C_putc('>');@+C_putc('>'); out_state=normal; break;
+case eq_eq: C_putc('=');@+C_putc('='); out_state=normal; break;
+case lt_lt: C_putc('<');@+C_putc('<'); out_state=normal; break;
+case gt_eq: C_putc('>');@+C_putc('='); out_state=normal; break;
+case lt_eq: C_putc('<');@+C_putc('='); out_state=normal; break;
+case non_eq: C_putc('!');@+C_putc('='); out_state=normal; break;
+case and_and: C_putc('&');@+C_putc('&'); out_state=normal; break;
+case or_or: C_putc('|');@+C_putc('|'); out_state=normal; break;
+case dot_dot_dot: C_putc('.');@+C_putc('.');@+C_putc('.'); out_state=normal;
+ break;
+case colon_colon: C_putc(':');@+C_putc(':'); out_state=normal; break;
+case period_ast: C_putc('.');@+C_putc('*'); out_state=normal; break;
+case minus_gt_ast: C_putc('-');@+C_putc('>');@+C_putc('*'); out_state=normal;
+ break;
+@z
+
+@x
eight_bits
skip_ahead() /* skip to next control code */
@y
static eight_bits
-skip_ahead (void) /* skip to next control code */
+skip_ahead(void) /* skip to next control code */
@z
-Section 60.
-
-@x l.849
+@x
int skip_comment(is_long_comment) /* skips over comments */
boolean is_long_comment;
@y
-static int
-skip_comment (boolean is_long_comment) /* skips over comments */
+static boolean skip_comment(@t\1\1@> /* skips over comments */
+boolean is_long_comment@t\2\2@>)
@z
-Section 62
-
-@x l.889 - add declaration of versionstring.
-#include <ctype.h> /* definition of |isalpha|, |isdigit| and so on */
+@x
+ err_print("! Input ended in mid-comment");
@y
+ err_print(_("! Input ended in mid-comment"));
@z
-Section 63.
+@x
+ err_print("! Section name ended in mid-comment"); loc--;
+@y
+ err_print(_("! Section name ended in mid-comment")); loc--;
+@z
-@x l.901
+@x
eight_bits
get_next() /* produces the next input token */
@y
static eight_bits
-get_next (void) /* produces the next input token */
+get_next(void) /* produces the next input token */
@z
-Section 63.
+@x
+ else if (c=='\'' || c=='"' || (c=='L'&&(*loc=='\'' || *loc=='"')))
+@y
+ else if (c=='\'' || c=='"'@|
+ || ((c=='L' || c=='u' || c=='U')&&(*loc=='\'' || *loc=='"'))@|
+ || ((c=='u' && *loc=='8')&&(*(loc+1)=='\'' || *(loc+1)=='"')))
+@z
-@x l.954
+@x
else if (*loc=='>') if (*(loc+1)=='*') {loc++; compress(minus_gt_ast);}
else compress(minus_gt); break;
@y
- else if (*loc=='>') {if (*(loc+1)=='*') {loc++; compress(minus_gt_ast);}
- else compress(minus_gt);} break;
+ else { if (*loc=='>') { if (*(loc+1)=='*') {loc++; compress(minus_gt_ast);}
+ else compress(minus_gt); } } break;
@z
-@x l.974
+@x
+ case '!': if (*loc=='=') compress(not_eq); break;
+@y
+ case '!': if (*loc=='=') compress(non_eq); break;
+@z
+
+@x
while (isalpha(*++loc) || isdigit(*loc) || isxalpha(*loc) || ishigh(*loc));
@y
- while (isalpha((unsigned char)*++loc) || isdigit((unsigned char)*loc) || isxalpha(*loc) || ishigh(*loc));
+ while (isalpha((eight_bits)*++loc) || isdigit((eight_bits)*loc) @|
+ || isxalpha((eight_bits)*loc) || ishigh((eight_bits)*loc));
@z
-Section 76.
+@x
+ if (delim=='L') { /* wide character constant */
+ delim=*loc++; *++id_loc=delim;
+ }
+@y
+ if (delim=='L' || delim=='u' || delim=='U') { /* wide character constant */
+ if (delim=='u' && *loc=='8') { *++id_loc=*loc++; }
+ delim=*loc++; *++id_loc=delim;
+ }
+@z
+
+@x
+ err_print("! String didn't end"); loc=limit; break;
+@y
+ err_print(_("! String didn't end")); loc=limit; break;
+@z
+
+@x
+ err_print("! Input ended in middle of string"); loc=buffer; break;
+@y
+ err_print(_("! Input ended in middle of string")); loc=buffer; break;
+@z
+
+@x
+ printf("\n! String too long: ");
+@y
+ fputs(_("\n! String too long: "),stdout);
+@z
+
+@x
+ case translit_code: err_print("! Use @@l in limbo only"); continue;
+@y
+ case translit_code: err_print(_("! Use @@l in limbo only")); continue;
+@z
+
+@x
+ err_print("! Double @@ should be used in control text");
+@y
+ err_print(_("! Double @@ should be used in control text"));
+@z
+
+@x
+ err_print("! Double @@ should be used in ASCII constant");
+@y
+ err_print(_("! Double @@ should be used in ASCII constant"));
+@z
+
+@x
+ err_print("! String didn't end"); loc=limit-1; break;
+@y
+ err_print(_("! String didn't end")); loc=limit-1; break;
+@z
-@x l.1200
+@x
+ err_print("! Input ended in section name");
+@y
+ err_print(_("! Input ended in section name"));
+@z
+
+@x
+ printf("\n! Section name too long: ");
+@y
+ fputs(_("\n! Section name too long: "),stdout);
+@z
+
+@x
+ err_print("! Section name didn't end"); break;
+@y
+ err_print(_("! Section name didn't end")); break;
+@z
+
+@x
+ err_print("! Nesting of section names not allowed"); break;
+@y
+ err_print(_("! Nesting of section names not allowed")); break;
+@z
+
+@x
+ if (loc>=limit) err_print("! Verbatim string didn't end");
+@y
+ if (loc>=limit) err_print(_("! Verbatim string didn't end"));
+@z
+
+@x
+@d app_repl(c) {if (tok_ptr==tok_mem_end) overflow("token"); *tok_ptr++=c;}
+@y
+@d app_repl(c) {if (tok_ptr==tok_mem_end) overflow(_("token")); *tok_ptr++=c;}
+@z
+
+@x
void
scan_repl(t) /* creates a replacement text */
eight_bits t;
@y
static void
-scan_repl (eight_bits t) /* creates a replacement text */
+scan_repl(@t\1\1@> /* creates a replacement text */
+eight_bits t@t\2\2@>)
@z
-Section 77.
+@x
+ if (text_ptr>text_info_end) overflow("text");
+@y
+ if (text_ptr>text_info_end) overflow(_("text"));
+@z
-@x l.1232 -- rename local var, not to shadow previous local
+@x
{int a=id_lookup(id_first,id_loc,0)-name_dir; app_repl((a / 0400)+0200);
app_repl(a % 0400);}
@y
@@ -411,69 +583,262 @@ Section 77.
app_repl(a_l % 0400);}
@z
-Section 82.
+@x
+case output_defs_code: if (t!=section_name) err_print("! Misplaced @@h");
+@y
+case output_defs_code: if (t!=section_name) err_print(_("! Misplaced @@h"));
+@z
-@x l.1320
+@x
+ err_print("! @@d, @@f and @@c are ignored in C text"); continue;
+@y
+ err_print(_("! @@d, @@f and @@c are ignored in C text")); continue;
+@z
+
+@x
+ if (*try_loc=='=') err_print ("! Missing `@@ ' before a named section");
+@y
+ if (*try_loc=='=') err_print (_("! Missing `@@ ' before a named section"));
+@z
+
+@x
+ else err_print("! Double @@ should be used in string");
+@y
+ else err_print(_("! Double @@ should be used in string"));
+@z
+
+@x
c=toupper(*id_first)-'A'+10;
@y
- c=toupper((unsigned char)*id_first)-'A'+10;
+ c=toupper((eight_bits)*id_first)-'A'+10;
@z
-@x l.1325
+
+@x
c=16*c+toupper(*id_first)-'A'+10;
@y
- c=16*c+toupper((unsigned char)*id_first)-'A'+10;
+ c=16*c+toupper((eight_bits)*id_first)-'A'+10;
@z
-Section 83.
+@x
+ default: err_print("! Unrecognized escape sequence");
+@y
+ default: err_print(_("! Unrecognized escape sequence"));
+@z
-@x l.1358
+@x
void
scan_section()
@y
static void
-scan_section (void)
+scan_section(void)
@z
-Section 90.
+@x
+ err_print("! Definition flushed, must start with identifier");
+@y
+ err_print(_("! Definition flushed, must start with identifier"));
+@z
-@x l.1458
-void phase_one();
+@x
+else if (p->equiv==(char *)text_info) p->equiv=(char *)cur_text;
@y
-static void phase_one (void);
+else if (p->equiv==(void *)text_info) p->equiv=(void *)cur_text;
@z
-Section 91.
+@x
+void phase_one();
+@y
+static void phase_one(void);@/
+@z
-@x l.1461
+@x
void
phase_one() {
@y
static void
-phase_one (void) {
+phase_one(void) {
@z
-Section 92.
-
-@x l.1476
+@x
void skip_limbo();
@y
-static void skip_limbo (void);
+static void skip_limbo(void);@/
@z
-Section 93.
-
-@x l.1479
+@x
void
skip_limbo()
@y
static void
-skip_limbo (void)
+skip_limbo(void)
+@z
+
+@x
+ err_print("! Double @@ should be used in control text");
+@y
+ err_print(_("! Double @@ should be used in control text"));
+@z
+
+@x
+ default: err_print("! Double @@ should be used in limbo");
+@y
+ default: err_print(_("! Double @@ should be used in limbo"));
+@z
+
+@x
+ err_print("! Improper hex number following @@l");
+@y
+ err_print(_("! Improper hex number following @@l"));
+@z
+
+@x
+ err_print("! Replacement string in @@l too long");
+@y
+ err_print(_("! Replacement string in @@l too long"));
@z
-Section 95.
+@x
+ strncpy(translit[i-0200],beg,loc-beg);
+@y
+ strncpy(translit[i-0200],beg,(size_t)(loc-beg));
+@z
-@x l.1535
+@x
+void
print_stats() {
@y
-print_stats (void) {
+void
+print_stats(void) {
@z
+
+@x
+ printf("\nMemory usage statistics:\n");
+ printf("%ld names (out of %ld)\n",
+ (long)(name_ptr-name_dir),(long)max_names);
+ printf("%ld replacement texts (out of %ld)\n",
+ (long)(text_ptr-text_info),(long)max_texts);
+ printf("%ld bytes (out of %ld)\n",
+ (long)(byte_ptr-byte_mem),(long)max_bytes);
+ printf("%ld tokens (out of %ld)\n",
+@y
+ puts(_("\nMemory usage statistics:"));
+ printf(_("%ld names (out of %ld)\n"),
+ (long)(name_ptr-name_dir),(long)max_names);
+ printf(_("%ld replacement texts (out of %ld)\n"),
+ (long)(text_ptr-text_info),(long)max_texts);
+ printf(_("%ld bytes (out of %ld)\n"),
+ (long)(byte_ptr-byte_mem),(long)max_bytes);
+ printf(_("%ld tokens (out of %ld)\n"),
+@z
+
+@x
+@** Index.
+@y
+@** Extensions for modern \.{CWEB}.
+
+The following sections introduce code changes and extensions that have been
+created by numerous contributors over the course of a quarter century. They
+make \.{CWEB} adhere to modern coding standards and introduce new or improved
+features.
+
+Care has been taken to keep the original section numbering intact, so this new
+section should have the same number as the original ``\&{96.~Index},'' and
+additional material follows below.
+
+@* Function declarations. Here are declarations---conforming to
+{\mc ANSI~C}---of all functions in this code, as far as they are
+not already in |"common.h"|. These are private to \.{CTANGLE}.
+
+@<Predecl...@>=
+static eight_bits get_next(void);@/
+static eight_bits skip_ahead(void);@/
+static boolean skip_comment(boolean);@/
+static void flush_buffer(void);@/
+static void get_output(void);@/
+static void pop_level(int);@/
+static void push_level(name_pointer);@/
+static void scan_repl(eight_bits);@/
+static void scan_section(void);@/
+static void store_two_bytes(sixteen_bits);@/
+
+@* Output file update. Most \CEE/ projects are controlled by a
+\.{Makefile} that automatically takes care of the temporal dependecies
+between the different source modules. It is suitable that \.{CWEB} doesn't
+create new output for all existing files, when there are only changes to
+some of them. Thus the \.{make} process will only recompile those modules
+where necessary. The idea and basic implementation of this mechanism can
+be found in the program \.{NUWEB} by Preston Briggs, to whom credit is due.
+
+@<Update the primary result...@>=
+if((C_file=fopen(C_file_name,"r"))!=NULL) {
+ @<Set up the comparison of temporary output@>@;
+ @<Create the primary output depending on the comparison@>@;
+} else
+ rename(check_file_name,C_file_name); /* This was the first run */
+
+@ @<Set up the comparison of temporary output@>=
+ char x[BUFSIZ],y[BUFSIZ];
+ int x_size,y_size,comparison;
+
+ if((check_file=fopen(check_file_name,"r"))==NULL)
+ fatal(_("! Cannot open output file "),check_file_name);
+@.Cannot open output file@>
+
+ @<Compare the temporary output to the previous output@>@;
+
+ fclose(C_file); C_file=NULL;
+ fclose(check_file); check_file=NULL;
+
+@ We hope that this runs fast on most systems.
+
+@<Compare the temp...@>=
+do {
+ x_size = fread(x,1,BUFSIZ,C_file);
+ y_size = fread(y,1,BUFSIZ,check_file);
+ comparison = (x_size == y_size); /* Do not merge these statements! */
+ if(comparison) comparison = !memcmp(x,y,x_size);
+} while(comparison && !feof(C_file) && !feof(check_file));
+
+@ Note the superfluous call to |remove| before |rename|. We're using it to
+get around a bug in some implementations of |rename|.
+
+@<Create the primary output...@>=
+if(comparison)
+ remove(check_file_name); /* The output remains untouched */
+else {
+ remove(C_file_name);
+ rename(check_file_name,C_file_name);
+}
+
+@ @<Update the secondary results...@>=
+if((C_file=fopen(output_file_name,"r"))!=NULL) {
+ @<Set up the comparison of temporary output@>@;
+ @<Create the secondary output depending on the comparison@>@;
+} else
+ rename(check_file_name,output_file_name); /* This was the first run */
+
+@ Again, we use a call to |remove| before |rename|.
+
+@<Create the secondary output...@>=
+if(comparison)
+ remove(check_file_name); /* The output remains untouched */
+else {
+ remove(output_file_name);
+ rename(check_file_name,output_file_name);
+}
+
+@* Put ``version'' information in a single spot.
+Don't do this at home, kids! Push our local macro to the variable in \.{COMMON}
+for printing the |banner| and the |versionstring| from there.
+
+@d max_banner 50
+
+@<Common code...@>=
+extern char cb_banner[];
+
+@ @<Set init...@>=
+ strncpy(cb_banner,banner,max_banner-1);
+
+@** Index.
+@z
+
diff --git a/Build/source/texk/web2c/cwebdir/ctproofmac.tex b/Build/source/texk/web2c/cwebdir/ctproofmac.tex
new file mode 100644
index 00000000000..29533b84b4d
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/ctproofmac.tex
@@ -0,0 +1,353 @@
+% standard macros for CWEB listings (in addition to plain.tex)
+% Version 3.6 --- May 2000
+% Modified for proofs in CTWILL
+\ifx\documentstyle\undefined\else\endinput\fi % LaTeX will use other macros
+\xdef\fmtversion{\fmtversion+CWEB3.6+PROOFS}
+
+\let\:=\. % preserve a way to get the dot accent
+ % (all other accents will still work as usual)
+
+\parskip 0pt % no stretch between paragraphs
+\parindent 1em % for paragraphs and for the first line of C text
+
+\font\ninerm=cmr9
+\let\mc=\ninerm % medium caps
+\def\CEE/{{\mc C\spacefactor1000}}
+\def\UNIX/{{\mc U\kern-.05emNIX\spacefactor1000}}
+\def\TEX/{\TeX}
+\def\CPLUSPLUS/{{\mc C\PP\spacefactor1000}}
+\def\Cee{\CEE/} % for backward compatibility
+\def\9#1{}
+\font\eightrm=cmr8
+\let\sc=\eightrm % small caps (NOT a caps-and-small-caps font)
+\let\mainfont=\tenrm
+\let\cmntfont\tenrm
+%\font\tenss=cmss10 \let\cmntfont\tenss % alternative comment font
+\font\titlefont=cmr7 scaled\magstep4 % title on the contents page
+\font\ttitlefont=cmtt10 scaled\magstep2 % typewriter type in title
+\font\tentex=cmtex10 % TeX extended character set (used in strings)
+\fontdimen7\tentex=0pt % no double space after sentences
+
+\def\\#1{\leavevmode\hbox{\it#1\/\kern.05em}} % italic type for identifiers
+\def\|#1{\leavevmode\hbox{$#1$}} % one-letter identifiers look better this way
+\def\&#1{\leavevmode\hbox{\bf
+ \def\_{\kern.04em\vbox{\hrule width.3em height .6pt}\kern.08em}%
+ #1\/\kern.05em}} % boldface type for reserved words
+\def\.#1{\leavevmode\hbox{\tentex % typewriter type for strings
+ \let\\=\BS % backslash in a string
+ \let\{=\LB % left brace in a string
+ \let\}=\RB % right brace in a string
+ \let\~=\TL % tilde in a string
+ \let\ =\SP % space in a string
+ \let\_=\UL % underline in a string
+ \let\&=\AM % ampersand in a string
+ \let\^=\CF % circumflex in a string
+ #1\kern.05em}}
+\def\){{\tentex\kern-.05em}\discretionary{\hbox{\tentex\BS}}{}{}}
+\def\AT{@} % at sign for control text (not needed in versions >= 2.9)
+\def\ATL{\par\noindent\bgroup\catcode`\_=12 \postATL} % print @l in limbo
+\def\postATL#1 #2 {\bf letter \\{\uppercase{\char"#1}}
+ tangles as \tentex "#2"\egroup\par}
+\def\noATL#1 #2 {}
+\def\noatl{\let\ATL=\noATL} % suppress output from @l
+\def\ATH{\X\kern-.5em:Preprocessor definitions\X}
+\let\PB=\relax % hook for program brackets |...| in TeX part or section name
+
+\chardef\AM=`\& % ampersand character in a string
+\chardef\BS=`\\ % backslash in a string
+\chardef\LB=`\{ % left brace in a string
+\chardef\RB=`\} % right brace in a string
+\def\SP{{\tt\char`\ }} % (visible) space in a string
+\chardef\TL=`\~ % tilde in a string
+\chardef\UL=`\_ % underline character in a string
+\chardef\CF=`\^ % circumflex character in a string
+
+\newbox\PPbox % symbol for ++
+\setbox\PPbox=\hbox{\kern.5pt\raise1pt\hbox{\sevenrm+\kern-1pt+}\kern.5pt}
+\def\PP{\copy\PPbox}
+\newbox\MMbox \setbox\MMbox=\hbox{\kern.5pt\raise1pt\hbox{\sevensy\char0
+ \kern-1pt\char0}\kern.5pt}
+\def\MM{\copy\MMbox}
+\newbox\MGbox % symbol for ->
+\setbox\MGbox=\hbox{\kern-2pt\lower3pt\hbox{\teni\char'176}\kern1pt}
+\def\MG{\copy\MGbox}
+\def\MRL#1{\mathrel{\let\K==#1}}
+\let\GG=\gg
+\let\LL=\ll
+\let\NULL=\Lambda
+\mathchardef\AND="2026 % bitwise and; also \& (unary operator)
+\let\OR=\mid % bitwise or
+\let\XOR=\oplus % bitwise exclusive or
+\def\CM{{\sim}} % bitwise complement
+\newbox\MODbox \setbox\MODbox=\hbox{\eightrm\%}
+\def\MOD{\mathbin{\copy\MODbox}}
+\def\DC{\kern.1em{::}\kern.1em} % symbol for ::
+\def\PA{\mathbin{.*}} % symbol for .*
+\def\MGA{\mathbin{\MG*}} % symbol for ->*
+\def\this{\&{this}}
+
+\newbox\bak \setbox\bak=\hbox to -1em{} % backspace one em
+\newbox\bakk\setbox\bakk=\hbox to -2em{} % backspace two ems
+
+\newcount\ind % current indentation in ems
+\def\1{\global\advance\ind by1\hangindent\ind em} % indent one more notch
+\def\2{\global\advance\ind by-1} % indent one less notch
+\def\3#1{\hfil\penalty#10\hfilneg} % optional break within a statement
+\def\4{\copy\bak} % backspace one notch
+\def\5{\hfil\penalty-1\hfilneg\kern2.5em\copy\bakk\ignorespaces}% optional break
+\def\6{\ifmmode\else\par % forced break
+ \hangindent\ind em\noindent\kern\ind em\copy\bakk\ignorespaces\fi}
+\def\7{\Y\6} % forced break and a little extra space
+\def\8{\hskip-\ind em\hskip 2em} % no indentation
+
+\newcount\gdepth % depth of current major group, plus one
+\newcount\secpagedepth
+\secpagedepth=3 % page breaks will occur for depths -1, 0, and 1
+\newtoks\gtitle % title of current major group
+\newskip\intersecskip \intersecskip=12pt minus 3pt % space between sections
+\let\yskip=\smallskip
+\def\?{\mathrel?}
+\def\note#1#2.{\Y\noindent{\hangindent2em\baselineskip10pt\eightrm#1~#2.\par}}
+\def\lapstar{\rlap{*}}
+\def\stsec{\rightskip=0pt % get out of C mode (cf. \B)
+ \sfcode`;=1500 \pretolerance 200 \hyphenpenalty 50 \exhyphenpenalty 50
+ \noindent{\let\*=\lapstar\bf\secstar.\quad}}
+\let\startsection=\stsec
+\def\defin#1{\global\advance\ind by 2 \1\&{#1 } } % begin `define' or `format'
+\def\A{\note{See also section}} % xref for doubly defined section name
+\def\As{\note{See also sections}} % xref for multiply defined section name
+\def\B{\rightskip=0pt plus 100pt minus 10pt % go into C mode
+ \sfcode`;=3000
+ \pretolerance 10000
+ \hyphenpenalty 1000 % so strings can be broken (discretionary \ is inserted)
+ \exhyphenpenalty 10000
+ \global\ind=2 \1\ \unskip}
+\def\C#1{\5\5\quad$/\ast\,${\cmntfont #1}$\,\ast/$}
+\let\SHC\C % "// short comments" treated like "/* ordinary comments */"
+%\def\C#1{\5\5\quad$\triangleright\,${\cmntfont#1}$\,\triangleleft$}
+%\def\SHC#1{\5\5\quad$\diamond\,${\cmntfont#1}}
+\def\D{\defin{\#define}} % macro definition
+\let\E=\equiv % equivalence sign
+\def\ET{ and~} % conjunction between two section numbers
+\def\ETs{, and~} % conjunction between the last two of several section numbers
+\def\F{\defin{format}} % format definition
+\let\G=\ge % greater than or equal sign
+% \H is long Hungarian umlaut accent
+\let\I=\ne % unequal sign
+\def\J{\.{@\&}} % TANGLE's join operation
+\let\K== % assignment operator
+%\let\K=\leftarrow % "honest" alternative to standard assignment operator
+% \L is Polish letter suppressed-L
+\outer\def\M#1{\MN{#1}\ifon\vfil\penalty-100\vfilneg % beginning of section
+ \vskip\intersecskip\startsection\ignorespaces}
+\outer\def\N#1#2#3.{\gdepth=#1\gtitle={#3}\MN{#2}% beginning of starred section
+ \ifon\ifnum#1<\secpagedepth \vfil\eject % force page break if depth is small
+ \else\vfil\penalty-100\vfilneg\vskip\intersecskip\fi\fi
+ \message{*\secno} % progress report
+ \edef\next{\write\cont{\ZZ{#3}{#1}{\secno}% write to contents file
+ {\noexpand\the\pageno}}}\next % \ZZ{title}{depth}{sec}{page}
+ \ifon\startsection{\bf#3.\quad}\ignorespaces}
+\def\MN#1{\par % common code for \M, \N
+ {\xdef\secstar{#1}\let\*=\empty\xdef\secno{#1}}% remove \* from section name
+ \ifx\secno\secstar \onmaybe \else\ontrue \fi
+ \mark{{{\tensy x}\secno}{\the\gdepth}{\the\gtitle}}}
+% each \mark is {section reference or null}{depth plus 1}{group title}
+% \O is Scandinavian letter O-with-slash
+% \P is paragraph sign
+\def\Q{\note{This code is cited in section}} % xref for mention of a section
+\def\Qs{\note{This code is cited in sections}} % xref for mentions of a section
+\let\R=\lnot % logical not
+% \S is section sign
+\def\T#1{\leavevmode % octal, hex or decimal constant
+ \hbox{$\def\?{\kern.2em}%
+ \def\$##1{\egroup_{\,\rm##1}\bgroup}% suffix to constant
+ \def\_{\cdot 10^{\aftergroup}}% power of ten (via dirty trick)
+ \let\~=\oct \let\^=\hex {#1}$}}
+\def\U{\note{This code is used in section}} % xref for use of a section
+\def\Us{\note{This code is used in sections}} % xref for uses of a section
+\let\V=\lor % logical or
+\let\W=\land % logical and
+\def\X#1:#2\X{\ifmmode\gdef\XX{\null$\null}\else\gdef\XX{}\fi % section name
+ \XX$\langle\,${\let\I=\ne#2\eightrm\kern.5em#1}$\,\rangle$\XX}
+\def\Y{\par\yskip}
+\let\Z=\le
+\let\ZZ=\let % now you can \write the control sequence \ZZ
+\let\*=*
+
+%\def\oct{\hbox{\rm\char'23\kern-.2em\it\aftergroup\?\aftergroup}} % WEB style
+%\def\hex{\hbox{\rm\char"7D\tt\aftergroup}} % WEB style
+\def\oct{\hbox{$^\circ$\kern-.1em\it\aftergroup\?\aftergroup}}% CWEB style
+\def\hex{\hbox{$^{\scriptscriptstyle\#}$\tt\aftergroup}} % CWEB style
+\def\vb#1{\leavevmode\hbox{\kern2pt\vrule\vtop{\vbox{\hrule
+ \hbox{\strut\kern2pt\.{#1}\kern2pt}}
+ \hrule}\vrule\kern2pt}} % verbatim string
+
+\def\onmaybe{\let\ifon=\maybe} \let\maybe=\iftrue
+\newif\ifon \newif\iftitle \newif\ifpagesaved
+
+\def\lheader{\mainfont\the\pageno\eightrm\qquad\grouptitle\hfill\title\qquad
+ \mainfont\topsecno} % top line on left-hand pages
+\def\rheader{\mainfont\topsecno\eightrm\qquad\title\hfill\grouptitle
+ \qquad\mainfont\the\pageno} % top line on right-hand pages
+\def\grouptitle{\let\i=I\let\j=J\uppercase\expandafter{\expandafter
+ \takethree\topmark}}
+\def\topsecno{\expandafter\takeone\topmark}
+\def\takeone#1#2#3{#1}
+\def\taketwo#1#2#3{#2}
+\def\takethree#1#2#3{#3}
+\def\nullsec{\eightrm\kern-2em} % the \kern-2em cancels \qquad in headers
+
+\def\page{\box255 }
+\def\normaloutput#1#2#3{\ifodd\pageno\hoffset=\pageshift\fi
+ \shipout\vbox{
+ \vbox to\fullpageheight{
+ \iftitle\global\titlefalse
+ \else\hbox to\pagewidth{\vbox to10pt{}\ifodd\pageno #3\else#2\fi}\fi
+ \vfill#1}} % parameter #1 is the page itself
+ \global\advance\pageno by1}
+
+\gtitle={\.{CWEB} output} % this running head is reset by starred sections
+\mark{\noexpand\nullsec0{\the\gtitle}}
+\def\title{\expandafter\uppercase\expandafter{\jobname}}
+\def\topofcontents{\centerline{\titlefont\title}\vskip.7in
+ \vfill} % this material will start the table of contents page
+\def\botofcontents{\vfill
+ \centerline{\covernote}} % this material will end the table of contents page
+\def\covernote{}
+\def\contentspagenumber{0} % default page number for table of contents
+\newdimen\pagewidth \pagewidth=6.5in % the width of each page
+\newdimen\pageheight \pageheight=8.7in % the height of each page
+\newdimen\fullpageheight \fullpageheight=9in % page height including headlines
+\newdimen\pageshift \pageshift=0in % shift righthand pages wrt lefthand ones
+\def\magnify#1{\mag=#1\pagewidth=6.5truein\pageheight=8.7truein
+ \fullpageheight=9truein\setpage}
+\def\setpage{\hsize\pagewidth\vsize\pageheight} % use after changing page size
+\def\contentsfile{\jobname.toc} % file that gets table of contents info
+\def\readcontents{\input \contentsfile}
+\def\readindex{\input \jobname.idx}
+\def\readsections{\input \jobname.scn}
+
+\newwrite\cont
+\output{\setbox0=\page % the first page is garbage
+ \openout\cont=\contentsfile
+ \write\cont{\catcode `\noexpand\@=11\relax} % \makeatletter
+ \global\output{\normaloutput\page\lheader\rheader}}
+\setpage
+\vbox to \vsize{} % the first \topmark won't be null
+
+\def\mini{\Y\bgroup\obeylines}
+{\obeylines
+ \gdef\[#1 #2 #3
+{\noindent\kern.5\hsize #2\miniform#3, \S#1.\par}%
+ \gdef\]#1 #2 #3
+{\noindent\kern.5\hsize #2\miniform#3, \extref#1.\par}}
+\def\miniform{\futurelet\next\miniforma}
+\def\miniforma{\ifx\next\zip
+ \else\if=\noexpand\next \let\next\gobbleq
+ \else\let\next\colon\fi\fi\next}
+\def\zip{}
+\def\gobbleq={\,=\,}
+\def\colon{: }
+\def\extref{\futurelet\next\extrefa}
+\def\extrefa{\if"\next\let\next\gobblest\else\let\next\cite\fi\next}
+\def\gobblest"#1"{{\tentex#1}}
+\def\cite#1#2.{{\sc#1}\,\S#2.}
+\let\FI=\fi
+\let\shortpage=\relax
+\let\forcebr=\relax
+\def\uninitialized{???}
+
+\def\ch{\note{The following sections were changed by the change file:}
+ \let\*=\relax}
+\newbox\sbox % saved box preceding the index
+\newbox\lbox % lefthand column in the index
+\def\inx{\par\vskip6pt plus 1fil % we are beginning the index
+ \write\cont{} % ensure that the contents file isn't empty
+ \write\cont{\catcode `\noexpand\@=12\relax} % \makeatother
+ \closeout\cont % the contents information has been fully gathered
+ \output{\ifpagesaved\normaloutput{\box\sbox}\lheader\rheader\fi
+ \global\setbox\sbox=\page \global\pagesavedtrue}
+ \pagesavedfalse \eject % eject the page-so-far and predecessors
+ \setbox\sbox\vbox{\unvbox\sbox} % take it out of its box
+ \vsize=\pageheight \advance\vsize by -\ht\sbox % the remaining height
+ \hsize=.5\pagewidth \advance\hsize by -10pt
+ % column width for the index (20pt between cols)
+ \parfillskip 0pt plus .6\hsize % try to avoid almost empty lines
+ \def\lr{L} % this tells whether the left or right column is next
+ \output{\if L\lr\global\setbox\lbox=\page \gdef\lr{R}
+ \else\normaloutput{\vbox to\pageheight{\box\sbox\vss
+ \hbox to\pagewidth{\box\lbox\hfil\page}}}\lheader\rheader
+ \global\vsize\pageheight\gdef\lr{L}\global\pagesavedfalse\fi}
+ \message{Index:}
+ \parskip 0pt plus .5pt
+ \outer\def\I##1, {\par\hangindent2em\noindent##1:\kern1em} % index entry
+ \def\[##1]{$\underline{##1}$} % underlined index item
+ \rm \rightskip0pt plus 2.5em \tolerance 10000 \let\*=\lapstar
+ \hyphenpenalty 10000 \parindent0pt
+ \readindex}
+\def\fin{\par\vfill\eject % this is done when we are ending the index
+ \ifpagesaved\null\vfill\eject\fi % output a null index column
+ \if L\lr\else\null\vfill\eject\fi % finish the current page
+ \parfillskip 0pt plus 1fil
+ \def\grouptitle{NAMES OF THE SECTIONS}
+ \let\topsecno=\nullsec
+ \message{Section names:}
+ \output={\normaloutput\page\lheader\rheader}
+ \setpage
+ \def\note##1##2.{\quad{\eightrm##1~##2.}}
+ \def\Q{\note{Cited in section}} % crossref for mention of a section
+ \def\Qs{\note{Cited in sections}} % crossref for mentions of a section
+ \def\U{\note{Used in section}} % crossref for use of a section
+ \def\Us{\note{Used in sections}} % crossref for uses of a section
+ \def\I{\par\hangindent 2em}\let\*=*
+ \readsections}
+\def\con{\par\vfill\eject % finish the section names
+ \rightskip 0pt \hyphenpenalty 50 \tolerance 200
+ \setpage \output={\normaloutput\page\lheader\rheader}
+ \titletrue % prepare to output the table of contents
+ \pageno=\contentspagenumber
+ \def\grouptitle{TABLE OF CONTENTS}
+ \message{Table of contents:}
+ \topofcontents
+ \line{\hfil Section\hbox to3em{\hss Page}}
+ \let\ZZ=\contentsline
+ \readcontents\relax % read the contents info
+ \botofcontents \end} % print the contents page(s) and terminate
+\def\contentsline#1#2#3#4{\ifnum#2=0 \smallbreak\fi
+ \line{\consetup{#2}#1
+ \rm\leaders\hbox to .5em{.\hfil}\hfil\ #3\hbox to3em{\hss#4}}}
+\def\consetup#1{\ifcase#1 \bf % depth -1 (@**)
+ \or % depth 0 (@*)
+ \or \hskip2em % depth 1 (@*1)
+ \or \hskip4em % depth 2 (@*2)
+ \or \hskip6em % depth 3 (@*3)
+ \or \hskip8em % depth 4 (@*4)
+ \or \hskip10em % depth 5 (@*5)
+ \else \hskip12em \fi} % depth 6 or more
+\def\noinx{\let\inx=\end} % no indexes or table of contents
+\def\nosecs{\let\FIN=\fin \def\fin{\let\parfillskip=\end \FIN}}
+ % no index of section names or table of contents
+\def\nocon{\let\con=\end} % no table of contents
+\def\today{\ifcase\month\or
+ January\or February\or March\or April\or May\or June\or
+ July\or August\or September\or October\or November\or December\fi
+ \space\number\day, \number\year}
+\newcount\twodigits
+\def\hours{\twodigits=\time \divide\twodigits by 60 \printtwodigits
+ \multiply\twodigits by-60 \advance\twodigits by\time :\printtwodigits}
+\def\gobbleone1{}
+\def\printtwodigits{\advance\twodigits100
+ \expandafter\gobbleone\number\twodigits
+ \advance\twodigits-100 }
+\def\TeX{{\ifmmode\it\fi
+ \leavevmode\hbox{T\kern-.1667em\lower.424ex\hbox{E}\hskip-.125em X}}}
+\def\,{\relax\ifmmode\mskip\thinmuskip\else\thinspace\fi}
+\def\datethis{\def\startsection{\leftline{\sc\today\ at \hours}\bigskip
+ \let\startsection=\stsec\stsec}}
+ % say `\datethis' in limbo, to get your listing timestamped before section 1
+\def\datecontentspage{%
+ \def\topofcontents{\leftline{\sc\today\ at \hours}\bigskip
+ \centerline{\titlefont\title}\vfill}} % timestamps the contents page
+\def\formatoff{\gdef\F##1\par{\setbox0=\lastbox\par}} % omits output of @f
+\def\formaton{\gdef\F{\defin{format}}} % restores output of @f
+ % hack: you can say @t}\par\formaton{@> at end of an @f being suppressed
diff --git a/Build/source/texk/web2c/cwebdir/cttwinxmac.tex b/Build/source/texk/web2c/cwebdir/cttwinxmac.tex
new file mode 100644
index 00000000000..99ae6047ab4
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/cttwinxmac.tex
@@ -0,0 +1,319 @@
+% macros for index produced by twinx
+
+\let\:=\. % preserve a way to get the dot accent
+ % (all other accents will still work as usual)
+\def\TeX{{\ifmmode\it\fi
+ \hbox{T\kern-.1667em\lower.424ex\hbox{E}\hskip-.125em X}}}
+\def\,{\relax\ifmmode\mskip\thinmuskip\else\thinspace\fi}
+\let\mc=\ninerm % medium caps
+\def\CEE/{{\mc C\spacefactor1000}}
+\def\UNIX/{{\mc U\kern-.05emNIX\spacefactor1000}}
+\def\TEX/{\TeX}
+\def\CPLUSPLUS/{{\mc C\PP\spacefactor1000}}
+\def\9#1{}
+
+\newdimen\em \em=10pt % this "em" will not change with font size
+\parskip 0pt plus .1pt % almost no stretch between paragraphs
+\parindent 1\em % for paragraphs and for the first line of C text
+
+\font\ninerm=cmr9
+\font\eightrm=cmr8
+\font\sixrm=cmr6
+\font\ninei=cmmi9
+\font\eighti=cmmi8
+\font\sixi=cmmi6
+\skewchar\ninei='177 \skewchar\eighti='177 \skewchar\sixi='177
+\font\ninesy=cmsy9
+\font\eightsy=cmsy8
+\font\sixsy=cmsy6
+\skewchar\ninesy='60 \skewchar\eightsy='60 \skewchar\sixsy='60
+\font\ninebf=cmbx9
+\font\eightbf=cmbx8
+\font\sixbf=cmbx6
+\font\ninett=cmtt9
+\font\eighttt=cmtt8
+\hyphenchar\ninett=-1 \hyphenchar\eighttt=-1
+\font\ninesl=cmsl9
+\font\eightsl=cmsl8
+\font\nineit=cmti9
+\font\eightit=cmti8
+\font\tentex=cmtex10
+\font\ninetex=cmtex9 % TeX extended character set (used in strings)
+\font\eighttex=cmtex8
+\fontdimen7\tentex=0pt % no double space after sentences
+\fontdimen7\ninetex=0pt
+\fontdimen7\eighttex=0pt
+
+\newif\iftenpoint
+\def\tenpoint{\tenpointtrue
+ \def\rm{\fam0\tenrm}%
+ \textfont0=\tenrm \scriptfont0=\sevenrm \scriptscriptfont0=\fiverm
+ \textfont1=\teni \scriptfont1=\seveni \scriptscriptfont1=\fivei
+ \textfont2=\tensy \scriptfont2=\sevensy \scriptscriptfont2=\fivesy
+ \textfont3=\tenex \scriptfont3=\tenex \scriptscriptfont3=\tenex
+ \def\it{\fam\itfam\tenit}%
+ \textfont\itfam=\tenit
+ \def\sl{\fam\slfam\tensl}%
+ \textfont\slfam=\tensl
+ \def\bf{\fam\bffam\tenbf}%
+ \textfont\bffam=\tenbf \scriptfont\bffam=\sevenbf
+ \scriptscriptfont\bffam=\fivebf
+ \def\tt{\fam\ttfam\tentt}%
+ \textfont\ttfam=\tentt
+ \def\ttx{\tentex}%
+ \normalbaselineskip=12pt
+ \let\mc=\ninerm
+ \let\sc=\eightrm
+ \let\big=\tenbig
+ \setbox\strutbox=\hbox{\vrule height8pt depth3pt width 0pt}%
+ \normalbaselines\rm}
+
+\def\ninepoint{\tenpointfalse
+ \def\rm{\fam0\ninerm}%
+ \textfont0=\ninerm \scriptfont0=\sixrm \scriptscriptfont0=\fiverm
+ \textfont1=\ninei \scriptfont1=\sixi \scriptscriptfont1=\fivei
+ \textfont2=\ninesy \scriptfont2=\sixsy \scriptscriptfont2=\fivesy
+ \textfont3=\tenex \scriptfont3=\tenex \scriptscriptfont3=\tenex
+ \def\it{\fam\itfam\nineit}%
+ \textfont\itfam=\nineit
+ \def\sl{\fam\slfam\ninesl}%
+ \textfont\slfam=\ninesl
+ \def\bf{\fam\bffam\ninebf}%
+ \textfont\bffam=\ninebf \scriptfont\bffam=\sixbf
+ \scriptscriptfont\bffam=\fivebf
+ \def\tt{\fam\ttfam\ninett}%
+ \textfont\ttfam=\ninett
+ \def\ttx{\ninetex}%
+ \normalbaselineskip=11pt
+ \let\mc=\eightrm
+ \let\sc=\sevenrm
+ \let\big=\ninebig
+ \setbox\strutbox=\hbox{\vrule height8pt depth3pt width 0pt}%
+ \normalbaselines\rm}
+
+\def\eightpoint{%
+ \def\rm{\fam0\eightrm}%
+ \textfont0=\eightrm \scriptfont0=\sixrm \scriptscriptfont0=\fiverm
+ \textfont1=\eighti \scriptfont1=\sixi \scriptscriptfont1=\fivei
+ \textfont2=\eightsy \scriptfont2=\sixsy \scriptscriptfont2=\fivesy
+ \textfont3=\tenex \scriptfont3=\tenex \scriptscriptfont3=\tenex
+ \def\it{\fam\itfam\eightit}%
+ \textfont\itfam=\eightit
+ \def\sl{\fam\slfam\eightsl}%
+ \textfont\slfam=\eightsl
+ \def\bf{\fam\bffam\eightbf}%
+ \textfont\bffam=\eightbf \scriptfont\bffam=\sixbf
+ \scriptscriptfont\bffam=\fivebf
+ \def\tt{\fam\ttfam\eighttt}%
+ \textfont\ttfam=\eighttt
+ \def\ttx{\eighttex}%
+ \normalbaselineskip=9pt
+ \let\mc=\sevenrm
+ \let\sc=\sixrm
+ \let\big=\eightbig
+ \setbox\strutbox=\hbox{\vrule height7pt depth2pt width 0pt}%
+ \normalbaselines\rm}
+
+\tenpoint
+\def\tenbig#1{{\hbox{$\left#1\vbox to8.5pt{}\right.\nulldelimiterspace=0pt$}}}
+\def\ninebig#1{{\hbox{$\textfont0=\tenrm\textfont2=\tensy
+ \left#1\vbox to7.25pt{}\right.\nulldelimiterspace=0pt$}}}
+\def\eightbig#1{{\hbox{$\textfont0=\ninerm\textfont2=\ninesy
+ \left#1\vbox to6.5pt{}\right.\nulldelimiterspace=0pt$}}}
+
+\def\Cee{{\mc C\spacefactor1000}}
+\def\UNIX{{\mc UNIX\spacefactor1000}}
+\font\titlefont=cmr7 scaled\magstep4 % title on the contents page
+\font\ttitlefont=cmtt10 scaled\magstep2 % typewriter type in title
+
+\def\\#1{\leavevmode\hbox{\it#1\/\kern.05em}} % italic type for identifiers
+\def\|#1{\leavevmode\hbox{$#1$}} % one-letter identifiers look better this way
+\def\&#1{\leavevmode\hbox{\bf
+ \def\_{\kern.04em\vbox{\hrule width.3em height .6pt}\kern.08em}%
+ #1\/\kern.05em}} % boldface type for reserved words
+\def\.#1{\leavevmode\hbox{\ttx % typewriter type for strings
+ \let\\=\BS % backslash in a string
+ \let\{=\LB % left brace in a string
+ \let\}=\RB % right brace in a string
+ \let\~=\TL % tilde in a string
+ \let\ =\SP % space in a string
+ \let\_=\UL % underline in a string
+ \let\&=\AM % ampersand in a string
+ \let\^=\CF % circumflex in a string
+ #1\kern.2em}}
+\def\){\discretionary{\hbox{\tentex\BS}}{}{}}
+\def\AT{@} % at sign for control text
+
+\chardef\AM=`\& % ampersand character in a string
+\chardef\BS=`\\ % backslash in a string
+\chardef\LB=`\{ % left brace in a string
+\chardef\RB=`\} % right brace in a string
+\def\SP{{\tt\char`\ }} % (visible) space in a string
+\chardef\TL=`\~ % tilde in a string
+\chardef\UL=`\_ % underline character in a string
+\chardef\CF=`\^ % circumflex character in a string
+
+\newbox\PPbox % symbol for ++
+\setbox\PPbox=\hbox{\kern.5pt\raise1pt\hbox{\sevenrm+\kern-1pt+}\kern.5pt}
+\def\PP{\copy\PPbox}
+\newbox\MMbox \setbox\MMbox=\hbox{\kern.5pt\raise1pt\hbox{\sevensy\char0
+ \kern-1pt\char0}\kern.5pt}
+\def\MM{\copy\MMbox}
+\newbox\MGbox % symbol for ->
+\setbox\MGbox=\hbox{\kern-2pt\lower3pt\hbox{\teni\char'176}\kern1pt}
+\def\MG{\copy\MGbox}
+\let\GG=\gg
+\let\LL=\ll
+\let\NULL=\Lambda
+\mathchardef\AND="2026 % bitwise and; also \& (unary operator)
+\let\OR=\mid % bitwise or
+\let\XOR=\oplus % bitwise exclusive or
+\def\CM{{\sim}} % bitwise complement
+\newbox\MODbox \setbox\MODbox=\hbox{\eightrm\%}
+\def\MOD{\mathbin{\copy\MODbox}}
+
+\newbox\bak \setbox\bak=\hbox to -1\em{} % backspace one em
+\newbox\bakk\setbox\bakk=\hbox to -2\em{} % backspace two ems
+
+\newcount\ind % current indentation in ems
+\def\1{\global\advance\ind by1\hangindent\ind \em} % indent one more notch
+\def\2{\global\advance\ind by-1} % indent one less notch
+\def\3#1{\hfil\penalty#10\hfilneg} % optional break within a statement
+\def\4{\copy\bak} % backspace one notch
+\def\5{\hfil\penalty-1\hfilneg\kern2.5\em\copy\bakk\ignorespaces}% optional break
+\def\6{\ifmmode\else\par % forced break
+ \hangindent\ind \em\noindent\kern\ind \em\copy\bakk\ignorespaces\fi}
+\def\7{\Y\6} % forced break and a little extra space
+\def\8{\hskip-\ind \em\hskip 2\em} % no indentation
+
+\let\yskip=\smallskip
+\def\?{\mathrel?}
+\def\note#1#2.{\par\penalty5000
+ \Y\noindent{\hangindent2\em\baselineskip10pt\eightrm#1~#2.\par}}
+\def\lapstar{\rlap{*}}
+\def\stsec{\tenpoint
+ \rightskip=0pt % get out of C mode (cf. \B)
+ \sfcode`;=1500 \pretolerance 200 \hyphenpenalty 50 \exhyphenpenalty 50
+ \noindent\strut{\bf\modno.\quad}}
+\let\startsection=\stsec
+\def\defin#1{\global\advance\ind by 2 \1\&{#1 } } % begin `define' or `format'
+\def\A{\note{See also section}} % xref for doubly defined section name
+\def\As{\note{See also sections}} % xref for multiply defined section name
+\def\B{\iftenpoint\ninepoint\fi
+ \rightskip=0pt plus 100pt minus 10pt % go into C mode
+ \sfcode`;=3000
+ \pretolerance 10000
+ \hyphenpenalty 9999 % so strings can be broken (discretionary \ is inserted)
+ \exhyphenpenalty 10000
+ \global\ind=2 \1\ \unskip}
+\def\C#1{\5\5\quad$/\ast\,$#1$\,\ast/$}
+\def\D{\defin{\#define}} % macro definition
+\let\E=\equiv % equivalence sign
+\def\ET{ and~} % conjunction between two section numbers
+\def\ETs{, and~} % conjunction between the last two of several section numbers
+\def\F{\defin{format}} % format definition
+\let\G=\ge % greater than or equal sign
+% \H is long Hungarian umlaut accent
+\let\I=\ne % unequal sign
+\def\J{\.{@\&}} % TANGLE's join operation
+\let\K== % can be changed to left arrow, if desired
+% \L is Polish letter suppressed-L; we have no shorthand for \le
+% \O is Scandinavian letter O-with-slash
+% \P is paragraph sign
+% \Q is not used
+\let\R=\lnot % logical not
+% \S is section sign
+\def\T#1{\leavevmode % octal, hex or decimal constant
+ \hbox{${\def\?{\kern.2em}%
+ \def\${\ell}% long constant
+ \def\_{\cdot 10^{\aftergroup}}% power of ten (via dirty trick)
+ \let\~=\oct \let\^=\hex #1}$}}
+\def\U{\note{This code is used in section}} % xref for use of a section
+\def\Us{\note{This code is used in sections}} % xref for uses of a section
+\let\V=\lor % logical or
+\let\W=\land % logical and
+\def\X#1:#2\X{\ifmmode\gdef\XX{\null$\null}\else\gdef\XX{}\fi % section name
+ \XX$\langle\,${#2\sevenrm\kern.5em#1}$\,\rangle$\XX}
+\def\Y{\par\yskip}
+\let\Z=\let % now you can \send the control sequence \Z
+\let\*=*
+
+%\def\oct{\hbox{\rm\char'23\kern-.2em\it\aftergroup\?\aftergroup}} % WEB style
+%\def\hex{\hbox{\rm\char"7D\tt\aftergroup}} % WEB style
+\def\oct{\hbox{$^\circ$\kern-.1em\it\aftergroup\?\aftergroup}}% CWEB style
+\def\hex{\hbox{$^{\scriptscriptstyle\#}$\tt\aftergroup}} % CWEB style
+\def\vb#1{\leavevmode\hbox{\kern2pt\vrule\vtop{\vbox{\hrule
+ \hbox{\strut\kern2pt\.{#1}\kern2pt}}
+ \hrule}\vrule\kern2pt}} % verbatim string
+
+\def\normaloutput#1{\shipout\vbox{
+ \vbox to 3pc{\ifodd\pageno\rightheadline\else\leftheadline\fi\vfill}
+ \nointerlineskip#1}
+ \global\advance\pageno 1 }
+\def\page{\box255 }
+
+\newif\ifpagesaved \newif\iftitle
+\def\leftheadline{\hbox to\pagewd{\vbox to10pt{}%
+ \iftitle\global\titlefalse\else\ninesl\rhead\fi
+ \hfil\eightrm\folio}}
+\def\rightheadline{\hbox to\pagewd{\vbox to10pt{}%
+ \eightrm\folio\hfil\ninesl\rhead\/}}
+\def\rhead{MASTER INDEX}
+\newbox\sbox % saved box preceding the index
+\newbox\lbox % lefthand column in the index
+
+\newdimen\pageht \pageht=19cm
+\newdimen\pagewd \pagewd=13cm
+\newdimen\colwd \colwd=\pagewd
+ \advance\colwd by -1pc \divide\colwd by 2 % for two columns
+
+% Usually some text will be inserted at the beginning, preceded by
+% \preinx and followed by \inx
+\def\preinx{\tenpoint \hsize=\pagewd
+ \output{\ifpagesaved\normaloutput{\box\sbox}\fi
+ \global\setbox\sbox=\page \global\pagesavedtrue}
+ \rightskip0pt \tolerance 200
+ \pagesavedfalse \parindent=20pt}
+\def\inx{\parindent=0pt
+ \vskip 15pt plus 1fil
+ \eject\setbox\sbox\vbox{\unvbox\sbox} % take text out of its box
+ \vsize=\pageht \advance\vsize by -\ht\sbox % the remaining height
+ \rightskip0pt plus 2.5em \tolerance 10000
+ \hsize=\colwd
+ \parfillskip 0pt plus .6\hsize % try to avoid almost empty lines
+ \output{\twocolout} \eightpoint}
+\vsize=\pageht
+\eightpoint
+\def\lr{L} % this tells whether the left or right column is next
+\def\twocolout{\if L\lr\global\setbox\lbox=\page \gdef\lr{R}
+ \else\normaloutput{\vbox to\pageht{\box\sbox\vss
+ \hbox to\pagewd{\box\lbox\hfil\page}}}
+ \global\vsize=\pageht\gdef\lr{L}\global\pagesavedfalse\fi}
+\output{\twocolout}
+\parskip 0pt plus .5pt
+\outer\def\I#1\unskip, {\par\hangindent2em\noindent#1:\kern1em} % index entry
+\def\[#1]{$\underline{#1}$} % underlined index item
+\rm \rightskip0pt plus 2.5em \tolerance 10000
+\hyphenpenalty 10000
+\parindent0pt
+\def\fin{\par\vfill\eject % this is done when we are ending the index
+ \ifpagesaved\null\vfill\eject\fi % output a null index column
+ \if L\lr\else\null\vfill\eject\fi % finish the current page
+ \end}
+
+\input twinx-startup % custom IDs, \preinx copy, etc.
+
+% To produce only a subset of pages, put the page numbers on separate
+% lines in a file called pages.tex
+\let\Shipout=\shipout
+\newread\pages \newcount\nextpage \openin\pages=pages
+\def\getnextpage{\ifeof\pages\else
+ {\endlinechar=-1\read\pages to\next
+ \ifx\next\empty % in this case we should have eof now
+ \else\global\nextpage=\next\fi}\fi}
+\ifeof\pages\else\message{OK, I'll ship only the requested pages!}
+ \getnextpage\fi
+\def\shipout{\ifeof\pages\let\next=\Shipout
+ \else\ifnum\pageno=\nextpage\getnextpage\let\next=\Shipout
+ \else\let\next=\Tosspage\fi\fi \next}
+\newbox\garbage \def\Tosspage{\deadcycles=0\setbox\garbage=}
diff --git a/Build/source/texk/web2c/cwebdir/ctwill-w2c.ch b/Build/source/texk/web2c/cwebdir/ctwill-w2c.ch
new file mode 100644
index 00000000000..30d5671bf3a
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/ctwill-w2c.ch
@@ -0,0 +1,3217 @@
+@q Changes for CWEB in TeX Live from numerous contributors. @>
+@q This file is in the Public Domain. @>
+
+@q Most of the original Kpathsea changes by Wlodek Bzyl and Olaf Weber @>
+@q were merged with the set of change files of the CWEBbin project; @>
+@q see https://github.com/ascherer/cwebbin for the original parts. @>
+
+@q This stripped change file {comm,ctang,cweav,ctwill}-w2c.ch has been @>
+@q created from the set of change files {comm,ctang,cweav}-patch.ch, @>
+@q {comm,ctang,cweav}-ansi.ch, {comm,ctang,cweav}-extensions.ch, @>
+@q {comm,ctang,cweav}-output.ch, {comm,ctang,cweav}-i18n.ch, and @>
+@q cweav-twill.ch for CTWILL, and {comm,ctang,cweav,ctwill}-texlive.ch @>
+@q with the 'tie' processor and is used as a monolithic changefile for @>
+@q {common,ctangle,cweave}.w in TeX Live. @>
+
+@q Please send comments, suggestions, etc. to tex-k@@tug.org. @>
+
+@x
+% This file is part of CWEB.
+% This program by Silvio Levy and Donald E. Knuth
+% is based on a program by Knuth.
+% It is distributed WITHOUT ANY WARRANTY, express or implied.
+@y
+% This program by Don Knuth is based on CWEAVE by Levy and Knuth.
+% It's somewhat flaky, so you probably shouldn't try to use it.
+@z
+
+@x
+% (essentially the same as version 3.6, which added
+% recently introduced features of standard C++ to version 3.4)
+% (In November 2016 I made minor adjustments but changed no code -- DEK)
+@y
+@z
+
+@x
+% Here is TeX material that gets inserted after \input cwebmac
+@y
+% Here is TeX material that gets inserted after \input ctwimac
+\def\contentspagenumber{0} % default page number for table of contents
+@z
+
+@x
+\def\title{CWEAVE (Version 3.64)}
+@y
+\def\title{CTWILL (Version 3.64 [\TeX~Live])}
+@z
+
+@x
+ \centerline{\titlefont The {\ttitlefont CWEAVE} processor}
+@y
+ \centerline{\titlefont The {\ttitlefont CTWILL} processor}
+@z
+
+@x
+ \centerline{(Version 3.64)}
+@y
+ \centerline{(Version 3.64 [\TeX~Live])}
+@z
+
+@x
+@s not_eq normal @q unreserve a C++ keyword @>
+@y
+@z
+
+@x
+This is the \.{CWEAVE} program by Silvio Levy and Donald E. Knuth,
+based on \.{WEAVE} by Knuth.
+We are thankful to Steve Avery,
+Nelson Beebe, Hans-Hermann Bode (to whom the original \CPLUSPLUS/ adaptation
+is due), Klaus Guntermann, Norman Ramsey, Tomas Rokicki, Joachim Schnitter,
+Joachim Schrod, Lee Wittenberg, Saroj Mahapatra, Cesar Augusto Rorato
+Crusius, and others who have contributed improvements.
+
+The ``banner line'' defined here should be changed whenever \.{CWEAVE}
+is modified.
+
+@d banner "This is CWEAVE (Version 3.64)\n"
+@y
+This is the \.{CTWILL} program by D. E. Knuth, based
+on \.{CWEAVE} by Silvio Levy and D.~E. Knuth. It is also based on
+\.{TWILL}, a private \.{WEB} program that Knuth wrote to produce
+Volumes B and~D of {\sl Computers {\char`\&} Typesetting\/} in 1985.
+\.{CTWILL} was hacked together hastily in June, 1992, to generate pages for
+Knuth's book about the Stanford GraphBase, and updated even more hastily
+in March, 1993 to generate final copy for that book. The main idea was to
+extend \.{CWEAVE} so that ``mini-indexes'' could appear.
+No time was available to make \.{CTWILL} into a refined or complete system,
+nor even to fully update the program documentation below. Subsequent changes
+were made only to maintain compatibility with \.{CWEAVE}. Further information
+can be found in Knuth's article ``Mini-indexes for literate programs,''
+reprinted in {\sl Digital Typography\/} (1999), 225--245.
+
+The ``banner line'' defined here should be changed whenever \.{CTWILL} is
+modified. The version number parallels the corresponding version of \.{CWEAVE}.
+
+@d banner _("This is CTWILL, Version 3.64")
+ /* will be extended by the \TeX~Live |versionstring| */
+@z
+
+@x
+@ We predeclare several standard system functions here instead of including
+their system header files, because the names of the header files are not as
+standard as the names of the functions. (For example, some \CEE/ environments
+have \.{<string.h>} where others have \.{<strings.h>}.)
+
+@<Predecl...@>=
+extern int strlen(); /* length of string */
+extern int strcmp(); /* compare strings lexicographically */
+extern char* strcpy(); /* copy one string to another */
+extern int strncmp(); /* compare up to $n$ string characters */
+extern char* strncpy(); /* copy up to $n$ string characters */
+@y
+@ For string handling we include the {\mc ANSI C} system header file instead
+of predeclaring the standard system functions |strlen|, |strcmp|, |strcpy|,
+|strncmp|, and |strncpy|.
+@^system dependencies@>
+
+@<Include files@>=
+#include <string.h>
+
+@ Here is a sort of user manual for \.{CTWILL}---which is exactly like
+\.{CWEAVE} except that it produces much better documentation, for which you
+must work harder. As with \.{CWEAVE}, input comes from a source file
+\.{foo.w} and from an optional (but now almost mandatory) change file
+\.{foo.ch}; output goes to \.{foo.tex}, \.{foo.idx}, and \.{foo.scn}.
+Unlike \.{CWEAVE}, there is an additional output file, \.{foo.aux},
+which records all nonexternal definitions. The \.{.aux} file also
+serves as an input file on subsequent runs. You should run \.{CTWILL}
+twice, once to prime the pump and once to get decent answers.
+
+Moreover, you must run the output twice through \TeX. (This double duplicity
+suggested the original name \.{TWILL}.) After `\.{tex} \.{foo}' you
+will have output that looks like final pages except that the entries
+of mini-indexes won't be alphabetized. \TeX\ will say `This is the first
+pass', and it will produce a weird file called \.{foo.ref}. Say
+$$\.{refsort < foo.ref > foo.sref}$$
+and then another `\.{tex} \.{foo}' will produce alphabetized output.
+While \TeX\ runs it emits messages filled with numeric data, indicating how
+much space is consumed by each program section. If you can decipher these
+numbers (see \.{ctwimac.tex}), you can use them to fine-tune the page
+layout. You might be tempted to do fine tuning by editing \.{foo.tex}
+directly, but it's better to incorporate all changes into \.{foo.ch}.
+
+The mini-indexes list identifiers that are used but not defined on
+each two-page spread. At the end of each section, \.{CTWILL} gives
+\TeX\ a list of identifiers used in that section and information
+about where they are defined. The macros in \.{ctwimac.tex} figure out
+which identifiers should go in each mini-index, based on how the pages
+break. (Yes, those macros are pretty hairy.)
+
+The information that \.{CTWILL} concocts from \.{foo.w} is not always
+correct. Sometimes you'll use an identifier that you don't want
+indexed; for example, your exposition might talk about |f(x)| when you
+don't mean to refer to program variables |f| or |x|. Sometimes you'll
+use an identifier that's defined in a header file, unknown to
+\.{CTWILL}. Sometimes you'll define a single identifier in several
+different places, and \.{CTWILL} won't know which definition to choose.
+But all is not lost. \.{CTWILL} guesses right most of the time, and you can
+give it the necessary hints in other places via your change file.
+
+If you think it's easy to write a completely automatic system that doesn't
+make \.{CTWILL}'s mistakes and doesn't depend so much on change files,
+please do so.
+
+\.{CTWILL} uses a very simple method to generate mini-index info. By
+understanding this method, you will understand how to fix it when things
+go wrong. Every identifier has a current ``meaning,'' consisting of its
+abstract type and the number of the section in which it was most recently
+defined. For example, if your \Cee\ program says `|char *s|' in section~3,
+the meaning of~|s| gets changed to `\&{char} $*$, \S3' while \.{CTWILL}
+is processing that section. If you refer to~|s| in section~10, and if
+|s|~hasn't been redefined in the meantime, and if section~10 doesn't
+wind up on the same two-page spread as section~3, the mini-index generated
+by section~10 will say ``|s|: \&{char}~$*$, \S3.''
+
+The current meaning of every identifier is initially `\.{\\uninitialized}'.
+Then \.{CTWILL} reads the \.{.aux} file for your job, if any; this
+\.{.aux} file contains all definitions of new meanings in the previous
+run, so it tells \.{CTWILL} about definitions that will be occurring
+in the future. If all identifiers have a unique definition, they will
+have a unique and appropriate meaning in the mini-indexes.
+
+But some identifiers, like parameters to procedures, may be defined
+several times. Others may not be defined at all, because they are
+defined elsewhere and mentioned in header files included by the \Cee\
+preprocessor. To solve this problem, \.{CTWILL} provides mechanisms by which
+the current meaning of an identifier can be temporarily or permanently
+changed.
+
+For example, the operation
+$$\.{@@\$s \{FOO\}3 \\\&\{char\} \$*\$@@>}$$
+changes the current meaning of |s| to the \TeX\ output of `\.{\\\&\{char\}}
+\.{\$*\$}' in section~3 of program {\sc FOO}. All entries in the \.{.aux}
+file are expressed in the form of this \.{@@\$} operator; therefore you
+can use a text editor to paste such entries into a \.{.ch} file, whenever
+you want to tell \.{CTWILL} about definitions that are out of order
+or from other programs.
+
+Before reading the \.{.aux} file, \.{CTWILL} actually looks for a file
+called \.{system.bux}, which will be read if present. And after
+\.{foo.aux}, a third possibility is \.{foo.bux}. The general
+convention is to put definitions of system procedures such as |printf|
+into \.{system.bux}, and to put definitions found in specifically
+foo-ish header files into \.{foo.bux}. Like the \.{.aux}
+files, \.{.bux} files should contain only \.{@@\$} specifications;
+this rule corresponds to the fact that `bux' is the plural of `\$'.
+The \.{.bux} files may also contain \.{@@i} includes.
+
+A companion operation \.{@@\%} signifies that all \.{@@\$}
+specifications from the present point to the beginning of the next
+section will define {\it temporary\/} meanings instead of permanent
+ones. Temporary meanings are placed into the
+mini-index of the current section; the permanent (current) meaning of
+the identifier will not be changed, nor will it appear in the
+mini-index of the section. If several temporary meanings are assigned
+to the same identifier in a section, all will appear in the mini-index.
+Each \.{@@\%} toggles the temporary/permanent convention; thus, after
+an even number of \.{@@\%} operations in a section, meanings specified
+by \.{@@\$} are permanent.
+
+The operation \.{@@-} followed by an identifier followed by \.{@@>}
+specifies that the identifier should not generate a mini-index entry
+in the current section (unless, of course, a temporary meaning is assigned).
+
+If \.{@@-foo@@>} appears in a section where a new permanent meaning is
+later defined by the semantics of~\Cee, the current meaning of \\{foo}
+will not be redefined; moreover, this current meaning, which may have
+been changed by \.{@@\$foo ...@@>}, will also be written to the
+\.{.aux} file. Therefore you can control what \.{CTWILL} outputs; you
+can keep it from repeatedly contaminating the \.{.aux} file with
+things you don't like.
+
+The meaning specified by \.{@@\$...@@>} generally has four components:
+an identifier (followed by space), a program name (enclosed in braces),
+a section number (followed by space), and a \TeX\ part. The \TeX\ part
+must have fewer than 50 characters. If the \TeX\ part starts
+with `\.=', the mini-index entry will contain an equals sign instead
+of a colon; for example,
+$$\.{@@\$buf\_size \{PROG\}10 =\\T\{200\}@@>}$$
+generates either `$\\{buf\_size}=200$, \S10' or
+`$\\{buf\_size}=200$, {\sc PROG}\S10', depending on whether
+`{\sc PROG}' is or isn't the title of the current program. If the
+\TeX\ part is `\.{\\zip}', the mini-index entry will contain neither
+colon nor equals, just a comma. The program name and section number
+can also be replaced by a string. For example,
+$$\.{@@\$printf "<stdio.h>" \\zip@@>}$$
+will generate a mini-index entry like `\\{printf}, \.{<stdio.h>}.'.
+
+\vfill\eject
+
+A special ``proofmode'' is provided so that you can check \.{CTWILL}'s
+conclusions about cross-references. Run \.{CTWILL} with the
+flag \.{+P}, and \TeX\ will produce a specially formatted document
+({\it without\/} mini-indexes)
+in which you can check that your specifications are correct.
+You should always do this before generating mini-indexes, because
+mini-indexes can mask errors if page breaks are favorable but the
+errors might reveal themselves later after your program has changed.
+The proofmode output is much easier to check than the mini-indexes themselves.
+
+The control code \.{@@r} or \.{@@R} causes \.{CTWILL} to emit
+the \TeX\ macro `\.{\\shortpage}' just before starting the next
+section of the program. This causes the section to appear at the top of
+a right-hand page, if it would ordinarily have appeared near the bottom
+of a left-hand page and split across the pages. (The \.{\\shortpage} macro
+is fragile and should be used only in cases where it will not mess up
+the output; insert it only when fine-tuning a set of pages.) If the
+next section is a starred section, the behavior is slightly different
+(but still fragile): The starred section will either be postponed to
+a left-hand page, if it normally would begin on a right-hand page,
+or vice versa. In other words, \.{@@r@@*} inverts the left/right logic.
+
+\.{CTANGLE} does not recognize the operations \.{@@\$}, \.{@@\%}, \.{@@-},
+and \.{@@r}, which are unique to \.{CTWILL}. But that is no problem,
+since you use them only in change files set up for book publishing,
+which are quite different from the change files you set up for tangling.
+
+(End of user manual. We now resume the program for \.{CWEAVE}, with occasional
+outbursts of new code.)
+
+@d max_tex_chars 50 /* limit on the \TeX\ part of a meaning */
+@z
+
+@x
+int main (ac, av)
+int ac; /* argument count */
+char **av; /* argument values */
+@y
+int main (@t\1\1@>
+int ac, /* argument count */
+char **av@t\2\2@>) /* argument values */
+@z
+
+@x
+ argc=ac; argv=av;
+@y
+ extern const char *use_language; /* prefix to \.{cwebmac.tex} in \TEX/ output */
+ argc=ac; argv=av;
+@z
+
+@x
+ program=cweave;
+@y
+ program=ctwill;
+@z
+
+@x
+ make_xrefs=force_lines=make_pb=1; /* controlled by command-line options */
+ common_init();
+ @<Set initial values@>;
+@y
+ @<Set initial values@>;
+ common_init();
+ @<Start \TEX/ output@>;
+@z
+
+@x
+ if (show_banner) printf(banner); /* print a ``banner line'' */
+@y
+ if (show_banner) cb_show_banner(); /* print a ``banner line'' */
+@z
+
+@x
+@d max_bytes 90000 /* the number of bytes in identifiers,
+@y
+@d max_bytes 1000000 /* the number of bytes in identifiers,
+@z
+
+@x
+@d max_names 4000 /* number of identifiers, strings, section names;
+@y
+@d max_names 10239 /* number of identifiers, strings, section names;
+@z
+
+@x
+@d max_sections 2000 /* greater than the total number of sections */
+@d hash_size 353 /* should be prime */
+@d buf_size 100 /* maximum length of input line, plus one */
+@y
+@d max_sections 10239 /* greater than the total number of sections */
+@d hash_size 8501 /* should be prime */
+@d buf_size 1000 /* maximum length of input line, plus one */
+@z
+
+@x
+@d max_refs 20000 /* number of cross-references; must be less than 65536 */
+@d max_toks 20000 /* number of symbols in \CEE/ texts being parsed;
+@y
+@d max_refs 65535 /* number of cross-references; must be less than 65536 */
+@d max_toks 65535 /* number of symbols in \CEE/ texts being parsed;
+@z
+
+@x
+@d max_texts 4000 /* number of phrases in \CEE/ texts being parsed;
+@y
+@d max_texts 10239 /* number of phrases in \CEE/ texts being parsed;
+@z
+
+@x
+@d max_scraps 2000 /* number of tokens in \CEE/ texts being parsed */
+@y
+@d max_scraps 10000 /* number of tokens in \CEE/ texts being parsed */
+@z
+
+@x
+@i common.h
+@y
+@i comm-w2c.h
+@z
+
+@x
+turned on during the first phase.
+
+@<Global...@>=
+boolean change_exists; /* has any section changed? */
+@y
+turned on during the first phase---NOT!
+@z
+
+@x
+sixteen_bits xref_switch,section_xref_switch; /* either zero or |def_flag| */
+@y
+sixteen_bits xref_switch,section_xref_switch; /* either zero or |def_flag| */
+
+@ \.{CTWILL} also has special data structures to keep track of current
+and temporary meanings. These structures were not designed for maximum
+efficiency; they were designed to be easily grafted into \.{CWEAVE}'s
+existing code without major surgery.
+
+@d max_meanings 100 /* max temporary meanings per section */
+@d max_titles 100 /* max distinct program or header names in meanings */
+
+@<Type...@>=
+typedef struct {
+ name_pointer id; /* identifier whose meaning is being recorded */
+ sixteen_bits prog_no; /* title of program or header in which defined */
+ sixteen_bits sec_no; /* section number in which defined */
+ char tex_part[max_tex_chars]; /* \TeX\ part of meaning */
+} meaning_struct;
+
+@ @<Glob...@>=
+struct perm_meaning {
+ meaning_struct perm; /* current meaning of an identifier */
+ int stamp; /* last section number in which further output suppressed */
+ struct perm_meaning *link; /* another meaning to output in this section */
+} cur_meaning[max_names]; /* the current ``permanent'' meanings */
+struct perm_meaning *top_usage; /* first meaning to output in this section */
+meaning_struct temp_meaning_stack[max_meanings]; /* the current ``temporary'' meanings */
+meaning_struct *temp_meaning_ptr; /* first available slot in |temp_meaning_stack| */
+meaning_struct *max_temp_meaning_ptr; /* its maximum value so far */
+name_pointer title_code[max_titles]; /* program names seen so far */
+name_pointer *title_code_ptr; /* first available slot in |title_code| */
+char ministring_buf[max_tex_chars]; /* \TeX\ code being generated */
+char *ministring_ptr; /* first available slot in |ministring_buf| */
+boolean ms_mode; /* are we outputting to |ministring_buf|? */
+
+@ @<Set init...@>=
+max_temp_meaning_ptr=temp_meaning_stack;
+title_code_ptr=title_code;
+ms_mode=0;
+
+@ Here's a routine that converts a program title from the buffer
+into an internal number for the |prog_no| field of a meaning.
+It advances |loc| past the title found.
+
+@c static sixteen_bits title_lookup(void)
+{
+ char *first,*last; /* boundaries */
+ int balance; /* excess of left over right */
+ register name_pointer *p;
+ first=loc;
+ if (*loc=='"') {
+ while (++loc<=limit && *loc!='"') if (*loc=='\\') loc++;
+ } else if (*loc=='{') {
+ balance=1;
+ while (++loc<=limit) {
+ if (*loc=='}' && --balance==0) break;
+ if (*loc=='{') balance++;
+ }
+ } else err_print(_("! Title should be enclosed in braces or doublequotes"));
+ last=++loc;
+ if (last>limit) err_print(_("! Title name didn't end"));
+ if (title_code_ptr==&title_code[max_titles]) overflow(_("titles"));
+ *title_code_ptr=id_lookup(first,last,title);
+ for (p=title_code;;p++) if (*p==*title_code_ptr) break;
+ if (p==title_code_ptr) title_code_ptr++;
+ return p-title_code;
+}
+
+@ @<Give a default title to the program, if necessary@>=
+if (title_code_ptr==title_code) { /* no \.{\\def\\title} found in limbo */
+ char *saveloc=loc,*savelimit=limit;
+ loc=limit+1; limit=loc;
+ *limit++='{';
+ strncpy(limit,tex_file_name,strlen(tex_file_name)-4);
+ limit+=strlen(tex_file_name)-4;
+ *limit++='}';
+ title_lookup();
+ loc=saveloc; limit=savelimit;
+}
+
+@ The |new_meaning| routine changes the current ``permanent meaning''
+when an identifier is redeclared. It gets the |tex_part| from
+|ministring_buf|.
+
+@c
+static void
+new_meaning(
+ name_pointer p)
+{
+ struct perm_meaning *q=p-name_dir+cur_meaning;
+ ms_mode=0;
+ if (q->stamp!=section_count) {
+ if (*(ministring_ptr-1)==' ') ministring_ptr--;
+ if (ministring_ptr>=&ministring_buf[max_tex_chars])
+ strcpy(ministring_buf,"\\zip"); /* ignore |tex_part| if too long */
+@.\\zip@>
+ else *ministring_ptr='\0';
+ q->perm.prog_no=0; /* |q->perm.id=p| */
+ q->perm.sec_no=section_count;
+ strcpy(q->perm.tex_part,ministring_buf);
+ }
+ @<Write the new meaning to the \.{.aux} file@>;
+}
+
+@ @<Write the new meaning to the \.{.aux} file@>=
+{@+int n=q->perm.prog_no;
+ fprintf(aux_file,"@@$%.*s %.*s",@|
+ (int)((p+1)->byte_start-p->byte_start),p->byte_start,@|
+ (int)((title_code[n]+1)->byte_start-title_code[n]->byte_start),
+ title_code[n]->byte_start);
+ if (*(title_code[n]->byte_start)=='{') fprintf(aux_file,"%d",q->perm.sec_no);
+ fprintf(aux_file," %s@@>\n",q->perm.tex_part);
+}
+@z
+
+@x
+xref_ptr=xmem; name_dir->xref=(char*)xmem; xref_switch=0; section_xref_switch=0;
+@y
+xref_ptr=xmem; init_node(name_dir); xref_switch=0; section_xref_switch=0;
+@z
+
+@x
+@d append_xref(c) if (xref_ptr==xmem_end) overflow("cross-reference");
+@y
+@d append_xref(c) if (xref_ptr==xmem_end) overflow(_("cross-reference"));
+@z
+
+@x
+@d no_xref (flags['x']==0)
+@d make_xrefs flags['x'] /* should cross references be output? */
+@y
+@d no_xref (!make_xrefs) /* should cross references be suppressed? */
+@z
+
+@x
+void
+new_xref(p)
+name_pointer p;
+@y
+static void
+new_xref(
+name_pointer p)
+@z
+
+@x
+ append_xref(m); xref_ptr->xlink=q; p->xref=(char*)xref_ptr;
+@y
+ append_xref(m); xref_ptr->xlink=q; update_node(p);
+@z
+
+@x
+void
+new_section_xref(p)
+name_pointer p;
+@y
+static void
+new_section_xref(
+name_pointer p)
+@z
+
+@x
+ if (r==xmem) p->xref=(char*)xref_ptr;
+@y
+ if (r==xmem) update_node(p);
+@z
+
+@x
+void
+set_file_flag(p)
+name_pointer p;
+@y
+static void
+set_file_flag(
+name_pointer p)
+@z
+
+@x
+ p->xref = (char *)xref_ptr;
+@y
+ update_node(p);
+@z
+
+@x
+further details about them will be explained later. A |text_pointer| variable
+is an index into |tok_start|.
+@y
+further details about them will be explained later. A \&{text\_pointer}
+variable is an index into |tok_start|.
+@z
+
+@x
+tok_ptr=tok_mem+1; text_ptr=tok_start+1; tok_start[0]=tok_mem+1;
+tok_start[1]=tok_mem+1;
+max_tok_ptr=tok_mem+1; max_text_ptr=tok_start+1;
+@y
+tok_ptr=max_tok_ptr=tok_mem+1;@/
+tok_start[0]=tok_start[1]=tok_mem+1;@/
+text_ptr=max_text_ptr=tok_start+1;
+@z
+
+@x
+int names_match(p,first,l,t)
+name_pointer p; /* points to the proposed match */
+char *first; /* position of first character of string */
+int l; /* length of identifier */
+eight_bits t; /* desired ilk */
+@y
+boolean names_match(@t\1\1@>
+name_pointer p, /* points to the proposed match */
+const char *first, /* position of first character of string */
+size_t l, /* length of identifier */
+eight_bits t@t\2\2@>) /* desired |ilk| */
+@z
+
+@x
+void
+init_p(p,t)
+name_pointer p;
+eight_bits t;
+@y
+void
+init_p(
+name_pointer p,
+eight_bits t)
+@z
+
+@x
+ p->ilk=t; p->xref=(char*)xmem;
+@y
+ struct perm_meaning *q=p-name_dir+cur_meaning;
+ p->ilk=t; init_node(p);
+ q->stamp=0;
+ q->link=NULL;
+ q->perm.id=p;
+ q->perm.prog_no=q->perm.sec_no=0;
+ strcpy(q->perm.tex_part,"\\uninitialized");
+@z
+
+@x
+void
+init_node(p)
+name_pointer p;
+@y
+void
+init_node(
+name_pointer p)
+@z
+
+@x
+ p->xref=(char*)xmem;
+}
+@y
+ p->xref=(void *)xmem;
+}
+
+static void
+update_node(
+name_pointer p)
+{
+ p->xref=(void *)xref_ptr;
+}
+@z
+
+@x
+id_lookup("extern",NULL,int_like);
+@y
+ext_loc=id_lookup("extern",NULL,int_like)-name_dir;
+@z
+
+@x
+id_lookup("int",NULL,raw_int);
+@y
+int_loc=id_lookup("int",NULL,raw_int)-name_dir;
+@z
+
+@x
+id_lookup("make_pair",NULL,func_template);
+@y
+id_lookup("make_pair",NULL,func_template);
+
+@ @<Glob...@>=
+sixteen_bits int_loc, ext_loc; /* locations of special reserved words */
+@z
+
+@x
+@d ord 0207 /* control code for `\.{@@'}' */
+@d join 0210 /* control code for `\.{@@\&}' */
+@d thin_space 0211 /* control code for `\.{@@,}' */
+@d math_break 0212 /* control code for `\.{@@\v}' */
+@d line_break 0213 /* control code for `\.{@@/}' */
+@d big_line_break 0214 /* control code for `\.{@@\#}' */
+@d no_line_break 0215 /* control code for `\.{@@+}' */
+@d pseudo_semi 0216 /* control code for `\.{@@;}' */
+@d macro_arg_open 0220 /* control code for `\.{@@[}' */
+@d macro_arg_close 0221 /* control code for `\.{@@]}' */
+@d trace 0222 /* control code for `\.{@@0}', `\.{@@1}' and `\.{@@2}' */
+@d translit_code 0223 /* control code for `\.{@@l}' */
+@d output_defs_code 0224 /* control code for `\.{@@h}' */
+@d format_code 0225 /* control code for `\.{@@f}' and `\.{@@s}' */
+@d definition 0226 /* control code for `\.{@@d}' */
+@d begin_C 0227 /* control code for `\.{@@c}' */
+@d section_name 0230 /* control code for `\.{@@<}' */
+@d new_section 0231 /* control code for `\.{@@\ }' and `\.{@@*}' */
+@y
+@d meaning 0207 /* control code for `\.{@@\$}' */
+@d suppress 0210 /* control code for `\.{@@-}' */
+@d temp_meaning 0211 /* control code for `\.{@@\%}' */
+@d right_start 0212 /* control code for `\.{@@r}' */
+@d ord 0213 /* control code for `\.{@@'}' */
+@d join 0214 /* control code for `\.{@@\&}' */
+@d thin_space 0215 /* control code for `\.{@@,}' */
+@d math_break 0216 /* control code for `\.{@@\v}' */
+@d line_break 0217 /* control code for `\.{@@/}' */
+@d big_line_break 0220 /* control code for `\.{@@\#}' */
+@d no_line_break 0221 /* control code for `\.{@@+}' */
+@d pseudo_semi 0222 /* control code for `\.{@@;}' */
+@d macro_arg_open 0224 /* control code for `\.{@@[}' */
+@d macro_arg_close 0225 /* control code for `\.{@@]}' */
+@d trace 0226 /* control code for `\.{@@0}', `\.{@@1}' and `\.{@@2}' */
+@d translit_code 0227 /* control code for `\.{@@l}' */
+@d output_defs_code 0230 /* control code for `\.{@@h}' */
+@d format_code 0231 /* control code for `\.{@@f}' and `\.{@@s}' */
+@d definition 0232 /* control code for `\.{@@d}' */
+@d begin_C 0233 /* control code for `\.{@@c}' */
+@d section_name 0234 /* control code for `\.{@@<}' */
+@d new_section 0235 /* control code for `\.{@@\ }' and `\.{@@*}' */
+@z
+
+@x
+ccode['\'']=ord;
+@y
+ccode['\'']=ord;
+ccode['$']=meaning; ccode['%']=temp_meaning; ccode['-']=suppress;
+ccode['r']=ccode['R']=right_start;
+@z
+
+@x
+void skip_limbo();
+
+@ @c
+@y
+static void skip_limbo(void);@/
+
+@ We look for a clue about the program's title, because this will become
+part of all meanings.
+
+@c
+@z
+
+@x
+void
+skip_limbo() {
+@y
+static void
+skip_limbo(void) {
+@z
+
+@x
+ if (loc>limit && get_line()==0) return;
+@y
+ if (loc>limit && get_line()==0) return;
+ if (loc==buffer && strncmp(buffer,"\\def\\title{",11)==0) {
+ loc=buffer+10;
+ title_lookup(); /* this program's title will be code zero */
+ }
+@z
+
+@x
+unsigned
+skip_TeX() /* skip past pure \TEX/ code */
+@y
+static eight_bits
+skip_TeX(void)
+@z
+
+@x
+\yskip\hang |xref_roman|, |xref_wildcard|, |xref_typewriter|, |TeX_string|,
+@y
+\yskip\hang |xref_roman|, |xref_wildcard|, |xref_typewriter|, |TeX_string|,
+|meaning|, |suppress|,
+@z
+
+@x
+eight_bits get_next();
+@y
+static eight_bits get_next(void);@/
+@z
+
+@x
+eight_bits
+get_next() /* produces the next input token */
+{@+eight_bits c; /* the current character */
+@y
+static eight_bits
+get_next(void) /* produces the next input token */
+{
+ eight_bits c; /* the current character */
+@z
+
+@x
+ else if (c=='\'' || c=='"' || (c=='L'&&(*loc=='\'' || *loc=='"'))@|
+@y
+ else if (c=='\'' || c=='"'@|
+ || ((c=='L' || c=='u' || c=='U')&&(*loc=='\'' || *loc=='"'))@|
+ || ((c=='u' && *loc=='8')&&(*(loc+1)=='\'' || *(loc+1)=='"'))@|
+@z
+
+@x
+@d right_preproc 0217 /* ends a preprocessor command */
+@y
+@d right_preproc 0223 /* ends a preprocessor command */
+@z
+
+@x
+ else if (*loc=='>') if (*(loc+1)=='*') {loc++; compress(minus_gt_ast);}
+ else compress(minus_gt); break;
+@y
+ else { if (*loc=='>') { if (*(loc+1)=='*') {loc++; compress(minus_gt_ast);}
+ else compress(minus_gt); } } break;
+@z
+
+@x
+ case '!': if (*loc=='=') compress(not_eq); break;
+@y
+ case '!': if (*loc=='=') compress(non_eq); break;
+@z
+
+@x
+ while (isalpha(*++loc) || isdigit(*loc) || isxalpha(*loc) || ishigh(*loc));
+@y
+ while (isalpha((eight_bits)*++loc) || isdigit((eight_bits)*loc) @|
+ || isxalpha((eight_bits)*loc) || ishigh((eight_bits)*loc));
+@z
+
+@x
+ *id_loc++='$'; *id_loc++=toupper(*loc); loc++;
+@y
+ *id_loc++='$'; *id_loc++=toupper((eight_bits)*loc); loc++;
+@z
+
+@x
+ if (delim=='L') { /* wide character constant */
+ delim=*loc++; *++id_loc=delim;
+ }
+@y
+ if (delim=='L' || delim=='u' || delim=='U') { /* wide character constant */
+ if (delim=='u' && *loc=='8') { *++id_loc=*loc++; }
+ delim=*loc++; *++id_loc=delim;
+ }
+@z
+
+@x
+ err_print("! String didn't end"); loc=limit; break;
+@y
+ err_print(_("! String didn't end")); loc=limit; break;
+@z
+
+@x
+ err_print("! Input ended in middle of string"); loc=buffer; break;
+@y
+ err_print(_("! Input ended in middle of string")); loc=buffer; break;
+@z
+
+@x
+ if (c=='\\') if (loc>=limit) continue;
+ else if (++id_loc<=section_text_end) {
+ *id_loc = '\\'; c=*loc++;
+ }
+@y
+ if (c=='\\') { if (loc>=limit) continue;
+ else { if (++id_loc<=section_text_end) {
+ *id_loc = '\\'; c=*loc++;
+ } } }
+@z
+
+@x
+ printf("\n! String too long: ");
+@y
+ fputs(_("\n! String too long: "),stdout);
+@z
+
+@x
+ case translit_code: err_print("! Use @@l in limbo only"); continue;
+@y
+ case translit_code: err_print(_("! Use @@l in limbo only")); continue;
+@z
+
+@x
+ case underline: xref_switch=def_flag; continue;
+@y
+ case underline: xref_switch=def_flag; continue;
+ case temp_meaning: temp_switch=1-temp_switch; continue;
+ case right_start: right_start_switch=1; continue;
+@z
+
+@x
+ case xref_roman: case xref_wildcard: case xref_typewriter:
+ case noop: case TeX_string: c=ccode[c]; skip_restricted(); return(c);
+@y
+ case xref_roman: case xref_wildcard: case xref_typewriter: case noop:
+ case meaning: case suppress:
+ case TeX_string: c=ccode[(eight_bits)c]; skip_restricted(); return(c);
+@z
+
+@x
+ err_print("! Input ended in section name");
+@y
+ err_print(_("! Input ended in section name"));
+@z
+
+@x
+ printf("\n! Section name too long: ");
+@y
+ fputs(_("\n! Section name too long: "),stdout);
+@z
+
+@x
+ err_print("! Section name didn't end"); break;
+@y
+ err_print(_("! Section name didn't end")); break;
+@z
+
+@x
+ err_print("! Control codes are forbidden in section name"); break;
+@y
+ err_print(_("! Control codes are forbidden in section name")); break;
+@z
+
+@x
+void skip_restricted();
+@y
+void skip_restricted(void);@/
+@z
+
+@x
+void
+skip_restricted()
+{
+@y
+void
+skip_restricted(void)
+{ int c=ccode[(eight_bits)*(loc-1)];
+@z
+
+@x
+ err_print("! Control text didn't end"); loc=limit;
+@y
+ err_print(_("! Control text didn't end")); loc=limit;
+@z
+
+@x
+ err_print("! Control codes are forbidden in control text");
+@y
+ err_print(_("! Control codes are forbidden in control text"));
+@z
+
+@x
+@.Control codes are forbidden...@>
+@y
+@.Control codes are forbidden...@>
+ if (c==meaning && phase==2) @<Process a user-generated meaning@>@;
+ else if (c==suppress && phase==2) @<Suppress mini-index entry@>;
+ }
+}
+
+@ @<Suppress mini-index entry@>=
+{ char *first=id_first,*last=id_loc;
+ while (xisspace(*first)) first++;
+ while (xisspace(*(last-1))) last--;
+ if (first<last) {
+ struct perm_meaning *q=id_lookup(first,last,normal)-name_dir+cur_meaning;
+ q->stamp=section_count; /* this is what actually suppresses output */
+ }
+}
+
+@ @<Process a user-generated meaning@>=
+{ char *first=id_first;
+ while (xisspace(*first)) first++;
+ loc=first;
+ while (xisalpha(*loc)||xisdigit(*loc)||*loc=='_') loc++;
+ if (*loc++!=' ')
+ err_print(_("! Identifier in meaning should be followed by space"));
+ else { name_pointer p=id_lookup(first,loc-1,normal);
+ sixteen_bits t; int n=0;
+ t=title_lookup();
+ if (*(loc-1)=='}')
+ while (xisdigit(*loc)) n=10*n+(*loc++)-'0';
+ if (*loc++!=' ')
+ err_print(_("! Location in meaning should be followed by space"));
+ else @<Digest the meaning of |p|, |t|, |n|@>;
+ }
+ loc=id_loc+2;
+}
+
+@ @<Digest...@>=
+{ meaning_struct *m;
+ struct perm_meaning *q=p-name_dir+cur_meaning;
+ if (temp_switch) {
+ m=temp_meaning_ptr++;
+ if (temp_meaning_ptr>max_temp_meaning_ptr) {
+ if (temp_meaning_ptr>&temp_meaning_stack[max_meanings])
+ overflow(_("temp meanings"));
+ max_temp_meaning_ptr=temp_meaning_ptr;
+ }
+ } else m=&(q->perm);
+ m->id=p;
+ m->prog_no=t;
+ m->sec_no=n;
+ if (id_loc-loc>=max_tex_chars) strcpy(m->tex_part,"\\zip");
+@.\\zip@>
+ else { char *q=m->tex_part;
+ while (loc<id_loc) *q++=*loc++;
+ *q='\0';
+@z
+
+@x
+ if (loc>=limit) err_print("! Verbatim string didn't end");
+@y
+ if (loc>=limit) err_print(_("! Verbatim string didn't end"));
+@z
+
+@x
+void phase_one();
+@y
+static void phase_one(void);@/
+@z
+
+@x
+void
+phase_one() {
+@y
+static void
+phase_one(void) {
+@z
+
+@x
+ skip_limbo(); change_exists=0;
+@y
+ skip_limbo();
+ @<Give a default title to the program, if necessary@>;
+@z
+
+@x
+ changed_section[section_count]=change_exists;
+ /* the index changes if anything does */
+@y
+@z
+
+@x
+ if (++section_count==max_sections) overflow("section number");
+@y
+ if (++section_count==max_sections) overflow(_("section number"));
+@z
+
+@x
+ changed_section[section_count]=changing;
+ /* it will become 1 if any line changes */
+@y
+@z
+
+@x
+ if (changed_section[section_count]) change_exists=1;
+@y
+@z
+
+@x
+void C_xref();
+@y
+static void C_xref(eight_bits);@/
+@z
+
+@x
+void
+C_xref( spec_ctrl ) /* makes cross-references for \CEE/ identifiers */
+ eight_bits spec_ctrl;
+@y
+static void
+C_xref(@t\1\1@> /* makes cross-references for \CEE/ identifiers */
+ eight_bits spec_ctrl@t\2\2@>)
+@z
+
+@x
+void outer_xref();
+@y
+static void outer_xref(void);@/
+@z
+
+@x
+void
+outer_xref() /* extension of |C_xref| */
+@y
+static void
+outer_xref(void) /* extension of |C_xref| */
+@z
+
+@x
+ case translit_code: err_print("! Use @@l in limbo only"); continue;
+@y
+ case translit_code: err_print(_("! Use @@l in limbo only")); continue;
+@z
+
+@x
+ case xref_roman: case xref_wildcard: case xref_typewriter:
+@y
+ case xref_roman: case xref_wildcard: case xref_typewriter:
+ case meaning: case suppress:
+@z
+
+@x
+ else lhs->xref=(char*)q->xlink;
+@y
+ else lhs->xref=(void *)q->xlink;
+@z
+
+@x
+ err_print("! Missing left identifier of @@s");
+@y
+ err_print(_("! Missing left identifier of @@s"));
+@z
+
+@x
+ err_print("! Missing right identifier of @@s");
+@y
+ err_print(_("! Missing right identifier of @@s"));
+@z
+
+@x
+void section_check();
+@y
+static void section_check(name_pointer);@/
+@z
+
+@x
+void
+section_check(p)
+name_pointer p; /* print anomalies in subtree |p| */
+@y
+static void
+section_check(
+name_pointer p) /* print anomalies in subtree |p| */
+@z
+
+@x
+ printf("\n! Never defined: <"); print_section_name(p); putchar('>'); mark_harmless;
+@y
+ fputs(_("\n! Never defined: <"),stdout);
+ print_section_name(p); putchar('>'); mark_harmless;
+@z
+
+@x
+ printf("\n! Never used: <"); print_section_name(p); putchar('>'); mark_harmless;
+@y
+ fputs(_("\n! Never used: <"),stdout);
+ print_section_name(p); putchar('>'); mark_harmless;
+@z
+
+@x
+If the |per_cent| parameter is 1 a |'%'| is appended to the line
+@y
+If the |per_cent| parameter is 1, a |'%'| is appended to the line
+@z
+
+@x
+@d tex_printf(c) fprintf(active_file,c)
+@y
+@d tex_printf(c) fprintf(active_file,"%s",c)
+@d tex_puts(c) fputs(c,active_file)
+@z
+
+@x
+void
+flush_buffer(b,per_cent,carryover)
+char *b; /* outputs from |out_buf+1| to |b|,where |b<=out_ptr| */
+boolean per_cent,carryover;
+@y
+static void
+flush_buffer(@t\1\1@>
+char *b, /* outputs from |out_buf+1| to |b|, where |b<=out_ptr| */
+boolean per_cent,boolean carryover@t\2\2@>)
+@z
+
+@x
+ if (b<out_ptr) strncpy(out_buf+1,b+1,out_ptr-b);
+@y
+ if (b<out_ptr) strncpy(out_buf+1,b+1,(size_t)(out_ptr-b));
+@z
+
+@x
+void
+finish_line() /* do this at the end of a line */
+@y
+static void
+finish_line(void) /* do this at the end of a line */
+@z
+
+@x
+@ In particular, the |finish_line| procedure is called near the very
+beginning of phase two. We initialize the output variables in a slightly
+tricky way so that the first line of the output file will be
+`\.{\\input cwebmac}'.
+
+@<Set init...@>=
+out_ptr=out_buf+1; out_line=1; active_file=tex_file;
+*out_ptr='c'; tex_printf("\\input cwebma");
+@y
+@ In particular, the |finish_line| procedure is called near the very
+beginning of phase two. We initialize the output variables in a slightly
+tricky way so that the first line of the output file will be dependent of
+the user language set by the `\.{+l}' option and its argument. If you call
+\.{CWEAVE} with `\.{+lX}' (or `\.{-lX}' as well), where `\.X' is the
+(possibly empty) string of characters to the right of~`\.l', `\.X'~will be
+prepended to `\.{cwebmac.tex}', e.g., if you call \.{CWEAVE} with
+`\.{+ldeutsch}', you will receive the line `\.{\\input deutschcwebmac}'.
+Without this option the first line of the output file will be
+`\.{\\input ctwimac}'. Or, if the user has specified proofing by
+saying \.{+P} on the command line, it's `\.{\\input ctproofmac}',
+a set of macros used when debugging mini-index entries.
+
+@d proofing flags['P']
+
+@<Start \TEX/...@>=
+out_ptr=out_buf+1; out_line=1; active_file=tex_file; *out_ptr='c';
+tex_puts("\\input ");
+tex_printf(use_language);
+tex_puts(proofing?"ctproofma":"ctwima");
+@z
+
+@x
+@d out(c) {if (out_ptr>=out_buf_end) break_out(); *(++out_ptr)=c;}
+@y
+@d out(c)
+ {if (ms_mode) { /* outputting to |ministring_buf| */
+ if (ministring_ptr<&ministring_buf[max_tex_chars])
+ *ministring_ptr++=c;
+ } else {
+ if (out_ptr>=out_buf_end) break_out();
+ *(++out_ptr)=c;
+ }
+ }
+@z
+
+@x
+void
+out_str(s) /* output characters from |s| to end of string */
+char *s;
+@y
+static void
+out_str(@t\1\1@> /* output characters from |s| to end of string */
+const char*s@t\2\2@>)
+@z
+
+@x
+void break_out();
+@y
+static void break_out(void);@/
+@z
+
+@x
+void
+break_out() /* finds a way to break the output line */
+@y
+static void
+break_out(void) /* finds a way to break the output line */
+@z
+
+@x
+ printf("\n! Line had to be broken (output l. %d):\n",out_line);
+@y
+ printf(_("\n! Line had to be broken (output l. %d):\n"),out_line);
+@z
+
+@x
+|def_flag|, so it cannot have more than five decimal digits. If
+the section is changed, we output `\.{\\*}' just after the number.
+@y
+|def_flag|, so it cannot have more than five decimal digits.
+@z
+
+@x
+void
+out_section(n)
+sixteen_bits n;
+@y
+static void
+out_section(
+sixteen_bits n)
+@z
+
+@x
+ if(changed_section[n]) out_str ("\\*");
+@.\\*@>
+@y
+@z
+
+@x
+void
+out_name(p,quote_xalpha)
+name_pointer p;
+boolean quote_xalpha;
+@y
+static void
+out_name(
+name_pointer p,
+boolean quote_xalpha)
+@z
+
+@x
+void
+copy_limbo()
+@y
+static void
+copy_limbo(void)
+@z
+
+@x
+ default: err_print("! Double @@ should be used in limbo");
+@y
+ case right_start: right_start_switch=1; break;
+ default: err_print(_("! Double @@ should be used in limbo"));
+@z
+
+@x
+eight_bits
+copy_TeX()
+@y
+static eight_bits
+copy_TeX(void)
+@z
+
+@x
+@d app_tok(c) {if (tok_ptr+2>tok_mem_end) overflow("token"); *(tok_ptr++)=c;}
+@y
+@d app_tok(c) {if (tok_ptr+2>tok_mem_end) overflow(_("token")); *(tok_ptr++)=c;}
+@z
+
+@x
+int copy_comment();
+@y
+static int copy_comment(boolean,int);@/
+@z
+
+@x
+int copy_comment(is_long_comment,bal) /* copies \TEX/ code in comments */
+boolean is_long_comment; /* is this a traditional \CEE/ comment? */
+int bal; /* brace balance */
+@y
+static int copy_comment(@t\1\1@> /* copies \TeX\ code in comments */
+boolean is_long_comment, /* is this a traditional \CEE/ comment? */
+int bal@t\2\2@>) /* brace balance */
+@z
+
+@x
+ err_print("! Input ended in mid-comment");
+@y
+ err_print(_("! Input ended in mid-comment"));
+@z
+
+@x
+ if (bal>1) err_print("! Missing } in comment");
+@y
+ if (bal>1) err_print(_("! Missing } in comment"));
+@z
+
+@x
+ else {err_print("! Extra } in comment");
+@y
+ else {err_print(_("! Extra } in comment"));
+@z
+
+@x
+ if (bal>1) err_print("! Missing } in comment");
+@y
+ if (bal>1) err_print(_("! Missing } in comment"));
+@z
+
+@x
+ err_print("! Illegal use of @@ in comment");
+@y
+ err_print(_("! Illegal use of @@ in comment"));
+@z
+
+@x
+else if (c=='\\' && *loc!='@@')
+ if (phase==2) app_tok(*(loc++))@; else loc++;
+@y
+else { if (c=='\\' && *loc!='@@') {
+ if (phase==2) app_tok(*(loc++))@; else loc++; } }
+@z
+
+@x
+@d end_arg 62 /* \.{@@]} */
+@y
+@d end_arg 62 /* \.{@@]} */
+@d title 63 /* program name or header name in a ``meaning'' */
+@z
+
+@x
+eight_bits cat_index;
+
+@ @<Set in...@>=
+ for (cat_index=0;cat_index<255;cat_index++)
+ strcpy(cat_name[cat_index],"UNKNOWN");
+@y
+
+@ @<Set in...@>=
+{int c; for (c=0;c<256;c++) strcpy(cat_name[c],"UNKNOWN");}
+@z
+
+@x
+void
+print_cat(c) /* symbolic printout of a category */
+eight_bits c;
+@y
+static void
+print_cat(@t\1\1@> /* symbolic printout of a category */
+eight_bits c@t\2\2@>)
+@z
+
+@x
+ printf(cat_name[c]);
+@y
+ fputs(cat_name[c],stdout);
+@z
+
+@x
+@i prod.w
+@y
+@i prod-twill.w
+@z
+
+@x
+scrap scrap_info[max_scraps]; /* memory array for scraps */
+@y
+scrap scrap_info[max_scraps]; /* memory array for scraps */
+scrap null_scrap; /* a scrap with empty translation */
+@z
+
+@x
+@ @<Set init...@>=
+@y
+@ @<Set init...@>=
+null_scrap.trans=&tok_start[0];
+@z
+
+@x
+void
+print_text(p) /* prints a token list for debugging; not used in |main| */
+text_pointer p;
+@y
+#ifdef DEAD_CODE /* not used in |main| */
+static void
+print_text(@t\1\1@> /* prints a token list for debugging; not used in |main| */
+text_pointer p@t\2\2@>)
+@z
+
+@x
+ fflush(stdout);
+}
+@y
+ printf("|\n"); update_terminal;
+}
+@#
+static void pr_txt(
+ int k)
+{ print_text(&tok_start[k]); }
+#endif /* |DEAD_CODE| */
+@z
+
+@x
+@d app(a) *(tok_ptr++)=a
+@d app1(a) *(tok_ptr++)=tok_flag+(int)((a)->trans-tok_start)
+@y
+@d app(a) *(tok_ptr++)=(token)(a)
+@d app1(a) *(tok_ptr++)=(token)(tok_flag+(int)((a)->trans-tok_start))
+@z
+
+@x
+void
+app_str(s)
+char *s;
+@y
+static void
+app_str(
+const char *s)
+@z
+
+@x
+void
+big_app(a)
+token a;
+@y
+static void
+big_app(
+token a)
+@z
+
+@x
+void
+big_app1(a)
+scrap_pointer a;
+@y
+static void
+big_app1(
+scrap_pointer a)
+@z
+
+@x
+ && pp->cat!=prerangle
+@y
+ && pp->cat!=prerangle @|
+@z
+
+@x
+ && pp->cat!=ftemplate
+@y
+ && pp->cat!=ftemplate @|
+@z
+
+@x
+token_pointer
+find_first_ident(p)
+text_pointer p;
+@y
+static token_pointer
+find_first_ident(
+text_pointer p)
+@z
+
+@x
+the |for| loop below.
+
+@c
+@y
+the |for| loop below.
+
+We use the fact that |make_underlined| has been called immediately preceding
+|make_reserved|, hence |tok_loc| has been set.
+
+@c
+static token_pointer tok_loc; /* where the first identifier appears */
+@#
+@z
+
+@x
+void
+make_reserved(p) /* make the first identifier in |p->trans| like |int| */
+scrap_pointer p;
+@y
+static void
+make_reserved(@t\1\1@> /* make the first identifier in |p->trans| like |int| */
+scrap_pointer p@t\2\2@>)
+@z
+
+@x
+ token_pointer tok_loc; /* pointer to |tok_value| */
+ if ((tok_loc=find_first_ident(p->trans))<=operator_found)
+ return; /* this should not happen */
+@y
+ if (tok_loc<=operator_found) return; /* this should not happen */
+@z
+
+@x
+void
+make_underlined(p)
+/* underline the entry for the first identifier in |p->trans| */
+scrap_pointer p;
+@y
+static void
+make_underlined(@t\1\1@>
+/* underline the entry for the first identifier in |p->trans| */
+scrap_pointer p@t\2\2@>)
+@z
+
+@x
+ token_pointer tok_loc; /* where the first identifier appears */
+@y
+@z
+
+@x
+void underline_xref();
+@y
+static void underline_xref(name_pointer);@/
+@z
+
+@x
+void
+underline_xref(p)
+name_pointer p;
+@y
+static void
+underline_xref(
+name_pointer p)
+@z
+
+@x
+ p->xref=(char*)xref_ptr;
+@y
+ update_node(p);
+@z
+
+@x
+ r->num=m; /* everything from |q| on is left undisturbed */
+@y
+ r->num=m; /* everything from |q| on is left undisturbed */
+
+@ \.{CTWILL} needs the following procedure, which appends tokens of a
+translated text until coming to |tok_loc|, then suppresses text that may
+appear between parentheses or brackets. The calling routine should set
+|ident_seen=0| first. (This is admittedly tricky.)
+
+@c boolean ident_seen;
+static boolean app_supp(
+ text_pointer p)
+{ token_pointer j;
+ text_pointer q;
+ if (ident_seen && **p>=tok_flag) {
+ q=**p-tok_flag+tok_start;
+ if (**q=='(') {
+ app('(');@+app('\\');@+app(',');@+app(')'); goto catch14;
+ }
+ if (**q=='[') {
+ app('[');@+app('\\');@+app(',');@+app(']'); goto catch14;
+ }
+ }
+ for (j=*p;j<*(p+1);j++) {
+ if (*j<tok_flag) {
+ if (*j==inserted) return 0;
+ if (j==tok_loc) ident_seen=1;
+ else app(*j);
+ } else if (*j>=inner_tok_flag) confusion(_("inner"));
+ else if (app_supp(*j-tok_flag+tok_start)) goto catch14;;
+ }
+ return 0;
+catch14: if (*(*(p+1)-1)=='9') return 1; /* production 14 was used */
+ else return 0;
+}
+
+@ The trickiest part of \.{CTWILL} is the procedure |make_ministring(l)|,
+which tries to figure out a symbolic form of definition after
+|make_underlined(pp+l)| has been called. We rely heavily on the
+existing productions, which force the translated texts to have a
+structure that's decodable even though the underlying |cat| and |mathness|
+codes have disappeared.
+
+@c static void
+make_ministring(
+ int l) /* 0, 1, or 2 */
+{
+ text_pointer q,r;
+ name_pointer cn;
+ token t;
+ int ast_count; /* asterisks preceding the expression */
+ boolean non_ast_seen; /* have we seen a non-asterisk? */
+ if (tok_loc<=operator_found) return;
+ cn=((*tok_loc)%id_flag)+name_dir;
+ @<Append the type of the declaree; |return| if it begins with \&{extern}@>;
+ null_scrap.mathness=(((pp+l)->mathness)%4)*5; big_app1(&null_scrap);
+ /* now we're ready for the mathness that follows (I think) */
+ /* (without the mod 4 times 5, comments posed a problem) */
+ /* (namely in cases like |int a(b,c)| followed by comment) */
+ ident_seen=0;@+app_supp((pp+l)->trans);
+ null_scrap.mathness=10; big_app1(&null_scrap);
+ /* now |cur_mathness==no_math| */
+ ms_mode=1; ministring_ptr=ministring_buf;
+ if (l==2) *ministring_ptr++='=';
+ make_output(); /* translate the current text into a ministring */
+ tok_ptr=*(--text_ptr); /* delete that text */
+ new_meaning(cn);
+ cur_mathness=maybe_math; /* restore it */
+}
+
+@ Here we use the fact that a |decl_head| comes from |int_like| only in
+production~27, whose translation is fairly easy to recognize. (Well,
+production 28 has been added for \CPLUSPLUS/, but we hope that doesn't
+mess us up.) And we also use other similar facts.
+
+If an identifier is given an \&{extern} definition, we don't change
+its current meaning, but we do suppress mini-index entries to its
+current meaning in other sections.
+
+@<Append the type of the declaree; |return| if it begins with \&{extern}@>=
+if (l==0) { app(int_loc+res_flag); app(' '); cur_mathness=no_math; }
+else {
+ q=(pp+l-1)->trans;
+ ast_count=0;
+ non_ast_seen=0;
+ while (1) {
+ if (*(q+1)==*q+1) {
+ r=q;@+break; /* e.g. \&{struct}; we're doing production 45 or 46 */
+ }
+ if (**q<tok_flag) confusion(_("find type"));
+ r=**q-tok_flag+tok_start;
+ if ((t=*(*(q+1)-2))>=tok_flag && **(t-tok_flag+tok_start)=='*') {
+ /* production 34 */
+ if (!non_ast_seen) ast_count++; /* count immediately preceding |*|'s */
+ } else non_ast_seen=1;
+ if (*(*q+1)==' ' && *(q+1)==*q+2) break; /* production 27 */
+ if (*(*q+1)=='{' && *(*q+2)=='}' && *(*q+3)=='$' && *(*q+4)==' '@|
+ && *(q+1)==*q+5) break; /* production 27 in disguise */
+ q=r;
+ }
+ while (**r>=tok_flag) {
+ if (*(r+1)>*r+9 && *(*r+1)=='{' && *(*r+2)=='}' && *(*r+3)=='$' @|
+ && *(*r+4)==indent) q=**r-tok_flag+tok_start; /* production 49 */
+ r=**r-tok_flag+tok_start;
+ }
+ if (**r==ext_loc+res_flag) return; /* \&{extern} gives no definition */
+ @<Append tokens for type |q|@>;
+}
+
+@ @<Append tokens for type |q|@>=
+cur_mathness=no_math; /* it was |maybe_math| */
+if (*(q+1)==*q+8 && *(*q+1)==' ' && *(*q+3)==' ') {
+ app(**q);@+app(' ');@+app(*(*q+2)); /* production 46 */
+} else if ((t=*(*(q+1)-1))>=tok_flag && **(r=t-tok_flag+tok_start)=='\\'
+ && *(*r+1)=='{') app(**q); /* |struct_like| identifier */
+else app((q-tok_start)+tok_flag);
+while (ast_count) {
+ big_app('{');@+app('*');@+app('}');@+ast_count--;
+}
+
+@z
+
+@x
+@<Cases for |exp|@>=
+if (cat1==lbrace || cat1==int_like || cat1==decl) {
+ make_underlined(pp); big_app1(pp); big_app(indent); app(indent);
+ reduce(pp,1,fn_decl,0,1);
+}
+@y
+\.{CWEAVE} indents declarations after old-style function definitions.
+With the \.{-i} option they will come out flush left. You won't see
+any difference if you use ANSI-style function definitions.
+
+@d indent_param_decl flags['i'] /* should formal parameter declarations be indented? */
+
+@<Cases for |exp|@>=
+if(cat1==lbrace || cat1==int_like || cat1==decl) {
+ make_underlined(pp);
+ make_ministring(0);
+ big_app1(pp);
+ if (indent_param_decl) {
+ big_app(indent); app(indent);
+ }
+ reduce(pp,1,fn_decl,0,1);
+}
+@z
+
+@x
+ make_underlined (pp); squash(pp,2,tag,-1,7);
+@y
+ make_underlined (pp);
+ if (tok_loc>operator_found) {
+ name_pointer cn=((*tok_loc)%id_flag)+name_dir;
+ strcpy(ministring_buf,"label");
+ new_meaning(cn);
+ }
+ squash(pp,2,tag,-1,7);
+@z
+
+@x
+@ @<Cases for |decl_head|@>=
+if (cat1==comma) {
+ big_app2(pp); big_app(' '); reduce(pp,2,decl_head,-1,33);
+}
+else if (cat1==ubinop) {
+ big_app1(pp); big_app('{'); big_app1(pp+1); big_app('}');
+ reduce(pp,2,decl_head,-1,34);
+}
+else if (cat1==exp && cat2!=lpar && cat2!=exp && cat2!=cast) {
+ make_underlined(pp+1); squash(pp,2,decl_head,-1,35);
+}
+else if ((cat1==binop||cat1==colon) && cat2==exp && (cat3==comma ||
+ cat3==semi || cat3==rpar))
+ squash(pp,3,decl_head,-1,36);
+else if (cat1==cast) squash(pp,2,decl_head,-1,37);
+else if (cat1==lbrace || cat1==int_like || cat1==decl) {
+ big_app1(pp); big_app(indent); app(indent); reduce(pp,1,fn_decl,0,38);
+}
+else if (cat1==semi) squash(pp,2,decl,-1,39);
+@y
+@ @<Cases for |decl_head|@>=
+if (cat1==comma) {
+ big_app2(pp); big_app(' '); reduce(pp,2,decl_head,-1,33);
+}
+else if (cat1==ubinop) {
+ big_app1(pp); big_app('{'); big_app1(pp+1); big_app('}');
+ reduce(pp,2,decl_head,-1,34);
+}
+else if (cat1==exp && cat2!=lpar && cat2!=exp && cat2!=cast) {
+ make_underlined(pp+1);
+ make_ministring(1);
+ squash(pp,2,decl_head,-1,35);
+}
+else if ((cat1==binop||cat1==colon) && cat2==exp && (cat3==comma ||
+ cat3==semi || cat3==rpar))
+ squash(pp,3,decl_head,-1,36);
+else if (cat1==cast) squash(pp,2,decl_head,-1,37);
+else if (cat1==lbrace || cat1==int_like || cat1==decl) {
+ big_app1(pp);
+ if (indent_param_decl) {
+ big_app(indent); app(indent);
+ }
+ reduce(pp,1,fn_decl,0,38);
+}
+else if (cat1==semi) squash(pp,2,decl,-1,39);
+@z
+
+@x
+@ @<Cases for |decl|@>=
+if (cat1==decl) {
+ big_app1(pp); big_app(force); big_app1(pp+1);
+ reduce(pp,2,decl,-1,40);
+}
+else if (cat1==stmt || cat1==function) {
+ big_app1(pp); big_app(big_force);
+ big_app1(pp+1); reduce(pp,2,cat1,-1,41);
+}
+@y
+@ The original manual described the \.{-o} option for \.{CWEAVE}, but this was
+not yet present. Here is a simple implementation. The purpose is to suppress
+the extra space between local variable declarations and the first statement in
+a function block.
+
+@d order_decl_stmt flags['o'] /* should declarations and statements be separated? */
+
+@<Cases for |decl|@>=
+if (cat1==decl) {
+ big_app1(pp); big_app(force); big_app1(pp+1);
+ reduce(pp,2,decl,-1,40);
+}
+else if (cat1==stmt || cat1==function) {
+ big_app1(pp);
+ if(order_decl_stmt) big_app(big_force);
+ else big_app(force);
+ big_app1(pp+1); reduce(pp,2,cat1,-1,41);
+}
+@z
+
+@x
+ make_underlined(pp+1); make_reserved(pp+1);
+@y
+ make_underlined(pp+1); make_reserved(pp+1);
+ make_ministring(1);
+@z
+
+@x
+@ @<Cases for |fn_decl|@>=
+if (cat1==decl) {
+ big_app1(pp); big_app(force); big_app1(pp+1); reduce(pp,2,fn_decl,0,51);
+}
+else if (cat1==stmt) {
+ big_app1(pp); app(outdent); app(outdent); big_app(force);
+ big_app1(pp+1); reduce(pp,2,function,-1,52);
+}
+@y
+@ Outdent after parameter declarations with option \.{-i}.
+
+@<Cases for |fn_decl|@>=
+if (cat1==decl) {
+ big_app1(pp); big_app(force); big_app1(pp+1); reduce(pp,2,fn_decl,0,51);
+}
+else if (cat1==stmt) {
+ big_app1(pp);
+ if (indent_param_decl) {
+ app(outdent); app(outdent);
+ }
+ big_app(force);
+ big_app1(pp+1); reduce(pp,2,function,-1,52);
+}
+@z
+
+@x
+if (cat1==define_like) make_underlined(pp+2);
+@y
+if (cat1==define_like) { /* \.{\#define} is analogous to \&{extern} */
+ make_underlined(pp+2);
+ if (tok_loc>operator_found) {
+ /* no time to work out this case; I'll handle defines by brute force
+ in the \.{aux} file, since they usually don't go in mini-index */
+ }
+}
+@z
+
+@x
+if (cat1==prelangle) squash(pp+1,1,langle,1,100);
+else squash(pp,1,exp,-2,101);
+@y
+if (cat1==prelangle) squash(pp+1,1,langle,1,121);
+else squash(pp,1,exp,-2,122);
+@z
+
+@x
+ big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,else_like,-2,102);
+@y
+ big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,else_like,-2,123);
+@z
+
+@x
+@ @<Cases for |typedef_like|@>=
+if ((cat1==int_like || cat1==cast) && (cat2==comma || cat2==semi))
+ squash(pp+1,1,exp,-1,115);
+else if (cat1==int_like) {
+ big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,typedef_like,0,116);
+}
+else if (cat1==exp && cat2!=lpar && cat2!=exp && cat2!=cast) {
+ make_underlined(pp+1); make_reserved(pp+1);
+ big_app1(pp); big_app(' '); big_app1(pp+1); reduce(pp,2,typedef_like,0,117);
+}
+else if (cat1==comma) {
+ big_app2(pp); big_app(' '); reduce(pp,2,typedef_like,0,118);
+}
+else if (cat1==semi) squash(pp,2,decl,-1,119);
+else if (cat1==ubinop && (cat2==ubinop || cat2==cast)) {
+ big_app('{'); big_app1(pp+1); big_app('}'); big_app1(pp+2);
+ reduce(pp+1,2,cat2,0,120);
+}
+@y
+@ Here \.{CTWILL} deviates from the normal productions introduced in
+version 3.6, because those productions bypass |decl_head| (thereby
+confusing |make_ministring|, which depends on the |decl_head| productions
+to deduce the type). We revert to an older syntax that was
+less friendly to \CPLUSPLUS/ but good enough for me.
+
+@<Cases for |typedef_like|@>=
+if (cat1==decl_head) {
+ if ((cat2==exp&&cat3!=lpar&&cat3!=exp)||cat2==int_like) {
+ make_underlined(pp+2); make_reserved(pp+2);
+ make_ministring(2);
+ big_app2(pp+1); reduce(pp+1,2,decl_head,0,200);
+ }
+ else if (cat2==semi) {
+ big_app1(pp); big_app(' '); big_app2(pp+1); reduce(pp,3,decl,-1,201);
+ }
+} else if (cat1==int_like && cat2==raw_int &&
+ (cat3==semi || cat3==comma)) squash(pp+2,1,exp,1,202);
+@z
+
+@x
+void
+reduce(j,k,c,d,n)
+scrap_pointer j;
+eight_bits c;
+short k, d, n;
+@y
+static void
+reduce(
+scrap_pointer j, short k,
+eight_bits c,
+short d, short n)
+@z
+
+@x
+void
+squash(j,k,c,d,n)
+scrap_pointer j;
+eight_bits c;
+short k, d, n;
+@y
+static void
+squash(
+scrap_pointer j, short k,
+eight_bits c,
+short d, short n)
+@z
+
+@x
+ overflow("token");
+@y
+ overflow(_("token"));
+@z
+
+@x
+ overflow("text");
+@y
+ overflow(_("text"));
+@z
+
+@x
+{ scrap_pointer k; /* pointer into |scrap_info| */
+ if (tracing==2) {
+ printf("\n%d:",n);
+ for (k=scrap_base; k<=lo_ptr; k++) {
+ if (k==pp) putxchar('*'); else putxchar(' ');
+ if (k->mathness %4 == yes_math) putchar('+');
+ else if (k->mathness %4 == no_math) putchar('-');
+ print_cat(k->cat);
+ if (k->mathness /4 == yes_math) putchar('+');
+ else if (k->mathness /4 == no_math) putchar('-');
+@y
+{ scrap_pointer k_l; /* pointer into |scrap_info| */
+ if (tracing==2) {
+ printf("\n%d:",n);
+ for (k_l=scrap_base; k_l<=lo_ptr; k_l++) {
+ if (k_l==pp) putxchar('*'); else putxchar(' ');
+ if (k_l->mathness %4 == yes_math) putchar('+');
+ else if (k_l->mathness %4 == no_math) putchar('-');
+ print_cat(k_l->cat);
+ if (k_l->mathness /4 == yes_math) putchar('+');
+ else if (k_l->mathness /4 == no_math) putchar('-');
+@z
+
+@x
+text_pointer
+translate() /* converts a sequence of scraps */
+@y
+static text_pointer
+translate(void) /* converts a sequence of scraps */
+@z
+
+@x
+ if (tok_ptr+6>tok_mem_end) overflow("token");
+@y
+ if (tok_ptr+6>tok_mem_end) overflow(_("token"));
+@z
+
+@x
+ printf("\nIrreducible scrap sequence in section %d:",section_count);
+@y
+ printf(_("\nIrreducible scrap sequence in section %d:"),section_count);
+@z
+
+@x
+ printf("\nTracing after l. %d:\n",cur_line); mark_harmless;
+@y
+ printf(_("\nTracing after l. %d:\n"),cur_line); mark_harmless;
+@z
+
+@x
+void
+C_parse(spec_ctrl) /* creates scraps from \CEE/ tokens */
+ eight_bits spec_ctrl;
+@y
+static void
+C_parse(@t\1\1@> /* creates scraps from \CEE/ tokens */
+ eight_bits spec_ctrl@t\2\2@>)
+@z
+
+@x
+switch (next_control) {
+ case section_name:
+ app(section_flag+(int)(cur_section-name_dir));
+ app_scrap(section_scrap,maybe_math);
+ app_scrap(exp,yes_math);@+break;
+ case string: case constant: case verbatim: @<Append a string or constant@>;
+ @+break;
+ case identifier: app_cur_id(1);@+break;
+ case TeX_string: @<Append a \TEX/ string, without forming a scrap@>;@+break;
+ case '/': case '.':
+ app(next_control); app_scrap(binop,yes_math);@+break;
+ case '<': app_str("\\langle");@+app_scrap(prelangle,yes_math);@+break;
+@.\\langle@>
+ case '>': app_str("\\rangle");@+app_scrap(prerangle,yes_math);@+break;
+@.\\rangle@>
+ case '=': app_str("\\K"); app_scrap(binop,yes_math);@+break;
+@.\\K@>
+ case '|': app_str("\\OR"); app_scrap(binop,yes_math);@+break;
+@.\\OR@>
+ case '^': app_str("\\XOR"); app_scrap(binop,yes_math);@+break;
+@.\\XOR@>
+ case '%': app_str("\\MOD"); app_scrap(binop,yes_math);@+break;
+@.\\MOD@>
+ case '!': app_str("\\R"); app_scrap(unop,yes_math);@+break;
+@.\\R@>
+ case '~': app_str("\\CM"); app_scrap(unop,yes_math);@+break;
+@.\\CM@>
+ case '+': case '-': app(next_control); app_scrap(ubinop,yes_math);@+break;
+ case '*': app(next_control); app_scrap(raw_ubin,yes_math);@+break;
+ case '&': app_str("\\AND"); app_scrap(raw_ubin,yes_math);@+break;
+@.\\AND@>
+ case '?': app_str("\\?"); app_scrap(question,yes_math);@+break;
+@.\\?@>
+ case '#': app_str("\\#"); app_scrap(ubinop,yes_math);@+break;
+@.\\\#@>
+ case ignore: case xref_roman: case xref_wildcard:
+ case xref_typewriter: case noop:@+break;
+ case '(': case '[': app(next_control); app_scrap(lpar,maybe_math);@+break;
+ case ')': case ']': app(next_control); app_scrap(rpar,maybe_math);@+break;
+ case '{': app_str("\\{"@q}@>); app_scrap(lbrace,yes_math);@+break;
+@.\\\{@>@q}@>
+ case '}': app_str(@q{@>"\\}"); app_scrap(rbrace,yes_math);@+break;
+@q{@>@.\\\}@>
+ case ',': app(','); app_scrap(comma,yes_math);@+break;
+ case ';': app(';'); app_scrap(semi,maybe_math);@+break;
+ case ':': app(':'); app_scrap(colon,no_math);@+break;@/
+ @t\4@> @<Cases involving nonstandard characters@>@;
+ case thin_space: app_str("\\,"); app_scrap(insert,maybe_math);@+break;
+@.\\,@>
+ case math_break: app(opt); app_str("0");
+ app_scrap(insert,maybe_math);@+break;
+ case line_break: app(force); app_scrap(insert,no_math);@+break;
+ case left_preproc: app(force); app(preproc_line);
+ app_str("\\#"); app_scrap(lproc,no_math);@+break;
+@.\\\#@>
+ case right_preproc: app(force); app_scrap(rproc,no_math);@+break;
+ case big_line_break: app(big_force); app_scrap(insert,no_math);@+break;
+ case no_line_break: app(big_cancel); app(noop); app(break_space);
+ app(noop); app(big_cancel);
+ app_scrap(insert,no_math);@+break;
+ case pseudo_semi: app_scrap(semi,maybe_math);@+break;
+ case macro_arg_open: app_scrap(begin_arg,maybe_math);@+break;
+ case macro_arg_close: app_scrap(end_arg,maybe_math);@+break;
+ case join: app_str("\\J"); app_scrap(insert,no_math);@+break;
+@.\\J@>
+ case output_defs_code: app(force); app_str("\\ATH"); app(force);
+ app_scrap(insert,no_math);@+break;
+@.\\ATH@>
+ default: app(inserted); app(next_control);
+ app_scrap(insert,maybe_math);@+break;
+}
+@y
+switch (next_control) {
+ case section_name:
+ app(section_flag+(int)(cur_section-name_dir));
+ app_scrap(section_scrap,maybe_math);
+ app_scrap(exp,yes_math);@+break;
+ case string: case constant: case verbatim:
+ @<Append a string or constant@>;@+break;
+ case identifier: app_cur_id(1);@+break;
+ case TeX_string:
+ @<Append a \TEX/ string, without forming a scrap@>;@+break;
+ case '/': case '.':
+ app(next_control);@+app_scrap(binop,yes_math);@+break;
+ case '<': app_str("\\langle");@+app_scrap(prelangle,yes_math);@+break;
+@.\\langle@>
+ case '>': app_str("\\rangle");@+app_scrap(prerangle,yes_math);@+break;
+@.\\rangle@>
+ case '=': app_str("\\K");@+app_scrap(binop,yes_math);@+break;
+@.\\K@>
+ case '|': app_str("\\OR");@+app_scrap(binop,yes_math);@+break;
+@.\\OR@>
+ case '^': app_str("\\XOR");@+app_scrap(binop,yes_math);@+break;
+@.\\XOR@>
+ case '%': app_str("\\MOD");@+app_scrap(binop,yes_math);@+break;
+@.\\MOD@>
+ case '!': app_str("\\R");@+app_scrap(unop,yes_math);@+break;
+@.\\R@>
+ case '~': app_str("\\CM");@+app_scrap(unop,yes_math);@+break;
+@.\\CM@>
+ case '+': case '-': app(next_control);@+app_scrap(ubinop,yes_math);@+break;
+ case '*': app(next_control);@+app_scrap(raw_ubin,yes_math);@+break;
+ case '&': app_str("\\AND");@+app_scrap(raw_ubin,yes_math);@+break;
+@.\\AND@>
+ case '?': app_str("\\?");@+app_scrap(question,yes_math);@+break;
+@.\\?@>
+ case '#': app_str("\\#");@+app_scrap(ubinop,yes_math);@+break;
+@.\\\#@>
+ case ignore: case xref_roman: case xref_wildcard:
+ case meaning: case suppress:
+ case xref_typewriter: case noop:@+break;
+ case '(': case '[': app(next_control);@+app_scrap(lpar,maybe_math);@+break;
+ case ')': case ']': app(next_control);@+app_scrap(rpar,maybe_math);@+break;
+ case '{': app_str("\\{"@q}@>);@+app_scrap(lbrace,yes_math);@+break;
+@.\\\{@>@q}@>
+ case '}': app_str(@q{@>"\\}");@+app_scrap(rbrace,yes_math);@+break;
+@q{@>@.\\\}@>
+ case ',': app(',');@+app_scrap(comma,yes_math);@+break;
+ case ';': app(';');@+app_scrap(semi,maybe_math);@+break;
+ case ':': app(':');@+app_scrap(colon,no_math);@+break;@/
+ @t\4@> @<Cases involving nonstandard characters@>@;
+ case thin_space: app_str("\\,");@+app_scrap(insert,maybe_math);@+break;
+@.\\,@>
+ case math_break: app(opt);@+app_str("0");@+
+ app_scrap(insert,maybe_math);@+break;
+ case line_break: app(force);@+app_scrap(insert,no_math);@+break;
+ case left_preproc: app(force);@+app(preproc_line);@+app_str("\\#");
+ app_scrap(lproc,no_math);@+break;
+@.\\\#@>
+ case right_preproc: app(force);@+app_scrap(rproc,no_math);@+break;
+ case big_line_break: app(big_force);@+app_scrap(insert,no_math);@+break;
+ case no_line_break: app(big_cancel);@+app(noop);@+app(break_space);@+
+ app(noop);@+app(big_cancel); app_scrap(insert,no_math);@+break;
+ case pseudo_semi: app_scrap(semi,maybe_math);@+break;
+ case macro_arg_open: app_scrap(begin_arg,maybe_math);@+break;
+ case macro_arg_close: app_scrap(end_arg,maybe_math);@+break;
+ case join: app_str("\\J");@+app_scrap(insert,no_math);@+break;
+@.\\J@>
+ case output_defs_code: app(force);@+app_str("\\ATH");@+app(force);
+ app_scrap(insert,no_math);@+break;
+@.\\ATH@>
+ default: app(inserted);@+app(next_control);
+ app_scrap(insert,maybe_math);@+break;
+}
+@z
+
+@x
+ overflow("scrap/token/text");
+@y
+ overflow(_("scrap/token/text"));
+@z
+
+@x
+case not_eq: app_str("\\I");@+app_scrap(binop,yes_math);@+break;
+@y
+case non_eq: app_str("\\I");@+app_scrap(binop,yes_math);@+break;
+@z
+
+@x
+ else err_print("! Double @@ should be used in strings");
+@y
+ else err_print(_("! Double @@ should be used in strings"));
+@z
+
+@x
+void app_cur_id();
+@y
+void app_cur_id(boolean);@/
+@z
+
+@x
+void
+app_cur_id(scrapping)
+boolean scrapping; /* are we making this into a scrap? */
+@y
+void
+app_cur_id(@t\1\1@>
+boolean scrapping@t\2\2@>) /* are we making this into a scrap? */
+@z
+
+@x
+ else app_scrap(p->ilk,maybe_math);
+ }
+ }
+@y
+ else app_scrap(p->ilk,maybe_math);
+ }
+ }
+ @<Flag the usage of this identifier, for the mini-index@>;
+@z
+
+@x
+text_pointer
+C_translate()
+@y
+static text_pointer
+C_translate(void)
+@z
+
+@x
+ if (next_control!='|') err_print("! Missing '|' after C text");
+@y
+ if (next_control!='|') err_print(_("! Missing '|' after C text"));
+@z
+
+@x
+to \.{\\PB}, if the user has invoked \.{CWEAVE} with the \.{+e} flag.
+Although \.{cwebmac} ignores \.{\\PB}, other macro packages
+@y
+to \.{\\PB}, if the user has invoked \.{CTWILL} with the \.{+e} flag.
+Although \.{ctwimac} ignores \.{\\PB}, other macro packages
+@z
+
+@x
+void
+outer_parse() /* makes scraps from \CEE/ tokens and comments */
+@y
+static void
+outer_parse(void) /* makes scraps from \CEE/ tokens and comments */
+@z
+
+@x
+ app(tok_flag+(int)(p-tok_start));
+@y
+ app(tok_flag+(int)(p-tok_start));
+ app(inserted);
+@z
+
+@x
+void
+push_level(p) /* suspends the current level */
+text_pointer p;
+@y
+static void
+push_level(@t\1\1@> /* suspends the current level */
+text_pointer p@t\2\2@>)
+@z
+
+@x
+ if (stack_ptr==stack_end) overflow("stack");
+@y
+ if (stack_ptr==stack_end) overflow(_("stack"));
+@z
+
+@x
+void
+pop_level()
+@y
+static void
+pop_level(void)
+@z
+
+@x
+eight_bits
+get_output() /* returns the next token of output */
+@y
+static eight_bits
+get_output(void) /* returns the next token of output */
+@z
+
+@x
+ return(a);
+@y
+ return((eight_bits)a);
+@z
+
+@x
+void
+output_C() /* outputs the current token list */
+@y
+static void
+output_C(void) /* outputs the current token list */
+@z
+
+@x
+void make_output();
+@y
+static void make_output(void);@/
+@z
+
+@x
+void
+make_output() /* outputs the equivalents of tokens */
+{
+ eight_bits a, /* current output byte */
+@y
+static void
+make_output(void) /* outputs the equivalents of tokens */
+{
+ eight_bits a=0, /* current output byte */
+@z
+
+@x
+ else if (b!='|') out(b)@;
+@y
+ else { if (b!='|') out(b)@;
+@z
+
+@x
+ }
+@y
+ } }
+@z
+
+@x
+ printf("\n! Illegal control code in section name: <");
+@y
+ fputs(_("\n! Illegal control code in section name: <"),stdout);
+@z
+
+@x
+ printf("\n! C text in section name didn't end: <");
+@y
+ fputs(_("\n! C text in section name didn't end: <"),stdout);
+@z
+
+@x
+ if (b=='\'' || b=='"')
+ if (delim==0) delim=b;
+ else if (delim==b) delim=0;
+@y
+ if (b=='\'' || b=='"') {
+ if (delim==0) delim=b;
+ else if (delim==b) delim=0; }
+@z
+
+@x
+ if (j>buffer+long_buf_size-3) overflow("buffer");
+@y
+ if (j>buffer+long_buf_size-3) overflow(_("buffer"));
+@z
+
+@x
+ if (j>buffer+long_buf_size-4) overflow("buffer");
+@y
+ if (j>buffer+long_buf_size-4) overflow(_("buffer"));
+@z
+
+@x
+void phase_two();
+@y
+static void phase_two(void);@/
+@z
+
+@x
+void
+phase_two() {
+@y
+static void
+phase_two(void) {
+@z
+
+@x
+reset_input(); if (show_progress) printf("\nWriting the output file...");
+@y
+reset_input(); if (show_progress) fputs(_("\nWriting the output file..."),stdout);
+@z
+
+@x
+section_count=0; format_visible=1; copy_limbo();
+@y
+temp_switch=0; temp_meaning_ptr=temp_meaning_stack;
+@<Read the \.{.aux} file, if present; then open it for output@>;
+section_count=0; format_visible=1; right_start_switch=0; copy_limbo();
+@z
+
+@x
+while (!input_has_ended) @<Translate the current section@>;
+}
+
+@y
+while (!input_has_ended) @<Translate the current section@>;
+}
+
+@ @<Glob...@>=
+FILE *aux_file;
+char aux_file_name[max_file_name_length]; /* name of \.{.aux} file */
+
+@ @<Read the \.{.aux} file, if present; then open it for output@>=
+strncpy(aux_file_name,tex_file_name,strlen(tex_file_name)-4);
+strcat(aux_file_name,".bux");
+include_depth=1; /* we simulate \.{@@i} */
+strcpy(cur_file_name,aux_file_name); /* first in, third out */
+if ((cur_file=fopen(cur_file_name,"r"))) { cur_line=0; include_depth++; }
+strcpy(aux_file_name+strlen(aux_file_name)-4,".aux");
+strcpy(cur_file_name,aux_file_name); /* second in, second out */
+if ((cur_file=fopen(cur_file_name,"r"))) { cur_line=0; include_depth++; }
+strcpy(cur_file_name,"system.bux"); /* third in, first out */
+if ((cur_file=fopen(cur_file_name,"r"))) cur_line=0;
+else include_depth--;
+if (include_depth) { /* at least one new file was opened */
+ while (get_next()==meaning) ; /* new meaning is digested */
+ if (include_depth) err_print(_("! Only @@$ is allowed in aux and bux files"));
+ finish_line(); loc=buffer; /* now reading beginning of line 1 */
+}
+if ((aux_file=fopen(aux_file_name,"wb"))==NULL)
+ fatal(_("! Cannot open aux output file "),aux_file_name);
+
+@z
+
+@x
+boolean group_found=0; /* has a starred section occurred? */
+@y
+boolean group_found=0; /* has a starred section occurred? */
+boolean right_start_switch; /* has `\.{@@r}' occurred recently? */
+boolean temp_switch; /* has `\.{@@\%}' occurred recently? */
+@z
+
+@x
+@ @<Translate the current section@>= {
+ section_count++;
+@y
+@ @d usage_sentinel (struct perm_meaning *)1
+@<Translate the current section@>= {
+ section_count++;
+ temp_switch=0; temp_meaning_ptr=temp_meaning_stack;
+ top_usage=usage_sentinel;
+@z
+
+@x
+if (*(loc-1)!='*') out_str("\\M");
+@y
+if (*(loc-1)!='*') {
+ if (right_start_switch) {
+ out_str("\\shortpage\n"); right_start_switch=0;
+@.\\shortpage@>
+ }
+ out_str("\\M");
+}
+@z
+
+@x
+@.\\N@>
+@y
+@.\\N@>
+ if (right_start_switch) {
+ out_str("N"); right_start_switch=0;
+@.\\NN@>
+ }
+@z
+
+@x
+out_str("{");out_section(section_count); out_str("}");
+@y
+out_str("{");out_section(section_count); out_str("}");
+flush_buffer(out_ptr,0,0);
+@z
+
+@x
+ case '@@': out('@@'); break;
+@y
+ case '@@': out('@@'); break;
+ case temp_meaning: temp_switch=1-temp_switch; break;
+ case right_start: right_start_switch=1; break;
+@z
+
+@x
+ case section_name: loc-=2; next_control=get_next(); /* skip to \.{@@>} */
+@y
+ case meaning: case suppress:
+ case section_name: loc-=2; next_control=get_next(); /* reprocess */
+@z
+
+@x
+ err_print("! TeX string should be in C text only"); break;
+@y
+ err_print(_("! TeX string should be in C text only")); break;
+@z
+
+@x
+ err_print("! You can't do that in TeX text"); break;
+@y
+ err_print(_("! You can't do that in TeX text")); break;
+@z
+
+@x
+ outer_parse(); finish_C(format_visible); format_visible=1;
+ doing_format=0;
+}
+@y
+ outer_parse();
+ if (is_macro) @<Make ministring for a new macro@>;
+ finish_C(format_visible); format_visible=1;
+ doing_format=0;
+}
+
+@ @<Glob...@>=
+boolean is_macro; /* it's a macro def, not a format def */
+int def_diff; /* 0 iff the current macro has parameters */
+name_pointer id_being_defined; /* the definee */
+@z
+
+@x
+void finish_C();
+@y
+static void finish_C(boolean);@/
+@z
+
+@x
+void
+finish_C(visible) /* finishes a definition or a \CEE/ part */
+ boolean visible; /* nonzero if we should produce \TEX/ output */
+@y
+static void
+finish_C(@t\1\1@> /* finishes a definition or a \Cee\ part */
+ boolean visible@t\2\2@>) /* nonzero if we should produce \TeX\ output */
+@z
+
+@x
+ if (out_ptr>out_buf+1)
+ if (*(out_ptr-1)=='\\')
+@.\\6@>
+@.\\7@>
+@.\\Y@>
+ if (*out_ptr=='6') out_ptr-=2;
+ else if (*out_ptr=='7') *out_ptr='Y';
+@y
+ if (out_ptr>out_buf+1) {
+ if (*(out_ptr-1)=='\\') {
+@.\\6@>
+@.\\7@>
+@.\\Y@>
+ if (*out_ptr=='6') out_ptr-=2;
+ else if (*out_ptr=='7') *out_ptr='Y';
+ }
+ }
+@z
+
+@x
+@<Start a macro...@>= {
+@y
+@<Start a macro...@>= {
+ is_macro=1;
+@z
+
+@x
+ err_print("! Improper macro definition");
+@y
+ err_print(_("! Improper macro definition"));
+@z
+
+@x
+@.Improper macro definition@>
+ else {
+ app('$'); app_cur_id(0);
+@y
+@.Improper macro definition@>
+ else {
+ id_being_defined=id_lookup(id_first,id_loc,normal);
+ app('$'); app_cur_id(0);
+ def_diff=*loc-'(';
+@z
+
+@x
+ default: err_print("! Improper macro definition"); break;
+@y
+ default: err_print(_("! Improper macro definition")); break;
+@z
+
+@x
+@ @<Start a format...@>= {
+ doing_format=1;
+@y
+@ @<Make ministring for a new macro@>=
+{
+ ms_mode=1; ministring_ptr=ministring_buf;
+ *ministring_ptr++='=';
+ if (def_diff) { /* parameterless */
+ scrap_pointer s=scrap_ptr;
+ text_pointer t;
+ token_pointer j;
+ while (s->cat==insert) s--;
+ if ((s-1)->cat==dead && s->cat==exp && **(t=s->trans)=='\\'
+ && *(*t+1)=='T') /* it's just a constant */
+ for (j=*t;j<*(t+1);j++) *ministring_ptr++=*j;
+ else out_str("macro");
+ } else out_str("macro (\\,)");
+ new_meaning(id_being_defined);
+}
+
+@ @<Start a format...@>= {
+ doing_format=1;
+ is_macro=0;
+@z
+
+@x
+ if (scrap_ptr!=scrap_info+2) err_print("! Improper format definition");
+@y
+ if (scrap_ptr!=scrap_info+2) err_print(_("! Improper format definition"));
+@z
+
+@x
+ err_print("! You need an = sign after the section name");
+@y
+ err_print(_("! You need an = sign after the section name"));
+@z
+
+@x
+ err_print("! You can't do that in C text");
+@y
+ err_print(_("! You can't do that in C text"));
+@z
+
+@x
+void footnote();
+@y
+static void footnote(sixteen_bits);@/
+@z
+
+@x
+void
+footnote(flag) /* outputs section cross-references */
+sixteen_bits flag;
+@y
+static void
+footnote(@t\1\1@> /* outputs section cross-references */
+sixteen_bits flag@t\2\2@>)
+@z
+
+@x
+out_str("\\fi"); finish_line();
+@.\\fi@>
+flush_buffer(out_buf,0,0); /* insert a blank line, it looks nice */
+@y
+finish_line(); out_str("\\mini"); finish_line();
+@.\\mini@>
+@<Output information about usage of id's defined in other sections@>;
+out_str("}\\FI"); finish_line();
+@.\\FI@>
+flush_buffer(out_buf,0,0); /* insert a blank line, it looks nice */
+
+@ The following code is performed for each identifier parsed during
+a section. Variable |top_usage| is always nonzero; it has the sentinel
+value~1 initially, then it points to each variable scheduled for
+possible citation. A variable is on this list if and only if its
+|link| field is nonzero. All variables mentioned in the section are
+placed on the list, unless they are reserved and their current
+\TeX\ meaning is uninitialized.
+
+@ @<Flag the usage of this identifier, for the mini-index@>=
+{ struct perm_meaning *q=p-name_dir+cur_meaning;
+ if (!(abnormal(p)) || strcmp(q->perm.tex_part,"\\uninitialized")!=0)
+ if (q->link==0) {
+ q->link=top_usage;
+ top_usage=q;
+ }
+}
+
+@ @<Output information about usage of id's defined in other sections@>=
+{@+struct perm_meaning *q;
+ while (temp_meaning_ptr>temp_meaning_stack) {
+ out_mini(--temp_meaning_ptr);
+ q=temp_meaning_ptr->id-name_dir+cur_meaning;
+ q->stamp=section_count; /* suppress output from ``permanent'' data */
+ }
+ while (top_usage!=usage_sentinel) {
+ q=top_usage;
+ top_usage=q->link;
+ q->link=NULL;
+ if (q->stamp!=section_count) out_mini(&(q->perm));
+ }
+}
+
+@ @<Predec...@>=
+static void out_mini(meaning_struct *);@/
+
+@ @c static void
+out_mini(
+ meaning_struct *m)
+{ char s[60];
+ name_pointer cur_name=m->id;
+ if (m->prog_no==0) { /* reference within current program */
+ if (m->sec_no==section_count) return; /* defined in current section */
+ sprintf(s,"\\[%d",m->sec_no);
+ } else { name_pointer n=title_code[m->prog_no];
+ if (*(n->byte_start)=='{')
+ sprintf(s,"\\]%.*s%d",(int)((n+1)->byte_start-n->byte_start),n->byte_start,
+ m->sec_no);
+ else sprintf(s,"\\]%.*s",(int)((n+1)->byte_start-n->byte_start),n->byte_start);
+ }
+ out_str(s); out(' ');
+ @<Mini-output the name at |cur_name|@>;
+ out(' '); out_str(m->tex_part); finish_line();
+}
+
+@ @<Mini-output...@>=
+switch (cur_name->ilk) {
+ case normal: case func_template: if (length(cur_name)==1) out_str("\\|");
+ else {char *j;
+ for (j=cur_name->byte_start;j<(cur_name+1)->byte_start;j++)
+ if (xislower(*j)) goto lowcase;
+ out_str("\\."); break;
+lowcase: out_str("\\\\");
+ }
+ break;
+@.\\|@>
+@.\\.@>
+@.\\\\@>
+ case roman: break;
+ case wildcard: out_str("\\9"); break;
+@.\\9@>
+ case typewriter: out_str("\\."); break;
+@.\\.@>
+ case custom: {char *j; out_str("$\\");
+ for (j=cur_name->byte_start;j<(cur_name+1)->byte_start;j++)
+ out(*j=='_'? 'x': *j=='$'? 'X': *j);
+ out('$');
+ goto name_done;
+ }
+ default: out_str("\\&");
+@.\\\&@>
+}
+out_name(cur_name,1);
+name_done:
+
+@z
+
+@x
+void phase_three();
+@y
+static void phase_three(void);@/
+@z
+
+@x
+void
+phase_three() {
+@y
+static void
+phase_three(void) {
+@z
+
+@x
+if (no_xref) {
+ finish_line();
+ out_str("\\end");
+@.\\end@>
+ finish_line();
+}
+@y
+if (no_xref) {
+ finish_line();
+ out_str("\\end");
+@.\\end@>
+ active_file=tex_file;
+}
+@z
+
+@x
+ phase=3; if (show_progress) printf("\nWriting the index...");
+@y
+ phase=3; if (show_progress) fputs(_("\nWriting the index..."),stdout);
+@z
+
+@x
+ if ((idx_file=fopen(idx_file_name,"w"))==NULL)
+@y
+ if ((idx_file=fopen(idx_file_name,"wb"))==NULL)
+@z
+
+@x
+ fatal("! Cannot open index file ",idx_file_name);
+@y
+ fatal(_("! Cannot open index file "),idx_file_name);
+@z
+
+@x
+ if (change_exists) {
+ @<Tell about changed sections@>; finish_line(); finish_line();
+ }
+@y
+@z
+
+@x
+ @<Do the first pass of sorting@>;
+ @<Sort and output the index@>;
+@y
+ @<Do the first pass of sorting@>@;
+ @<Sort and output the index@>@;
+@z
+
+@x
+ if ((scn_file=fopen(scn_file_name,"w"))==NULL)
+@y
+ if ((scn_file=fopen(scn_file_name,"wb"))==NULL)
+@z
+
+@x
+ fatal("! Cannot open section file ",scn_file_name);
+@y
+ fatal(_("! Cannot open section file "),scn_file_name);
+@z
+
+@x
+ @<Output all the section names@>;
+@y
+ @<Output all the section names@>@;
+@z
+
+@x
+@.\\end@>
+ finish_line();
+ fclose(active_file);
+}
+@y
+@.\\end@>
+}
+finish_line(); fclose(active_file); active_file=NULL;
+@<Update the result when it has changed@>@;
+@z
+
+@x
+if (show_happiness) printf("\nDone.");
+@y
+if (show_happiness) {
+ if (show_progress) new_line;
+ fputs(_("Done."),stdout);
+}
+@z
+
+@x
+the index section itself.
+@y
+the index section itself---NOT!
+@z
+
+@x
+@ @<Tell about changed sections@>= {
+ /* remember that the index is already marked as changed */
+ k_section=0;
+ while (!changed_section[++k_section]);
+ out_str("\\ch ");
+@.\\ch@>
+ out_section(k_section);
+ while (k_section<section_count) {
+ while (!changed_section[++k_section]);
+ out_str(", "); out_section(k_section);
+ }
+ out('.');
+}
+
+@y
+@z
+
+@x
+for (c=0; c<=255; c++) bucket[c]=NULL;
+@y
+for (c=0; c<256; c++) bucket[c]=NULL;
+@z
+
+@x
+ if (cur_name->xref!=(char*)xmem) {
+@y
+ if (cur_name->xref!=(void *)xmem) {
+@z
+
+@x
+collate[0]=0;
+strcpy(collate+1," \1\2\3\4\5\6\7\10\11\12\13\14\15\16\17");
+/* 16 characters + 1 = 17 */
+strcpy(collate+17,"\20\21\22\23\24\25\26\27\30\31\32\33\34\35\36\37");
+/* 16 characters + 17 = 33 */
+strcpy(collate+33,"!\42#$%&'()*+,-./:;<=>?@@[\\]^`{|}~_");
+/* 32 characters + 33 = 65 */
+strcpy(collate+65,"abcdefghijklmnopqrstuvwxyz0123456789");
+/* (26 + 10) characters + 65 = 101 */
+strcpy(collate+101,"\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217");
+/* 16 characters + 101 = 117 */
+strcpy(collate+117,"\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237");
+/* 16 characters + 117 = 133 */
+strcpy(collate+133,"\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257");
+/* 16 characters + 133 = 149 */
+strcpy(collate+149,"\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277");
+/* 16 characters + 149 = 165 */
+strcpy(collate+165,"\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317");
+/* 16 characters + 165 = 181 */
+strcpy(collate+181,"\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337");
+/* 16 characters + 181 = 197 */
+strcpy(collate+197,"\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357");
+/* 16 characters + 197 = 213 */
+strcpy(collate+213,"\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377");
+/* 16 characters + 213 = 229 */
+@y
+collate[0]=0;
+strcpy((char *)collate+1,
+ " \1\2\3\4\5\6\7\10\11\12\13\14\15\16\17");
+/* 16 characters + 1 = 17 */
+strcpy((char *)collate+17,
+ "\20\21\22\23\24\25\26\27\30\31\32\33\34\35\36\37");
+/* 16 characters + 17 = 33 */
+strcpy((char *)collate+33,
+ "!\42#$%&'()*+,-./:;<=>?@@[\\]^`{|}~_");
+/* 32 characters + 33 = 65 */
+strcpy((char *)collate+65,
+ "abcdefghijklmnopqrstuvwxyz0123456789");
+/* (26 + 10) characters + 65 = 101 */
+strcpy((char *)collate+101,
+ "\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217");
+/* 16 characters + 101 = 117 */
+strcpy((char *)collate+117,
+ "\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237");
+/* 16 characters + 117 = 133 */
+strcpy((char *)collate+133,
+ "\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257");
+/* 16 characters + 133 = 149 */
+strcpy((char *)collate+149,
+ "\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277");
+/* 16 characters + 149 = 165 */
+strcpy((char *)collate+165,
+ "\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317");
+/* 16 characters + 165 = 181 */
+strcpy((char *)collate+181,
+ "\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337");
+/* 16 characters + 181 = 197 */
+strcpy((char *)collate+197,
+ "\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357");
+/* 16 characters + 197 = 213 */
+strcpy((char *)collate+213,
+ "\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377");
+/* 16 characters + 213 = 229 */
+@z
+
+@x
+void unbucket();
+@y
+static void unbucket(eight_bits);@/
+@z
+
+@x
+void
+unbucket(d) /* empties buckets having depth |d| */
+eight_bits d;
+@y
+static void
+unbucket(@t\1\1@> /* empties buckets having depth |d| */
+eight_bits d@t\2\2@>)
+@z
+
+@x
+ if (sort_ptr>=scrap_info_end) overflow("sorting");
+@y
+ if (sort_ptr>=scrap_info_end) overflow(_("sorting"));
+@z
+
+@x
+@ @<Output the name...@>=
+@y
+@ We don't format the index completely; the \.{twinx} program does the
+rest of the job.
+
+@<Output the name...@>=
+@z
+
+@x
+ case normal: case func_template: if (is_tiny(cur_name)) out_str("\\|");
+@y
+ case normal: if (is_tiny(cur_name)) out_str("\\|");
+@z
+
+@x
+ case wildcard: out_str("\\9");@+ goto not_an_identifier;
+@y
+ case roman: out_str(" "); goto not_an_identifier;
+ case wildcard: out_str("\\9"); goto not_an_identifier;
+@z
+
+@x
+ case roman: not_an_identifier: out_name(cur_name,0); goto name_done;
+ case custom: {char *j; out_str("$\\");
+ for (j=cur_name->byte_start;j<(cur_name+1)->byte_start;j++)
+ out(*j=='_'? 'x': *j=='$'? 'X': *j);
+ out('$');
+ goto name_done;
+ }
+@y
+not_an_identifier: out_name(cur_name,0); goto name_done;
+ case custom: out_str("\\$"); break;
+@.\\\$@>
+@z
+
+@x
+out_name(cur_name,1);
+@y
+if (proofing) out_name(cur_name,1);
+else {
+ out('{');
+ {char *j;
+ for (j=cur_name->byte_start;j<(cur_name+1)->byte_start;j++) out(*j);
+ }
+ out('}');
+}
+@z
+
+@x
+void section_print();
+@y
+static void section_print(name_pointer);@/
+@z
+
+@x
+void
+section_print(p) /* print all section names in subtree |p| */
+name_pointer p;
+@y
+static void
+section_print(@t\1\1@> /* print all section names in subtree |p| */
+name_pointer p@t\2\2@>)
+@z
+
+@x
+@ @<Output all the section names@>=section_print(root)
+@y
+@ @<Output all the section names@>=section_print(root);
+@z
+
+@x
+void
+print_stats() {
+@y
+void
+print_stats(void) {
+@z
+
+@x
+ printf("\nMemory usage statistics:\n");
+@.Memory usage statistics:@>
+ printf("%ld names (out of %ld)\n",
+ (long)(name_ptr-name_dir),(long)max_names);
+ printf("%ld cross-references (out of %ld)\n",
+ (long)(xref_ptr-xmem),(long)max_refs);
+ printf("%ld bytes (out of %ld)\n",
+ (long)(byte_ptr-byte_mem),(long)max_bytes);
+ printf("Parsing:\n");
+ printf("%ld scraps (out of %ld)\n",
+ (long)(max_scr_ptr-scrap_info),(long)max_scraps);
+ printf("%ld texts (out of %ld)\n",
+ (long)(max_text_ptr-tok_start),(long)max_texts);
+ printf("%ld tokens (out of %ld)\n",
+ (long)(max_tok_ptr-tok_mem),(long)max_toks);
+ printf("%ld levels (out of %ld)\n",
+ (long)(max_stack_ptr-stack),(long)stack_size);
+ printf("Sorting:\n");
+ printf("%ld levels (out of %ld)\n",
+ (long)(max_sort_ptr-scrap_info),(long)max_scraps);
+}
+@y
+ puts(_("\nMemory usage statistics:"));
+@.Memory usage statistics:@>
+ printf(_("%ld names (out of %ld)\n"),
+ (long)(name_ptr-name_dir),(long)max_names);
+ printf(_("%ld cross-references (out of %ld)\n"),
+ (long)(xref_ptr-xmem),(long)max_refs);
+ printf(_("%ld bytes (out of %ld)\n"),
+ (long)(byte_ptr-byte_mem),(long)max_bytes);
+ printf(_("%ld temp meanings (out of %ld)\n"),
+ (long)(max_temp_meaning_ptr-temp_meaning_stack),
+ (long)max_meanings);
+ printf(_("%ld titles (out of %ld)\n"),
+ (long)(title_code_ptr-title_code),(long)max_titles);
+ puts(_("Parsing:"));
+ printf(_("%ld scraps (out of %ld)\n"),
+ (long)(max_scr_ptr-scrap_info),(long)max_scraps);
+ printf(_("%ld texts (out of %ld)\n"),
+ (long)(max_text_ptr-tok_start),(long)max_texts);
+ printf(_("%ld tokens (out of %ld)\n"),
+ (long)(max_tok_ptr-tok_mem),(long)max_toks);
+ printf(_("%ld levels (out of %ld)\n"),
+ (long)(max_stack_ptr-stack),(long)stack_size);
+ puts(_("Sorting:"));
+ printf(_("%ld levels (out of %ld)\n"),
+ (long)(max_sort_ptr-scrap_info),(long)max_scraps);
+}
+@z
+
+@x
+@** Index.
+@y
+@** Extensions for modern {\tt CWEB}.
+
+The following sections introduce code changes and extensions that have been
+created by numerous contributors over the course of a quarter century. They
+make \.{CWEB} adhere to modern coding standards and introduce new or improved
+features.
+
+Care has been taken to keep the original section numbering intact, so this new
+section should have the same number as the original ``\&{275.~Index},'' and
+additional material follows below.
+
+@* Set {\tt CWEAVE} flags.
+At least one of these is already used in \.{COMMON}.
+
+@<Set init...@>=
+ make_xrefs=force_lines=make_pb=indent_param_decl=order_decl_stmt=1;
+ /* controlled by command-line options */
+
+@* Function declarations. Here are declarations---conforming to
+{\mc ANSI~C}---of all functions in this code, as far as they are
+not already in |"common.h"|. These are private to \.{CWEAVE} and \.{CTWILL}.
+
+@<Predecl...@>=
+static eight_bits copy_TeX(void);@/
+static eight_bits get_output(void);@/
+static eight_bits skip_TeX(void);@/
+static text_pointer C_translate(void);@/
+static text_pointer translate(void);@/
+static token_pointer find_first_ident(text_pointer);@/
+static void app_str(const char *);@/
+static void big_app(token);@/
+static void big_app1(scrap_pointer);@/
+static void copy_limbo(void);@/
+static void C_parse(eight_bits);@/
+static void finish_line(void);@/
+static void flush_buffer(char *,boolean,boolean);@/
+static void make_reserved(scrap_pointer);@/
+static void make_underlined(scrap_pointer);@/
+static void new_section_xref(name_pointer);@/
+static void new_xref(name_pointer);@/
+static void outer_parse(void);@/
+static void output_C(void);@/
+static void out_name(name_pointer,boolean);@/
+static void out_section(sixteen_bits);@/
+static void out_str(const char *);@/
+static void pop_level(void);@/
+static void print_cat(eight_bits);@/
+#ifdef DEAD_CODE
+static void print_text(text_pointer p);@/
+#endif
+static void push_level(text_pointer);@/
+static void reduce(scrap_pointer,short,eight_bits,short,short);@/
+static void set_file_flag(name_pointer);@/
+static void skip_limbo(void);@/
+static void squash(scrap_pointer,short,eight_bits,short,short);@/
+static void update_node(name_pointer p);@/
+
+@* Output file update. Most \CEE/ projects are controlled by a
+\.{Makefile} that automatically takes care of the temporal dependecies
+between the different source modules. It is suitable that \.{CWEB} doesn't
+create new output for all existing files, when there are only changes to
+some of them. Thus the \.{make} process will only recompile those modules
+where necessary. The idea and basic implementation of this mechanism can
+be found in the program \.{NUWEB} by Preston Briggs, to whom credit is due.
+
+@<Update the result...@>=
+if((tex_file=fopen(tex_file_name,"r"))!=NULL) {
+ char x[BUFSIZ],y[BUFSIZ];
+ int x_size,y_size,comparison;
+
+ if((check_file=fopen(check_file_name,"r"))==NULL)
+ fatal(_("! Cannot open output file "),check_file_name);
+@.Cannot open output file@>
+
+ @<Compare the temporary output to the previous output@>@;
+
+ fclose(tex_file); tex_file=NULL;
+ fclose(check_file); check_file=NULL;
+
+ @<Take appropriate action depending on the comparison@>@;
+} else
+ rename(check_file_name,tex_file_name); /* This was the first run */
+
+strcpy(check_file_name,""); /* We want to get rid of the temporary file */
+
+@ We hope that this runs fast on most systems.
+
+@<Compare the temp...@>=
+do {
+ x_size = fread(x,1,BUFSIZ,tex_file);
+ y_size = fread(y,1,BUFSIZ,check_file);
+ comparison = (x_size == y_size); /* Do not merge these statements! */
+ if(comparison) comparison = !memcmp(x,y,x_size);
+} while(comparison && !feof(tex_file) && !feof(check_file));
+
+@ Note the superfluous call to |remove| before |rename|. We're using it to
+get around a bug in some implementations of |rename|.
+
+@<Take appropriate action...@>=
+if(comparison)
+ remove(check_file_name); /* The output remains untouched */
+else {
+ remove(tex_file_name);
+ rename(check_file_name,tex_file_name);
+}
+
+@* Put ``version'' information in a single spot.
+Don't do this at home, kids! Push our local macro to the variable in \.{COMMON}
+for printing the |banner| and the |versionstring| from there.
+
+@d max_banner 50
+
+@<Common code...@>=
+extern char cb_banner[];
+
+@ @<Set init...@>=
+ strncpy(cb_banner,banner,max_banner-1);
+
+@** Index.
+@z
+
diff --git a/Build/source/texk/web2c/cwebdir/ctwimac.tex b/Build/source/texk/web2c/cwebdir/ctwimac.tex
new file mode 100644
index 00000000000..eddd6af3528
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/ctwimac.tex
@@ -0,0 +1,476 @@
+% standard macros for CWEB listings (in addition to plain.tex)
+% Version 3.6 --- May 2000
+% modified for pages produced by CTWILL
+% further modified for page size of the MMIXware book
+\ifx\documentstyle\undefined\else\endinput\fi % LaTeX will use other macros
+\xdef\fmtversion{\fmtversion+CTWILL3.6+LNCS}
+
+\let\:=\. % preserve a way to get the dot accent
+ % (all other accents will still work as usual)
+
+\newdimen\em \em=10pt % this "em" will not change with font size
+\parskip 0pt plus .1pt % almost no stretch between paragraphs
+\parindent 1\em % for paragraphs and for the first line of C text
+
+\newif\ifsorted
+\newread\sreffile
+\newwrite\reffile
+\ifx\norefs\def\else
+ \openin\sreffile=\jobname.sref
+ \ifeof\sreffile \immediate\openout\reffile=\jobname.ref \sortedfalse
+ \message{This is the first pass!}
+ \else \sortedtrue \message{This is the second pass!} \fi
+\fi
+
+\font\ninerm=cmr9
+\let\mc=\ninerm % medium caps
+\def\CEE/{{\mc C\spacefactor1000}}
+\def\UNIX/{{\mc U\kern-.05emNIX\spacefactor1000}}
+\def\TEX/{\TeX}
+\def\CPLUSPLUS/{{\mc C\PP\spacefactor1000}}
+\def\Cee{\CEE/} % for backward compatibility
+\def\9#1{}
+\font\eightrm=cmr8
+\font\sixrm=cmr6
+\font\ninei=cmmi9
+\font\eighti=cmmi8
+\font\sixi=cmmi6
+\skewchar\ninei='177 \skewchar\eighti='177 \skewchar\sixi='177
+\font\ninesy=cmsy9
+\font\eightsy=cmsy8
+\font\sixsy=cmsy6
+\skewchar\ninesy='60 \skewchar\eightsy='60 \skewchar\sixsy='60
+\font\ninebf=cmbx9
+\font\eightbf=cmbx8
+\font\sixbf=cmbx6
+\font\ninett=cmtt9
+\font\eighttt=cmtt8
+\hyphenchar\ninett=-1 \hyphenchar\eighttt=-1
+\font\ninesl=cmsl9
+\font\eightsl=cmsl8
+\font\nineit=cmti9
+\font\eightit=cmti8
+\font\tentex=cmtex10
+\font\ninetex=cmtex9 % TeX extended character set (used in strings)
+\font\eighttex=cmtex8
+\fontdimen7\tentex=0pt % no double space after sentences
+\fontdimen7\ninetex=0pt
+\fontdimen7\eighttex=0pt
+
+\newif\iftenpoint
+\def\tenpoint{\tenpointtrue
+ \def\rm{\fam0\tenrm}%
+ \textfont0=\tenrm \scriptfont0=\sevenrm \scriptscriptfont0=\fiverm
+ \textfont1=\teni \scriptfont1=\seveni \scriptscriptfont1=\fivei
+ \textfont2=\tensy \scriptfont2=\sevensy \scriptscriptfont2=\fivesy
+ \textfont3=\tenex \scriptfont3=\tenex \scriptscriptfont3=\tenex
+ \def\it{\fam\itfam\tenit}%
+ \textfont\itfam=\tenit
+ \def\sl{\fam\slfam\tensl}%
+ \textfont\slfam=\tensl
+ \def\bf{\fam\bffam\tenbf}%
+ \textfont\bffam=\tenbf \scriptfont\bffam=\sevenbf
+ \scriptscriptfont\bffam=\fivebf
+ \def\tt{\fam\ttfam\tentt}%
+ \textfont\ttfam=\tentt
+ \def\ttx{\tentex}%
+ \normalbaselineskip=12pt
+ \let\cmntfont=\tenrm
+ \let\mc=\ninerm
+ \let\sc=\eightrm
+ \let\big=\tenbig
+ \setbox\strutbox=\hbox{\vrule height8pt depth3pt width 0pt}%
+ \normalbaselines\rm}
+
+\def\ninepoint{\tenpointfalse
+ \def\rm{\fam0\ninerm}%
+ \textfont0=\ninerm \scriptfont0=\sixrm \scriptscriptfont0=\fiverm
+ \textfont1=\ninei \scriptfont1=\sixi \scriptscriptfont1=\fivei
+ \textfont2=\ninesy \scriptfont2=\sixsy \scriptscriptfont2=\fivesy
+ \textfont3=\tenex \scriptfont3=\tenex \scriptscriptfont3=\tenex
+ \def\it{\fam\itfam\nineit}%
+ \textfont\itfam=\nineit
+ \def\sl{\fam\slfam\ninesl}%
+ \textfont\slfam=\ninesl
+ \def\bf{\fam\bffam\ninebf}%
+ \textfont\bffam=\ninebf \scriptfont\bffam=\sixbf
+ \scriptscriptfont\bffam=\fivebf
+ \def\tt{\fam\ttfam\ninett}%
+ \textfont\ttfam=\ninett
+ \def\ttx{\ninetex}%
+ \normalbaselineskip=11pt
+ \let\cmntfont=\ninerm
+ \let\mc=\eightrm
+ \let\sc=\sevenrm
+ \let\big=\ninebig
+ \setbox\strutbox=\hbox{\vrule height8pt depth3pt width 0pt}%
+ \normalbaselines\rm}
+
+\def\eightpoint{%
+ \def\rm{\fam0\eightrm}%
+ \textfont0=\eightrm \scriptfont0=\sixrm \scriptscriptfont0=\fiverm
+ \textfont1=\eighti \scriptfont1=\sixi \scriptscriptfont1=\fivei
+ \textfont2=\eightsy \scriptfont2=\sixsy \scriptscriptfont2=\fivesy
+ \textfont3=\tenex \scriptfont3=\tenex \scriptscriptfont3=\tenex
+ \def\it{\fam\itfam\eightit}%
+ \textfont\itfam=\eightit
+ \def\sl{\fam\slfam\eightsl}%
+ \textfont\slfam=\eightsl
+ \def\bf{\fam\bffam\eightbf}%
+ \textfont\bffam=\eightbf \scriptfont\bffam=\sixbf
+ \scriptscriptfont\bffam=\fivebf
+ \def\tt{\fam\ttfam\eighttt}%
+ \textfont\ttfam=\eighttt
+ \def\ttx{\eighttex}%
+ \normalbaselineskip=9pt
+ \let\cmntfont=\eightrm
+ \let\mc=\sevenrm
+ \let\sc=\sixrm
+ \let\big=\eightbig
+ \setbox\strutbox=\hbox{\vrule height7pt depth2pt width 0pt}%
+ \normalbaselines\rm}
+
+\tenpoint
+\def\tenbig#1{{\hbox{$\left#1\vbox to8.5pt{}\right.\nulldelimiterspace=0pt$}}}
+\def\ninebig#1{{\hbox{$\textfont0=\tenrm\textfont2=\tensy
+ \left#1\vbox to7.25pt{}\right.\nulldelimiterspace=0pt$}}}
+\def\eightbig#1{{\hbox{$\textfont0=\ninerm\textfont2=\ninesy
+ \left#1\vbox to6.5pt{}\right.\nulldelimiterspace=0pt$}}}
+
+%\font\tenss=cmss10 \let\cmntfont\tenss % alternative comment font
+\font\titlefont=cmr7 scaled\magstep4 % title on the contents page
+\font\ttitlefont=cmtt10 scaled\magstep2 % typewriter type in title
+
+\def\\#1{\leavevmode\hbox{\it#1\/\kern.05em}} % italic type for identifiers
+\def\|#1{\leavevmode\hbox{$#1$}} % one-letter identifiers look better this way
+\def\&#1{\leavevmode\hbox{\bf
+ \def\_{\kern.04em\vbox{\hrule width.3em height .6pt}\kern.08em}%
+ #1\/\kern.05em}} % boldface type for reserved words
+\def\.#1{\leavevmode\hbox{\ttx % typewriter type for strings
+ \let\\=\BS % backslash in a string
+ \let\{=\LB % left brace in a string
+ \let\}=\RB % right brace in a string
+ \let\~=\TL % tilde in a string
+ \let\ =\SP % space in a string
+ \let\_=\UL % underline in a string
+ \let\&=\AM % ampersand in a string
+ \let\^=\CF % circumflex in a string
+ #1\kern.05em}}
+\def\){{\tentex\kern-.05em}\discretionary{\hbox{\tentex\BS}}{}{}}
+\def\AT{@} % at sign for control text (not needed in versions >= 2.9)
+\def\ATL{\par\noindent\bgroup\catcode`\_=12 \postATL} % print @l in limbo
+\def\postATL#1 #2 {\bf letter \\{\uppercase{\char"#1}}
+ tangles as \tentex "#2"\egroup\par}
+\def\noATL#1 #2 {}
+\def\noatl{\let\ATL=\noATL} % suppress output from @l
+\def\ATH{\X\kern-.5em:Preprocessor definitions\X}
+\let\PB=\relax % hook for program brackets |...| in TeX part or section name
+
+\chardef\AM=`\& % ampersand character in a string
+\chardef\BS=`\\ % backslash in a string
+\chardef\LB=`\{ % left brace in a string
+\chardef\RB=`\} % right brace in a string
+\def\SP{{\tt\char`\ }} % (visible) space in a string
+\chardef\TL=`\~ % tilde in a string
+\chardef\UL=`\_ % underline character in a string
+\chardef\CF=`\^ % circumflex character in a string
+
+\newbox\PPbox % symbol for ++
+\setbox\PPbox=\hbox{\kern.5pt\raise1pt\hbox{\sevenrm+\kern-1pt+}\kern.5pt}
+\def\PP{\copy\PPbox}
+\newbox\MMbox \setbox\MMbox=\hbox{\kern.5pt\raise1pt\hbox{\sevensy\char0
+ \kern-1pt\char0}\kern.5pt}
+\def\MM{\copy\MMbox}
+\newbox\MGbox % symbol for ->
+\setbox\MGbox=\hbox{\kern-2pt\lower3pt\hbox{\teni\char'176}\kern1pt}
+\def\MG{\copy\MGbox}
+\def\MRL#1{\mathrel{\let\K==#1}}
+\let\GG=\gg
+\let\LL=\ll
+\let\NULL=\Lambda
+\mathchardef\AND="2026 % bitwise and; also \& (unary operator)
+\let\OR=\mid % bitwise or
+\let\XOR=\oplus % bitwise exclusive or
+\def\CM{{\sim}} % bitwise complement
+\newbox\MODbox \setbox\MODbox=\hbox{\eightrm\%}
+\def\MOD{\mathbin{\copy\MODbox}}
+\def\DC{\kern.1em{::}\kern.1em} % symbol for ::
+\def\PA{\mathbin{.*}} % symbol for .*
+\def\MGA{\mathbin{\MG*}} % symbol for ->*
+\def\this{\&{this}}
+
+\newbox\bak \setbox\bak=\hbox to -1\em{} % backspace one em
+\newbox\bakk\setbox\bakk=\hbox to -2\em{} % backspace two ems
+
+\newcount\ind % current indentation in ems
+\def\1{\global\advance\ind by1\hangindent\ind\em} % indent one more notch
+\def\2{\global\advance\ind by-1} % indent one less notch
+\def\3#1{\hfil\penalty#10\hfilneg} % optional break within a statement
+\def\4{\copy\bak} % backspace one notch
+\def\5{\hfil\penalty-1\hfilneg\kern2.5\em\copy\bakk\ignorespaces}% optional break
+\def\6{\ifmmode\else\par % forced break
+ \hangindent\ind\em\noindent\kern\ind\em\copy\bakk\ignorespaces\fi}
+\def\7{\Y\6} % forced break and a little extra space
+\def\8{\hskip-\ind em\hskip 2\em} % no indentation
+
+\newcount\gdepth % depth of current major group, plus one
+\newtoks\gtitle % title of current major group
+\newskip\intersecskip \intersecskip=12pt minus 3pt % space between sections
+\let\yskip=\smallskip
+\def\?{\mathrel?}
+\def\note#1#2.{\par\penalty5000
+ \Y\noindent{\hangindent2\em\baselineskip10pt\eightrm#1~#2.\par}}
+\def\lapstar{\rlap{*}}
+\def\stsec{\tenpoint\rightskip=0pt % get out of C mode (cf. \B)
+ \sfcode`;=1500 \pretolerance 200 \hyphenpenalty 50 \exhyphenpenalty 50
+ \noindent\strut{\bf\secno.\quad}}
+\def\startsection{\titletrue
+ \line{\smash{\titlefont\title}\quad\hrulefill}\bigskip
+ \let\startsection=\stsec\stsec}
+\def\defin#1{\global\advance\ind by 2 \1\&{#1 } } % begin `define' or `format'
+\def\A{\note{See also section}} % xref for doubly defined section name
+\def\As{\note{See also sections}} % xref for multiply defined section name
+\def\B{\iftenpoint\ninepoint\fi
+ \rightskip=0pt plus 100pt minus 10pt % go into C mode
+ \sfcode`;=3000
+ \pretolerance 10000
+ \hyphenpenalty 9999 % so strings can be broken (discretionary \ is inserted)
+ \exhyphenpenalty 10000
+ \global\ind=2 \1\ \unskip}
+\def\C#1{\5\5\quad$/\ast\,${\cmntfont #1}$\,\ast/$}
+\let\SHC\C % "// short comments" treated like "/* ordinary comments */"
+%\def\C#1{\5\5\quad$\triangleright\,${\cmntfont#1}$\,\triangleleft$}
+%\def\SHC#1{\5\5\quad$\diamond\,${\cmntfont#1}}
+\def\D{\defin{\#define}} % macro definition
+\let\E=\equiv % equivalence sign
+\def\ET{ and~} % conjunction between two section numbers
+\def\ETs{, and~} % conjunction between the last two of several section numbers
+\def\F{\defin{format}} % format definition
+\let\G=\ge % greater than or equal sign
+% \H is long Hungarian umlaut accent
+\let\I=\ne % unequal sign
+\def\J{\.{@\&}} % TANGLE's join operation
+\let\K== % assignment operator
+%\let\K=\leftarrow % "honest" alternative to standard assignment operator
+% \L is Polish letter suppressed-L
+\outer\def\M#1{\def\secno{#1}\startsection\ignorespaces}
+\outer\def\N{\ifvoid\partialpage\lefttrue
+ \else\ifdim\ht\partialpage<\pageht \leftfalse\else\lefttrue\fi\fi\NNN}
+\outer\def\NN{\ifvoid\partialpage\leftfalse
+ \else\ifdim\ht\partialpage<\pageht \lefttrue\else\leftfalse\fi\fi\NNN}
+\outer\def\NNN#1#2#3.{\gdepth=#1\gtitle={#3}\def\secno{#2}% starred section
+ \ifleft \flushout
+ \gdef\rlhead{\let\i=I\uppercase{\ignorespaces#3}} % running left headline
+ \global\let\rrhead=\rlhead % running right headline
+ \else\global\setbox\partialpage=\vbox{
+ \vbox to\pageht{\unvbox\partialpage\vfill}\break}
+ \gdef\rrhead{\let\i=I\uppercase{\ignorespaces#3}}
+ \fi
+ \message{*\secno} % progress report
+ \startsection{\bf\ignorespaces#3.\quad}\ignorespaces}
+% \O is Scandinavian letter O-with-slash
+% \P is paragraph sign
+\def\Q{\note{This code is cited in section}} % xref for mention of a section
+\def\Qs{\note{This code is cited in sections}} % xref for mentions of a section
+\let\R=\lnot % logical not
+% \S is section sign
+\def\T#1{\leavevmode % octal, hex or decimal constant
+ \hbox{$\def\?{\kern.2em}%
+ \def\$##1{\egroup_{\,\rm##1}\bgroup}% suffix to constant
+ \def\_{\cdot 10^{\aftergroup}}% power of ten (via dirty trick)
+ \let\~=\oct \let\^=\hex {#1}$}}
+\def\U{\note{This code is used in section}} % xref for use of a section
+\def\Us{\note{This code is used in sections}} % xref for uses of a section
+\let\V=\lor % logical or
+\let\W=\land % logical and
+\def\X#1:#2\X{\ifmmode\gdef\XX{\null$\null}\else\gdef\XX{}\fi % section name
+ \XX$\langle\,${\let\I=\ne#2\sevenrm\kern.5em#1}$\,\rangle$\XX}
+\def\Y{\par\yskip}
+\let\Z=\le
+\let\ZZ=\let % now you can \write the control sequence \ZZ
+\let\*=*
+
+%\def\oct{\hbox{\rm\char'23\kern-.2em\it\aftergroup\?\aftergroup}} % WEB style
+%\def\hex{\hbox{\rm\char"7D\tt\aftergroup}} % WEB style
+\def\oct{\hbox{$^\circ$\kern-.1em\it\aftergroup\?\aftergroup}}% CWEB style
+\def\hex{\hbox{$^{\scriptscriptstyle\#}$\tt\aftergroup}} % CWEB style
+\def\vb#1{\leavevmode\hbox{\kern2pt\vrule\vtop{\vbox{\hrule
+ \hbox{\strut\kern2pt\.{#1}\kern2pt}}
+ \hrule}\vrule\kern2pt}} % verbatim string
+
+\def\TeX{{\ifmmode\it\fi
+ \leavevmode\hbox{T\kern-.1667em\lower.424ex\hbox{E}\hskip-.125em X}}}
+\def\,{\relax\ifmmode\mskip\thinmuskip\else\thinspace\fi}
+
+% now here's the mini-index formatting control
+\newcount\nrefs % total number of references in partial page
+\newcount\baseno % smallest section number in partial page
+\toksdef\prefs=199 % references to previous sections in current program
+\toksdef\frefs=220 % references to future sections in current program
+\toksdef\erefs=221 % references to sections in another program
+% \count and \toks registers 200--219 are also used to keep track of refs
+\catcode`\@=11
+\newcount\@n \newcount\@m \newcount\@p
+\newdimen\pageht \pageht=19cm
+\newdimen\pagewd \pagewd=13cm
+\newdimen\colwd \colwd=\pagewd
+ \advance\colwd by -2pc \divide\colwd by 3 % for three columns
+\newdimen\fullpageht \fullpageht=\pageht \advance\fullpageht by 4pc
+\newdimen\pagethresh \pagethresh=2\pageht
+\newdimen\nsize \newdimen\msize
+\newskip\intersecskip \intersecskip=8pt plus 2pt minus 3pt
+\newbox\partialpage
+\newbox\newsec
+\newtoks\newrefs
+\newtoks\ttoks
+\newdimen\ninept \ninept=9pt
+\newif\iftitle \newif\ifleft
+
+\def\flushout{\ifvoid\partialpage\else
+ \setbox0=\vsplit\partialpage to \pageht
+ \shipout\vbox{
+ \vbox to 3pc{\leftheadline\vfill}
+ \nointerlineskip\box0}
+ \global\advance\pageno 1
+ \global\let\[=\makeinref \global\let\]=\makeoutref
+ \ifsorted \let\readin=\readln \readrefs
+ \else \immediate\write\reffile{!\the\pageno}\let\readin=\readrefs \fi
+ \setbox0=\vbox{\eightpoint \hsize=\colwd
+ \rightskip=0pt plus 100pt minus 10pt
+ \pretolerance 10000
+ \hyphenpenalty 10000 \exhyphenpenalty 10000
+ \noindent\vbox to1pt{}\par % 1pt = \topskip - \ninept
+ \readin}
+ \shipout\vbox to\fullpageht{
+ \vbox to 3pc{\rightheadline\vfill}
+ \unvbox\partialpage
+ \vfill
+ \ifdim\ht0>1pt \kern11pt\hrule \hbox{%
+ \nsize=\ht0 \advance\nsize-\topskip
+ \divide\nsize by 3 \divide\nsize by\ninept
+ \multiply\nsize by\ninept \advance\nsize\topskip
+ \vsplit0 to\nsize \kern1pc
+ \msize=\ht0 \advance\msize-\topskip
+ \divide\msize by 2 \divide\msize by\ninept
+ \multiply\msize by\ninept \advance\msize\topskip
+ \vbox to\nsize{\vsplit0 to\msize\vss}\kern1pc
+ \vbox to\nsize{\box0\vss}} \fi}
+ \global\advance\pageno 1 \global\let\rlhead=\rrhead\fi
+ {\globaldefs=1
+ \@n=199 \loop \ifnum\@n<222 \toks\@n={} \count\@n=0 \advance\@n 1 \repeat
+ \nrefs=0
+ \baseno=\secno}}
+\def\leftheadline{\hbox to\pagewd{\vbox to10pt{}%
+ \iftitle\global\titlefalse\else\ninerm\title:\enspace \eightsl\rlhead\fi
+ \hfil\eightrm\folio}}
+\def\rightheadline{\hbox to\pagewd{\vbox to10pt{}%
+ \eightrm\folio\hfil\ninerm\title:\enspace \eightsl\rrhead\/}}
+
+\def\mini{\begingroup \obeylines \globaldefs=1 \newrefs=\bgroup}
+\def\FI{\@n=\secno \advance\@n-\baseno \advance\@n 200
+ \advance\nrefs-\count\@n \@n=\nrefs
+ \let\[=\countnewref \let\]=\cn \the\newrefs \endgroup
+ \nobreak\null\nobreak\vskip-\baselineskip\penalty-500\vfil\eject}
+\def\twillout{\setbox\newsec=\vbox{\unvbox255}
+ \ifnum\@n=0 \nsize=0pt
+ \else \nsize=3pt \multiply\nsize\@n \advance\nsize 1.25pc \fi
+ \ifvoid\partialpage\else\advance\nsize 5pt \advance\nsize\ht\partialpage\fi
+ \advance\nsize\ht\newsec
+ \message{\the\nsize} % show the page break decision amount
+ \ifbr \global\brfalse \flushout \message{/\secno}\fi
+ \ifdim\nsize>\pagethresh \flushout \message{\secno}\fi
+ \addtopartialpage}
+\def\addtopartialpage{\globaldefs=1
+ \let\[=\addnewref \let\]=\addneweref \the\newrefs
+ \setbox\partialpage=\ifvoid\partialpage \box\newsec
+ \else \vbox{\unvbox\partialpage \vfilneg
+ \vskip\intersecskip \unvbox\newsec}\fi}
+\def\shortpage{\par\vskip-2\baselineskip
+ \null\vfill\penalty-5000\message{(shortpage)}}
+\newif\ifbr
+\def\forcebr{\global\brtrue}
+
+\def\countnewref #1 {\ifnum#1<\baseno \let\next\cn
+ \else\ifnum#1>\secno \let\next\cn \else\let\next\flushref\fi\fi\next#1 }
+\def\cn #1 #2 {\begintest{#1 #2}\cnr\endtest}
+
+% here's a tricky way to present \cnr with a csname unexpanded inside:
+\def\begintest#1{\def\TEST{#1}\expandafter\expandafter\expandafter}
+\def\endtest{\csname\expandafter\gobb\meaning\TEST\endcsname}
+\expandafter\def\expandafter\gobb\meaning\empty{}
+
+{\obeylines\gdef\cnr#1#2
+ {\ifx#1\relax \advance\@n 1 \fi}}
+{\obeylines\gdef\flushref#1
+ {}}
+\def\addnewref #1 {\ifnum#1<\baseno \let\next\an \@n=199
+ \else\ifnum#1>\secno \let\next\an \@n=#1 \advance\@n-\baseno
+ \advance\@n200 \ifnum\@n>219 \@n=220 \fi
+ \else\let\next\flushref\fi\fi\next#1 }
+\def\an#1 #2 {\begintest{#1 #2}\anr\endtest\[#1 #2 }
+\def\addneweref#1 #2 {\@n=221 \begintest{#1 #2}\anr\endtest\]#1 #2 }
+{\obeylines\gdef\anr#1#2
+ {\ifx#1\relax \advance\nrefs1 \advance\count\@n 1 %
+ \def#1{#2
+ }\toks\@n=\expandafter{\the\toks\@n\lmda#1}\fi}}
+\ifsorted \def\lmda#1{\global\let#1\relax}
+\else \def\lmda#1{#1\global\let#1\relax} \fi
+{\obeylines\gdef\makeinref#1 #2 #3
+ {\ifsorted\else\ttoks={\[#1 #2 #3}\immediate\write\reffile{+ \the\ttoks}\fi %
+ \hangindent=1em \noindent #2\miniform#3, \S#1.\par}}
+{\obeylines\gdef\makeoutref#1 #2 #3
+ {\ifsorted\else\ttoks={\]#1 #2 #3}\immediate\write\reffile{+ \the\ttoks}\fi %
+ \hangindent=1em \noindent #2\miniform#3, \extref#1.\par}}
+\def\miniform{\futurelet\next\miniforma}
+\def\miniforma{\ifx\next\zip
+ \else\if=\noexpand\next \let\next\gobbleq
+ \else\let\next\colon\fi\fi\next}
+\def\zip{}
+\def\gobbleq={\,=\,}
+\def\colon{: }
+\def\extref{\futurelet\next\extrefa}
+\def\extrefa{\if"\next\let\next\gobblest\else\let\next\cite\fi\next}
+\def\gobblest"#1"{{\ttx#1}}
+\def\cite#1#2.{{\sc#1}\,\S#2.}
+\def\uninitialized{???}
+
+\def\readrefs{\the\prefs \@m=\secno \advance\@m-\baseno \advance\@m200
+ {\def\lmda##1{\global\let##1\relax}\@p=200
+ \loop\ifnum\@p<\@m \the\toks\@p \advance\@p 1 \repeat}
+ \loop\ifnum\@m<222 \the\toks\@m \advance\@m 1 \repeat}
+\def\readln{\read\sreffile to\next \expandafter\next\newline \readin}
+{\obeylines\gdef\newline{\unskip\noexpand
+ }}
+\def\donewithpage#1 {\let\readin=\relax}
+\catcode`\@=12
+
+\hsize=\pagewd \vsize=\maxdimen \output={\twillout}
+
+\def\inx{\flushout\end}
+\def\fin{\parfillskip 0pt plus 1fil
+ \let\topsecno=\nullsec
+ \message{Section names:}
+ \def\note##1##2.{\quad{\eightrm##1~##2.}}
+ \def\Q{\note{Cited in section}} % crossref for mention of a section
+ \def\Qs{\note{Cited in sections}} % crossref for mentions of a section
+ \def\U{\note{Used in section}} % crossref for use of a section
+ \def\Us{\note{Used in sections}} % crossref for uses of a section
+ \def\I{\par\hangindent 2em}\let\*=*
+ \readsections}
+\def\readsections{\input \jobname.sscn}
+\def\datethis{}
+
+% To produce only a subset of pages, put the page numbers on separate
+% lines in a file called pages.tex
+\let\Shipout=\shipout
+\newread\pages \newcount\nextpage \openin\pages=pages
+\def\getnextpage{\ifeof\pages\else
+ {\endlinechar=-1\read\pages to\next
+ \ifx\next\empty % in this case we should have eof now
+ \else\global\nextpage=\next\fi}\fi}
+\ifeof\pages\else\message{OK, I'll ship only the requested pages!}
+ \getnextpage\fi
+\def\shipout{\ifeof\pages\let\next=\Shipout
+ \else\ifnum\pageno=\nextpage\getnextpage\let\next=\Shipout
+ \else\let\next=\Tosspage\fi\fi \next}
+\newbox\garbage \def\Tosspage{\deadcycles=0\setbox\garbage=}
diff --git a/Build/source/texk/web2c/cwebdir/cweav-w2c.ch b/Build/source/texk/web2c/cwebdir/cweav-w2c.ch
index 193bda51b48..6ec384d0491 100644
--- a/Build/source/texk/web2c/cwebdir/cweav-w2c.ch
+++ b/Build/source/texk/web2c/cwebdir/cweav-w2c.ch
@@ -1,55 +1,45 @@
-% Original Kpathsea changes for CWEB by Wlodek Bzyl and Olaf Weber
-% This file is in the Public Domain.
+@q Changes for CWEB in TeX Live from numerous contributors. @>
+@q This file is in the Public Domain. @>
+@q Most of the original Kpathsea changes by Wlodek Bzyl and Olaf Weber @>
+@q were merged with the set of change files of the CWEBbin project; @>
+@q see https://github.com/ascherer/cwebbin for the original parts. @>
-@x l.32
+@q This stripped change file {comm,ctang,cweav,ctwill}-w2c.ch has been @>
+@q created from the set of change files {comm,ctang,cweav}-patch.ch, @>
+@q {comm,ctang,cweav}-ansi.ch, {comm,ctang,cweav}-extensions.ch, @>
+@q {comm,ctang,cweav}-output.ch, {comm,ctang,cweav}-i18n.ch, and @>
+@q cweav-twill.ch for CTWILL, and {comm,ctang,cweav,ctwill}-texlive.ch @>
+@q with the 'tie' processor and is used as a monolithic changefile for @>
+@q {common,ctangle,cweave}.w in TeX Live. @>
+
+@q Please send comments, suggestions, etc. to tex-k@@tug.org. @>
+
+@x
\def\title{CWEAVE (Version 3.64)}
-\def\topofcontents{\null\vfill
- \centerline{\titlefont The {\ttitlefont CWEAVE} processor}
- \vskip 15pt
- \centerline{(Version 3.64)}
- \vfill}
@y
-\def\Kpathsea/{{\mc KPATHSEA\spacefactor1000}}
-\def\SQUARE{\vrule width 2pt depth -1pt height 3pt}
-\def\sqitem{\item{\SQUARE}}
-
-\def\title{CWEAVE (Version 3.64k)}
-\def\topofcontents{\null\vfill
- \centerline{\titlefont The {\ttitlefont CWEAVE} processor}
- \vskip 15pt
- \centerline{(Version 3.64k)}
- \vfill}
+\def\title{CWEAVE (Version 3.64 [\TeX~Live])}
@z
-This change cannot be applied when `tie' is used
-(TOC file can not be typeset).
-
-%@x l.51
-%\let\maybe=\iftrue
-%@y
-%\let\maybe=\iffalse % print only changed modules
-%@z
-
-
-Section 1.
+@x
+ \centerline{(Version 3.64)}
+@y
+ \centerline{(Version 3.64 [\TeX~Live])}
+@z
-@x l.65
-The ``banner line'' defined here should be changed whenever \.{CWEAVE}
-is modified.
+@x
+@s not_eq normal @q unreserve a C++ keyword @>
+@y
+@z
+@x
@d banner "This is CWEAVE (Version 3.64)\n"
-@y
-The ``banner line'' defined here should be changed whenever \.{CWEAVE}
-is modified.
-
-@d banner "This is CWEAVE, Version 3.64"
+@y
+@d banner _("This is CWEAVE, Version 3.64")
+ /* will be extended by the \TeX~Live |versionstring| */
@z
-
-Section 2.
-
-@x l.77
+@x
@ We predeclare several standard system functions here instead of including
their system header files, because the names of the header files are not as
standard as the names of the functions. (For example, some \CEE/ environments
@@ -62,46 +52,61 @@ extern char* strcpy(); /* copy one string to another */
extern int strncmp(); /* compare up to $n$ string characters */
extern char* strncpy(); /* copy up to $n$ string characters */
@y
-@z
+@ For string handling we include the {\mc ANSI C} system header file instead
+of predeclaring the standard system functions |strlen|, |strcmp|, |strcpy|,
+|strncmp|, and |strncpy|.
+@^system dependencies@>
-Section 3.
+@<Include files@>=
+#include <string.h>
+@z
-@x l.98
+@x
int main (ac, av)
int ac; /* argument count */
char **av; /* argument values */
@y
-int main (int ac, char **av)
+int main (@t\1\1@>
+int ac, /* argument count */
+char **av@t\2\2@>) /* argument values */
@z
-@x l.107 - Add Web2C version to banner.
- if (show_banner) printf(banner); /* print a ``banner line'' */
+@x
+ argc=ac; argv=av;
@y
- if (show_banner) {
- printf("%s%s\n", banner, versionstring); /* print a ``banner line'' */
- }
+ extern const char *use_language; /* prefix to \.{cwebmac.tex} in \TEX/ output */
+ argc=ac; argv=av;
+@z
+
+@x
+ make_xrefs=force_lines=make_pb=1; /* controlled by command-line options */
+ common_init();
+ @<Set initial values@>;
+@y
+ @<Set initial values@>;
+ common_init();
+ @<Start \TEX/ output@>;
@z
-@x l.112 - 'use' print_text(), used nowhere else
- return wrap_up(); /* and exit gracefully */
+@x
+ if (show_banner) printf(banner); /* print a ``banner line'' */
@y
- if (0) print_text(text_ptr);
- return wrap_up(); /* and exit gracefully */
+ if (show_banner) cb_show_banner(); /* print a ``banner line'' */
@z
-@x l.120
+@x
@d max_bytes 90000 /* the number of bytes in identifiers,
@y
@d max_bytes 1000000 /* the number of bytes in identifiers,
@z
-@x l.112
+@x
@d max_names 4000 /* number of identifiers, strings, section names;
@y
@d max_names 10239 /* number of identifiers, strings, section names;
@z
-@x l.124
+@x
@d max_sections 2000 /* greater than the total number of sections */
@d hash_size 353 /* should be prime */
@d buf_size 100 /* maximum length of input line, plus one */
@@ -111,7 +116,7 @@ int main (int ac, char **av)
@d buf_size 1000 /* maximum length of input line, plus one */
@z
-@x l.131
+@x
@d max_refs 20000 /* number of cross-references; must be less than 65536 */
@d max_toks 20000 /* number of symbols in \CEE/ texts being parsed;
@y
@@ -119,588 +124,935 @@ int main (int ac, char **av)
@d max_toks 65535 /* number of symbols in \CEE/ texts being parsed;
@z
-@x l.134
+@x
@d max_texts 4000 /* number of phrases in \CEE/ texts being parsed;
@y
@d max_texts 10239 /* number of phrases in \CEE/ texts being parsed;
@z
-@x l.136
+@x
@d max_scraps 2000 /* number of tokens in \CEE/ texts being parsed */
@y
@d max_scraps 10000 /* number of tokens in \CEE/ texts being parsed */
@z
-Section 5.
-
-@x common.h l.30 - boolean comes from kpathsea.
-typedef short boolean;
+@x
+@i common.h
@y
+@i comm-w2c.h
@z
-Section 6.
-
-@x common.h l.36
-#include <stdio.h>
-@y
-#include <kpathsea/kpathsea.h>
-#include <stdio.h>
-@z
-
-@x common.h l.65
-@d xisalpha(c) (isalpha(c)&&((eight_bits)c<0200))
-@d xisdigit(c) (isdigit(c)&&((eight_bits)c<0200))
-@d xisspace(c) (isspace(c)&&((eight_bits)c<0200))
-@d xislower(c) (islower(c)&&((eight_bits)c<0200))
-@d xisupper(c) (isupper(c)&&((eight_bits)c<0200))
-@d xisxdigit(c) (isxdigit(c)&&((eight_bits)c<0200))
-@y
-@d xisalpha(c) (isalpha((eight_bits)c)&&((eight_bits)c<0200))
-@d xisdigit(c) (isdigit((eight_bits)c)&&((eight_bits)c<0200))
-@d xisspace(c) (isspace((eight_bits)c)&&((eight_bits)c<0200))
-@d xislower(c) (islower((eight_bits)c)&&((eight_bits)c<0200))
-@d xisupper(c) (isupper((eight_bits)c)&&((eight_bits)c<0200))
-@d xisxdigit(c) (isxdigit((eight_bits)c)&&((eight_bits)c<0200))
-@z
-
-Section 9.
-
-@x common.h l.109 - protos now all in cweb.h.
-extern name_pointer id_lookup(); /* looks up a string in the identifier table */
-extern name_pointer section_lookup(); /* finds section name */
-extern void print_section_name(), sprint_section_name();
+@x
+xref_ptr=xmem; name_dir->xref=(char*)xmem; xref_switch=0; section_xref_switch=0;
@y
-#include "cweb.h"
+xref_ptr=xmem; init_node(name_dir); xref_switch=0; section_xref_switch=0;
@z
-Section 10.
-
-@x common.h l.123 - explicit types, protos now all in cweb.h.
-extern history; /* indicates how bad this run was */
-extern err_print(); /* print error message and context */
-extern wrap_up(); /* indicate |history| and exit */
-extern void fatal(); /* issue error message and die */
-extern void overflow(); /* succumb because a table has overflowed */
+@x
+@d append_xref(c) if (xref_ptr==xmem_end) overflow("cross-reference");
@y
-extern int history; /* indicates how bad this run was */
+@d append_xref(c) if (xref_ptr==xmem_end) overflow(_("cross-reference"));
@z
-Section 11.
-
-@x common.h l.131 - max_file_name_length is way too small.
-@d max_file_name_length 60
+@x
+@d no_xref (flags['x']==0)
+@d make_xrefs flags['x'] /* should cross references be output? */
@y
-@d max_file_name_length 1024
+@d no_xref (!make_xrefs) /* should cross references be suppressed? */
@z
-@x common.h l.138 - explicit types.
-extern include_depth; /* current level of nesting */
+@x
+void
+new_xref(p)
+name_pointer p;
@y
-extern int include_depth; /* current level of nesting */
+static void
+new_xref(
+name_pointer p)
@z
-@x common.h l.148 - explicit types.
-extern line[]; /* number of current line in the stacked files */
-extern change_line; /* number of current line in change file */
-extern change_depth; /* where \.{@@y} originated during a change */
+@x
+ append_xref(m); xref_ptr->xlink=q; p->xref=(char*)xref_ptr;
@y
-extern int line[]; /* number of current line in the stacked files */
-extern int change_line; /* number of current line in change file */
-extern int change_depth; /* where \.{@@y} originated during a change */
+ append_xref(m); xref_ptr->xlink=q; update_node(p);
@z
-@x common.h l.153 - protos now all in cweb.h.
-extern reset_input(); /* initialize to read the web file and change file */
-extern get_line(); /* inputs the next line */
-extern check_complete(); /* checks that all changes were picked up */
+@x
+void
+new_section_xref(p)
+name_pointer p;
@y
+static void
+new_section_xref(
+name_pointer p)
@z
-Section 15.
-
-@x common.h l.192 - protos now all in cweb.h.
-extern void common_init();
+@x
+ if (r==xmem) p->xref=(char*)xref_ptr;
@y
+ if (r==xmem) update_node(p);
@z
-Section 21.
-
-@x l.275
+@x
void
-new_xref(p)
+set_file_flag(p)
name_pointer p;
@y
static void
-new_xref (name_pointer p)
+set_file_flag(
+name_pointer p)
@z
-Section 22.
-
-@x l.306
-void
-new_section_xref(p)
-name_pointer p;
+@x
+ p->xref = (char *)xref_ptr;
@y
-static void
-new_section_xref (name_pointer p)
+ update_node(p);
@z
-Section 23.
-
-@x l.326
-void
-set_file_flag(p)
-name_pointer p;
+@x
+further details about them will be explained later. A |text_pointer| variable
+is an index into |tok_start|.
@y
-static void
-set_file_flag (name_pointer p)
+further details about them will be explained later. A \&{text\_pointer}
+variable is an index into |tok_start|.
@z
-Section 27.
+@x
+tok_ptr=tok_mem+1; text_ptr=tok_start+1; tok_start[0]=tok_mem+1;
+tok_start[1]=tok_mem+1;
+max_tok_ptr=tok_mem+1; max_text_ptr=tok_start+1;
+@y
+tok_ptr=max_tok_ptr=tok_mem+1;@/
+tok_start[0]=tok_start[1]=tok_mem+1;@/
+text_ptr=max_text_ptr=tok_start+1;
+@z
-@x l.371
+@x
int names_match(p,first,l,t)
name_pointer p; /* points to the proposed match */
char *first; /* position of first character of string */
int l; /* length of identifier */
eight_bits t; /* desired ilk */
@y
-int
-names_match (name_pointer p, const char *first, int l, char t)
+boolean names_match(@t\1\1@>
+name_pointer p, /* points to the proposed match */
+const char *first, /* position of first character of string */
+size_t l, /* length of identifier */
+eight_bits t@t\2\2@>) /* desired |ilk| */
@z
-@x l.383
+@x
+void
init_p(p,t)
name_pointer p;
eight_bits t;
@y
-init_p (name_pointer p, char t)
+void
+init_p(
+name_pointer p,
+eight_bits t)
@z
-@x l.391
+@x
+ p->ilk=t; p->xref=(char*)xmem;
+@y
+ p->ilk=t; init_node(p);
+@z
+
+@x
+void
init_node(p)
name_pointer p;
@y
-init_node (name_pointer p)
+void
+init_node(
+name_pointer p)
@z
-Section 34.
+@x
+ p->xref=(char*)xmem;
+}
+@y
+ p->xref=(void *)xmem;
+}
+
+static void
+update_node(
+name_pointer p)
+{
+ p->xref=(void *)xref_ptr;
+}
+@z
-@x l.600
+@x
void skip_limbo();
@y
-static void skip_limbo (void);
+static void skip_limbo(void);@/
@z
-Section 35.
-
-@x l.603
+@x
void
skip_limbo() {
@y
static void
-skip_limbo (void) {
+skip_limbo(void) {
@z
-Section 36.
-
-@x l.625
+@x
unsigned
skip_TeX() /* skip past pure \TEX/ code */
@y
-static unsigned
-skip_TeX (void) /* skip past pure \TEX/ code */
-@z
-
-Section 38.
-
-@x l.682 - Add declaration for versionstring.
-#include <ctype.h> /* definition of |isalpha|, |isdigit| and so on */
-@y
+static eight_bits
+skip_TeX(void) /* skip past pure \TEX/ code */
@z
-Section 39.
-
-@x l.696
+@x
eight_bits get_next();
@y
-static eight_bits get_next (void);
+static eight_bits get_next(void);@/
@z
-Section 40.
-
-@x l.699
+@x
eight_bits
get_next() /* produces the next input token */
+{@+eight_bits c; /* the current character */
@y
static eight_bits
-get_next (void) /* produces the next input token */
+get_next(void) /* produces the next input token */
+{
+ eight_bits c; /* the current character */
@z
-Section 45.
+@x
+ else if (c=='\'' || c=='"' || (c=='L'&&(*loc=='\'' || *loc=='"'))@|
+@y
+ else if (c=='\'' || c=='"'@|
+ || ((c=='L' || c=='u' || c=='U')&&(*loc=='\'' || *loc=='"'))@|
+ || ((c=='u' && *loc=='8')&&(*(loc+1)=='\'' || *(loc+1)=='"'))@|
+@z
-@x l.780
+@x
else if (*loc=='>') if (*(loc+1)=='*') {loc++; compress(minus_gt_ast);}
else compress(minus_gt); break;
@y
- else if (*loc=='>') {if (*(loc+1)=='*') {loc++; compress(minus_gt_ast);}
- else compress(minus_gt);} break;
+ else { if (*loc=='>') { if (*(loc+1)=='*') {loc++; compress(minus_gt_ast);}
+ else compress(minus_gt); } } break;
@z
-@x l.800
+@x
+ case '!': if (*loc=='=') compress(not_eq); break;
+@y
+ case '!': if (*loc=='=') compress(non_eq); break;
+@z
+
+@x
while (isalpha(*++loc) || isdigit(*loc) || isxalpha(*loc) || ishigh(*loc));
@y
- while (isalpha((unsigned char)*++loc) || isdigit((unsigned char)*loc) || isxalpha(*loc) || ishigh(*loc));
+ while (isalpha((eight_bits)*++loc) || isdigit((eight_bits)*loc) @|
+ || isxalpha((eight_bits)*loc) || ishigh((eight_bits)*loc));
@z
-@x l.835
+@x
*id_loc++='$'; *id_loc++=toupper(*loc); loc++;
@y
- *id_loc++='$'; *id_loc++=toupper((unsigned char)*loc); loc++;
+ *id_loc++='$'; *id_loc++=toupper((eight_bits)*loc); loc++;
@z
-Section 48.
+@x
+ if (delim=='L') { /* wide character constant */
+ delim=*loc++; *++id_loc=delim;
+ }
+@y
+ if (delim=='L' || delim=='u' || delim=='U') { /* wide character constant */
+ if (delim=='u' && *loc=='8') { *++id_loc=*loc++; }
+ delim=*loc++; *++id_loc=delim;
+ }
+@z
-@x l.870
+@x
+ err_print("! String didn't end"); loc=limit; break;
+@y
+ err_print(_("! String didn't end")); loc=limit; break;
+@z
+
+@x
+ err_print("! Input ended in middle of string"); loc=buffer; break;
+@y
+ err_print(_("! Input ended in middle of string")); loc=buffer; break;
+@z
+
+@x
if (c=='\\') if (loc>=limit) continue;
else if (++id_loc<=section_text_end) {
*id_loc = '\\'; c=*loc++;
}
@y
- if (c=='\\') {
- if (loc>=limit) continue;
- else if (++id_loc<=section_text_end) {
+ if (c=='\\') { if (loc>=limit) continue;
+ else { if (++id_loc<=section_text_end) {
*id_loc = '\\'; c=*loc++;
- }
- }
+ } } }
+@z
+
+@x
+ printf("\n! String too long: ");
+@y
+ fputs(_("\n! String too long: "),stdout);
@z
-Section 55.
+@x
+ case translit_code: err_print("! Use @@l in limbo only"); continue;
+@y
+ case translit_code: err_print(_("! Use @@l in limbo only")); continue;
+@z
-@x l.971
-void skip_restricted();
+@x
+ case xref_roman: case xref_wildcard: case xref_typewriter:
+ case noop: case TeX_string: c=ccode[c]; skip_restricted(); return(c);
+@y
+ case xref_roman: case xref_wildcard: case xref_typewriter: case noop:
+ case TeX_string: c=ccode[(eight_bits)c]; skip_restricted(); return(c);
+@z
+
+@x
+ err_print("! Input ended in section name");
+@y
+ err_print(_("! Input ended in section name"));
+@z
+
+@x
+ printf("\n! Section name too long: ");
+@y
+ fputs(_("\n! Section name too long: "),stdout);
+@z
+
+@x
+ err_print("! Section name didn't end"); break;
@y
-static void skip_restricted (void);
+ err_print(_("! Section name didn't end")); break;
@z
-Section 56.
+@x
+ err_print("! Control codes are forbidden in section name"); break;
+@y
+ err_print(_("! Control codes are forbidden in section name")); break;
+@z
-@x l.974
+@x
+void skip_restricted();
+@y
+void skip_restricted(void);@/
+@z
+
+@x
void
skip_restricted()
@y
-static void
-skip_restricted (void)
+void
+skip_restricted(void)
+@z
+
+@x
+ err_print("! Control text didn't end"); loc=limit;
+@y
+ err_print(_("! Control text didn't end")); loc=limit;
@z
-Section 59.
+@x
+ err_print("! Control codes are forbidden in control text");
+@y
+ err_print(_("! Control codes are forbidden in control text"));
+@z
-@x l.1024
-void phase_one();
+@x
+ if (loc>=limit) err_print("! Verbatim string didn't end");
@y
-static void phase_one (void);
+ if (loc>=limit) err_print(_("! Verbatim string didn't end"));
@z
-Section 60.
+@x
+void phase_one();
+@y
+static void phase_one(void);@/
+@z
-@x l.1027
+@x
void
phase_one() {
@y
static void
-phase_one (void) {
+phase_one(void) {
@z
-Section 62.
+@x
+ if (++section_count==max_sections) overflow("section number");
+@y
+ if (++section_count==max_sections) overflow(_("section number"));
+@z
-@x l.1076
+@x
void C_xref();
@y
-static void C_xref (eight_bits);
+static void C_xref(eight_bits);@/
@z
-Section 63.
-
-@x l.1080
+@x
void
C_xref( spec_ctrl ) /* makes cross-references for \CEE/ identifiers */
eight_bits spec_ctrl;
@y
static void
-C_xref (eight_bits spec_ctrl) /* makes cross-references for \CEE/ identifiers */
+C_xref(@t\1\1@> /* makes cross-references for \CEE/ identifiers */
+ eight_bits spec_ctrl@t\2\2@>)
@z
-Section 64.
-
-@x l.1104
+@x
void outer_xref();
@y
-static void outer_xref (void);
+static void outer_xref(void);@/
@z
-Section 65.
-
-@x l.1107
+@x
void
outer_xref() /* extension of |C_xref| */
@y
static void
-outer_xref (void) /* extension of |C_xref| */
+outer_xref(void) /* extension of |C_xref| */
@z
-Section 74.
+@x
+ case translit_code: err_print("! Use @@l in limbo only"); continue;
+@y
+ case translit_code: err_print(_("! Use @@l in limbo only")); continue;
+@z
-@x l.1266
-void section_check();
+@x
+ else lhs->xref=(char*)q->xlink;
+@y
+ else lhs->xref=(void *)q->xlink;
+@z
+
+@x
+ err_print("! Missing left identifier of @@s");
+@y
+ err_print(_("! Missing left identifier of @@s"));
+@z
+
+@x
+ err_print("! Missing right identifier of @@s");
@y
-static void section_check (name_pointer);
+ err_print(_("! Missing right identifier of @@s"));
@z
-Section 75.
+@x
+void section_check();
+@y
+static void section_check(name_pointer);@/
+@z
-@x l.1269
+@x
void
section_check(p)
name_pointer p; /* print anomalies in subtree |p| */
@y
static void
-section_check (name_pointer p) /* print anomalies in subtree |p| */
+section_check(
+name_pointer p) /* print anomalies in subtree |p| */
+@z
+
+@x
+ printf("\n! Never defined: <"); print_section_name(p); putchar('>'); mark_harmless;
+@y
+ fputs(_("\n! Never defined: <"),stdout);
+ print_section_name(p); putchar('>'); mark_harmless;
@z
-Section 78.
+@x
+ printf("\n! Never used: <"); print_section_name(p); putchar('>'); mark_harmless;
+@y
+ fputs(_("\n! Never used: <"),stdout);
+ print_section_name(p); putchar('>'); mark_harmless;
+@z
+
+@x
+If the |per_cent| parameter is 1 a |'%'| is appended to the line
+@y
+If the |per_cent| parameter is 1, a |'%'| is appended to the line
+@z
-@x l.1322
+@x
+@d tex_printf(c) fprintf(active_file,c)
+@y
+@d tex_printf(c) fprintf(active_file,"%s",c)
+@d tex_puts(c) fputs(c,active_file)
+@z
+
+@x
void
flush_buffer(b,per_cent,carryover)
char *b; /* outputs from |out_buf+1| to |b|,where |b<=out_ptr| */
boolean per_cent,carryover;
@y
static void
-flush_buffer (char *b, boolean per_cent, boolean carryover)
+flush_buffer(@t\1\1@>
+char *b, /* outputs from |out_buf+1| to |b|, where |b<=out_ptr| */
+boolean per_cent,boolean carryover@t\2\2@>)
@z
-Section 79.
+@x
+ if (b<out_ptr) strncpy(out_buf+1,b+1,out_ptr-b);
+@y
+ if (b<out_ptr) strncpy(out_buf+1,b+1,(size_t)(out_ptr-b));
+@z
-@x l.1351
+@x
void
finish_line() /* do this at the end of a line */
@y
static void
-finish_line (void) /* do this at the end of a line */
-@z
-
-Section 81.
-
-@x l.1383
+finish_line(void) /* do this at the end of a line */
+@z
+
+@x
+@ In particular, the |finish_line| procedure is called near the very
+beginning of phase two. We initialize the output variables in a slightly
+tricky way so that the first line of the output file will be
+`\.{\\input cwebmac}'.
+
+@<Set init...@>=
+out_ptr=out_buf+1; out_line=1; active_file=tex_file;
+*out_ptr='c'; tex_printf("\\input cwebma");
+@y
+@ In particular, the |finish_line| procedure is called near the very
+beginning of phase two. We initialize the output variables in a slightly
+tricky way so that the first line of the output file will be dependent of
+the user language set by the `\.{+l}' option and its argument. If you call
+\.{CWEAVE} with `\.{+lX}' (or `\.{-lX}' as well), where `\.X' is the
+(possibly empty) string of characters to the right of~`\.l', `\.X'~will be
+prepended to `\.{cwebmac.tex}', e.g., if you call \.{CWEAVE} with
+`\.{+ldeutsch}', you will receive the line `\.{\\input deutschcwebmac}'.
+Without this option the first line of the output file will be
+`\.{\\input cwebmac}'.
+
+@<Start \TEX/...@>=
+out_ptr=out_buf+1; out_line=1; active_file=tex_file; *out_ptr='c';
+tex_puts("\\input ");
+tex_printf(use_language);
+tex_puts("cwebma");
+@z
+
+@x
void
out_str(s) /* output characters from |s| to end of string */
char *s;
@y
static void
-out_str (const char *s) /* output characters from |s| to end of string */
+out_str(@t\1\1@> /* output characters from |s| to end of string */
+const char*s@t\2\2@>)
@z
-Section 83.
-
-@x l.1402
+@x
void break_out();
@y
-static void break_out (void);
+static void break_out(void);@/
@z
-Section 84.
-
-@x l.1405
+@x
void
break_out() /* finds a way to break the output line */
@y
static void
-break_out (void) /* finds a way to break the output line */
+break_out(void) /* finds a way to break the output line */
@z
-Section 86.
+@x
+ printf("\n! Line had to be broken (output l. %d):\n",out_line);
+@y
+ printf(_("\n! Line had to be broken (output l. %d):\n"),out_line);
+@z
-@x l.1440
+@x
void
out_section(n)
sixteen_bits n;
@y
static void
-out_section (sixteen_bits n)
+out_section(
+sixteen_bits n)
@z
-Section 87.
-
-@x l.1454
+@x
void
out_name(p,quote_xalpha)
name_pointer p;
boolean quote_xalpha;
@y
static void
-out_name (name_pointer p, boolean quote_xalpha)
+out_name(
+name_pointer p,
+boolean quote_xalpha)
@z
-Section 88.
-
-@x l.1484
+@x
void
copy_limbo()
@y
static void
-copy_limbo (void)
+copy_limbo(void)
@z
-Section 90.
+@x
+ default: err_print("! Double @@ should be used in limbo");
+@y
+ default: err_print(_("! Double @@ should be used in limbo"));
+@z
-@x l.1519
+@x
eight_bits
copy_TeX()
@y
static eight_bits
-copy_TeX (void)
+copy_TeX(void)
@z
-Section 91.
+@x
+@d app_tok(c) {if (tok_ptr+2>tok_mem_end) overflow("token"); *(tok_ptr++)=c;}
+@y
+@d app_tok(c) {if (tok_ptr+2>tok_mem_end) overflow(_("token")); *(tok_ptr++)=c;}
+@z
-@x l.1449
+@x
int copy_comment();
@y
-static int copy_comment (boolean, int);
+static int copy_comment(boolean,int);@/
@z
-Section 92.
-
-@x l.1551
+@x
int copy_comment(is_long_comment,bal) /* copies \TEX/ code in comments */
boolean is_long_comment; /* is this a traditional \CEE/ comment? */
int bal; /* brace balance */
@y
-static int
-copy_comment (boolean is_long_comment, int bal)
+static int copy_comment(@t\1\1@> /* copies \TeX\ code in comments */
+boolean is_long_comment, /* is this a traditional \CEE/ comment? */
+int bal@t\2\2@>) /* brace balance */
@z
-Section 93.
+@x
+ err_print("! Input ended in mid-comment");
+@y
+ err_print(_("! Input ended in mid-comment"));
+@z
-@x l.1608
+@x
+ if (bal>1) err_print("! Missing } in comment");
+@y
+ if (bal>1) err_print(_("! Missing } in comment"));
+@z
+
+@x
+ else {err_print("! Extra } in comment");
+@y
+ else {err_print(_("! Extra } in comment"));
+@z
+
+@x
+ if (bal>1) err_print("! Missing } in comment");
+@y
+ if (bal>1) err_print(_("! Missing } in comment"));
+@z
+
+@x
+ err_print("! Illegal use of @@ in comment");
+@y
+ err_print(_("! Illegal use of @@ in comment"));
+@z
+
+@x
+else if (c=='\\' && *loc!='@@')
if (phase==2) app_tok(*(loc++))@; else loc++;
@y
- {if (phase==2) app_tok(*(loc++))@; else loc++;}
+else { if (c=='\\' && *loc!='@@') {
+ if (phase==2) app_tok(*(loc++))@; else loc++; } }
@z
-Section 99.
+@x
+eight_bits cat_index;
+
+@ @<Set in...@>=
+ for (cat_index=0;cat_index<255;cat_index++)
+ strcpy(cat_name[cat_index],"UNKNOWN");
+@y
+
+@ @<Set in...@>=
+{int c; for (c=0;c<256;c++) strcpy(cat_name[c],"UNKNOWN");}
+@z
-@x l.1783
+@x
void
print_cat(c) /* symbolic printout of a category */
eight_bits c;
@y
static void
-print_cat (eight_bits c)
+print_cat(@t\1\1@> /* symbolic printout of a category */
+eight_bits c@t\2\2@>)
@z
-@x l.1788
+@x
printf(cat_name[c]);
@y
- printf("%s",cat_name[c]);
+ fputs(cat_name[c],stdout);
@z
-Section 106.
-
-@x l.2138
+@x
void
print_text(p) /* prints a token list for debugging; not used in |main| */
text_pointer p;
@y
+#ifdef DEAD_CODE /* not used in |main| */
static void
-print_text (text_pointer p)
+print_text(@t\1\1@> /* prints a token list for debugging; not used in |main| */
+text_pointer p@t\2\2@>)
@z
-Section 109.
+@x
+ fflush(stdout);
+}
+@y
+ update_terminal;
+}
+#endif /* |DEAD_CODE| */
+@z
+
+@x
+@d app(a) *(tok_ptr++)=a
+@d app1(a) *(tok_ptr++)=tok_flag+(int)((a)->trans-tok_start)
+@y
+@d app(a) *(tok_ptr++)=(token)(a)
+@d app1(a) *(tok_ptr++)=(token)(tok_flag+(int)((a)->trans-tok_start))
+@z
-@x l.2263
+@x
void
app_str(s)
char *s;
@y
static void
-app_str (const char *s)
+app_str(
+const char *s)
@z
-@x l.2270
+@x
void
big_app(a)
token a;
@y
static void
-big_app (token a)
+big_app(
+token a)
@z
-@x l.2287
+@x
void
big_app1(a)
scrap_pointer a;
@y
static void
-big_app1 (scrap_pointer a)
+big_app1(
+scrap_pointer a)
@z
-Section 111.
+@x
+ && pp->cat!=prerangle
+@y
+ && pp->cat!=prerangle @|
+@z
+
+@x
+ && pp->cat!=ftemplate
+@y
+ && pp->cat!=ftemplate @|
+@z
-@x l.2414
+@x
token_pointer
find_first_ident(p)
text_pointer p;
@y
static token_pointer
-find_first_ident (text_pointer p)
+find_first_ident(
+text_pointer p)
@z
-Section 112.
-
-@x l.2446
+@x
void
make_reserved(p) /* make the first identifier in |p->trans| like |int| */
scrap_pointer p;
@y
static void
-make_reserved (scrap_pointer p)
+make_reserved(@t\1\1@> /* make the first identifier in |p->trans| like |int| */
+scrap_pointer p@t\2\2@>)
@z
-Section 113.
-
-@x l.2477
+@x
void
make_underlined(p)
/* underline the entry for the first identifier in |p->trans| */
scrap_pointer p;
@y
static void
-make_underlined (scrap_pointer p)
+make_underlined(@t\1\1@>
+/* underline the entry for the first identifier in |p->trans| */
+scrap_pointer p@t\2\2@>)
@z
-Section 114.
-
-@x l.2495
+@x
void underline_xref();
@y
-static void underline_xref (name_pointer);
+static void underline_xref(name_pointer);@/
@z
-Section 115.
-
-@x l.2498
+@x
void
underline_xref(p)
name_pointer p;
@y
static void
-underline_xref (name_pointer p)
+underline_xref(
+name_pointer p)
+@z
+
+@x
+ p->xref=(char*)xref_ptr;
+@y
+ update_node(p);
@z
-Section 164.
+@x
+@<Cases for |exp|@>=
+if (cat1==lbrace || cat1==int_like || cat1==decl) {
+ make_underlined(pp); big_app1(pp); big_app(indent); app(indent);
+ reduce(pp,1,fn_decl,0,1);
+}
+@y
+\.{CWEAVE} indents declarations after old-style function definitions.
+With the \.{-i} option they will come out flush left. You won't see
+any difference if you use ANSI-style function definitions.
+
+@d indent_param_decl flags['i'] /* should formal parameter declarations be indented? */
-@x l.3003
+@<Cases for |exp|@>=
+if(cat1==lbrace || cat1==int_like || cat1==decl) {
+ make_underlined(pp); big_app1(pp);
+ if (indent_param_decl) {
+ big_app(indent); app(indent);
+ }
+ reduce(pp,1,fn_decl,0,1);
+}
+@z
+
+@x
+@ @<Cases for |decl_head|@>=
+if (cat1==comma) {
+ big_app2(pp); big_app(' '); reduce(pp,2,decl_head,-1,33);
+}
+else if (cat1==ubinop) {
+ big_app1(pp); big_app('{'); big_app1(pp+1); big_app('}');
+ reduce(pp,2,decl_head,-1,34);
+}
+else if (cat1==exp && cat2!=lpar && cat2!=exp && cat2!=cast) {
+ make_underlined(pp+1); squash(pp,2,decl_head,-1,35);
+}
+else if ((cat1==binop||cat1==colon) && cat2==exp && (cat3==comma ||
+ cat3==semi || cat3==rpar))
+ squash(pp,3,decl_head,-1,36);
+else if (cat1==cast) squash(pp,2,decl_head,-1,37);
+else if (cat1==lbrace || cat1==int_like || cat1==decl) {
+ big_app1(pp); big_app(indent); app(indent); reduce(pp,1,fn_decl,0,38);
+}
+else if (cat1==semi) squash(pp,2,decl,-1,39);
+@y
+@ @<Cases for |decl_head|@>=
+if (cat1==comma) {
+ big_app2(pp); big_app(' '); reduce(pp,2,decl_head,-1,33);
+}
+else if (cat1==ubinop) {
+ big_app1(pp); big_app('{'); big_app1(pp+1); big_app('}');
+ reduce(pp,2,decl_head,-1,34);
+}
+else if (cat1==exp && cat2!=lpar && cat2!=exp && cat2!=cast) {
+ make_underlined(pp+1); squash(pp,2,decl_head,-1,35);
+}
+else if ((cat1==binop||cat1==colon) && cat2==exp && (cat3==comma ||
+ cat3==semi || cat3==rpar))
+ squash(pp,3,decl_head,-1,36);
+else if (cat1==cast) squash(pp,2,decl_head,-1,37);
+else if (cat1==lbrace || cat1==int_like || cat1==decl) {
+ big_app1(pp);
+ if (indent_param_decl) {
+ big_app(indent); app(indent);
+ }
+ reduce(pp,1,fn_decl,0,38);
+}
+else if (cat1==semi) squash(pp,2,decl,-1,39);
+@z
+
+@x
+@ @<Cases for |decl|@>=
+if (cat1==decl) {
+ big_app1(pp); big_app(force); big_app1(pp+1);
+ reduce(pp,2,decl,-1,40);
+}
+else if (cat1==stmt || cat1==function) {
+ big_app1(pp); big_app(big_force);
+ big_app1(pp+1); reduce(pp,2,cat1,-1,41);
+}
+@y
+@ The original manual described the \.{-o} option for \.{CWEAVE}, but this was
+not yet present. Here is a simple implementation. The purpose is to suppress
+the extra space between local variable declarations and the first statement in
+a function block.
+
+@d order_decl_stmt flags['o'] /* should declarations and statements be separated? */
+
+@<Cases for |decl|@>=
+if (cat1==decl) {
+ big_app1(pp); big_app(force); big_app1(pp+1);
+ reduce(pp,2,decl,-1,40);
+}
+else if (cat1==stmt || cat1==function) {
+ big_app1(pp);
+ if(order_decl_stmt) big_app(big_force);
+ else big_app(force);
+ big_app1(pp+1); reduce(pp,2,cat1,-1,41);
+}
+@z
+
+@x
+@ @<Cases for |fn_decl|@>=
+if (cat1==decl) {
+ big_app1(pp); big_app(force); big_app1(pp+1); reduce(pp,2,fn_decl,0,51);
+}
+else if (cat1==stmt) {
+ big_app1(pp); app(outdent); app(outdent); big_app(force);
+ big_app1(pp+1); reduce(pp,2,function,-1,52);
+}
+@y
+@ Outdent after parameter declarations with option \.{-i}.
+
+@<Cases for |fn_decl|@>=
+if (cat1==decl) {
+ big_app1(pp); big_app(force); big_app1(pp+1); reduce(pp,2,fn_decl,0,51);
+}
+else if (cat1==stmt) {
+ big_app1(pp);
+ if (indent_param_decl) {
+ app(outdent); app(outdent);
+ }
+ big_app(force);
+ big_app1(pp+1); reduce(pp,2,function,-1,52);
+}
+@z
+
+@x
void
reduce(j,k,c,d,n)
scrap_pointer j;
@@ -708,12 +1060,13 @@ eight_bits c;
short k, d, n;
@y
static void
-reduce (scrap_pointer j, short k, eight_bits c, short d, short n)
+reduce(
+scrap_pointer j, short k,
+eight_bits c,
+short d, short n)
@z
-Section 165.
-
-@x l.3029
+@x
void
squash(j,k,c,d,n)
scrap_pointer j;
@@ -721,12 +1074,25 @@ eight_bits c;
short k, d, n;
@y
static void
-squash (scrap_pointer j, short k, eight_bits c, short d, short n)
+squash(
+scrap_pointer j, short k,
+eight_bits c,
+short d, short n)
@z
-Section 169.
+@x
+ overflow("token");
+@y
+ overflow(_("token"));
+@z
+
+@x
+ overflow("text");
+@y
+ overflow(_("text"));
+@z
-@x l.3096 -- rename local var, not to shadow param
+@x
{ scrap_pointer k; /* pointer into |scrap_info| */
if (tracing==2) {
printf("\n%d:",n);
@@ -750,239 +1116,583 @@ Section 169.
else if (k_l->mathness /4 == no_math) putchar('-');
@z
-Section 170.
-
-@x l.3125
+@x
text_pointer
translate() /* converts a sequence of scraps */
@y
static text_pointer
-translate (void) /* converts a sequence of scraps */
+translate(void) /* converts a sequence of scraps */
+@z
+
+@x
+ if (tok_ptr+6>tok_mem_end) overflow("token");
+@y
+ if (tok_ptr+6>tok_mem_end) overflow(_("token"));
+@z
+
+@x
+ printf("\nIrreducible scrap sequence in section %d:",section_count);
+@y
+ printf(_("\nIrreducible scrap sequence in section %d:"),section_count);
@z
-Section 174.
+@x
+ printf("\nTracing after l. %d:\n",cur_line); mark_harmless;
+@y
+ printf(_("\nTracing after l. %d:\n"),cur_line); mark_harmless;
+@z
-@x l.3190
+@x
void
C_parse(spec_ctrl) /* creates scraps from \CEE/ tokens */
eight_bits spec_ctrl;
@y
static void
-C_parse (eight_bits spec_ctrl) /* creates scraps from \CEE/ tokens */
-@z
-
-Section 181.
-
-@x l.3421
+C_parse(@t\1\1@> /* creates scraps from \CEE/ tokens */
+ eight_bits spec_ctrl@t\2\2@>)
+@z
+
+@x
+switch (next_control) {
+ case section_name:
+ app(section_flag+(int)(cur_section-name_dir));
+ app_scrap(section_scrap,maybe_math);
+ app_scrap(exp,yes_math);@+break;
+ case string: case constant: case verbatim: @<Append a string or constant@>;
+ @+break;
+ case identifier: app_cur_id(1);@+break;
+ case TeX_string: @<Append a \TEX/ string, without forming a scrap@>;@+break;
+ case '/': case '.':
+ app(next_control); app_scrap(binop,yes_math);@+break;
+ case '<': app_str("\\langle");@+app_scrap(prelangle,yes_math);@+break;
+@.\\langle@>
+ case '>': app_str("\\rangle");@+app_scrap(prerangle,yes_math);@+break;
+@.\\rangle@>
+ case '=': app_str("\\K"); app_scrap(binop,yes_math);@+break;
+@.\\K@>
+ case '|': app_str("\\OR"); app_scrap(binop,yes_math);@+break;
+@.\\OR@>
+ case '^': app_str("\\XOR"); app_scrap(binop,yes_math);@+break;
+@.\\XOR@>
+ case '%': app_str("\\MOD"); app_scrap(binop,yes_math);@+break;
+@.\\MOD@>
+ case '!': app_str("\\R"); app_scrap(unop,yes_math);@+break;
+@.\\R@>
+ case '~': app_str("\\CM"); app_scrap(unop,yes_math);@+break;
+@.\\CM@>
+ case '+': case '-': app(next_control); app_scrap(ubinop,yes_math);@+break;
+ case '*': app(next_control); app_scrap(raw_ubin,yes_math);@+break;
+ case '&': app_str("\\AND"); app_scrap(raw_ubin,yes_math);@+break;
+@.\\AND@>
+ case '?': app_str("\\?"); app_scrap(question,yes_math);@+break;
+@.\\?@>
+ case '#': app_str("\\#"); app_scrap(ubinop,yes_math);@+break;
+@.\\\#@>
+ case ignore: case xref_roman: case xref_wildcard:
+ case xref_typewriter: case noop:@+break;
+ case '(': case '[': app(next_control); app_scrap(lpar,maybe_math);@+break;
+ case ')': case ']': app(next_control); app_scrap(rpar,maybe_math);@+break;
+ case '{': app_str("\\{"@q}@>); app_scrap(lbrace,yes_math);@+break;
+@.\\\{@>@q}@>
+ case '}': app_str(@q{@>"\\}"); app_scrap(rbrace,yes_math);@+break;
+@q{@>@.\\\}@>
+ case ',': app(','); app_scrap(comma,yes_math);@+break;
+ case ';': app(';'); app_scrap(semi,maybe_math);@+break;
+ case ':': app(':'); app_scrap(colon,no_math);@+break;@/
+ @t\4@> @<Cases involving nonstandard characters@>@;
+ case thin_space: app_str("\\,"); app_scrap(insert,maybe_math);@+break;
+@.\\,@>
+ case math_break: app(opt); app_str("0");
+ app_scrap(insert,maybe_math);@+break;
+ case line_break: app(force); app_scrap(insert,no_math);@+break;
+ case left_preproc: app(force); app(preproc_line);
+ app_str("\\#"); app_scrap(lproc,no_math);@+break;
+@.\\\#@>
+ case right_preproc: app(force); app_scrap(rproc,no_math);@+break;
+ case big_line_break: app(big_force); app_scrap(insert,no_math);@+break;
+ case no_line_break: app(big_cancel); app(noop); app(break_space);
+ app(noop); app(big_cancel);
+ app_scrap(insert,no_math);@+break;
+ case pseudo_semi: app_scrap(semi,maybe_math);@+break;
+ case macro_arg_open: app_scrap(begin_arg,maybe_math);@+break;
+ case macro_arg_close: app_scrap(end_arg,maybe_math);@+break;
+ case join: app_str("\\J"); app_scrap(insert,no_math);@+break;
+@.\\J@>
+ case output_defs_code: app(force); app_str("\\ATH"); app(force);
+ app_scrap(insert,no_math);@+break;
+@.\\ATH@>
+ default: app(inserted); app(next_control);
+ app_scrap(insert,maybe_math);@+break;
+}
+@y
+switch (next_control) {
+ case section_name:
+ app(section_flag+(int)(cur_section-name_dir));
+ app_scrap(section_scrap,maybe_math);
+ app_scrap(exp,yes_math);@+break;
+ case string: case constant: case verbatim:
+ @<Append a string or constant@>;@+break;
+ case identifier: app_cur_id(1);@+break;
+ case TeX_string:
+ @<Append a \TEX/ string, without forming a scrap@>;@+break;
+ case '/': case '.':
+ app(next_control);@+app_scrap(binop,yes_math);@+break;
+ case '<': app_str("\\langle");@+app_scrap(prelangle,yes_math);@+break;
+@.\\langle@>
+ case '>': app_str("\\rangle");@+app_scrap(prerangle,yes_math);@+break;
+@.\\rangle@>
+ case '=': app_str("\\K");@+app_scrap(binop,yes_math);@+break;
+@.\\K@>
+ case '|': app_str("\\OR");@+app_scrap(binop,yes_math);@+break;
+@.\\OR@>
+ case '^': app_str("\\XOR");@+app_scrap(binop,yes_math);@+break;
+@.\\XOR@>
+ case '%': app_str("\\MOD");@+app_scrap(binop,yes_math);@+break;
+@.\\MOD@>
+ case '!': app_str("\\R");@+app_scrap(unop,yes_math);@+break;
+@.\\R@>
+ case '~': app_str("\\CM");@+app_scrap(unop,yes_math);@+break;
+@.\\CM@>
+ case '+': case '-': app(next_control);@+app_scrap(ubinop,yes_math);@+break;
+ case '*': app(next_control);@+app_scrap(raw_ubin,yes_math);@+break;
+ case '&': app_str("\\AND");@+app_scrap(raw_ubin,yes_math);@+break;
+@.\\AND@>
+ case '?': app_str("\\?");@+app_scrap(question,yes_math);@+break;
+@.\\?@>
+ case '#': app_str("\\#");@+app_scrap(ubinop,yes_math);@+break;
+@.\\\#@>
+ case ignore: case xref_roman: case xref_wildcard:
+ case xref_typewriter: case noop:@+break;
+ case '(': case '[': app(next_control);@+app_scrap(lpar,maybe_math);@+break;
+ case ')': case ']': app(next_control);@+app_scrap(rpar,maybe_math);@+break;
+ case '{': app_str("\\{"@q}@>);@+app_scrap(lbrace,yes_math);@+break;
+@.\\\{@>@q}@>
+ case '}': app_str(@q{@>"\\}");@+app_scrap(rbrace,yes_math);@+break;
+@q{@>@.\\\}@>
+ case ',': app(',');@+app_scrap(comma,yes_math);@+break;
+ case ';': app(';');@+app_scrap(semi,maybe_math);@+break;
+ case ':': app(':');@+app_scrap(colon,no_math);@+break;@/
+ @t\4@> @<Cases involving nonstandard characters@>@;
+ case thin_space: app_str("\\,");@+app_scrap(insert,maybe_math);@+break;
+@.\\,@>
+ case math_break: app(opt);@+app_str("0");@+
+ app_scrap(insert,maybe_math);@+break;
+ case line_break: app(force);@+app_scrap(insert,no_math);@+break;
+ case left_preproc: app(force);@+app(preproc_line);@+app_str("\\#");
+ app_scrap(lproc,no_math);@+break;
+@.\\\#@>
+ case right_preproc: app(force);@+app_scrap(rproc,no_math);@+break;
+ case big_line_break: app(big_force);@+app_scrap(insert,no_math);@+break;
+ case no_line_break: app(big_cancel);@+app(noop);@+app(break_space);@+
+ app(noop);@+app(big_cancel); app_scrap(insert,no_math);@+break;
+ case pseudo_semi: app_scrap(semi,maybe_math);@+break;
+ case macro_arg_open: app_scrap(begin_arg,maybe_math);@+break;
+ case macro_arg_close: app_scrap(end_arg,maybe_math);@+break;
+ case join: app_str("\\J");@+app_scrap(insert,no_math);@+break;
+@.\\J@>
+ case output_defs_code: app(force);@+app_str("\\ATH");@+app(force);
+ app_scrap(insert,no_math);@+break;
+@.\\ATH@>
+ default: app(inserted);@+app(next_control);
+ app_scrap(insert,maybe_math);@+break;
+}
+@z
+
+@x
+ overflow("scrap/token/text");
+@y
+ overflow(_("scrap/token/text"));
+@z
+
+@x
+case not_eq: app_str("\\I");@+app_scrap(binop,yes_math);@+break;
+@y
+case non_eq: app_str("\\I");@+app_scrap(binop,yes_math);@+break;
+@z
+
+@x
+ else err_print("! Double @@ should be used in strings");
+@y
+ else err_print(_("! Double @@ should be used in strings"));
+@z
+
+@x
void app_cur_id();
@y
-static void app_cur_id (boolean);
+void app_cur_id(boolean);@/
@z
-Section 182.
-
-@x l.3424
+@x
void
app_cur_id(scrapping)
boolean scrapping; /* are we making this into a scrap? */
@y
-static void
-app_cur_id (boolean scrapping)
+void
+app_cur_id(@t\1\1@>
+boolean scrapping@t\2\2@>) /* are we making this into a scrap? */
@z
-Section 183.
-
-@x l.3449
+@x
text_pointer
C_translate()
@y
static text_pointer
-C_translate (void)
+C_translate(void)
@z
-Section 184.
+@x
+ if (next_control!='|') err_print("! Missing '|' after C text");
+@y
+ if (next_control!='|') err_print(_("! Missing '|' after C text"));
+@z
-@x l.3479
+@x
void
outer_parse() /* makes scraps from \CEE/ tokens and comments */
@y
static void
-outer_parse (void) /* makes scraps from \CEE/ tokens and comments */
+outer_parse(void) /* makes scraps from \CEE/ tokens and comments */
@z
-Section 189.
-
-@x l.3585
+@x
void
push_level(p) /* suspends the current level */
text_pointer p;
@y
static void
-push_level (text_pointer p) /* suspends the current level */
+push_level(@t\1\1@> /* suspends the current level */
+text_pointer p@t\2\2@>)
@z
-Section 190.
+@x
+ if (stack_ptr==stack_end) overflow("stack");
+@y
+ if (stack_ptr==stack_end) overflow(_("stack"));
+@z
-@x l.3605
+@x
void
pop_level()
@y
static void
-pop_level (void)
+pop_level(void)
@z
-Section 192.
-
-@x l.3627
+@x
eight_bits
get_output() /* returns the next token of output */
@y
static eight_bits
-get_output (void) /* returns the next token of output */
+get_output(void) /* returns the next token of output */
@z
-Section 193.
+@x
+ return(a);
+@y
+ return((eight_bits)a);
+@z
-@x l.3664
+@x
void
output_C() /* outputs the current token list */
@y
static void
-output_C (void) /* outputs the current token list */
+output_C(void) /* outputs the current token list */
@z
-Section 194.
-
-@x l.3687
+@x
void make_output();
@y
-static void make_output (void);
+static void make_output(void);@/
@z
-Section 195.
-
-@x l.3690
+@x
void
make_output() /* outputs the equivalents of tokens */
+{
+ eight_bits a, /* current output byte */
@y
static void
-make_output (void) /* outputs the equivalents of tokens */
+make_output(void) /* outputs the equivalents of tokens */
+{
+ eight_bits a=0, /* current output byte */
@z
-Section 202.
+@x
+ else if (b!='|') out(b)@;
+@y
+ else { if (b!='|') out(b)@;
+@z
-@x l.3927
+@x
+ }
+@y
+ } }
+@z
+
+@x
+ printf("\n! Illegal control code in section name: <");
+@y
+ fputs(_("\n! Illegal control code in section name: <"),stdout);
+@z
+
+@x
+ printf("\n! C text in section name didn't end: <");
+@y
+ fputs(_("\n! C text in section name didn't end: <"),stdout);
+@z
+
+@x
if (b=='\'' || b=='"')
if (delim==0) delim=b;
else if (delim==b) delim=0;
@y
if (b=='\'' || b=='"') {
if (delim==0) delim=b;
- else if (delim==b) delim=0;
- }
+ else if (delim==b) delim=0; }
@z
-Section 205.
+@x
+ if (j>buffer+long_buf_size-3) overflow("buffer");
+@y
+ if (j>buffer+long_buf_size-3) overflow(_("buffer"));
+@z
-@x l.3951
-void phase_two();
+@x
+ if (j>buffer+long_buf_size-4) overflow("buffer");
@y
-static void phase_two (void);
+ if (j>buffer+long_buf_size-4) overflow(_("buffer"));
@z
-Section 206.
+@x
+void phase_two();
+@y
+static void phase_two(void);@/
+@z
-@x l.3955
+@x
void
phase_two() {
@y
static void
-phase_two (void) {
+phase_two(void) {
@z
-Section 212.
+@x
+reset_input(); if (show_progress) printf("\nWriting the output file...");
+@y
+reset_input(); if (show_progress) fputs(_("\nWriting the output file..."),stdout);
+@z
-@x l.4074
-void finish_C();
+@x
+ err_print("! TeX string should be in C text only"); break;
+@y
+ err_print(_("! TeX string should be in C text only")); break;
+@z
+
+@x
+ err_print("! You can't do that in TeX text"); break;
@y
-static void finish_C (boolean);
+ err_print(_("! You can't do that in TeX text")); break;
@z
-Section 213.
+@x
+void finish_C();
+@y
+static void finish_C(boolean);@/
+@z
-@x l.4077
+@x
void
finish_C(visible) /* finishes a definition or a \CEE/ part */
boolean visible; /* nonzero if we should produce \TEX/ output */
@y
static void
-finish_C (boolean visible) /* finishes a definition or a \CEE/ part */
+finish_C(@t\1\1@> /* finishes a definition or a \Cee\ part */
+ boolean visible@t\2\2@>) /* nonzero if we should produce \TeX\ output */
@z
-Section 212.
-
-@x l.4092
+@x
+ if (out_ptr>out_buf+1)
+ if (*(out_ptr-1)=='\\')
+@.\\6@>
+@.\\7@>
+@.\\Y@>
if (*out_ptr=='6') out_ptr-=2;
else if (*out_ptr=='7') *out_ptr='Y';
@y
- {
+ if (out_ptr>out_buf+1) {
+ if (*(out_ptr-1)=='\\') {
+@.\\6@>
+@.\\7@>
+@.\\Y@>
if (*out_ptr=='6') out_ptr-=2;
else if (*out_ptr=='7') *out_ptr='Y';
}
+ }
@z
-Section 221.
+@x
+ err_print("! Improper macro definition");
+@y
+ err_print(_("! Improper macro definition"));
+@z
-@x l.4245
-void footnote();
+@x
+ default: err_print("! Improper macro definition"); break;
+@y
+ default: err_print(_("! Improper macro definition")); break;
+@z
+
+@x
+ if (scrap_ptr!=scrap_info+2) err_print("! Improper format definition");
+@y
+ if (scrap_ptr!=scrap_info+2) err_print(_("! Improper format definition"));
+@z
+
+@x
+ err_print("! You need an = sign after the section name");
@y
-static void footnote (sixteen_bits);
+ err_print(_("! You need an = sign after the section name"));
@z
-Section 222.
+@x
+ err_print("! You can't do that in C text");
+@y
+ err_print(_("! You can't do that in C text"));
+@z
+
+@x
+void footnote();
+@y
+static void footnote(sixteen_bits);@/
+@z
-@x l.4248
+@x
void
footnote(flag) /* outputs section cross-references */
sixteen_bits flag;
@y
static void
-footnote (sixteen_bits flag) /* outputs section cross-references */
+footnote(@t\1\1@> /* outputs section cross-references */
+sixteen_bits flag@t\2\2@>)
@z
-Section 225.
-
-@x l.4294
+@x
void phase_three();
@y
-static void phase_three (void);
+static void phase_three(void);@/
@z
-Section 226.
-
-@x l.4297
+@x
void
phase_three() {
@y
static void
-phase_three (void) {
+phase_three(void) {
+@z
+
+@x
+if (no_xref) {
+ finish_line();
+ out_str("\\end");
+@.\\end@>
+ finish_line();
+}
+@y
+if (no_xref) {
+ finish_line();
+ out_str("\\end");
+@.\\end@>
+ active_file=tex_file;
+}
@z
-@x l.4309 Use binary mode for output files
+@x
+ phase=3; if (show_progress) printf("\nWriting the index...");
+@y
+ phase=3; if (show_progress) fputs(_("\nWriting the index..."),stdout);
+@z
+
+@x
if ((idx_file=fopen(idx_file_name,"w"))==NULL)
@y
if ((idx_file=fopen(idx_file_name,"wb"))==NULL)
@z
-@x l.4324 Use binary mode for output files
+@x
+ fatal("! Cannot open index file ",idx_file_name);
+@y
+ fatal(_("! Cannot open index file "),idx_file_name);
+@z
+
+@x
+ @<Tell about changed sections@>; finish_line(); finish_line();
+@y
+ @<Tell about changed sections@>@; finish_line(); finish_line();
+@z
+
+@x
+ @<Do the first pass of sorting@>;
+ @<Sort and output the index@>;
+@y
+ @<Do the first pass of sorting@>@;
+ @<Sort and output the index@>@;
+@z
+
+@x
if ((scn_file=fopen(scn_file_name,"w"))==NULL)
@y
if ((scn_file=fopen(scn_file_name,"wb"))==NULL)
@z
-Section 235.
+@x
+ fatal("! Cannot open section file ",scn_file_name);
+@y
+ fatal(_("! Cannot open section file "),scn_file_name);
+@z
+
+@x
+ @<Output all the section names@>;
+@y
+ @<Output all the section names@>@;
+@z
+
+@x
+@.\\end@>
+ finish_line();
+ fclose(active_file);
+}
+@y
+@.\\end@>
+}
+finish_line(); fclose(active_file); active_file=NULL;
+@<Update the result when it has changed@>@;
+@z
+
+@x
+if (show_happiness) printf("\nDone.");
+@y
+if (show_happiness) {
+ if (show_progress) new_line;
+ fputs(_("Done."),stdout);
+}
+@z
-@x l.4440
+@x
+for (c=0; c<=255; c++) bucket[c]=NULL;
+@y
+for (c=0; c<256; c++) bucket[c]=NULL;
+@z
+
+@x
+ if (cur_name->xref!=(char*)xmem) {
+@y
+ if (cur_name->xref!=(void *)xmem) {
+@z
+
+@x
+collate[0]=0;
strcpy(collate+1," \1\2\3\4\5\6\7\10\11\12\13\14\15\16\17");
/* 16 characters + 1 = 17 */
strcpy(collate+17,"\20\21\22\23\24\25\26\27\30\31\32\33\34\35\36\37");
@@ -1006,85 +1716,266 @@ strcpy(collate+181,"\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336
strcpy(collate+197,"\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357");
/* 16 characters + 197 = 213 */
strcpy(collate+213,"\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377");
+/* 16 characters + 213 = 229 */
@y
-strcpy((char *)collate+1," \1\2\3\4\5\6\7\10\11\12\13\14\15\16\17");
+collate[0]=0;
+strcpy((char *)collate+1,
+ " \1\2\3\4\5\6\7\10\11\12\13\14\15\16\17");
/* 16 characters + 1 = 17 */
-strcpy((char *)collate+17,"\20\21\22\23\24\25\26\27\30\31\32\33\34\35\36\37");
+strcpy((char *)collate+17,
+ "\20\21\22\23\24\25\26\27\30\31\32\33\34\35\36\37");
/* 16 characters + 17 = 33 */
-strcpy((char *)collate+33,"!\42#$%&'()*+,-./:;<=>?@@[\\]^`{|}~_");
+strcpy((char *)collate+33,
+ "!\42#$%&'()*+,-./:;<=>?@@[\\]^`{|}~_");
/* 32 characters + 33 = 65 */
-strcpy((char *)collate+65,"abcdefghijklmnopqrstuvwxyz0123456789");
+strcpy((char *)collate+65,
+ "abcdefghijklmnopqrstuvwxyz0123456789");
/* (26 + 10) characters + 65 = 101 */
-strcpy((char *)collate+101,"\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217");
+strcpy((char *)collate+101,
+ "\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217");
/* 16 characters + 101 = 117 */
-strcpy((char *)collate+117,"\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237");
+strcpy((char *)collate+117,
+ "\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237");
/* 16 characters + 117 = 133 */
-strcpy((char *)collate+133,"\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257");
+strcpy((char *)collate+133,
+ "\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257");
/* 16 characters + 133 = 149 */
-strcpy((char *)collate+149,"\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277");
+strcpy((char *)collate+149,
+ "\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277");
/* 16 characters + 149 = 165 */
-strcpy((char *)collate+165,"\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317");
+strcpy((char *)collate+165,
+ "\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317");
/* 16 characters + 165 = 181 */
-strcpy((char *)collate+181,"\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337");
+strcpy((char *)collate+181,
+ "\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337");
/* 16 characters + 181 = 197 */
-strcpy((char *)collate+197,"\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357");
+strcpy((char *)collate+197,
+ "\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357");
/* 16 characters + 197 = 213 */
-strcpy((char *)collate+213,"\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377");
+strcpy((char *)collate+213,
+ "\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377");
+/* 16 characters + 213 = 229 */
@z
-Section 237.
-
-@x l.4474
+@x
void unbucket();
@y
-static void unbucket (eight_bits);
+static void unbucket(eight_bits);@/
@z
-Section 238.
-
-@x l.4477
+@x
void
unbucket(d) /* empties buckets having depth |d| */
eight_bits d;
@y
static void
-unbucket (eight_bits d) /* empties buckets having depth |d| */
+unbucket(@t\1\1@> /* empties buckets having depth |d| */
+eight_bits d@t\2\2@>)
@z
-Section 246.
+@x
+ if (sort_ptr>=scrap_info_end) overflow("sorting");
+@y
+ if (sort_ptr>=scrap_info_end) overflow(_("sorting"));
+@z
-@x l.4594
+@x
void section_print();
@y
-static void section_print (name_pointer);
+static void section_print(name_pointer);@/
@z
-Section 247.
-
-@x l.4597
+@x
void
section_print(p) /* print all section names in subtree |p| */
name_pointer p;
@y
static void
-section_print (name_pointer p) /* print all section names in subtree |p| */
+section_print(@t\1\1@> /* print all section names in subtree |p| */
+name_pointer p@t\2\2@>)
@z
-Section 249.
-
-@x l.4620
-print_stats() {
+@x
+@ @<Output all the section names@>=section_print(root)
@y
-print_stats (void) {
+@ @<Output all the section names@>=section_print(root);
@z
-Section 250. (added)
-
-@x l.4643 - declare print_text(), so it can be 'used' in main.
+@x
+void
+print_stats() {
+@y
+void
+print_stats(void) {
+@z
+
+@x
+ printf("\nMemory usage statistics:\n");
+@.Memory usage statistics:@>
+ printf("%ld names (out of %ld)\n",
+ (long)(name_ptr-name_dir),(long)max_names);
+ printf("%ld cross-references (out of %ld)\n",
+ (long)(xref_ptr-xmem),(long)max_refs);
+ printf("%ld bytes (out of %ld)\n",
+ (long)(byte_ptr-byte_mem),(long)max_bytes);
+ printf("Parsing:\n");
+ printf("%ld scraps (out of %ld)\n",
+ (long)(max_scr_ptr-scrap_info),(long)max_scraps);
+ printf("%ld texts (out of %ld)\n",
+ (long)(max_text_ptr-tok_start),(long)max_texts);
+ printf("%ld tokens (out of %ld)\n",
+ (long)(max_tok_ptr-tok_mem),(long)max_toks);
+ printf("%ld levels (out of %ld)\n",
+ (long)(max_stack_ptr-stack),(long)stack_size);
+ printf("Sorting:\n");
+ printf("%ld levels (out of %ld)\n",
+ (long)(max_sort_ptr-scrap_info),(long)max_scraps);
+}
+@y
+ puts(_("\nMemory usage statistics:"));
+@.Memory usage statistics:@>
+ printf(_("%ld names (out of %ld)\n"),
+ (long)(name_ptr-name_dir),(long)max_names);
+ printf(_("%ld cross-references (out of %ld)\n"),
+ (long)(xref_ptr-xmem),(long)max_refs);
+ printf(_("%ld bytes (out of %ld)\n"),
+ (long)(byte_ptr-byte_mem),(long)max_bytes);
+ puts(_("Parsing:"));
+ printf(_("%ld scraps (out of %ld)\n"),
+ (long)(max_scr_ptr-scrap_info),(long)max_scraps);
+ printf(_("%ld texts (out of %ld)\n"),
+ (long)(max_text_ptr-tok_start),(long)max_texts);
+ printf(_("%ld tokens (out of %ld)\n"),
+ (long)(max_tok_ptr-tok_mem),(long)max_toks);
+ printf(_("%ld levels (out of %ld)\n"),
+ (long)(max_stack_ptr-stack),(long)stack_size);
+ puts(_("Sorting:"));
+ printf(_("%ld levels (out of %ld)\n"),
+ (long)(max_sort_ptr-scrap_info),(long)max_scraps);
+}
+@z
+
+@x
@** Index.
@y
-@ @<Predecl...@>=
-static void print_text (text_pointer p);
+@** Extensions for modern {\tt CWEB}.
+
+The following sections introduce code changes and extensions that have been
+created by numerous contributors over the course of a quarter century. They
+make \.{CWEB} adhere to modern coding standards and introduce new or improved
+features.
+
+Care has been taken to keep the original section numbering intact, so this new
+section should have the same number as the original ``\&{250.~Index},'' and
+additional material follows below.
+
+@* Set {\tt CWEAVE} flags.
+At least one of these is already used in \.{COMMON}.
+
+@<Set init...@>=
+ make_xrefs=force_lines=make_pb=indent_param_decl=order_decl_stmt=1;
+ /* controlled by command-line options */
+
+@* Function declarations. Here are declarations---conforming to
+{\mc ANSI~C}---of all functions in this code, as far as they are
+not already in |"common.h"|. These are private to \.{CWEAVE}.
+
+@<Predecl...@>=
+static eight_bits copy_TeX(void);@/
+static eight_bits get_output(void);@/
+static eight_bits skip_TeX(void);@/
+static text_pointer C_translate(void);@/
+static text_pointer translate(void);@/
+static token_pointer find_first_ident(text_pointer);@/
+static void app_str(const char *);@/
+static void big_app(token);@/
+static void big_app1(scrap_pointer);@/
+static void copy_limbo(void);@/
+static void C_parse(eight_bits);@/
+static void finish_line(void);@/
+static void flush_buffer(char *,boolean,boolean);@/
+static void make_reserved(scrap_pointer);@/
+static void make_underlined(scrap_pointer);@/
+static void new_section_xref(name_pointer);@/
+static void new_xref(name_pointer);@/
+static void outer_parse(void);@/
+static void output_C(void);@/
+static void out_name(name_pointer,boolean);@/
+static void out_section(sixteen_bits);@/
+static void out_str(const char *);@/
+static void pop_level(void);@/
+static void print_cat(eight_bits);@/
+#ifdef DEAD_CODE
+static void print_text(text_pointer p);@/
+#endif
+static void push_level(text_pointer);@/
+static void reduce(scrap_pointer,short,eight_bits,short,short);@/
+static void set_file_flag(name_pointer);@/
+static void skip_limbo(void);@/
+static void squash(scrap_pointer,short,eight_bits,short,short);@/
+static void update_node(name_pointer p);@/
+
+@* Output file update. Most \CEE/ projects are controlled by a
+\.{Makefile} that automatically takes care of the temporal dependecies
+between the different source modules. It is suitable that \.{CWEB} doesn't
+create new output for all existing files, when there are only changes to
+some of them. Thus the \.{make} process will only recompile those modules
+where necessary. The idea and basic implementation of this mechanism can
+be found in the program \.{NUWEB} by Preston Briggs, to whom credit is due.
+
+@<Update the result...@>=
+if((tex_file=fopen(tex_file_name,"r"))!=NULL) {
+ char x[BUFSIZ],y[BUFSIZ];
+ int x_size,y_size,comparison;
+
+ if((check_file=fopen(check_file_name,"r"))==NULL)
+ fatal(_("! Cannot open output file "),check_file_name);
+@.Cannot open output file@>
+
+ @<Compare the temporary output to the previous output@>@;
+
+ fclose(tex_file); tex_file=NULL;
+ fclose(check_file); check_file=NULL;
+
+ @<Take appropriate action depending on the comparison@>@;
+} else
+ rename(check_file_name,tex_file_name); /* This was the first run */
+
+strcpy(check_file_name,""); /* We want to get rid of the temporary file */
+
+@ We hope that this runs fast on most systems.
+
+@<Compare the temp...@>=
+do {
+ x_size = fread(x,1,BUFSIZ,tex_file);
+ y_size = fread(y,1,BUFSIZ,check_file);
+ comparison = (x_size == y_size); /* Do not merge these statements! */
+ if(comparison) comparison = !memcmp(x,y,x_size);
+} while(comparison && !feof(tex_file) && !feof(check_file));
+
+@ Note the superfluous call to |remove| before |rename|. We're using it to
+get around a bug in some implementations of |rename|.
+
+@<Take appropriate action...@>=
+if(comparison)
+ remove(check_file_name); /* The output remains untouched */
+else {
+ remove(tex_file_name);
+ rename(check_file_name,tex_file_name);
+}
+
+@* Put ``version'' information in a single spot.
+Don't do this at home, kids! Push our local macro to the variable in \.{COMMON}
+for printing the |banner| and the |versionstring| from there.
+
+@d max_banner 50
+
+@<Common code...@>=
+extern char cb_banner[];
+
+@ @<Set init...@>=
+ strncpy(cb_banner,banner,max_banner-1);
@** Index.
@z
+
diff --git a/Build/source/texk/web2c/cwebdir/cwebinputs/amiga_types.w b/Build/source/texk/web2c/cwebdir/cwebinputs/amiga_types.w
new file mode 100644
index 00000000000..dc5d4afe003
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/cwebinputs/amiga_types.w
@@ -0,0 +1,109 @@
+%
+% CWEB/INCLUDE $VER: AMIGA_TYPES.W 1.3 (13.8.1998)
+%
+% SYNOPSIS:
+% This file tells CWEAVE to treat AMIGA specific keywords as
+% reserved words. Some of these are introduced by Commodore's
+% operating system, others by the SAS/C compiler.
+%
+% CREATION DATE: unknown
+%
+% AUTHOR: Andreas Scherer
+%
+% COPYRIGHT: There is no restriction to the usage of this file.
+
+@q Keywords specific to SAS/C@>
+
+@s __aligned int
+@s __asm int
+@s __chip int
+@s __far int
+@s __inline int
+@s __interrupt int
+@s __near int
+@s __regargs int
+@s __saveds int
+@s __stackext int
+@s __stdargs int
+
+@q Registers of the AMIGA@>
+
+@s __d0 int
+@s __d1 int
+@s __d2 int
+@s __d3 int
+@s __d4 int
+@s __d5 int
+@s __d6 int
+@s __d7 int
+@s __a0 int
+@s __a1 int
+@s __a2 int
+@s __a3 int
+@s __a4 int
+@s __a5 int
+@s __a6 int
+@s __a7 int
+@s __fp0 int
+@s __fp1 int
+@s __fp2 int
+@s __fp3 int
+@s __fp4 int
+@s __fp5 int
+@s __fp6 int
+@s __fp7 int
+
+@q Keywords by Commodore@>
+
+@s GLOBAL int
+@s IMPORT int
+@s STATIC int
+@s REGISTER int
+@s VOID int
+@s APTR int
+@s LONG int
+@s ULONG int
+@s LONGBITS int
+@s WORD int
+@s UWORD int
+@s WORDBITS int
+@s BYTE int
+@s UBYTE int
+@s BYTEBITS int
+@s RPTR int
+@s STRPTR int
+@s SHORT int
+@s USHORT int
+@s COUNT int
+@s UCOUNT int
+@s CPTR int
+@s FLOAT int
+@s DOUBLE int
+@s BOOL int
+@s TEXT int
+@s BPTR int
+@s BSTR int
+
+@s byte int
+@s Class int
+@s ClassID int
+@s CxMsg int
+@s CxObj int
+@s dev_t int
+@s DIR int
+@s DisplayInfoHandle int
+@s ino_t int
+@s IX int
+@s Msg int
+@s Object int
+@s off_t int
+@s PFL int
+@s PLANEPTR int
+@s Tag int
+@s tPoint int
+@s ushort int
+@s u_char int
+@s u_int int
+@s u_long int
+@s u_short int
+@s WINDOW int
diff --git a/Build/source/texk/web2c/cwebdir/cwebinputs/c++1xlib.w b/Build/source/texk/web2c/cwebdir/cwebinputs/c++1xlib.w
new file mode 100644
index 00000000000..eb5cb1ea710
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/cwebinputs/c++1xlib.w
@@ -0,0 +1,22 @@
+@q This file defines type names introduced in modern dialects of C++ as @>
+@q special items for formatting; see http://en.cppreference.com/w/cpp/header @>
+@q only the std::class names listed there are included here. @>
+
+@q @@i'nclude this file in addition to the file 'c++lib.w' @>
+
+@s type_index int
+@s initializer_list int
+@s tuple int
+@s any int
+@s optional int
+@s variant int
+@s error_code int
+@s basic_string_view int
+@s array int
+@s forward_list int
+@s unordered_set int
+@s unordered_multiset int
+@s unordered_map int
+@s unordered_multimap int
+@s thread int
+@s path int
diff --git a/Build/source/texk/web2c/cwebdir/cwebinputs/ecma94.w b/Build/source/texk/web2c/cwebdir/cwebinputs/ecma94.w
new file mode 100644
index 00000000000..6b2ce0a3655
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/cwebinputs/ecma94.w
@@ -0,0 +1,43 @@
+%
+% CWEB/INCLUDE $VER: ECMA94.W 1.5 (10.07.2017)
+%
+% SYNOPSIS:
+% Transliteration table for umlauts and special characters
+% according to the ISO 8859-1/ECMA-94/Latin-1 codepage.
+% @@include this file in limbo.
+% Note that not all equivalents to the TeX macros are present.
+%
+% DATE: 28.03.94: Derived from ECMA94.TEX (V1.0)
+%
+% AUTHOR:
+% Andreas Scherer <https://ascherer.github.io/>
+%
+% Please send suggestions (pull requests) and bug reports (issues)
+% to https://github.com/ascherer/cwebbin
+%
+% COPYRIGHT: There is no restriction to the usage of this file.
+%
+% CHANGES:
+% March 25, 1996: New postal address. (V1.2)
+% August 13, 1998: New e-mail address. (V1.3)
+% June 11, 2000: Include matching TeX macros. (V1.4)
+% July 10, 2017: Complete overhaul. (V1.5)
+
+\input ecma94.sty
+\noatl
+
+@q b0 @> @q b1 @> @q b2 @> @q b3 @> @q b4 @> @l b5 mu
+@q b6 @> @q b7 @> @q b8 @> @q b9 @> @q ba @> @q bb @>
+@q bc @> @q bd @> @q be @> @q bf @>
+@l c0 A @l c1 A @l c2 A @l c3 A @l c4 Ae @l c5 AA
+@l c6 AE @l c7 C @l c8 E @l c9 E @l ca E @l cb Ee
+@l cc I @l cd I @l ce I @l cf Ie
+@q d0 @> @l d1 N @l d2 O @l d3 O @l d4 O @l d5 O
+@l d6 Oe @q d7 @> @l d8 O @l d9 U @l da U @l db U
+@l dc Ue @l dd Y @q de @> @l df ss
+@l e0 a @l e1 a @l e2 a @l e3 a @l e4 ae @l e5 aa
+@l e6 ae @l e7 c @l e8 e @l e9 e @l ea e @l eb ee
+@l ec i @l ed i @l ee i @l ef ie
+@q f0 @> @l f1 n @l f2 o @l f3 o @l f4 o @l f5 o
+@l f6 oe @q f7 @> @l f8 o @l f9 u @l fa u @l fb u
+@l fc ue @l fd y @q fe @> @l ff ye
diff --git a/Build/source/texk/web2c/cwebdir/cwebinputs/hp8.w b/Build/source/texk/web2c/cwebdir/cwebinputs/hp8.w
new file mode 100644
index 00000000000..b4ab60246b8
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/cwebinputs/hp8.w
@@ -0,0 +1,46 @@
+%
+% CWEB/INCLUDE $VER: HP8.W 1.5 (10.07.2017)
+%
+% SYNOPSIS:
+% Transliteration table for umlauts and special characters
+% according to the Hewlett-Packard Roman 8 codepage.
+% @@include this file in limbo.
+% Note that not all equivalents to the TeX macros are present.
+%
+% DATE: 28.03.94: Derived from HP8.TEX (V1.0)
+%
+% AUTHOR:
+% Andreas Scherer <https://ascherer.github.io/>
+%
+% Please send suggestions (pull requests) and bug reports (issues)
+% to https://github.com/ascherer/cwebbin
+%
+% COPYRIGHT: There is no restriction to the usage of this file.
+%
+% CHANGES:
+% March 25, 1996: New postal address. (V1.2)
+% August 13, 1998: New e-mail address. (V1.3)
+% June 11, 2000: Include matching TeX macros. (V1.4)
+% July 10, 2017: Complete overhaul. (V1.5)
+
+\input hp8.sty
+\noatl
+
+@q a0 @> @l a1 A @l a2 A @l a3 E @l a4 E @l a5 Ee
+@l a6 I @l a7 Ie @q a8 @> @q a9 @> @q aa @> @q ab @>
+@q ac @> @l ad U @l ae U @q af @>
+@q b0 @> @l b1 Y @l b2 y @q b3 @> @l b4 C @l b5 c
+@l b6 N @l b7 n @q b8 @> @q b9 @> @q ba @> @q bb @>
+@q bc @> @q bd @> @q be @> @q bf @>
+@l c0 a @l c1 e @l c2 o @l c3 u @l c4 a @l c5 e
+@l c6 o @l c7 u @l c8 a @l c9 e @l ca o @l cb u
+@l cc ae @l cd ee @l ce oe @l cf ue
+@l d0 AA @l d1 i @l d2 O @l d3 AE @l d4 aa @l d5 i
+@l d6 o @l d7 ae @l d8 Ae @l d9 i @l da Oe @l db Ue
+@l dc E @l dd ie @l de ss @l df O
+@l e0 A @l e1 A @l e2 a @q e3 @> @q e4 @> @l e5 I
+@l e6 I @l e7 O @l e8 O @l e9 O @l ea o @q eb @>
+@q ec @> @l ed U @l ee Ye @l ef ye
+@q f0 @> @q f1 @> @q f2 @> @l f3 mu @q f4 @> @q f5 @>
+@q f6 @> @q f7 @> @q f8 @> @q f9 @> @q fa @> @q fb @>
+@q fc @> @q fd @> @q fe @> @q ff @>
diff --git a/Build/source/texk/web2c/cwebdir/cwebinputs/iso_types.w b/Build/source/texk/web2c/cwebdir/cwebinputs/iso_types.w
new file mode 100644
index 00000000000..3bb244b1c64
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/cwebinputs/iso_types.w
@@ -0,0 +1,119 @@
+@q This file defines syntax keywords and type names introduced in @>
+@q modern dialects of C and C++ as special entities for formatting @>
+
+@q C99 and C11 keywords, see http://en.cppreference.com/w/c/keyword @>
+
+@s restrict int
+
+@q C99 and C11 types @>
+
+@s _Alignas int
+@s _Alignof int
+@s _Atomic int
+@s _Bool int
+@s _Complex int
+@s _Generic int
+@s _Imaginary int
+@s _Noreturn int
+@s _Static_assert int
+@s _Thread_local int
+
+@s alignas int
+@s alignof int
+@s atomic_bool int
+@s atomic_char int
+@s atomic_schar int
+@s atomic_uchar int
+@s atomic_short int
+@s atomic_ushort int
+@s atomic_int int
+@s atomic_uint int
+@s atomic_long int
+@s atomic_ulong int
+@s atomic_llong int
+@s atomic_ullong int
+@s atomic_char16_t int
+@s atomic_char32_t int
+@s atomic_wchar_t int
+@s atomic_int_least8_t int
+@s atomic_uint_least8_t int
+@s atomic_int_least16_t int
+@s atomic_uint_least16_t int
+@s atomic_int_least32_t int
+@s atomic_uint_least32_t int
+@s atomic_int_least64_t int
+@s atomic_uint_least64_t int
+@s atomic_int_fast8_t int
+@s atomic_uint_fast8_t int
+@s atomic_int_fast16_t int
+@s atomic_uint_fast16_t int
+@s atomic_int_fast32_t int
+@s atomic_uint_fast32_t int
+@s atomic_int_fast64_t int
+@s atomic_uint_fast64_t int
+@s atomic_intptr_t int
+@s atomic_uintptr_t int
+@s atomic_size_t int
+@s atomic_ptrdiff_t int
+@s atomic_intmax_t int
+@s atomic_uintmax_t int
+@s bool int
+@s complex int
+@s imaginary int
+@s noreturn int
+@s static_assert int
+@s thread_local int
+
+@q C99 preprocessor @>
+
+@s _Pragma int
+
+@q C++99 and C++11 keywords, see http://en.cppreference.com/w/cpp/keyword @>
+
+@s constexpr int
+@s decltype int
+@s false int
+@s final int
+@s noexcept int
+@s override int
+@s true int
+
+@q Fundamental types of C++99 and C++11, see @>
+@q http://en.cppreference.com/w/cpp/language/types @>
+
+@s nullptr_t int
+@s char16_t int
+@s char32_t int
+
+@q Integral types of C99 and C++, see @>
+@q http://en.cppreference.com/w/c/types/integer and @>
+@q http://en.cppreference.com/w/cpp/types/integer @>
+
+@s int8_t int
+@s int16_t int
+@s int32_t int
+@s int64_t int
+@s int_fast8_t int
+@s int_fast16_t int
+@s int_fast32_t int
+@s int_fast64_t int
+@s int_least8_t int
+@s int_least16_t int
+@s int_least32_t int
+@s int_least64_t int
+@s intmax_t int
+@s intptr_t int
+@s uint8_t int
+@s uint16_t int
+@s uint32_t int
+@s uint64_t int
+@s uint_fast8_t int
+@s uint_fast16_t int
+@s uint_fast32_t int
+@s uint_fast64_t int
+@s uint_least8_t int
+@s uint_least16_t int
+@s uint_least32_t int
+@s uint_least64_t int
+@s uintmax_t int
+@s uintptr_t int
diff --git a/Build/source/texk/web2c/cwebdir/cwebinputs/mac8.w b/Build/source/texk/web2c/cwebdir/cwebinputs/mac8.w
new file mode 100644
index 00000000000..0ed7b1a702d
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/cwebinputs/mac8.w
@@ -0,0 +1,52 @@
+%
+% CWEB/INCLUDE $VER: MAC8.W 1.5 (10.07.2017)
+%
+% SYNOPSIS:
+% Transliteration table for umlauts and special characters
+% according to the Macintosh 8-bit codepage.
+% @@include this file in limbo.
+% Note that not all equivalents to the TeX macros are present.
+%
+% DATE: 23.06.94: Derived from MAC8.TEX (V1.0)
+%
+% AUTHOR:
+% Andreas Scherer <https://ascherer.github.io/>
+%
+% Please send suggestions (pull requests) and bug reports (issues)
+% to https://github.com/ascherer/cwebbin
+%
+% COPYRIGHT: There is no restriction to the usage of this file.
+%
+% CHANGES:
+% March 25, 1996: New postal address. (V1.2)
+% August 13, 1998: New e-mail address. (V1.3)
+% June 11, 2000: Include matching TeX macros. (V1.4)
+% July 10, 2017: Complete overhaul. (V1.5)
+
+\input mac8.sty
+\noatl
+
+@l 80 Ae @l 81 A @l 82 C @l 83 E @l 84 N @l 85 Oe
+@l 86 Ue @l 87 a @l 88 a @l 89 a @l 8a ae @l 8b a
+@l 8c a @l 8d c @l 8e e @l 8f e
+@l 90 e @l 91 ee @l 92 i @l 93 i @l 94 i @l 95 ie
+@l 96 n @l 97 o @l 98 o @l 99 o @l 9a oe @l 9b o
+@l 9c u @l 9d u @l 9e u @l 9f ue
+@q a0 @> @q a1 @> @q a2 @> @q a3 @> @q a4 @> @q a5 @>
+@q a6 @> @l a7 ss @q a8 @> @q a9 @> @q aa @> @q ab @>
+@q ac @> @q ad @> @l ae AE @l af O
+@q b0 @> @q b1 @> @q b2 @> @q b3 @> @q b4 @> @l b5 mu
+@q b6 @> @q b7 @> @q b8 @> @q b9 @> @q ba @> @q bb @>
+@q bc @> @q bd @> @l be ae @l bf o
+@q c0 @> @q c1 @> @q c2 @> @q c3 @> @q c4 @> @q c5 @>
+@q c6 @> @q c7 @> @q c8 @> @q c9 @> @q ca @> @l cb A
+@l cc A @l cd O @q ce @> @q cf @>
+@q d0 @> @q d1 @> @q d2 @> @q d3 @> @q d4 @> @q d5 @>
+@q d6 @> @q d7 @> @l d8 ye @l d9 Ye @q da @> @q db @>
+@q dc @> @q dd @> @q de @> @q df @>
+@q e0 @> @q e1 @> @q e2 @> @q e3 @> @q e4 @> @l e5 A
+@l e6 E @l e7 A @l e8 Ee @l e9 E @l ea I @l eb I
+@l ec Ie @l ed I @l ee O @l ef O
+@q f0 @> @l f1 O @l f2 U @l f3 U @l f4 U @q f5 @>
+@q f6 @> @q f7 @> @q f8 @> @q f9 @> @q fa @> @q fb @>
+@q fc @> @q fd @> @q fe @> @q ff @>
diff --git a/Build/source/texk/web2c/cwebdir/cwebinputs/pc850.w b/Build/source/texk/web2c/cwebdir/cwebinputs/pc850.w
new file mode 100644
index 00000000000..7c1c4862ee0
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/cwebinputs/pc850.w
@@ -0,0 +1,49 @@
+%
+% CWEB/INCLUDE $VER: PC850.W 1.5 (10.07.2017)
+%
+% SYNOPSIS:
+% Transliteration table for umlauts and special characters
+% according to the IBM PC International Codepage 850.
+% @@include this file in limbo.
+% Note that not all equivalents to the TeX macros are present.
+%
+% DATE: 28.03.94: Derived from PC850.TEX (V1.0)
+%
+% AUTHOR:
+% Andreas Scherer <https://ascherer.github.io/>
+%
+% Please send suggestions (pull requests) and bug reports (issues)
+% to https://github.com/ascherer/cwebbin
+%
+% COPYRIGHT: There is no restriction to the usage of this file.
+%
+% CHANGES:
+% March 25, 1996: New postal address. (V1.2)
+% August 13, 1998: New e-mail address. (V1.3)
+% June 11, 2000: Include matching TeX macros. (V1.4)
+% July 10, 2017: Complete overhaul. (V1.5)
+
+\input pc850.sty
+\noatl
+
+@l 80 C @l 81 ue @l 82 e @l 83 a @l 84 ae @l 85 a
+@l 86 aa @l 87 c @l 88 e @l 89 ee @l 8a e @l 8b ie
+@l 8c i @l 8d i @l 8e Ae @l 8f AA
+@l 90 E @l 91 ae @l 92 AE @l 93 o @l 94 oe @l 95 o
+@l 96 u @l 97 u @l 98 ye @l 99 Oe @l 9a Ue @l 9b o
+@q 9c @> @l 9d O @q 9e @> @q 9f @>
+@l a0 a @l a1 i @l a2 o @l a3 u @l a4 n @l a5 N
+@q a6 @> @q a7 @> @q a8 @> @q a9 @> @q aa @> @q ab @>
+@q ac @> @q ad @> @q ae @> @q af @>
+@q b0 @> @q b1 @> @q b2 @> @q b3 @> @q b4 @> @l b5 A
+@l b6 A @l b7 A @q b8 @> @q b9 @> @q ba @> @q bb @>
+@q bc @> @q bd @> @q be @> @q bf @>
+@q c0 @> @q c1 @> @q c2 @> @q c3 @> @q c4 @> @q c5 @>
+@l c6 a @l c7 A @q c8 @> @q c9 @> @q ca @> @q cb @>
+@q cc @> @q cd @> @q ce @> @q cf @>
+@q d0 @> @q d1 @> @l d2 E @l d3 Ee @l d4 E @q d5 @>
+@l d6 I @l d7 I @l d8 Ie @q d9 @> @q da @> @q db @>
+@q dc @> @q dd @> @l de I @q df @>
+@l e0 O @l e1 ss @l e2 O @l e3 O @l e4 o @l e5 O
+@l e6 mu @q e7 @> @q e8 @> @l e9 U @l ea U @l eb U
+@l ec y @l ed Y @q ee @> @q ef @>
diff --git a/Build/source/texk/web2c/cwebdir/po/cweb-tl.pot b/Build/source/texk/web2c/cwebdir/po/cweb-tl.pot
new file mode 100644
index 00000000000..255854ba9d4
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/po/cweb-tl.pot
@@ -0,0 +1,47 @@
+# International version of CWEB (CWEBbin, TeXLive).
+# Copyright (C) 2019 Andreas Scherer et al.
+# This file is distributed under the same license as the CWEB package.
+# Andreas Scherer <https://ascherer.github.io>, 2019.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: CWEBbin 2019\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2019-01-01 15:41+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: comm-texlive.ch:416
+#, c-format
+msgid "%s: Need one to three file arguments.\n"
+msgstr ""
+
+#: comm-texlive.ch:417
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr ""
+
+#: comm-texlive.ch:436
+#, c-format
+msgid ""
+"\n"
+"Email bug reports to %s.\n"
+msgstr ""
+
+#: ctang-texlive.ch:33
+msgid "This is CTANGLE, Version 3.64"
+msgstr ""
+
+#: cweav-texlive.ch:33
+msgid "This is CWEAVE, Version 3.64"
+msgstr ""
+
+#: ctwill-texlive.ch:33
+msgid "This is CTWILL, Version 3.64"
+msgstr ""
diff --git a/Build/source/texk/web2c/cwebdir/po/cweb.pot b/Build/source/texk/web2c/cwebdir/po/cweb.pot
new file mode 100644
index 00000000000..98be478844c
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/po/cweb.pot
@@ -0,0 +1,598 @@
+# International version of CWEB (CWEBbin).
+# Copyright (C) 2019 Andreas Scherer et al.
+# This file is distributed under the same license as the CWEB package.
+# Andreas Scherer <https://ascherer.github.io>, 2019.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: CWEBbin 2019\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2019-01-01 15:41+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: comm-i18n.ch:182
+msgid ""
+"\n"
+"! Ambiguous prefix: matches <"
+msgstr ""
+
+#: cweav-i18n.ch:295
+msgid ""
+"\n"
+"! C text in section name didn't end: <"
+msgstr ""
+
+#: cweav-i18n.ch:287
+msgid ""
+"\n"
+"! Illegal control code in section name: <"
+msgstr ""
+
+#: cweav-i18n.ch:157
+#, c-format
+msgid ""
+"\n"
+"! Line had to be broken (output l. %d):\n"
+msgstr ""
+
+#: cweav-i18n.ch:141
+msgid ""
+"\n"
+"! Never defined: <"
+msgstr ""
+
+#: cweav-i18n.ch:148
+msgid ""
+"\n"
+"! Never used: <"
+msgstr ""
+
+#: comm-i18n.ch:202
+msgid ""
+"\n"
+"! New name extends <"
+msgstr ""
+
+#: comm-i18n.ch:196
+msgid ""
+"\n"
+"! New name is a prefix of <"
+msgstr ""
+
+#: ctang-i18n.ch:57
+msgid ""
+"\n"
+"! No program text was specified."
+msgstr ""
+
+#: ctang-i18n.ch:41
+msgid ""
+"\n"
+"! Not present: <"
+msgstr ""
+
+#: comm-i18n.ch:208
+msgid ""
+"\n"
+"! Section name incompatible with <"
+msgstr ""
+
+#: ctang-i18n.ch:167 cweav-i18n.ch:67
+msgid ""
+"\n"
+"! Section name too long: "
+msgstr ""
+
+#: comm-i18n.ch:254
+#, c-format
+msgid ""
+"\n"
+"! Sorry, %s capacity exceeded"
+msgstr ""
+
+#: ctang-i18n.ch:125 cweav-i18n.ch:45
+msgid ""
+"\n"
+"! String too long: "
+msgstr ""
+
+#: cweav-i18n.ch:239
+#, c-format
+msgid ""
+"\n"
+"Irreducible scrap sequence in section %d:"
+msgstr ""
+
+#: ctang-i18n.ch:292 cweav-i18n.ch:431
+msgid ""
+"\n"
+"Memory usage statistics:"
+msgstr ""
+
+#: cweav-i18n.ch:247
+#, c-format
+msgid ""
+"\n"
+"Tracing after l. %d:\n"
+msgstr ""
+
+#: cweav-i18n.ch:377
+msgid ""
+"\n"
+"Writing the index..."
+msgstr ""
+
+#: ctang-i18n.ch:63
+#, c-format
+msgid ""
+"\n"
+"Writing the output file (%s):"
+msgstr ""
+
+#: cweav-i18n.ch:317
+msgid ""
+"\n"
+"Writing the output file..."
+msgstr ""
+
+#: ctang-i18n.ch:69
+msgid ""
+"\n"
+"Writing the output files:"
+msgstr ""
+
+#: ctang-i18n.ch:217
+msgid "! @d, @f and @c are ignored in C text"
+msgstr ""
+
+#: comm-i18n.ch:60
+msgid "! CWEB file ended during a change"
+msgstr ""
+
+#: cweav-twill.ch:1026
+msgid "! Cannot open aux output file "
+msgstr ""
+
+#: comm-i18n.ch:88
+msgid "! Cannot open change file "
+msgstr ""
+
+#: comm-i18n.ch:118
+msgid "! Cannot open include file"
+msgstr ""
+
+#: cweav-i18n.ch:383
+msgid "! Cannot open index file "
+msgstr ""
+
+#: comm-i18n.ch:82
+msgid "! Cannot open input file "
+msgstr ""
+
+#: comm-i18n.ch:300 comm-i18n.ch:306 ctang-i18n.ch:83 ctang-i18n.ch:307
+#: cweav-i18n.ch:457
+msgid "! Cannot open output file "
+msgstr ""
+
+#: cweav-i18n.ch:389
+msgid "! Cannot open section file "
+msgstr ""
+
+#: comm-i18n.ch:46
+msgid "! Change file ended after @x"
+msgstr ""
+
+#: comm-i18n.ch:54
+msgid "! Change file ended before @y"
+msgstr ""
+
+#: comm-i18n.ch:126
+msgid "! Change file ended without @z"
+msgstr ""
+
+#: comm-i18n.ch:140
+msgid "! Change file entry did not match"
+msgstr ""
+
+#: cweav-i18n.ch:95
+msgid "! Control codes are forbidden in control text"
+msgstr ""
+
+#: cweav-i18n.ch:81
+msgid "! Control codes are forbidden in section name"
+msgstr ""
+
+#: cweav-i18n.ch:89
+msgid "! Control text didn't end"
+msgstr ""
+
+#: ctang-i18n.ch:249
+msgid "! Definition flushed, must start with identifier"
+msgstr ""
+
+#: ctang-i18n.ch:147
+msgid "! Double @ should be used in ASCII constant"
+msgstr ""
+
+#: ctang-i18n.ch:139 ctang-i18n.ch:257
+msgid "! Double @ should be used in control text"
+msgstr ""
+
+#: ctang-i18n.ch:263 cweav-i18n.ch:165
+msgid "! Double @ should be used in limbo"
+msgstr ""
+
+#: ctang-i18n.ch:233
+msgid "! Double @ should be used in string"
+msgstr ""
+
+#: cweav-i18n.ch:263
+msgid "! Double @ should be used in strings"
+msgstr ""
+
+#: cweav-i18n.ch:193
+msgid "! Extra } in comment"
+msgstr ""
+
+#: comm-i18n.ch:292
+msgid "! Filename too long\n"
+msgstr ""
+
+#: cweav-twill.ch:542
+msgid "! Identifier in meaning should be followed by space"
+msgstr ""
+
+#: cweav-i18n.ch:209
+msgid "! Illegal use of @ in comment"
+msgstr ""
+
+#: cweav-i18n.ch:353
+msgid "! Improper format definition"
+msgstr ""
+
+#: ctang-i18n.ch:271
+msgid "! Improper hex number following @l"
+msgstr ""
+
+#: cweav-i18n.ch:339 cweav-i18n.ch:345
+msgid "! Improper macro definition"
+msgstr ""
+
+#: comm-i18n.ch:96
+msgid "! Include file name not given"
+msgstr ""
+
+#: comm-i18n.ch:110
+msgid "! Include file name too long"
+msgstr ""
+
+#: comm-i18n.ch:312
+msgid "! Include path too long"
+msgstr ""
+
+#: ctang-i18n.ch:99 cweav-i18n.ch:181
+msgid "! Input ended in mid-comment"
+msgstr ""
+
+#: ctang-i18n.ch:119 cweav-i18n.ch:39
+msgid "! Input ended in middle of string"
+msgstr ""
+
+#: ctang-i18n.ch:161 cweav-i18n.ch:61
+msgid "! Input ended in section name"
+msgstr ""
+
+#: comm-i18n.ch:30
+msgid "! Input line too long"
+msgstr ""
+
+#: cweav-twill.ch:549
+msgid "! Location in meaning should be followed by space"
+msgstr ""
+
+#: ctang-i18n.ch:211
+msgid "! Misplaced @h"
+msgstr ""
+
+#: cweav-i18n.ch:271
+msgid "! Missing '|' after C text"
+msgstr ""
+
+#: comm-i18n.ch:38
+msgid "! Missing @x in change file"
+msgstr ""
+
+#: ctang-i18n.ch:225
+msgid "! Missing `@ ' before a named section"
+msgstr ""
+
+#: cweav-i18n.ch:127
+msgid "! Missing left identifier of @s"
+msgstr ""
+
+#: cweav-i18n.ch:133
+msgid "! Missing right identifier of @s"
+msgstr ""
+
+#: cweav-i18n.ch:187 cweav-i18n.ch:201
+msgid "! Missing } in comment"
+msgstr ""
+
+#: ctang-i18n.ch:181
+msgid "! Nesting of section names not allowed"
+msgstr ""
+
+#: cweav-twill.ch:1022
+msgid "! Only @$ is allowed in aux and bux files"
+msgstr ""
+
+#: ctang-i18n.ch:277
+msgid "! Replacement string in @l too long"
+msgstr ""
+
+#: ctang-i18n.ch:175 cweav-i18n.ch:75
+msgid "! Section name didn't end"
+msgstr ""
+
+#: ctang-i18n.ch:99
+msgid "! Section name ended in mid-comment"
+msgstr ""
+
+#: ctang-i18n.ch:113 ctang-i18n.ch:153 cweav-i18n.ch:33
+msgid "! String didn't end"
+msgstr ""
+
+#: cweav-i18n.ch:325
+msgid "! TeX string should be in C text only"
+msgstr ""
+
+#: comm-i18n.ch:262 comm-i18n.hch:34
+msgid "! This can't happen: "
+msgstr ""
+
+#: cweav-twill.ch:310
+msgid "! Title name didn't end"
+msgstr ""
+
+#: cweav-twill.ch:308
+msgid "! Title should be enclosed in braces or doublequotes"
+msgstr ""
+
+#: comm-i18n.ch:102
+msgid "! Too many nested includes"
+msgstr ""
+
+#: ctang-i18n.ch:241
+msgid "! Unrecognized escape sequence"
+msgstr ""
+
+#: comm-i18n.ch:283
+msgid ""
+"! Usage: ctangle [options] webfile[.w] [{changefile[.ch]|-} [outfile[.c]]]\n"
+msgstr ""
+
+#: comm-i18n.ch:288
+msgid ""
+"! Usage: cweave [options] webfile[.w] [{changefile[.ch]|-} [outfile[.tex]]]\n"
+msgstr ""
+
+#: comm-i18n.ch:291
+msgid ""
+"! Usage: ctwill [options] webfile[.w] [{changefile[.ch]|-} [outfile[.tex]]]\n"
+msgstr ""
+
+#: ctang-i18n.ch:131 cweav-i18n.ch:53 cweav-i18n.ch:117
+msgid "! Use @l in limbo only"
+msgstr ""
+
+#: ctang-i18n.ch:189 cweav-i18n.ch:103
+msgid "! Verbatim string didn't end"
+msgstr ""
+
+#: comm-i18n.ch:68
+msgid "! Where is the matching @y?"
+msgstr ""
+
+#: comm-i18n.ch:132
+msgid "! Where is the matching @z?"
+msgstr ""
+
+#: cweav-i18n.ch:369
+msgid "! You can't do that in C text"
+msgstr ""
+
+#: cweav-i18n.ch:331
+msgid "! You can't do that in TeX text"
+msgstr ""
+
+#: cweav-i18n.ch:361
+msgid "! You need an = sign after the section name"
+msgstr ""
+
+#: ctang-i18n.ch:297 cweav-i18n.ch:437
+#, c-format
+msgid "%ld bytes (out of %ld)\n"
+msgstr ""
+
+#: cweav-i18n.ch:435
+#, c-format
+msgid "%ld cross-references (out of %ld)\n"
+msgstr ""
+
+#: cweav-i18n.ch:446 cweav-i18n.ch:449
+#, c-format
+msgid "%ld levels (out of %ld)\n"
+msgstr ""
+
+#: ctang-i18n.ch:293 cweav-i18n.ch:433
+#, c-format
+msgid "%ld names (out of %ld)\n"
+msgstr ""
+
+#: ctang-i18n.ch:295
+#, c-format
+msgid "%ld replacement texts (out of %ld)\n"
+msgstr ""
+
+#: cweav-i18n.ch:440
+#, c-format
+msgid "%ld scraps (out of %ld)\n"
+msgstr ""
+
+#: cweav-twill.ch:1350
+#, c-format
+msgid "%ld temp meanings (out of %ld)\n"
+msgstr ""
+
+#: cweav-i18n.ch:442
+#, c-format
+msgid "%ld texts (out of %ld)\n"
+msgstr ""
+
+#: ctang-i18n.ch:299 cweav-i18n.ch:444
+#, c-format
+msgid "%ld tokens (out of %ld)\n"
+msgstr ""
+
+#: comm-i18n.ch:242
+msgid "(Did you see the warning message above?)"
+msgstr ""
+
+#: comm-i18n.ch:240
+msgid "(No errors were found.)"
+msgstr ""
+
+#: comm-i18n.ch:244
+msgid "(Pardon me, but I think I spotted something wrong.)"
+msgstr ""
+
+#: comm-i18n.ch:246
+msgid "(That was a fatal error, my friend.)"
+msgstr ""
+
+#: comm-i18n.ch:244
+#, c-format
+msgid ". (l. %d of change file)\n"
+msgstr ""
+
+#: comm-i18n.ch:226
+#, c-format
+msgid ". (l. %d of include file %s)\n"
+msgstr ""
+
+#: comm-i18n.ch:225
+#, c-format
+msgid ". (l. %d)\n"
+msgstr ""
+
+#: comm-i18n.ch:188
+msgid ""
+">\n"
+" and <"
+msgstr ""
+
+#: comm-i18n.ch:214
+msgid ""
+">,\n"
+" which abbreviates <"
+msgstr ""
+
+#: ctang-i18n.ch:75 cweav-i18n.ch:395
+msgid "Done."
+msgstr ""
+
+#: cweav-i18n.ch:439
+msgid "Parsing:"
+msgstr ""
+
+#: cweav-i18n.ch:448
+msgid "Sorting:"
+msgstr ""
+
+#: ctang-i18n.ch:17
+msgid "This is CTANGLE (Version 3.64 [CWEBbin 2019])"
+msgstr ""
+
+#: cweav-i18n.ch:17
+msgid "This is CWEAVE (Version 3.64 [CWEBbin 2019])"
+msgstr ""
+
+#: cweav-twill.ch:49
+msgid "This is CTWILL (Version 3.64 [CWEBbin 2019])"
+msgstr ""
+
+#: cweav-i18n.ch:301 cweav-i18n.ch:309
+msgid "buffer"
+msgstr ""
+
+#: comm-i18n.ch:149 comm-i18n.ch:159 comm-i18n.ch:174
+msgid "byte memory"
+msgstr ""
+
+#: cweav-i18n.ch:25
+msgid "cross-reference"
+msgstr ""
+
+#: cweav-twill.ch:815
+msgid "find type"
+msgstr ""
+
+#: cweav-twill.ch:754
+msgid "inner"
+msgstr ""
+
+#: ctang-i18n.ch:91
+msgid "macro defs have strange char"
+msgstr ""
+
+#: comm-i18n.ch:150 comm-i18n.ch:160 comm-i18n.ch:168
+msgid "name"
+msgstr ""
+
+#: comm-i18n.ch:74
+msgid "of the preceding lines failed to match"
+msgstr ""
+
+#: ctang-i18n.ch:49
+msgid "output files"
+msgstr ""
+
+#: cweav-i18n.ch:255
+msgid "scrap/token/text"
+msgstr ""
+
+#: cweav-i18n.ch:111
+msgid "section number"
+msgstr ""
+
+#: cweav-i18n.ch:403
+msgid "sorting"
+msgstr ""
+
+#: ctang-i18n.ch:33 cweav-i18n.ch:279
+msgid "stack"
+msgstr ""
+
+#: cweav-twill.ch:562
+msgid "temp meanings"
+msgstr ""
+
+#: ctang-i18n.ch:203 cweav-i18n.ch:223
+msgid "text"
+msgstr ""
+
+#: cweav-twill.ch:311
+msgid "titles"
+msgstr ""
+
+#: ctang-i18n.ch:25 ctang-i18n.ch:197
+#: cweav-i18n.ch:173 cweav-i18n.ch:217 cweav-i18n.ch:231
+msgid "token"
+msgstr ""
diff --git a/Build/source/texk/web2c/cwebdir/po/de/cweb-tl.mo b/Build/source/texk/web2c/cwebdir/po/de/cweb-tl.mo
new file mode 100644
index 00000000000..9ea9d70917d
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/po/de/cweb-tl.mo
Binary files differ
diff --git a/Build/source/texk/web2c/cwebdir/po/de/cweb-tl.po b/Build/source/texk/web2c/cwebdir/po/de/cweb-tl.po
new file mode 100644
index 00000000000..f4b1cb6e855
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/po/de/cweb-tl.po
@@ -0,0 +1,50 @@
+# International version of CWEB (CWEBbin, TeXLive).
+# Copyright (C) 2018 Andreas Scherer et al.
+# This file is distributed under the same license as the CWEB package.
+# Andreas Scherer <https://ascherer.github.io>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: CWEBbin 2018\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2019-01-01 15:41+0100\n"
+"PO-Revision-Date: 2018-12-28 16:20+0100\n"
+"Last-Translator: Andreas Scherer <andreas_github@freenet.de>\n"
+"Language-Team: German\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: comm-texlive.ch:416
+#, c-format
+msgid "%s: Need one to three file arguments.\n"
+msgstr "%s: Benötige ein bis drei Dateiargumente.\n"
+
+#: comm-texlive.ch:417
+#, c-format
+msgid "Try `%s --help' for more information.\n"
+msgstr "Versuche `%s --help' für weitere Informationen.\n"
+
+#: comm-texlive.ch:436
+#, c-format
+msgid ""
+"\n"
+"Email bug reports to %s.\n"
+msgstr ""
+"\n"
+"Sende Fehler per Email an %s.\n"
+
+#: ctang-texlive.ch:33
+msgid "This is CTANGLE, Version 3.64"
+msgstr "Dies ist CTANGLE, Version 3.64"
+
+#: cweav-texlive.ch:33
+msgid "This is CWEAVE, Version 3.64"
+msgstr "Dies ist CWEAVE, Version 3.64"
+
+#: ctwill-texlive.ch:33
+#, fuzzy
+msgid "This is CTWILL, Version 3.64"
+msgstr "Dies ist CTWILL, Version 3.64"
diff --git a/Build/source/texk/web2c/cwebdir/po/de/cweb.mo b/Build/source/texk/web2c/cwebdir/po/de/cweb.mo
new file mode 100644
index 00000000000..4719ac38a5c
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/po/de/cweb.mo
Binary files differ
diff --git a/Build/source/texk/web2c/cwebdir/po/de/cweb.po b/Build/source/texk/web2c/cwebdir/po/de/cweb.po
new file mode 100644
index 00000000000..dbf66eea107
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/po/de/cweb.po
@@ -0,0 +1,675 @@
+# International version of CWEB (CWEBbin, TeXLive).
+# Copyright (C) 2019 Andreas Scherer et al.
+# This file is distributed under the same license as the CWEB package.
+# Andreas Scherer <https://ascherer.github.io>, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: CWEBbin 2019\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2019-01-01 15:41+0100\n"
+"PO-Revision-Date: 2019-01-01 15_41+0100\n"
+"Last-Translator: Andreas Scherer <andreas_github@freenet.de>\n"
+"Language-Team: German\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: comm-i18n.ch:182
+msgid ""
+"\n"
+"! Ambiguous prefix: matches <"
+msgstr ""
+"\n"
+"! Mehrdeutiger Präfix: passt zu <"
+
+#: cweav-i18n.ch:295
+msgid ""
+"\n"
+"! C text in section name didn't end: <"
+msgstr ""
+"\n"
+"! C-Text in Abschnittname nicht beendet: <"
+
+#: cweav-i18n.ch:287
+msgid ""
+"\n"
+"! Illegal control code in section name: <"
+msgstr ""
+"\n"
+"! Unerlaubtes Kontrollzeichen in Abschnittname: <"
+
+#: cweav-i18n.ch:157
+#, c-format
+msgid ""
+"\n"
+"! Line had to be broken (output l. %d):\n"
+msgstr ""
+"\n"
+"! Zeile musste umbrochen werden (Ausgabezeile %d):\n"
+
+#: cweav-i18n.ch:141
+msgid ""
+"\n"
+"! Never defined: <"
+msgstr ""
+"\n"
+"! Nicht definiert: <"
+
+#: cweav-i18n.ch:148
+msgid ""
+"\n"
+"! Never used: <"
+msgstr ""
+"\n"
+"! Nicht benutzt: <"
+
+#: comm-i18n.ch:202
+msgid ""
+"\n"
+"! New name extends <"
+msgstr ""
+"\n"
+"! Neuer Name erweitert <"
+
+#: comm-i18n.ch:196
+msgid ""
+"\n"
+"! New name is a prefix of <"
+msgstr ""
+"\n"
+"! Neuer Name ist Präfix von <"
+
+#: ctang-i18n.ch:57
+msgid ""
+"\n"
+"! No program text was specified."
+msgstr ""
+"\n"
+"! Kein Programmtext vorhanden."
+
+#: ctang-i18n.ch:41
+msgid ""
+"\n"
+"! Not present: <"
+msgstr ""
+"\n"
+"! Nicht vorhanden: <"
+
+#: comm-i18n.ch:208
+msgid ""
+"\n"
+"! Section name incompatible with <"
+msgstr ""
+"\n"
+"! Abschnittname passt nicht zu <"
+
+#: ctang-i18n.ch:167 cweav-i18n.ch:67
+msgid ""
+"\n"
+"! Section name too long: "
+msgstr ""
+"\n"
+"! Abschnittname zu lang: "
+
+#: comm-i18n.ch:254
+#, c-format
+msgid ""
+"\n"
+"! Sorry, %s capacity exceeded"
+msgstr ""
+"\n"
+"! Tut mir leid, Kapazität für %s überschritten"
+
+#: ctang-i18n.ch:125 cweav-i18n.ch:45
+msgid ""
+"\n"
+"! String too long: "
+msgstr ""
+"\n"
+"! Zeichenkette zu lang: "
+
+#: cweav-i18n.ch:239
+#, c-format
+msgid ""
+"\n"
+"Irreducible scrap sequence in section %d:"
+msgstr ""
+"\n"
+"Nichtreduzierbare Scrap-Folge in Abschnitt %d:"
+
+#: ctang-i18n.ch:292 cweav-i18n.ch:431
+msgid ""
+"\n"
+"Memory usage statistics:"
+msgstr ""
+"\n"
+"Statistik über den Speicherbedarf:"
+
+#: cweav-i18n.ch:247
+#, c-format
+msgid ""
+"\n"
+"Tracing after l. %d:\n"
+msgstr ""
+"\n"
+"Analyse nach Zeile %d:\n"
+
+#: cweav-i18n.ch:377
+msgid ""
+"\n"
+"Writing the index..."
+msgstr ""
+"\n"
+"Schreibe den Index..."
+
+#: ctang-i18n.ch:63
+#, c-format
+msgid ""
+"\n"
+"Writing the output file (%s):"
+msgstr ""
+"\n"
+"Schreibe die Ausgabedatei (%s):"
+
+#: cweav-i18n.ch:317
+msgid ""
+"\n"
+"Writing the output file..."
+msgstr ""
+"\n"
+"Schreibe die Ausgabedatei..."
+
+#: ctang-i18n.ch:69
+msgid ""
+"\n"
+"Writing the output files:"
+msgstr ""
+"\n"
+"Schreibe die Ausgabedateien:"
+
+#: ctang-i18n.ch:217
+msgid "! @d, @f and @c are ignored in C text"
+msgstr "! @d, @f und @c werden im C-Text ignoriert"
+
+#: comm-i18n.ch:60
+msgid "! CWEB file ended during a change"
+msgstr "! CWEB-Datei endete während einer Änderung"
+
+#: cweav-twill.ch:1026
+msgid "! Cannot open aux output file "
+msgstr "! Kann aux-Ausgabedatei nicht öffnen: "
+
+#: comm-i18n.ch:88
+msgid "! Cannot open change file "
+msgstr "! Kann Änderungsdatei nicht öffnen: "
+
+#: comm-i18n.ch:118
+msgid "! Cannot open include file"
+msgstr "! Kann Einfügedatei nicht öffnen"
+
+#: cweav-i18n.ch:383
+msgid "! Cannot open index file "
+msgstr "! Kann die Indexdatei nicht öffnen: "
+
+#: comm-i18n.ch:82
+msgid "! Cannot open input file "
+msgstr "! Kann Eingabedatei nicht öffnen: "
+
+#: comm-i18n.ch:300 comm-i18n.ch:306 ctang-i18n.ch:83 ctang-i18n.ch:307
+#: cweav-i18n.ch:457
+msgid "! Cannot open output file "
+msgstr "! Kann Ausgabedatei nicht öffnen: "
+
+#: cweav-i18n.ch:389
+msgid "! Cannot open section file "
+msgstr "! Kann die Abschnittdatei nicht öffnen: "
+
+#: comm-i18n.ch:46
+msgid "! Change file ended after @x"
+msgstr "! Änderungsdatei endete nach @x"
+
+#: comm-i18n.ch:54
+msgid "! Change file ended before @y"
+msgstr "! Änderungsdatei endete vor @y"
+
+#: comm-i18n.ch:126
+msgid "! Change file ended without @z"
+msgstr "! Änderungsdatei endete ohne @z"
+
+#: comm-i18n.ch:140
+msgid "! Change file entry did not match"
+msgstr "! Eintrag in der Änderungsdatei stimmt nicht überein"
+
+#: cweav-i18n.ch:95
+msgid "! Control codes are forbidden in control text"
+msgstr "! Kontrollzeichen sind in Kontrolltexten verboten"
+
+#: cweav-i18n.ch:81
+msgid "! Control codes are forbidden in section name"
+msgstr "! Kontrollzeichen sind in Abschnittnamen verboten"
+
+#: cweav-i18n.ch:89
+msgid "! Control text didn't end"
+msgstr "! Kontrolltext nicht beendet"
+
+#: ctang-i18n.ch:249
+msgid "! Definition flushed, must start with identifier"
+msgstr "! Definition übergangen, muss mit einem Bezeichner anfangen"
+
+#: ctang-i18n.ch:147
+msgid "! Double @ should be used in ASCII constant"
+msgstr "! In ASCII Konstanten sollten doppelte @ verwendet werden"
+
+#: ctang-i18n.ch:139 ctang-i18n.ch:257
+msgid "! Double @ should be used in control text"
+msgstr "! In Kontrolltexten sollten doppelte @ verwendet werden"
+
+#: ctang-i18n.ch:263 cweav-i18n.ch:165
+msgid "! Double @ should be used in limbo"
+msgstr "! Im Einführungsteil sollten doppelte @ verwendet werden"
+
+#: ctang-i18n.ch:233
+msgid "! Double @ should be used in string"
+msgstr "! In einer Zeichenkette sollten doppelte @ verwendet werden"
+
+#: cweav-i18n.ch:263
+msgid "! Double @ should be used in strings"
+msgstr "! In Zeichenketten sollten doppelte @ verwendet werden"
+
+#: cweav-i18n.ch:193
+msgid "! Extra } in comment"
+msgstr "! Zusätzliche } in Kommentar"
+
+#: comm-i18n.ch:292
+msgid "! Filename too long\n"
+msgstr "! Dateiname zu lang\n"
+
+#: cweav-twill.ch:542
+msgid "! Identifier in meaning should be followed by space"
+msgstr "! Bezeichner in Bedeutung sollte Leerzeichen folgen"
+
+#: cweav-i18n.ch:209
+msgid "! Illegal use of @ in comment"
+msgstr "! Unerlaubte Verwendung von @ in Kommentar"
+
+#: cweav-i18n.ch:353
+msgid "! Improper format definition"
+msgstr "! Ungültige Formatdefinition"
+
+#: ctang-i18n.ch:271
+msgid "! Improper hex number following @l"
+msgstr "! Ungültige Hexadezimalzahl nach @l"
+
+#: cweav-i18n.ch:339 cweav-i18n.ch:345
+msgid "! Improper macro definition"
+msgstr "! Ungültige Makrodefinition"
+
+#: comm-i18n.ch:96
+msgid "! Include file name not given"
+msgstr "! Name der Einfügedatei nicht angegeben"
+
+#: comm-i18n.ch:110
+msgid "! Include file name too long"
+msgstr "! Name der Einfügedatei zu lang"
+
+#: comm-i18n.ch:312
+msgid "! Include path too long"
+msgstr "! Einfügepfad zu lang"
+
+#: ctang-i18n.ch:99 cweav-i18n.ch:181
+msgid "! Input ended in mid-comment"
+msgstr "! Eingabe endete mitten in einem Kommentar"
+
+#: ctang-i18n.ch:119 cweav-i18n.ch:39
+msgid "! Input ended in middle of string"
+msgstr "! Eingabe endete mitten in einer Zeichenkette"
+
+#: ctang-i18n.ch:161 cweav-i18n.ch:61
+msgid "! Input ended in section name"
+msgstr "! Eingabe endete in einem Abschnittnamen"
+
+#: comm-i18n.ch:30
+msgid "! Input line too long"
+msgstr "! Eingabezeile zu lang"
+
+#: cweav-twill.ch:549
+msgid "! Location in meaning should be followed by space"
+msgstr "! Herkunftsort in Bedeutung sollte Leerzeichen folgen"
+
+#: ctang-i18n.ch:211
+msgid "! Misplaced @h"
+msgstr "! Falsch platziertes @h"
+
+#: cweav-i18n.ch:271
+msgid "! Missing '|' after C text"
+msgstr "! Fehlendes `|' nach C-Text"
+
+#: comm-i18n.ch:38
+msgid "! Missing @x in change file"
+msgstr "! Fehlendes @x in der Änderungsdatei"
+
+#: ctang-i18n.ch:225
+msgid "! Missing `@ ' before a named section"
+msgstr "! Fehlendes `@ ' vor einem Abschnittnamen"
+
+#: cweav-i18n.ch:127
+msgid "! Missing left identifier of @s"
+msgstr "! Fehlender linker Bezeichner von @s"
+
+#: cweav-i18n.ch:133
+msgid "! Missing right identifier of @s"
+msgstr "! Fehlender rechter Bezeichner von @s"
+
+#: cweav-i18n.ch:187 cweav-i18n.ch:201
+msgid "! Missing } in comment"
+msgstr "! Fehlende } in Kommentar"
+
+#: ctang-i18n.ch:181
+msgid "! Nesting of section names not allowed"
+msgstr "! Verschachtelung von Abschnittnamen nicht erlaubt"
+
+#: cweav-twill.ch:1022
+msgid "! Only @$ is allowed in aux and bux files"
+msgstr "! Nur @$ ist in aux- und bux-Dateien erlaubt"
+
+#: ctang-i18n.ch:277
+msgid "! Replacement string in @l too long"
+msgstr "! Ersetzungstext in @l zu lang"
+
+#: ctang-i18n.ch:175 cweav-i18n.ch:75
+msgid "! Section name didn't end"
+msgstr "! Abschnittname nicht beendet"
+
+#: ctang-i18n.ch:99
+msgid "! Section name ended in mid-comment"
+msgstr "! Abschnittname endete mitten in einem Kommentar"
+
+#: ctang-i18n.ch:113 ctang-i18n.ch:153 cweav-i18n.ch:33
+msgid "! String didn't end"
+msgstr "! Zeichenkette nicht beendet"
+
+#: cweav-i18n.ch:325
+msgid "! TeX string should be in C text only"
+msgstr "! TeX-Zeichenkette sollte nur in C-Text stehen"
+
+#: comm-i18n.ch:262 comm-i18n.hch:34
+msgid "! This can't happen: "
+msgstr "! Das kann nicht sein: "
+
+#: cweav-twill.ch:310
+msgid "! Title name didn't end"
+msgstr "! Titel nicht beendet"
+
+#: cweav-twill.ch:308
+msgid "! Title should be enclosed in braces or doublequotes"
+msgstr "! Titel sollte in geschweiften Klammern oder Anführungszeichen stehen"
+
+#: comm-i18n.ch:102
+msgid "! Too many nested includes"
+msgstr "! Zu viele verschachtelte Einfügungen"
+
+#: ctang-i18n.ch:241
+msgid "! Unrecognized escape sequence"
+msgstr "! Unbekannte Escape-Sequenz"
+
+#: comm-i18n.ch:283
+msgid ""
+"! Usage: ctangle [options] webfile[.w] [{changefile[.ch]|-} [outfile[.c]]]\n"
+msgstr ""
+"! Aufruf: ctangle [Optionen] webfile[.w] [{changefile[.ch]|-} [outfile[.c]]]\n"
+"Optionen sind (+ schaltet ein, - schaltet aus, Vorgabe in Klammern):\n"
+"b [+] Gib eine Startmeldung aus\n"
+"h [+] Bestätige einen fehlerfreien Lauf\n"
+"p [+] Zeige einen Zwischenbericht\n"
+"s [-] Melde die Verbrauchsstatistik\n"
+
+#: comm-i18n.ch:288
+msgid ""
+"! Usage: cweave [options] webfile[.w] [{changefile[.ch]|-} [outfile[.tex]]]\n"
+msgstr ""
+"! Aufruf: cweave [Optionen] webfile[.w] [{changefile[.ch]|-} [outfile[.tex]]]\n"
+"Optionen sind (+ schaltet ein, - schaltet aus, Vorgabe in Klammern):\n"
+"b [+] Gib eine Startmeldung aus\n"
+"e [-] Schließe C-Material in \\PB-Klammern ein\n"
+"f [+] Erzwinge Zeilenumbrüche nach jeder Anweisung\n"
+"h [+] Bestätige einen fehlerfreien Lauf\n"
+"i [+] Rücke Parameterdeklarationen ein\n"
+"lX [ ] Verwende die Makros für Sprache X aus Xcwebmac.tex\n"
+"o [+] Trenne Deklarationen und Anweisungen\n"
+"p [+] Zeige einen Zwischenbericht\n"
+"s [-] Melde die Verbrauchsstatistik\n"
+"x [+] Füge Indexe und Inhaltsverzeichnisse ein\n"
+
+#: comm-i18n.ch:291
+msgid ""
+"! Usage: ctwill [options] webfile[.w] [{changefile[.ch]|-} [outfile[.tex]]]\n"
+msgstr ""
+"! Aufruf: ctwill [Optionen] webfile[.w] [{changefile[.ch]|-} [outfile[.tex]]]\n"
+"Optionen sind (+ schaltet ein, - schaltet aus, Vorgabe in Klammern):\n"
+"b [+] Gib eine Startmeldung aus\n"
+"e [-] Schließe C-Material in \\PB-Klammern ein\n"
+"f [+] Erzwinge Zeilenumbrüche nach jeder Anweisung\n"
+"h [+] Bestätige einen fehlerfreien Lauf\n"
+"i [+] Rücke Parameterdeklarationen ein\n"
+"lX [ ] Verwende die Makros für Sprache X aus Xcwebmac.tex\n"
+"o [+] Trenne Deklarationen und Anweisungen\n"
+"P [+] Benutze 'proofmac.tex' statt 'ctwimac.tex'\n"
+"p [+] Zeige einen Zwischenbericht\n"
+"s [-] Melde die Verbrauchsstatistik\n"
+"x [+] Füge Indexe und Inhaltsverzeichnisse ein\n"
+
+#: ctang-i18n.ch:131 cweav-i18n.ch:53 cweav-i18n.ch:117
+msgid "! Use @l in limbo only"
+msgstr "! Verwende @l ausschließlich im Einführungsteil"
+
+#: ctang-i18n.ch:189 cweav-i18n.ch:103
+msgid "! Verbatim string didn't end"
+msgstr "! Verbatim-Zeichenkette nicht beendet"
+
+#: comm-i18n.ch:68
+msgid "! Where is the matching @y?"
+msgstr "! Wo ist das zugehörige @y?"
+
+#: comm-i18n.ch:132
+msgid "! Where is the matching @z?"
+msgstr "! Wo ist das zugehörige @z?"
+
+#: cweav-i18n.ch:369
+msgid "! You can't do that in C text"
+msgstr "! Das geht nicht im C-Text"
+
+#: cweav-i18n.ch:331
+msgid "! You can't do that in TeX text"
+msgstr "! Das geht nicht im TeX-Text"
+
+#: cweav-i18n.ch:361
+msgid "! You need an = sign after the section name"
+msgstr "! Hinter dem Abschnittnamen muss ein = Zeichen stehen"
+
+#: ctang-i18n.ch:297 cweav-i18n.ch:437
+#, c-format
+msgid "%ld bytes (out of %ld)\n"
+msgstr "%ld Bytes (von %ld)\n"
+
+#: cweav-i18n.ch:435
+#, c-format
+msgid "%ld cross-references (out of %ld)\n"
+msgstr "%ld Querverweise (von %ld)\n"
+
+#: cweav-i18n.ch:446 cweav-i18n.ch:449
+#, c-format
+msgid "%ld levels (out of %ld)\n"
+msgstr "%ld Ebenen (von %ld)\n"
+
+#: ctang-i18n.ch:293 cweav-i18n.ch:433
+#, c-format
+msgid "%ld names (out of %ld)\n"
+msgstr "%ld Namen (von %ld)\n"
+
+#: ctang-i18n.ch:295
+#, c-format
+msgid "%ld replacement texts (out of %ld)\n"
+msgstr "%ld Ersetzungstexte (von %ld)\n"
+
+#: cweav-i18n.ch:440
+#, c-format
+msgid "%ld scraps (out of %ld)\n"
+msgstr "%ld Scraps (von %ld)\n"
+
+#: cweav-twill.ch:1350
+#, c-format
+msgid "%ld temp meanings (out of %ld)\n"
+msgstr "%ld temporäre Bedeutungen (von %ld)\n"
+
+#: cweav-i18n.ch:442
+#, c-format
+msgid "%ld texts (out of %ld)\n"
+msgstr "%ld Texte (von %ld)\n"
+
+#: ctang-i18n.ch:299 cweav-i18n.ch:444
+#, c-format
+msgid "%ld tokens (out of %ld)\n"
+msgstr "%ld Token (von %ld)\n"
+
+#: comm-i18n.ch:242
+msgid "(Did you see the warning message above?)"
+msgstr "(Hast du die obige Warnung gesehen?)"
+
+#: comm-i18n.ch:240
+msgid "(No errors were found.)"
+msgstr "(Keine Fehler gefunden.)"
+
+#: comm-i18n.ch:244
+msgid "(Pardon me, but I think I spotted something wrong.)"
+msgstr "(Entschuldige bitte, aber ich glaube, etwas stimmt nicht.)"
+
+#: comm-i18n.ch:246
+msgid "(That was a fatal error, my friend.)"
+msgstr "(Mensch, das war ein böser Fehler.)"
+
+#: comm-i18n.ch:244
+#, c-format
+msgid ". (l. %d of change file)\n"
+msgstr ". (Zeile %d der Änderungsdatei)\n"
+
+#: comm-i18n.ch:226
+#, c-format
+msgid ". (l. %d of include file %s)\n"
+msgstr ". (Zeile %d der Einfügedatei %s)\n"
+
+#: comm-i18n.ch:225
+#, c-format
+msgid ". (l. %d)\n"
+msgstr ". (Zeile %d)\n"
+
+#: comm-i18n.ch:188
+msgid ""
+">\n"
+" and <"
+msgstr ""
+">\n"
+" und <"
+
+#: comm-i18n.ch:214
+msgid ""
+">,\n"
+" which abbreviates <"
+msgstr ""
+">,\n"
+" einer Abkürzung von <"
+
+#: ctang-i18n.ch:75 cweav-i18n.ch:395
+msgid "Done."
+msgstr "Fertig."
+
+#: cweav-i18n.ch:439
+msgid "Parsing:"
+msgstr "Parsen:"
+
+#: cweav-i18n.ch:448
+msgid "Sorting:"
+msgstr "Sortieren:"
+
+#: ctang-i18n.ch:17
+msgid "This is CTANGLE (Version 3.64 [CWEBbin 2019])"
+msgstr "Dies ist CTANGLE (Version 3.64 [CWEBbin 2019])"
+
+#: cweav-i18n.ch:17
+msgid "This is CWEAVE (Version 3.64 [CWEBbin 2019])"
+msgstr "Dies ist CWEAVE (Version 3.64 [CWEBbin 2019])"
+
+#: cweav-twill.ch:49
+msgid "This is CTWILL (Version 3.64 [CWEBbin 2019])"
+msgstr "Dies ist CTWILL (Version 3.64 [CWEBbin 2019])"
+
+#: cweav-i18n.ch:301 cweav-i18n.ch:309
+msgid "buffer"
+msgstr "Puffer"
+
+#: comm-i18n.ch:149 comm-i18n.ch:159 comm-i18n.ch:174
+msgid "byte memory"
+msgstr "Byte-Speicher"
+
+#: cweav-i18n.ch:25
+msgid "cross-reference"
+msgstr "Querverweise"
+
+#: cweav-twill.ch:815
+msgid "find type"
+msgstr "Auffindetyp"
+
+#: cweav-twill.ch:754
+msgid "inner"
+msgstr "inner"
+
+#: ctang-i18n.ch:91
+msgid "macro defs have strange char"
+msgstr "Unpassendes Zeichen in einer Makrodefinition"
+
+#: comm-i18n.ch:150 comm-i18n.ch:160 comm-i18n.ch:168
+msgid "name"
+msgstr "Bezeichner"
+
+#: comm-i18n.ch:74
+msgid "of the preceding lines failed to match"
+msgstr "der vorangegangenen Zeilen stimmen nicht überein"
+
+#: ctang-i18n.ch:49
+msgid "output files"
+msgstr "Ausgabedateien"
+
+#: cweav-i18n.ch:255
+msgid "scrap/token/text"
+msgstr "Scrap/Token/Text"
+
+#: cweav-i18n.ch:111
+msgid "section number"
+msgstr "Abschnittnummer"
+
+#: cweav-i18n.ch:403
+msgid "sorting"
+msgstr "Sortieren"
+
+#: ctang-i18n.ch:33 cweav-i18n.ch:279
+msgid "stack"
+msgstr "Stack"
+
+#: cweav-twill.ch:562
+msgid "temp meanings"
+msgstr "Temporäre Bedeutung"
+
+#: ctang-i18n.ch:203 cweav-i18n.ch:223
+msgid "text"
+msgstr "Text"
+
+#: cweav-twill.ch:311
+msgid "titles"
+msgstr "Titel"
+
+#: ctang-i18n.ch:25 ctang-i18n.ch:197 cweav-i18n.ch:173 cweav-i18n.ch:217
+#: cweav-i18n.ch:231
+msgid "token"
+msgstr "Token"
diff --git a/Build/source/texk/web2c/cwebdir/po/de/web2c-help.mo b/Build/source/texk/web2c/cwebdir/po/de/web2c-help.mo
new file mode 100644
index 00000000000..140d8d33843
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/po/de/web2c-help.mo
Binary files differ
diff --git a/Build/source/texk/web2c/cwebdir/po/de/web2c-help.po b/Build/source/texk/web2c/cwebdir/po/de/web2c-help.po
new file mode 100644
index 00000000000..33a5fb22463
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/po/de/web2c-help.po
@@ -0,0 +1,114 @@
+# International version of CWEB (CWEBbin, TeXLive).
+# Copyright (C) 2018 Andreas Scherer et al.
+# This file is distributed under the same license as the CWEB package.
+# Andreas Scherer <https://ascherer.github.io>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: CWEBbin 2018\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2019-01-01 15:41+0100\n"
+"PO-Revision-Date: 2018-12-30 10:37+0100\n"
+"Last-Translator: Andreas Scherer <andreas_github@freenet.de>\n"
+"Language-Team: German\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: help.h:52
+msgid "Usage: ctangle [OPTIONS] WEBFILE[.w] [{CHANGEFILE[.ch]|-} [OUTFILE[.c]]]"
+msgstr "Aufruf: ctangle [OPTIONS] WEBFILE[.w] [{CHANGEFILE[.ch]|-} [OUTFILE[.c]]]"
+
+#: help.h:53
+msgid " Tangle WEBFILE with CHANGEFILE into a C/C++ program."
+msgstr " Verknüpfe WEBFILE mit CHANGEFILE in ein C/C++ Programm."
+
+#: help.h:54 help.h:71 help.h:94
+msgid " Default CHANGEFILE is /dev/null;"
+msgstr " Vorgabe für CHANGEFILE ist /dev/null;"
+
+#: help.h:55
+msgid " C output goes to the basename of WEBFILE extended with `.c'"
+msgstr " C Ausgabe geht in den Hauptnamen des WEBFILE erweitert um `.c',"
+
+#: help.h:56 help.h:73 help.h:96
+msgid " unless otherwise specified by OUTFILE; in this case, '-' specifies"
+msgstr " sofern nicht ein anderes OUTFILE angegeben ist; in diesem Fall"
+
+#: help.h:57 help.h:74 help.h:97
+msgid " a null CHANGEFILE."
+msgstr " bezeichnet '-' ein leeres CHANGEFILE."
+
+#: help.h:59 help.h:76 help.h:99
+msgid "+b print banner line on terminal"
+msgstr "+b schreibe die Startmeldung"
+
+#: help.h:60 help.h:78 help.h:101
+msgid "+h print success message on completion"
+msgstr "+h schreibe die Erfolgsmeldung am Ende"
+
+#: help.h:61 help.h:81 help.h:105
+msgid "+p print progress report messages"
+msgstr "+p schreibe die Fortschrittsmeldungen"
+
+#: help.h:62 help.h:85 help.h:109
+msgid "+s print usage statistics"
+msgstr "+s melde die Verbrauchsstatistik"
+
+#: help.h:63 help.h:86 help.h:110
+msgid "--help display this help and exit"
+msgstr "--help zeige diesen Hilfetext und ende"
+
+#: help.h:64 help.h:87 help.h:111
+msgid "--version output version information and exit"
+msgstr "--version zeige de Versionsinformation und ende"
+
+#: help.h:69
+msgid "Usage: cweave [OPTIONS] WEBFILE[.w] [{CHANGEFILE[.ch]|-} [OUTFILE[.tex]]]"
+msgstr "Aufruf: cweave [OPTIONS] WEBFILE[.w] [{CHANGEFILE[.ch]|-} [OUTFILE[.tex]]]"
+
+#: help.h:70
+msgid " Weave WEBFILE with CHANGEFILE into a TeX document."
+msgstr " Verwebe WEBFILE mit CHANGEFILE in ein TeX Dokument."
+
+#: help.h:72 help.h:96
+msgid " TeX output goes to the basename of WEBFILE extended with `.tex'"
+msgstr " TeX Ausgabe geht in den Hauptnamen des WEBFILE erweitert um `.tex',"
+
+#: help.h:77 help.h:100
+msgid "-f do not force a newline after every C statement in output"
+msgstr "-f erzwinge keinen Zeilenumbruch nach jedem C Statement"
+
+#: help.h:79 help.h:102
+msgid "-i suppress indentation of parameter declarations"
+msgstr "-i unterdrücke die Einrückung von Parameterdeklarationen"
+
+#: help.h:80 help.h:103
+msgid "-o suppress separation of declarations and statements"
+msgstr "-o unterdrücke die Trennung von Deklarationen und Statements"
+
+#: help.h:82 help.h:106
+msgid "-x omit indices, section names, table of contents"
+msgstr "-x verzichte auf Indexe, Abschnittnamen und Inhaltsverzeichnis"
+
+#: help.h:83 help.h:107
+msgid "+e enclose C material in \\PB{...}"
+msgstr "+e schließe C Material in \\PB{...} ein"
+
+#: help.h:84 help.h:108
+msgid "+lX use macros for language X as of Xcwebmac.tex"
+msgstr "+lX benutze Macros für Sprache X aus Xcwebmac.tex"
+
+#: help.h:92
+msgid "Usage: ctwill [OPTIONS] WEBFILE[.w] [{CHANGEFILE[.ch]|-} [OUTFILE[.tex]]]"
+msgstr "Aufruf: ctwill [OPTIONS] WEBFILE[.w] [{CHANGEFILE[.ch]|-} [OUTFILE[.tex]]]"
+
+#: help.h:93
+msgid " Weave WEBFILE with CHANGEFILE into a TeX document with mini-indexes."
+msgstr " Verwebe WEBFILE mit CHANGEFILE in ein TeX Dokument mit Miniindexen."
+
+#: help.h:104
+msgid "+P \\input proofmac.tex instead of ctwimac.tex"
+msgstr "+P \\input proofmac.tex an Stelle von ctwimac.tex"
diff --git a/Build/source/texk/web2c/cwebdir/po/it/cweb.mo b/Build/source/texk/web2c/cwebdir/po/it/cweb.mo
new file mode 100644
index 00000000000..49dc5e080df
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/po/it/cweb.mo
Binary files differ
diff --git a/Build/source/texk/web2c/cwebdir/po/it/cweb.po b/Build/source/texk/web2c/cwebdir/po/it/cweb.po
new file mode 100644
index 00000000000..5bc39831967
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/po/it/cweb.po
@@ -0,0 +1,675 @@
+# International version of CWEB (CWEBbin, TeXLive).
+# Copyright (C) 2019 Andreas Scherer et al.
+# This file is distributed under the same license as the CWEB package.
+# Andreas Scherer <https://ascherer.github.io>, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: CWEBbin 2019\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2019-01-01 15:41+0100\n"
+"PO-Revision-Date: 2019-01-01 15:41+0100\n"
+"Last-Translator: Andreas Scherer <andreas_github@freenet.de>\n"
+"Language-Team: Italian\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: comm-i18n.ch:182
+msgid ""
+"\n"
+"! Ambiguous prefix: matches <"
+msgstr ""
+"\n"
+"! Prefisso ambiguo: corrispondenze trovate <"
+
+#: cweav-i18n.ch:295
+msgid ""
+"\n"
+"! C text in section name didn't end: <"
+msgstr ""
+"\n"
+"! Testo C nel nome di una sezione, non terminato: <"
+
+#: cweav-i18n.ch:287
+msgid ""
+"\n"
+"! Illegal control code in section name: <"
+msgstr ""
+"\n"
+"! Codice di controllo illegale nella sezione: <"
+
+#: cweav-i18n.ch:157
+#, c-format
+msgid ""
+"\n"
+"! Line had to be broken (output l. %d):\n"
+msgstr ""
+"\n"
+"! La linea deve essere spezzata (output l. %d):\n"
+
+#: cweav-i18n.ch:141
+msgid ""
+"\n"
+"! Never defined: <"
+msgstr ""
+"\n"
+"! Mai definito: <"
+
+#: cweav-i18n.ch:148
+msgid ""
+"\n"
+"! Never used: <"
+msgstr ""
+"\n"
+"! Mai usato: <"
+
+#: comm-i18n.ch:202
+msgid ""
+"\n"
+"! New name extends <"
+msgstr ""
+"\n"
+"! Il nuovo nome estende <"
+
+#: comm-i18n.ch:196
+msgid ""
+"\n"
+"! New name is a prefix of <"
+msgstr ""
+"\n"
+"! Il nuovo nome è un prefisso per <"
+
+#: ctang-i18n.ch:57
+msgid ""
+"\n"
+"! No program text was specified."
+msgstr ""
+"\n"
+"! Nessun testo di programma è stato specificato."
+
+#: ctang-i18n.ch:41
+msgid ""
+"\n"
+"! Not present: <"
+msgstr ""
+"\n"
+"! Non presente: <"
+
+#: comm-i18n.ch:208
+msgid ""
+"\n"
+"! Section name incompatible with <"
+msgstr ""
+"\n"
+"! Nome sezione incompatibile con <"
+
+#: ctang-i18n.ch:167 cweav-i18n.ch:67
+msgid ""
+"\n"
+"! Section name too long: "
+msgstr ""
+"\n"
+"! Nome sezione troppo lungo: "
+
+#: comm-i18n.ch:254
+#, c-format
+msgid ""
+"\n"
+"! Sorry, %s capacity exceeded"
+msgstr ""
+"\n"
+"! Spiacente, %s capacità superata"
+
+#: ctang-i18n.ch:125 cweav-i18n.ch:45
+msgid ""
+"\n"
+"! String too long: "
+msgstr ""
+"\n"
+"! Stringa troppo lunga: "
+
+#: cweav-i18n.ch:239
+#, c-format
+msgid ""
+"\n"
+"Irreducible scrap sequence in section %d:"
+msgstr ""
+"\n"
+"Sequenza scrap irriducibile nella sezione %d:"
+
+#: ctang-i18n.ch:292 cweav-i18n.ch:431
+msgid ""
+"\n"
+"Memory usage statistics:"
+msgstr ""
+"\n"
+"Statistiche uso memoria:"
+
+#: cweav-i18n.ch:247
+#, c-format
+msgid ""
+"\n"
+"Tracing after l. %d:\n"
+msgstr ""
+"\n"
+"Tracing dopo l. %d:\n"
+
+#: cweav-i18n.ch:377
+msgid ""
+"\n"
+"Writing the index..."
+msgstr ""
+"\n"
+"Scrittura dell'indice..."
+
+#: ctang-i18n.ch:63
+#, c-format
+msgid ""
+"\n"
+"Writing the output file (%s):"
+msgstr ""
+"\n"
+"Scrittura del file di output (%s):"
+
+#: cweav-i18n.ch:317
+msgid ""
+"\n"
+"Writing the output file..."
+msgstr ""
+"\n"
+"Scrittura file di output..."
+
+#: ctang-i18n.ch:69
+msgid ""
+"\n"
+"Writing the output files:"
+msgstr ""
+"\n"
+"Scrittura dei file di output:"
+
+#: ctang-i18n.ch:217
+msgid "! @d, @f and @c are ignored in C text"
+msgstr "! @d, @f e @c sono ignorati nella parte C"
+
+#: comm-i18n.ch:60
+msgid "! CWEB file ended during a change"
+msgstr "! File CWEB terminato durante un change"
+
+#: cweav-twill.ch:1026
+msgid "! Cannot open aux output file "
+msgstr "! Non posso aprire il file di aux output "
+
+#: comm-i18n.ch:88
+msgid "! Cannot open change file "
+msgstr "! Non posso aprire il change file "
+
+#: comm-i18n.ch:118
+msgid "! Cannot open include file"
+msgstr "! Non posso aprire il file include"
+
+#: cweav-i18n.ch:383
+msgid "! Cannot open index file "
+msgstr "! Non posso aprire il file per l'indice "
+
+#: comm-i18n.ch:82
+msgid "! Cannot open input file "
+msgstr "! Non posso aprire il file di input "
+
+#: comm-i18n.ch:300 comm-i18n.ch:306 ctang-i18n.ch:83 ctang-i18n.ch:307
+#: cweav-i18n.ch:457
+msgid "! Cannot open output file "
+msgstr "! Non posso aprire il file di output "
+
+#: cweav-i18n.ch:389
+msgid "! Cannot open section file "
+msgstr "! Non posso aprire il section file "
+
+#: comm-i18n.ch:46
+msgid "! Change file ended after @x"
+msgstr "! Change file terminato dopo @x"
+
+#: comm-i18n.ch:54
+msgid "! Change file ended before @y"
+msgstr "! Change file terminato prima di @y"
+
+#: comm-i18n.ch:126
+msgid "! Change file ended without @z"
+msgstr "! Change file terminato senza un @z"
+
+#: comm-i18n.ch:140
+msgid "! Change file entry did not match"
+msgstr "! C'è una voce nel change file che non corrisponde"
+
+#: cweav-i18n.ch:95
+msgid "! Control codes are forbidden in control text"
+msgstr "! I codici di controllo sono vietati nel \"control text\""
+
+#: cweav-i18n.ch:81
+msgid "! Control codes are forbidden in section name"
+msgstr "! I codici di controllo sono vietati all'interno dei nomi delle sezioni"
+
+#: cweav-i18n.ch:89
+msgid "! Control text didn't end"
+msgstr "! Control text non terminato"
+
+#: ctang-i18n.ch:249
+msgid "! Definition flushed, must start with identifier"
+msgstr "! Definizione liberata (flushed), iniziare con un identificatore"
+
+#: ctang-i18n.ch:147
+msgid "! Double @ should be used in ASCII constant"
+msgstr "! I doppi @ dovrebbero essere usati nelle costanti ASCII"
+
+#: ctang-i18n.ch:139 ctang-i18n.ch:257
+msgid "! Double @ should be used in control text"
+msgstr "! I doppi @ dovrebbero essere usati nel \"control text\""
+
+#: ctang-i18n.ch:263 cweav-i18n.ch:165
+msgid "! Double @ should be used in limbo"
+msgstr "! I doppi @ dovrebbero essere usati nel limbo"
+
+#: ctang-i18n.ch:233
+msgid "! Double @ should be used in string"
+msgstr "! I doppi @ dovrebbero essere usati nelle stringhe"
+
+#: cweav-i18n.ch:263
+msgid "! Double @ should be used in strings"
+msgstr "! I doppi @ dovrebbero essere usati nelle stringhe"
+
+#: cweav-i18n.ch:193
+msgid "! Extra } in comment"
+msgstr "! Extra } nel commento"
+
+#: comm-i18n.ch:292
+msgid "! Filename too long\n"
+msgstr "! Nome file troppo lungo\n"
+
+#: cweav-twill.ch:542
+msgid "! Identifier in meaning should be followed by space"
+msgstr "! Identifier in meaning should be followed by space"
+
+#: cweav-i18n.ch:209
+msgid "! Illegal use of @ in comment"
+msgstr "! Uso illegale di @ nel commento"
+
+#: cweav-i18n.ch:353
+msgid "! Improper format definition"
+msgstr "! Definizione di formato impropria"
+
+#: ctang-i18n.ch:271
+msgid "! Improper hex number following @l"
+msgstr "! Un numero decimale improprio segue @l"
+
+#: cweav-i18n.ch:339 cweav-i18n.ch:345
+msgid "! Improper macro definition"
+msgstr "! Definizione di macro impropria"
+
+#: comm-i18n.ch:96
+msgid "! Include file name not given"
+msgstr "! Nome del file include assente"
+
+#: comm-i18n.ch:110
+msgid "! Include file name too long"
+msgstr "! Nome file include troppo lungo"
+
+#: comm-i18n.ch:312
+msgid "! Include path too long"
+msgstr "! Path include troppo lungo"
+
+#: ctang-i18n.ch:99 cweav-i18n.ch:181
+msgid "! Input ended in mid-comment"
+msgstr "! Input terminato nel commento intermedio"
+
+#: ctang-i18n.ch:119 cweav-i18n.ch:39
+msgid "! Input ended in middle of string"
+msgstr "! Input terminato nel mezzo di una stringa"
+
+#: ctang-i18n.ch:161 cweav-i18n.ch:61
+msgid "! Input ended in section name"
+msgstr "! Input terminato all'interno del nome di una sezione"
+
+#: comm-i18n.ch:30
+msgid "! Input line too long"
+msgstr "! Linea in input troppo lunga"
+
+#: cweav-twill.ch:549
+msgid "! Location in meaning should be followed by space"
+msgstr "! Location in meaning should be followed by space"
+
+#: ctang-i18n.ch:211
+msgid "! Misplaced @h"
+msgstr "! Mal riposto @h"
+
+#: cweav-i18n.ch:271
+msgid "! Missing '|' after C text"
+msgstr "! Omesso `|' dopo il testo in C"
+
+#: comm-i18n.ch:38
+msgid "! Missing @x in change file"
+msgstr "! Omesso @x nel change file"
+
+#: ctang-i18n.ch:225
+msgid "! Missing `@ ' before a named section"
+msgstr "! Omesso `@ ' prima di una sezione con nome"
+
+#: cweav-i18n.ch:127
+msgid "! Missing left identifier of @s"
+msgstr "! Omesso identificatore sinistro di @s"
+
+#: cweav-i18n.ch:133
+msgid "! Missing right identifier of @s"
+msgstr "! Omesso identificatore destro di @s"
+
+#: cweav-i18n.ch:187 cweav-i18n.ch:201
+msgid "! Missing } in comment"
+msgstr "! Omesso } nel commento"
+
+#: ctang-i18n.ch:181
+msgid "! Nesting of section names not allowed"
+msgstr "! Nomi di sezioni l'uno dentro l'altro non consentiti"
+
+#: cweav-twill.ch:1022
+msgid "! Only @$ is allowed in aux and bux files"
+msgstr "! Only @$ is allowed in aux and bux files"
+
+#: ctang-i18n.ch:277
+msgid "! Replacement string in @l too long"
+msgstr "! Stringa sostitutiva in @l troppo lunga"
+
+#: ctang-i18n.ch:175 cweav-i18n.ch:75
+msgid "! Section name didn't end"
+msgstr "! Nome sezione non terminato"
+
+#: ctang-i18n.ch:99
+msgid "! Section name ended in mid-comment"
+msgstr "! Nome sezione terminato all'interno del commento intermedio"
+
+#: ctang-i18n.ch:113 ctang-i18n.ch:153 cweav-i18n.ch:33
+msgid "! String didn't end"
+msgstr "! Stringa non terminata"
+
+#: cweav-i18n.ch:325
+msgid "! TeX string should be in C text only"
+msgstr "! Stringa TeX dovrebbe stare solo nel testo in C"
+
+#: comm-i18n.ch:262 comm-i18n.hch:34
+msgid "! This can't happen: "
+msgstr "! Questo non può avvenire: "
+
+#: cweav-twill.ch:310
+msgid "! Title name didn't end"
+msgstr "! Nome titolo non terminato"
+
+#: cweav-twill.ch:308
+msgid "! Title should be enclosed in braces or doublequotes"
+msgstr "! Title should be enclosed in braces or doublequotes"
+
+#: comm-i18n.ch:102
+msgid "! Too many nested includes"
+msgstr "! Troppi include annidati"
+
+#: ctang-i18n.ch:241
+msgid "! Unrecognized escape sequence"
+msgstr "! Sequenza di escape non riconosciuta"
+
+#: comm-i18n.ch:283
+msgid ""
+"! Usage: ctangle [options] webfile[.w] [{changefile[.ch]|-} [outfile[.c]]]\n"
+msgstr ""
+"! Uso: ctangle [Opzioni] webfile[.w] [{changefile[.ch]|-} [outfile[.c]]]\n"
+"Opzioni (+ attiva, - disattiva, default indicato tra parentesi quadre):\n"
+"b [+] stampa una riga di titoli\n"
+"h [+] stampa un messaggio di \"buon fine\"\n"
+"p [+] mostra andamento elaborazione\n"
+"s [-] mostra statistiche\n"
+
+#: comm-i18n.ch:288
+msgid ""
+"! Usage: cweave [options] webfile[.w] [{changefile[.ch]|-} [outfile[.tex]]]\n"
+msgstr ""
+"! Uso: cweave [Opzioni] webfile[.w] [{changefile[.ch]|-} [outfile[.tex]]]\n"
+"Opzioni (+ attiva, - disattiva, default indicato tra parentesi quadre):\n"
+"b [+] stampa una riga di titoli\n"
+"e [-] C material in \\PB parentesi\n"
+"f [+] forza i line break\n"
+"h [+] stampa un messaggio di \"buon fine\"\n"
+"i [+] rientranza delle dichiarazioni\n"
+"lX [ ] usa macro in lingua X contenute in Xcwebmac.tex\n"
+"o [+] separa dichiarazioni e statement\n"
+"p [+] mostra andamento elaborazione\n"
+"s [-] mostra statistiche\n"
+"x [+] include indici\n"
+
+#: comm-i18n.ch:291
+msgid ""
+"! Usage: ctwill [options] webfile[.w] [{changefile[.ch]|-} [outfile[.tex]]]\n"
+msgstr ""
+"! Uso: ctwill [Opzioni] webfile[.w] [{changefile[.ch]|-} [outfile[.tex]]]\n"
+"Opzioni (+ attiva, - disattiva, default indicato tra parentesi quadre):\n"
+"b [+] stampa una riga di titoli\n"
+"e [-] C material in \\PB parentesi\n"
+"f [+] forza i line break\n"
+"h [+] stampa un messaggio di \"buon fine\"\n"
+"i [+] rientranza delle dichiarazioni\n"
+"lX [ ] usa macro in lingua X contenute in Xcwebmac.tex\n"
+"o [+] separa dichiarazioni e statement\n"
+"P [+] include 'proofmac.tex' invece di 'ctwimac.tex'\n"
+"p [+] mostra andamento elaborazione\n"
+"s [-] mostra statistiche\n"
+"x [+] include indici\n"
+
+#: ctang-i18n.ch:131 cweav-i18n.ch:53 cweav-i18n.ch:117
+msgid "! Use @l in limbo only"
+msgstr "! Usare @l solo nel limbo"
+
+#: ctang-i18n.ch:189 cweav-i18n.ch:103
+msgid "! Verbatim string didn't end"
+msgstr "! Stringa verbatim non terminata"
+
+#: comm-i18n.ch:68
+msgid "! Where is the matching @y?"
+msgstr "! Dov'è il corrispondente @y?"
+
+#: comm-i18n.ch:132
+msgid "! Where is the matching @z?"
+msgstr "! Dov'è il corrispondente @z?"
+
+#: cweav-i18n.ch:369
+msgid "! You can't do that in C text"
+msgstr "! Non puoi fare quello nella parte in C"
+
+#: cweav-i18n.ch:331
+msgid "! You can't do that in TeX text"
+msgstr "! Non puoi fare quello nel testo in TeX"
+
+#: cweav-i18n.ch:361
+msgid "! You need an = sign after the section name"
+msgstr "! È necessario un segno di = dopo il nome della sezione"
+
+#: ctang-i18n.ch:297 cweav-i18n.ch:437
+#, c-format
+msgid "%ld bytes (out of %ld)\n"
+msgstr "%ld byte (fuori da %ld)\n"
+
+#: cweav-i18n.ch:435
+#, c-format
+msgid "%ld cross-references (out of %ld)\n"
+msgstr "%ld riferimenti incrociati (fuori da %ld)\n"
+
+#: cweav-i18n.ch:446 cweav-i18n.ch:449
+#, c-format
+msgid "%ld levels (out of %ld)\n"
+msgstr "%ld livelli (fuori da %ld)\n"
+
+#: ctang-i18n.ch:293 cweav-i18n.ch:433
+#, c-format
+msgid "%ld names (out of %ld)\n"
+msgstr "%ld nomi (fuori da %ld)\n"
+
+#: ctang-i18n.ch:295
+#, c-format
+msgid "%ld replacement texts (out of %ld)\n"
+msgstr "%ld replacement text (fuori da %ld)\n"
+
+#: cweav-i18n.ch:440
+#, c-format
+msgid "%ld scraps (out of %ld)\n"
+msgstr "%ld scrap (fuori da %ld)\n"
+
+#: cweav-twill.ch:1350
+#, c-format
+msgid "%ld temp meanings (out of %ld)\n"
+msgstr "%ld temp meanings (fuori da %ld)\n"
+
+#: cweav-i18n.ch:442
+#, c-format
+msgid "%ld texts (out of %ld)\n"
+msgstr "%ld text (fuori da %ld)\n"
+
+#: ctang-i18n.ch:299 cweav-i18n.ch:444
+#, c-format
+msgid "%ld tokens (out of %ld)\n"
+msgstr "%ld token (fuori da %ld)\n"
+
+#: comm-i18n.ch:242
+msgid "(Did you see the warning message above?)"
+msgstr "(Hai visto i messaggi di warning sopra?)"
+
+#: comm-i18n.ch:240
+msgid "(No errors were found.)"
+msgstr "(Nessun errore trovato.)"
+
+#: comm-i18n.ch:244
+msgid "(Pardon me, but I think I spotted something wrong.)"
+msgstr "(Scusa, ma credo che sia avvenuto qualcosa di errato.)"
+
+#: comm-i18n.ch:246
+msgid "(That was a fatal error, my friend.)"
+msgstr "(Caro amico, si è verificato un errore importante.)"
+
+#: comm-i18n.ch:244
+#, c-format
+msgid ". (l. %d of change file)\n"
+msgstr ". (l. %d del change file)\n"
+
+#: comm-i18n.ch:226
+#, c-format
+msgid ". (l. %d of include file %s)\n"
+msgstr ". (l. %d del file include %s)\n"
+
+#: comm-i18n.ch:225
+#, c-format
+msgid ". (l. %d)\n"
+msgstr ". (l. %d)\n"
+
+#: comm-i18n.ch:188
+msgid ""
+">\n"
+" and <"
+msgstr ""
+">\n"
+" e <"
+
+#: comm-i18n.ch:214
+msgid ""
+">,\n"
+" which abbreviates <"
+msgstr ""
+">,\n"
+" che abbrevia <"
+
+#: ctang-i18n.ch:75 cweav-i18n.ch:395
+msgid "Done."
+msgstr "Fatto."
+
+#: cweav-i18n.ch:439
+msgid "Parsing:"
+msgstr "Analisi:"
+
+#: cweav-i18n.ch:448
+msgid "Sorting:"
+msgstr "Ordinamento:"
+
+#: ctang-i18n.ch:17
+msgid "This is CTANGLE (Version 3.64 [CWEBbin 2019])"
+msgstr "Questo è CTANGLE (Versione 3.64 [CWEBbin 2019])"
+
+#: cweav-i18n.ch:17
+msgid "This is CWEAVE (Version 3.64 [CWEBbin 2019])"
+msgstr "Questo è CWEAVE (Versione 3.64 [CWEBbin 2019])"
+
+#: cweav-twill.ch:49
+msgid "This is CTWILL (Version 3.64 [CWEBbin 2019])"
+msgstr "Questo è CTWILL (Versione 3.64 [CWEBbin 2019])"
+
+#: cweav-i18n.ch:301 cweav-i18n.ch:309
+msgid "buffer"
+msgstr "buffer"
+
+#: comm-i18n.ch:149 comm-i18n.ch:159 comm-i18n.ch:174
+msgid "byte memory"
+msgstr "byte di memoria"
+
+#: cweav-i18n.ch:25
+msgid "cross-reference"
+msgstr "referimento incrociato"
+
+#: cweav-twill.ch:815
+msgid "find type"
+msgstr "find type"
+
+#: cweav-twill.ch:754
+msgid "inner"
+msgstr "inner"
+
+#: ctang-i18n.ch:91
+msgid "macro defs have strange char"
+msgstr "definizione macro contiene uno strano carattere"
+
+#: comm-i18n.ch:150 comm-i18n.ch:160 comm-i18n.ch:168
+msgid "name"
+msgstr "nome"
+
+#: comm-i18n.ch:74
+msgid "of the preceding lines failed to match"
+msgstr "delle linee precedenti, corrispondenza non trovata"
+
+#: ctang-i18n.ch:49
+msgid "output files"
+msgstr "files di output"
+
+#: cweav-i18n.ch:255
+msgid "scrap/token/text"
+msgstr "scrap/token/text"
+
+#: cweav-i18n.ch:111
+msgid "section number"
+msgstr "numero sezione"
+
+#: cweav-i18n.ch:403
+msgid "sorting"
+msgstr "ordinamento"
+
+#: ctang-i18n.ch:33 cweav-i18n.ch:279
+msgid "stack"
+msgstr "stack"
+
+#: cweav-twill.ch:562
+msgid "temp meanings"
+msgstr "temp meanings"
+
+#: ctang-i18n.ch:203 cweav-i18n.ch:223
+msgid "text"
+msgstr "text"
+
+#: cweav-twill.ch:311
+msgid "titles"
+msgstr "titles"
+
+#: ctang-i18n.ch:25 ctang-i18n.ch:197 cweav-i18n.ch:173 cweav-i18n.ch:217
+#: cweav-i18n.ch:231
+msgid "token"
+msgstr "token"
diff --git a/Build/source/texk/web2c/cwebdir/po/web2c-help.pot b/Build/source/texk/web2c/cwebdir/po/web2c-help.pot
new file mode 100644
index 00000000000..592cc8f80c8
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/po/web2c-help.pot
@@ -0,0 +1,117 @@
+# International version of CWEB (CWEBbin, TeXLive).
+# Copyright (C) 2019 Andreas Scherer et al.
+# This file is distributed under the same license as the CWEB package.
+# Andreas Scherer <https://ascherer.github.io>, 2019.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: CWEBbin 2019\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2019-01-01 15:41+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: help.h:52
+msgid ""
+"Usage: ctangle [OPTIONS] WEBFILE[.w] [{CHANGEFILE[.ch]|-} [OUTFILE[.c]]]"
+msgstr ""
+
+#: help.h:53
+msgid " Tangle WEBFILE with CHANGEFILE into a C/C++ program."
+msgstr ""
+
+#: help.h:54 help.h:71 help.h:94
+msgid " Default CHANGEFILE is /dev/null;"
+msgstr ""
+
+#: help.h:55
+msgid " C output goes to the basename of WEBFILE extended with `.c'"
+msgstr ""
+
+#: help.h:56 help.h:73 help.h:96
+msgid " unless otherwise specified by OUTFILE; in this case, '-' specifies"
+msgstr ""
+
+#: help.h:57 help.h:74 help.h:97
+msgid " a null CHANGEFILE."
+msgstr ""
+
+#: help.h:59 help.h:76 help.h:99
+msgid "+b print banner line on terminal"
+msgstr ""
+
+#: help.h:60 help.h:78 help.h:101
+msgid "+h print success message on completion"
+msgstr ""
+
+#: help.h:61 help.h:81 help.h:105
+msgid "+p print progress report messages"
+msgstr ""
+
+#: help.h:62 help.h:85 help.h:109
+msgid "+s print usage statistics"
+msgstr ""
+
+#: help.h:63 help.h:86 help.h:110
+msgid "--help display this help and exit"
+msgstr ""
+
+#: help.h:64 help.h:87 help.h:111
+msgid "--version output version information and exit"
+msgstr ""
+
+#: help.h:69
+msgid ""
+"Usage: cweave [OPTIONS] WEBFILE[.w] [{CHANGEFILE[.ch]|-} [OUTFILE[.tex]]]"
+msgstr ""
+
+#: help.h:70
+msgid " Weave WEBFILE with CHANGEFILE into a TeX document."
+msgstr ""
+
+#: help.h:72 help.h:96
+msgid " TeX output goes to the basename of WEBFILE extended with `.tex'"
+msgstr ""
+
+#: help.h:77 help.h:100
+msgid "-f do not force a newline after every C statement in output"
+msgstr ""
+
+#: help.h:79 help.h:102
+msgid "-i suppress indentation of parameter declarations"
+msgstr ""
+
+#: help.h:80 help.h:103
+msgid "-o suppress separation of declarations and statements"
+msgstr ""
+
+#: help.h:82 help.h:106
+msgid "-x omit indices, section names, table of contents"
+msgstr ""
+
+#: help.h:83 help.h:107
+msgid "+e enclose C material in \\PB{...}"
+msgstr ""
+
+#: help.h:84 help.h:108
+msgid "+lX use macros for language X as of Xcwebmac.tex"
+msgstr ""
+
+#: help.h:92
+msgid ""
+"Usage: ctwill [OPTIONS] WEBFILE[.w] [{CHANGEFILE[.ch]|-} [OUTFILE[.tex]]]"
+msgstr ""
+
+#: help.h:93
+msgid " Weave WEBFILE with CHANGEFILE into a TeX document with mini-indexes."
+msgstr ""
+
+#: help.h:104
+msgid "+P \\input proofmac.tex instead of ctwimac.tex"
+msgstr ""
diff --git a/Build/source/texk/web2c/cwebdir/prod-twill.w b/Build/source/texk/web2c/cwebdir/prod-twill.w
new file mode 100644
index 00000000000..abeb8bea6c0
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/prod-twill.w
@@ -0,0 +1,303 @@
+% This file is part of CTWILL, a modification of CWEB.
+% This program by Silvio Levy and Donald E. Knuth
+% is based on a program by Knuth.
+% It is distributed WITHOUT ANY WARRANTY, express or implied.
+% Version 3.6 --- May 2000
+%
+@ Here is a table of all the productions. Each production that
+combines two or more consecutive scraps implicitly inserts a {\tt \$}
+where necessary, that is, between scraps whose abutting boundaries
+have different |mathness|. In this way we never get double {\tt\$\$}.
+
+% The following kludge is needed because \newcount, \newdimen, and \+
+% are "\outer" control sequences that cannot be used in skipped text!
+\newcount\prodno \newdimen\midcol \let\+\relax
+
+\def\v{\char'174}
+\mathchardef\RA="3221 % right arrow
+\mathchardef\BA="3224 % double arrow
+
+A translation is provided when the resulting scrap is not merely a
+juxtaposition of the scraps it comes from. An asterisk$^*$ next to a scrap
+means that its first identifier gets an underlined entry in the index,
+via the function |make_underlined|. Two asterisks$^{**}$ means that both
+|make_underlined| and |make_reserved| are called; that is, the
+identifier's ilk becomes |raw_int|. A dagger \dag\ before the
+production number refers to the notes at the end of this section,
+which deal with various exceptional cases.
+
+We use \\{in}, \\{out}, \\{back} and
+\\{bsp} as shorthands for |indent|, |outdent|, |backup| and
+|break_space|, respectively.
+
+\begingroup \lineskip=4pt
+\def\alt #1 #2
+{$\displaystyle\Bigl\{\!\matrix{\strut\hbox{#1}\cr
+ \strut\hbox{#2}\cr}\!\Bigr\}$ }
+\def\altt #1 #2 #3
+{$\displaystyle\Biggl\{\!\matrix{\strut\hbox{#1}\cr\hbox{#2}\cr
+ \strut\hbox{#3}\cr}\!\Biggr\}$ }
+\def\malt #1 #2
+{$\displaystyle\matrix{\strut\hbox{#1}\hfill\cr\strut\hbox{#2}\hfill\cr}$}
+\def\maltt #1 #2 #3
+{$\displaystyle\matrix{\strut\hbox{#1}\hfill\cr\hbox{#2}\hfill\cr
+ \strut\hbox{#3}\hfill\cr}$}
+\yskip
+\prodno=0 \midcol=2.5in
+\def\theprodno{\number\prodno \global\advance\prodno by1\enspace}
+\def\dagit{\dag\theprodno}
+\def\+#1&#2&#3&#4\cr{\def\next{#1}%
+ \line{\hbox to 2em{\hss
+ \ifx\next\empty\theprodno\else\next\fi}\strut
+ \ignorespaces#2\hfil\hbox to\midcol{$\RA$
+ \ignorespaces#3\hfil}\quad \hbox to1.45in{\ignorespaces#4\hfil}}}
+\+\relax & LHS & RHS \hfill Translation & Example\cr
+\yskip
+\+& \altt\\{any} {\\{any} \\{any}} {\\{any} \\{any} \\{any}}
+|insert| & \altt\\{any} {\\{any} \\{any}} {\\{any} \\{any} \\{any}}
+& stmt; \ /$\ast\,$comment$\,*$/\cr
+\+& |exp| \altt|lbrace| |int_like| |decl|
+ & |fn_decl| \altt|lbrace| |int_like| |decl|
+ \hfill $F=E^*\,|in|\,|in|$ & \malt {\\{main}()$\{$}
+ {\\{main}$(\\{ac},\\{av})$ \&{int} \\{ac};} \cr
+\+& |exp| |unop| & |exp| & |x++|\cr
+\+& |exp| \alt |binop| |ubinop| |exp| & |exp| & \malt {|x/y|} {|x+y|} \cr
+\+& |exp| |comma| |exp| & |exp| \hfill $EC\,|opt|9\,E$& |f(x,y)|\cr
+\+& |exp| \alt {|lpar| |rpar|} |cast| |colon| &
+ |exp| \alt {|lpar| |rpar|} |cast| |base| &
+ \malt \&C|()|: {\&C|int i)|:} \cr
+\+& |exp| |semi| & |stmt| & |x=0;|\cr
+\+& |exp| |colon| & |tag| \hfill $E^*C$ & |found:|\cr
+\+& |exp| |rbrace| & |stmt| |rbrace| & end of \&{enum} list\cr
+\+& |exp| \alt {|lpar| |rpar|} |cast| \alt|const_like| |case_like| &
+ |exp| \alt {|lpar| |rpar|} |cast| \hfill
+ \alt $R=R\.\ C$ $C_1=C_1\.\ C_2$ &
+ \malt {|f() const|} {|f(int) throw|} \cr
+\+& |exp| \alt |exp| |cast| & |exp| & |time()|\cr
+\+& |lpar| \alt |exp| |ubinop| |rpar| & |exp| & \malt{|(x)|} {|(*)|} \cr
+\+& |lpar| |rpar| & |exp| \hfill $L\.{\\,}R$ & functions, declarations\cr
+\+& |lpar| \altt |decl_head| |int_like| |cast| |rpar| & |cast| & |(char*)|\cr
+\+& |lpar| \altt |decl_head| |int_like| |exp| |comma| & |lpar| \hfill
+ $L$\,\altt $D$ $I$ $E$ $C$\,|opt|9 & |(int,|\cr
+\+& |lpar| \alt |stmt| |decl| & |lpar| \hfill \alt {$LS\.\ $} {$LD\.\ $} &
+ \malt {|(k=5;|} {|(int k=5;|} \cr
+\+& |unop| \alt |exp| |int_like| & |exp| &
+ \malt |!x| |~|\&C \cr
+\+& |ubinop| |cast| |rpar| & |cast| |rpar| \hfill
+ $C=\.\{U\.\}C$ & |*|\&{CPtr}) \cr
+\+& |ubinop| \alt|exp| |int_like| & \alt|exp| |int_like| \hfill
+ \.\{$U$\.\}\alt$E$ $I$ & \malt |*x| |*|\&{CPtr} \cr
+\+& |ubinop| |binop| & |binop| \hfill $|math_rel|\,U\.\{B\.\}\.\}$ & |*=|\cr
+\+& |binop| |binop| & |binop| \hfill
+ $|math_rel|\,\.\{B_1\.\}\.\{B_2\.\}\.\}$ & |>>=|\cr
+\+& |cast| \alt |lpar| |exp| & \alt |lpar| |exp| \hfill
+ \alt $CL$ $C\.\ E$ & \malt |(double)(x+2)| |(double)x| \cr
+\+& |cast| |semi| & |exp| |semi| & |(int);|\cr
+\+& |sizeof_like| |cast| & |exp| & |sizeof (double)|\cr
+\+& |sizeof_like| |exp| & |exp| \hfill $S\.\ E$ & |sizeof x|\cr
+\+& |int_like| \alt|int_like| |struct_like| &
+ \alt|int_like| |struct_like| \hfill $I\.\ $\alt $I$ $S$
+ \unskip& |extern char|\cr
+\+& |int_like| |exp| \alt|raw_int| |struct_like| &
+ |int_like| \alt|raw_int| |struct_like| & |extern "Ada" int|\cr
+\+& |int_like| \altt|exp| |ubinop| |colon| &
+ |decl_head| \altt|exp| |ubinop| |colon| \hfill
+ $D=I$\.\ & \maltt|int x| |int*x| |unsigned:| \cr
+\+& |int_like| \alt |semi| |binop| & |decl_head| \alt |semi| |binop| &
+ \malt |int x;| {\&{int} $f(\&{int}=4)$} \cr
+\+& |public_like| |colon| & |tag| & \&{private}:\cr
+\+& |public_like| & |int_like| & \&{private}\cr
+\+& |colcol| \alt|exp| |int_like| & \alt|exp| |int_like| \hfill
+ |qualifier| $C$ \alt$E$ $I$ & \&C\DC$x$\cr
+\+& |colcol| |colcol| & |colcol| & \&C\DC\&B\DC\cr
+\+& |decl_head| |comma| & |decl_head| \hfill $DC\.\ $ & |int x,|\cr
+\+& |decl_head| |ubinop| & |decl_head| \hfill $D\.\{U\.\}$ & |int *|\cr
+\+\dagit& |decl_head| |exp| & |decl_head| \hfill $DE^*$ & |int x|\cr
+\+& |decl_head| \alt|binop| |colon| |exp| \altt|comma| |semi| |rpar| &
+ |decl_head| \altt|comma| |semi| |rpar| \hfill
+ $D=D$\alt $B$ $C$ \unskip$E$ & \malt {\&{int} $f(\&{int}\ x=2)$} |int b:1| \cr
+\+& |decl_head| |cast| & |decl_head| & |int f(int)|\cr
+\+& |decl_head| \altt|int_like| |lbrace| |decl| & |fn_decl|
+ \altt|int_like| |lbrace| |decl| \hfill $F=D\,|in|\,|in|$
+ & |long time () {|\cr
+\+& |decl_head| |semi| & |decl| & |int n;|\cr
+\+& |decl| |decl| & |decl| \hfill $D_1\,|force|\,D_2$ & |int n;double x;|\cr
+\+& |decl| \alt|stmt| |function| & \alt|stmt| |function|
+ \hfill $D\,|big_force|\,$\alt $S$ $F$ \unskip& \&{extern} $n$;
+ \\{main} ()|{}|\cr
+\+& |base| \alt |int_like| |exp| |comma| & |base| \hfill
+ $B$\.\ \alt $I$ $E$ \unskip$C$\,|opt|9
+ & \malt {: \&{public} \&A,} {: $i(5)$,} \cr
+\+& |base| \alt |int_like| |exp| |lbrace| & |lbrace| \hfill
+ $B$\.\ \alt $I$ $E$ \unskip\.\ $L$ & \&D : \&{public} \&A $\{$\cr
+\+& |struct_like| |lbrace| & |struct_head| \hfill $S\.\ L$ & |struct {|\cr
+\+& |struct_like| \alt|exp| |int_like| |semi| & |decl_head| |semi|
+ \hfill $S\.\ $\alt $E^{**}$ $I^{**}$ & \&{struct} \&{forward};\cr
+\+& |struct_like| \alt|exp| |int_like| |lbrace| & |struct_head| \hfill
+ $S\.\ $\alt $E^{**}$ $I^{**}$ \unskip $\.\ L$ &
+ \&{struct} \&{name\_info} $\{$\cr
+\+& |struct_like| \alt|exp| |int_like| |colon| &
+ |struct_like| \alt|exp| |int_like| |base| & |class| \&C :\cr
+\+\dagit& |struct_like| \alt|exp| |int_like| & |int_like|
+ \hfill $S\.\ $\alt$E$ $I$ & \&{struct} \&{name\_info} $z$;\cr
+\+& |struct_head| \altt|decl| |stmt| |function| |rbrace| & |int_like|\hfill
+ $S\,\\{in}\,|force|$\altt$D$ $S$ $F$ $\\{out}\,|force|\,R$ &
+ |struct {| declaration |}|\cr
+\+& |struct_head| |rbrace| & |int_like|\hfill $S\.{\\,}R$ & |class C{}|\cr
+\+& |fn_decl| |decl| & |fn_decl| \hfill $F\,|force|\,D$
+ & $f(z)$ \&{double} $z$; \cr
+\+& |fn_decl| |stmt| & |function| \hfill $F\,|out|\,|out|\,|force|\,S$
+ & \\{main}() {\dots}\cr
+\+& |function| \altt|stmt| |decl| |function| & \altt |stmt| |decl| |function|
+ \hfill $F\,|big_force|\,$\altt $S$ $D$ $F$ & outer block\cr
+\+& |lbrace| |rbrace| & |stmt| \hfill $L\.{\\,}R$ & empty statement\cr
+\advance\midcol35pt
+\+& |lbrace| \altt|stmt| |decl| |function| |rbrace| & |stmt| \hfill
+ $|force|\,L\,\\{in}\,|force|\,S\,
+ |force|\,\\{back}\,R\,\\{out}\,|force|$ & compound statement\cr
+\advance\midcol-20pt
+\+& |lbrace| |exp| [|comma|] |rbrace| & |exp| & initializer\cr
+\+& |if_like| |exp| & |if_clause| \hfill $I\.{\ }E$ & |if (z)|\cr
+\+& |else_like| |colon| & |else_like| |base| & \&{try} :\cr
+\+& |else_like| |lbrace| & |else_head| |lbrace| & \&{else} $\{$\cr
+\+& |else_like| |stmt| & |stmt| \hfill
+ $|force|\,E\,\\{in}\,\\{bsp}\,S\,\\{out}\,|force|$ & |else x=0;|\cr
+\+& |else_head| \alt|stmt| |exp| & |stmt| \hfill
+ $|force|\,E\,\\{bsp}\,|noop|\,|cancel|\,S\,\\{bsp}$ & |else{x=0;}|\cr
+\+& |if_clause| |lbrace| & |if_head| |lbrace| & |if (x) {|\cr
+\+& |if_clause| |stmt| |else_like| |if_like| & |if_like| \hfill
+ $|force|\,I\,\\{in}\,\\{bsp}\,S\,\\{out}\,|force|\,E\,\.\ I$ &
+ |if (x) y; else if|\cr
+\+& |if_clause| |stmt| |else_like| & |else_like| \hfill
+ $|force|\,I\,\\{in}\,\\{bsp}\,S\,\\{out}\,|force|\,E$ &
+ |if (x) y; else|\cr
+\+& |if_clause| |stmt| & |else_like| |stmt| & |if (x)|\cr
+\+& |if_head| \alt|stmt| |exp| |else_like| |if_like| & |if_like| \hfill
+ $|force|\,I\,\\{bsp}\,|noop|\,|cancel|\,S\,|force|\,E\,\.\ I$ &
+ |if (x){y;}else if|\cr
+\+& |if_head| \alt|stmt| |exp| |else_like| & |else_like| \hfill
+ $|force|\,I\,\\{bsp}\,|noop|\,|cancel|\,S\,|force|\,E$ &
+ |if (x){y;}else|\cr
+\+& |if_head| \alt|stmt| |exp| & |else_head| \alt|stmt| |exp| & |if (x){y;}|\cr
+\advance\midcol20pt
+\+& |do_like| |stmt| |else_like| |semi| & |stmt| \hfill
+ $D\,\\{bsp}\,|noop|\,|cancel|\,S\,|cancel|\,|noop|\,\\{bsp}\,ES$%
+ & |do f(x); while (g(x));|\cr
+\advance\midcol-20pt
+\+& |case_like| |semi| & |stmt| & |return;|\cr
+\+& |case_like| |colon| & |tag| & |default:|\cr
+\+& |case_like| |exp| & |exp| \hfill $C\.\ E$ & |return 0|\cr
+\+& |catch_like| \alt|cast| |exp| & |fn_decl| \hfill
+ $C$\alt $C$ $E$ \\{in}\,\\{in} & |catch (...)|\cr
+\+& |tag| |tag| & |tag| \hfill $T_1\,\\{bsp}\,T_2$ & |case 0: case 1:|\cr
+\+& |tag| \altt|stmt| |decl| |function| & \altt|stmt| |decl| |function|
+ \hfill $|force|\,\\{back}\,T\,\\{bsp}\,S$ & |case 0: z=0;|\cr
+\+\dagit& |stmt| \altt|stmt| |decl| |function| &
+ \altt|stmt| |decl| |function|
+ \hfill $S\,$\altt$|force|\,S$ $|big_force|\,D$ $|big_force|\,F$ &
+ |x=1;y=2;|\cr
+\+& |semi| & |stmt| \hfill \.\ $S$& empty statement\cr
+\+\dagit& |lproc| \altt |if_like| |else_like| |define_like| & |lproc| &
+ \maltt {{\bf \#include}} {\bf\#else} {\bf\#define} \cr
+\+& |lproc| |rproc| & |insert| & {\bf\#endif} \cr
+\+& |lproc| \alt {|exp| [|exp|]} |function| |rproc| & |insert| \hfill
+ $I$\.\ \alt {$E{[\.{\ \\5}E]}$} {$F$} &
+ \malt{{\bf\#define} $a$\enspace 1} {{\bf\#define} $a$\enspace$\{\,b;\,\}$} \cr
+\+& |section_scrap| |semi| & |stmt|\hfill $MS$ |force|
+ &$\langle\,$section name$\,\rangle$;\cr
+\+& |section_scrap| & |exp| &$\langle\,$section name$\,\rangle$\cr
+\+& |insert| |any| & |any| & \.{\v\#include\v}\cr
+\+& |prelangle| & |binop| \hfill \.< & $<$ not in template\cr
+\+& |prerangle| & |binop| \hfill \.> & $>$ not in template\cr
+\+& |langle| |prerangle| & |cast| \hfill $L\.{\\,}P$ & $\langle\,\rangle$\cr
+\+& |langle| \altt|decl_head| |int_like| |exp| |prerangle| & |cast| &
+ $\langle\&{class}\,\&C\rangle$\cr
+\+& |langle| \altt|decl_head| |int_like| |exp| |comma| & |langle| \hfill
+ $L$\,\altt $D$ $I$ $E$ $C$\,|opt|9 & $\langle\&{class}\,\&C,$\cr
+\+& |template_like| |exp| |prelangle| & |template_like| |exp| |langle| &
+ \&{template} $a\langle100\rangle$\cr
+\+& |template_like| \alt|exp| |raw_int| & \alt|exp| |raw_int| \hfill
+ $T$\.\ \alt$E$ $R$ & \&C\DC\&{template} |a()|\cr
+\+& |template_like| & |raw_int| & \&{template}$\langle\&{class}\,\&T\rangle$\cr
+\+& |new_like| |lpar| |exp| |rpar| & |new_like| & \&{new}(\\{nothrow})\cr
+\+& |new_like| |cast| & |exp| \hfill $N\.\ C$ & |new(int*)|\cr
+\+\dagit& |new_like| & |new_exp| & \&{new} \&C|()|\cr
+\+& |new_exp| \alt|int_like| |const_like| & |new_exp| \hfill
+ $N$\.\ \alt $I$ $C$ & |new const int|\cr
+\+& |new_exp| |struct_like| \alt |exp| |int_like| & |new_exp| \hfill
+ $N\.\ S$\.\ \alt $E$ $I$ & \&{new} \&{struct} \&S\cr
+\+& |new_exp| |raw_ubin| & |new_exp| \hfill $N\.\{R\.\}$ & |new int*[2]|\cr
+\+& |new_exp| \alt |lpar| |exp| & |exp| \alt |lpar| |exp| \hfill
+ $E=N$\,\alt {} {\.\ } & \malt |operator[](int)| {|new int(2)|} \cr
+\+\dagit& |new_exp| & |exp| & |new int;|\cr
+\+& |ftemplate| |prelangle| & |ftemplate| |langle| & |make_pair<int,int>|\cr
+\+& |ftemplate| & |exp| & |make_pair(1,2)|\cr
+\+& |for_like| |exp| & |else_like| \hfill $F\.\ E$ & |while (1)|\cr
+\+& |raw_ubin| |const_like| & |raw_ubin| \hfill $RC$\.{\\\ }
+ & $*$\&{const} |x|\cr
+\+& |raw_ubin| & |ubinop| & $*$ |x|\cr
+\+& |const_like| & |int_like| & \&{const} |x|\cr
+\+& |raw_int| |prelangle| & |raw_int| |langle| & \&C$\langle$\cr
+\+& |raw_int| |colcol| & |colcol| & \&C\DC\cr
+\+& |raw_int| |cast| & |raw_int| & \&C$\langle\&{class}\ \&T\rangle$\cr
+\+& |raw_int| |lpar| & |exp| |lpar| & \&{complex}$(x,y)$\cr
+\+\dagit& |raw_int| & |int_like| & \&{complex} |z|\cr
+\+\dagit& |operator_like| \altt|binop| |unop| |ubinop| & |exp|
+ \hfill $O$\.\{\altt $B$ $U$ $U$ \unskip\.\} & |operator+|\cr
+\+& |operator_like| \alt|new_like| |delete_like| & |exp| \hfill
+ $O$\.\ \alt $N$ $S$ & |operator delete|\cr
+\+& |operator_like| |comma| & |exp| & \&{operator},\cr
+\+\dagit& |operator_like| & |new_exp| & |operator char*|\cr
+\advance\midcol-3pt
+\+\dag200\enspace& |typedef_like| |decl_head| \alt|exp| |int_like| &
+ |typedef_like| |decl_head| \hfill $D=D$\alt $E^{**}$ $I^{**}$ \unskip &
+ \&{typedef} \&{char} \&{ch};\cr
+\advance\midcol+3pt
+\+201\enspace& |typedef_like| |decl_head| |semi| & |decl| \hfill $T\.\ D$ &
+ \&{typedef} \&{int} $\&x,\&y$;\cr
+\+\dag202\enspace& |typedef_like| |int_like| |raw_int| & |typedef_like| |int_like| |exp| &
+ \&{typedef} \&{int} \&{foo}\cr
+\global\prodno=121
+\+& |delete_like| |lpar| |rpar| & |delete_like|\hfill $DL\.{\\,}R$ &
+ \&{delete}|[]| \cr
+\+& |delete_like| |exp| & |exp| \hfill $D\.\ E$ & |delete p| \cr
+\+\dagit& |question| |exp| \alt |colon| |base| & |binop| &
+ \malt |?x:| |?f():| \cr
+\+& |begin_arg| |end_arg| & |exp| & \.{@@[}\&{char}$*$\.{@@]}\cr
+\+& |any_other| |end_arg| & |end_arg| & \&{char}$*$\.{@@]}\cr
+\yskip
+\yskip
+\yskip
+\parindent=0pt
+\dag{\bf Notes}
+\yskip
+Rule 35: The |exp| must not be immediately followed by |lpar|, |exp|,
+ or~|cast|.
+
+Rule 48: The |exp| or |int_like| must not be immediately followed by |base|.
+
+Rule 76: The |force| in the |stmt| line becomes \\{bsp} if \.{CWEAVE} has
+been invoked with the \.{-f} option.
+
+Rule 78: The |define_like| case calls |make_underlined| on the following scrap.
+
+Rule 94: The |new_like| must not be immediately followed by |lpar|.
+
+Rule 99: The |new_exp| must not be immediately followed by |raw_int|,
+|struct_like|, or |colcol|.
+
+Rule 110: The |raw_int| must not be immediately followed by |langle|.
+
+Rule 111: The operator after |operator_like|
+must not be immediately followed by a |binop|.
+
+Rule 114: The |operator_like| must not be immediately followed by
+|raw_ubin|.
+
+Rule 123: The mathness of the |colon| or |base| changes to `yes'.
+
+Rule 200: The |exp| must not be immediately followed by |lpar| or~|exp|.
+
+Rule 202: The |raw_int| must be immediately followed by |semi| or |comma|.
+
+\endgroup
diff --git a/Build/source/texk/web2c/cwebdir/refsort.w b/Build/source/texk/web2c/cwebdir/refsort.w
new file mode 100644
index 00000000000..162f696f568
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/refsort.w
@@ -0,0 +1,165 @@
+% usage: refsort <foo.ref >foo.sref (after first pass with ctwimac)
+\datethis
+
+@* Introduction. This short program sorts the mini-indexes of listings
+prepared by \.{CTWILL}.
+
+More precisely, suppose you have said \.{ctwill} \.{foo.w},
+getting a file \.{foo.tex}, and that you've then said \.{tex} \.{foo.tex},
+getting files \.{foo.dvi} and \.{foo.ref}. If you're happy with \.{foo.dvi}
+except for the alphabetic order of the mini-indexes, you can then say
+$$\hbox{\tt refsort <foo.ref >foo.sref}$$
+after which \.{tex} \.{foo} will produce \.{foo.dvi} again, this time
+with the mini-indexes in order.
+
+Still more precisely, this program reads from standard input a file consisting
+of groups of unsorted lines and writes to standard output a file consisting
+of groups of sorted lines. Each input group begins with an identification
+line whose first character is \.!; the remaining characters are a page number.
+The other lines in the group all have the form
+$$\.{+\ }\alpha\.{\ \\?\{}\kappa\.{\}}\omega$$
+where $\alpha$ is a string containing no spaces, \.? is a single
+character, $\kappa$ is a string of
+letters, digits, and \.{\\\_}'s, and $\omega$ is an arbitrary string.
+The output groups contain the same lines without the initial \.{+\ },
+sorted alphabetically with respect to the $\kappa$ fields, followed by
+a closing line that says `\.{\\donewithpage}' followed by the page number
+copied from the original identification line.
+
+Exception: In the case of a ``custom'' identifier, \.{\\?\{$\kappa$\}}
+takes the alternative form \.{\$\\$\kappa$\ \$} instead.
+
+We define limits on the number and size of mini-index entries that should
+be plenty big enough.
+
+@d max_key 30 /* greater than the length of the longest identifier */
+@d max_size 100 /* greater than the length of the longest mini-index entry */
+@d max_items 300 /* the maximum number of items in a single mini-index */
+
+@ Here's the layout of the \Cee\ program:
+
+@d abort(c,m) { fprintf(stderr,"%s!\n%s",m,buf); return c; }
+@c
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+@#
+typedef struct {
+ char key[max_key];
+ char entry[max_size];
+} item;
+item items[max_items]; /* all items of current group */
+item *sorted[max_items]; /* pointers to items in alphabetic order */
+char cur_page[10]; /* page number, as a string */
+char buf[max_size]; /* current line of input */
+char *input_status; /* |NULL| if end of input reached, else |buf| */
+@#
+int main()
+{
+ register char *p,*q;
+ register int n; /* current number of items */
+ register item *x, **y;
+ input_status=fgets(buf,max_size,stdin);
+ while (input_status) {
+ @<Check that |buf| contains a valid page-number line@>;
+ @<Read and sort additional lines, until |buf| terminates a group@>;
+ @<Output the current group@>;
+ }
+ return 0; /* normal exit */
+}
+
+@ @<Check that |buf| contains a valid page-number line@>=
+if (*buf!='!') abort(-1,"missing '!'");
+if (strlen(buf+1)>11) abort (-2,"page number too long");
+for (p=buf+1,q=cur_page;*p!='\n';p++) *q++=*p;
+*q='\0';
+
+@ @<Read and sort additional lines, until |buf| terminates a group@>=
+n=0;
+while (1) {
+ input_status=fgets(buf,max_size,stdin);
+ if (input_status==NULL || *buf!='+') break;
+ x=&items[n];
+ @<Copy |buf| to item |x|@>;
+ @<Sort the new item into its proper place@>;
+ if (++n>max_items) abort(-11,"too many lines in group");
+}
+
+@ @<Output the current group@>=
+{
+ for (y=sorted;y<sorted+n;y++) printf("%s\n",(*y)->entry);
+ printf("\\donewithpage%s\n",cur_page);
+}
+
+@* Sorting. We convert the key to lowercase as we copy it,
+and we omit backslashes. We also convert \.{\_} to \.{\ }.
+Then \.{\\\_} will be alphabetically less
+than alphabetic letters, as desired.
+
+@<Copy |buf|...@>=
+if (*(buf+1)!=' ') abort(-3,"missing blank after +");
+@<Scan past $\alpha$@>;
+if (*p!=' ') abort(-4,"missing blank after alpha");
+if (*(p+1)=='$') @<Process a custom-formatted identifier@>@;
+else {
+ if (*(p+1)!='\\') abort(-5,"missing backslash");
+ if (!*(p+2)) abort(-6,"missing control code");
+ if (*(p+3)!='{') abort(-7,"missing left brace");
+ for (p+=4,q=x->key;*p!='}'&&*p;p++) {
+ if (*p!='\\') {
+ if (isupper(*p)) *q++=*p+('a'-'A');
+ else if (*p=='_') *q++=' ';
+ else *q++=*p;
+ }
+ }
+ if (*p!='}') abort(-8,"missing right brace");
+}
+if (q>=&x->key[max_key]) abort(-9,"key too long");
+*q='\0';
+@<Copy the buffer to |x->entry|@>;
+if (p==buf+max_size-1) abort(-10,"entry too long");
+*(q-1)='\0';
+
+@ @<Process a custom...@>=
+{
+ if (*(p+2)!='\\') abort(-11,"missing custom backlash");
+ for (p+=3,q=x->key;*p!=' '&&*p;p++) {
+ if (isupper(*p)) *q++=*p+('a'-'A');
+ else *q++=*p;
+ }
+ if (*p!=' ') abort(-12,"missing custom space");
+ if (*(p+1)!='$') abort(-13,"missing custom dollarsign");
+}
+
+@ @<Sort...@>=
+for (y=&sorted[n];
+ y>&sorted[0] && strcmp((*(y-1))->key,x->key)>0;
+ y--)
+ *y=*(y-1);
+*y=x;
+
+@*A bugfix.
+The program specification had a subtle bug: There are cases where
+$\alpha$ includes spaces that should be removed in the output.
+
+These cases occur when a space occurs after an odd number of doublequote
+characters. Ergo, the following routine replaced a simpler original loop.
+
+@<Scan past $\alpha$@>=
+{ register int toggle=0;
+ for (p=buf+2;(*p!=' '||toggle)&&*p;p++)
+ if (*p=='"') toggle^=1;
+}
+
+@ A corresponding change to the copying loop is also needed.
+
+@<Copy the buffer to |x->entry|@>=
+{ register int toggle=0;
+ for (p=buf+2,q=x->entry;(*p!=' '||toggle)&&*p;p++) {
+ if (*p=='"') toggle^=1;
+ if (*p!=' ') *q++=*p;
+ }
+ for (;*p;p++) *q++=*p;
+}
+
+@* Index.
diff --git a/Build/source/texk/web2c/cwebdir/texinputs/Xcwebmac.tex b/Build/source/texk/web2c/cwebdir/texinputs/Xcwebmac.tex
new file mode 100644
index 00000000000..056bf230010
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/texinputs/Xcwebmac.tex
@@ -0,0 +1,41 @@
+% standard macros for CWEB listings (in addition to plain.tex)
+% Version 2.4 --- Don Knuth, June 1992
+% Version 2.4 [p5] --- Hans-Hermann Bode, July 1992
+% Version 2.7 --- Don Knuth, July 1992
+% Version 2.7 [p6] --- Hans-Hermann Bode, September 1992
+% Version 2.8 --- Don Knuth, September 1992
+% Version 2.8 [p7] --- Andreas Scherer, October 1993
+% Version 3.0 --- Don Knuth, June 1993
+% Version 3.0 [p8c] --- Hans-Hermann Bode, June 1993
+% Version 3.0 [p8d] --- Andreas Scherer, October 1993
+% Version 3.0 [p8e] --- Andreas Scherer, November 1993
+% Version 3.1 [p9b] --- Andreas Scherer, January 1994
+% Version 3.1 [p9c] --- Andreas Scherer, June 1994
+% Version 3.2 [p10] --- Andreas Scherer, September 1994
+% Version 3.3 [p11] --- Andreas Scherer, December 1994
+% Version 3.3 [p11a] --- Andreas Scherer, January 1995
+% Version 3.3 [p11b] --- Andreas Scherer, March 1995
+% Version 3.4 [p13] --- Andreas Scherer, May 1996
+% Version 3.4 [p14] --- Andreas Scherer, March 1997
+% Version 3.42 [p15] --- Andreas Scherer, August 1998
+% Version 3.43 [p16] --- Andreas Scherer, October 1998
+% Version 3.5 [p17] --- Andreas Scherer, December 1999
+% Version 3.61 [p18] --- Andreas Scherer, July 2000
+% Version 3.63 [p19] --- Andreas Scherer, January 2001
+% Version 3.64 [p20] --- Andreas Scherer, March 2002
+% Version 3.64 [p21] --- Andreas Scherer, Octobre 2005
+% Version 3.64 [2018] --- Andreas Scherer, Octobre 2018
+
+\ifx\undefined\documentclass\input cwebmac.tex
+\else\endinput\fi % LaTeX will use other macros
+
+\xdef\fmtversion{\fmtversion[2018]}
+
+\def\Cpp{\CPLUSPLUS/} % for backward compatibility
+
+\font\tenss=cmss10 \let\cmntfont\tenss % comment font
+
+\def\C#1{\5\5\quad$\triangleright\,${\cmntfont#1}$\,\triangleleft$}
+\def\SHC#1{\5\5\quad$\diamond\,${\cmntfont#1}}
+
+%\let\K=\leftarrow % "honest" alternative to standard assignment operator
diff --git a/Build/source/texk/web2c/cwebdir/texinputs/dctproofmac.tex b/Build/source/texk/web2c/cwebdir/texinputs/dctproofmac.tex
new file mode 100644
index 00000000000..09a8de346b6
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/texinputs/dctproofmac.tex
@@ -0,0 +1,28 @@
+\ifx\undefined\documentclass\input ctproofmac.tex
+\else\endinput\fi % LaTeX will use other macros
+
+\let\acrofalse=\relax
+\input dcwebstrings.tex
+
+\def\fin{\par\vfill\eject % this is done when we are ending the index
+ \ifpagesaved\null\vfill\eject\fi % output a null index column
+ \if L\lr\else\null\vfill\eject\fi % finish the current page
+ \parfillskip 0pt plus 1fil
+ \let\topsecno=\nullsec
+ \redeffin
+ \output={\normaloutput\page\lheader\rheader}
+ \setpage
+ \def\note##1##2.{\quad{\eightrm##1~##2.}}
+ \def\I{\par\hangindent 2em}\let\*=*
+ \readsections}
+\def\con{\par\vfill\eject % finish the section names
+ \rightskip 0pt \hyphenpenalty 50 \tolerance 200
+ \setpage \output={\normaloutput\page\lheader\rheader}
+ \titletrue % prepare to output the table of contents
+ \pageno=\contentspagenumber
+ \redefcon
+ \topofcontents
+ \line{\headerline}
+ \let\ZZ=\contentsline
+ \readcontents\relax % read the contents info
+ \botofcontents \end} % print the contents page(s) and terminate
diff --git a/Build/source/texk/web2c/cwebdir/texinputs/dctwimac.tex b/Build/source/texk/web2c/cwebdir/texinputs/dctwimac.tex
new file mode 100644
index 00000000000..aaba94d4ba2
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/texinputs/dctwimac.tex
@@ -0,0 +1,12 @@
+\ifx\undefined\documentclass\input ctwimac.tex
+\else\endinput\fi % LaTeX will use other macros
+
+\let\acrofalse=\relax
+\input dcwebstrings.tex
+
+\def\fin{\parfillskip 0pt plus 1fil
+ \let\topsecno=\nullsec
+ \redeffin
+ \def\note##1##2.{\quad{\eightrm##1~##2.}}
+ \def\I{\par\hangindent 2em}\let\*=*
+ \readsections}
diff --git a/Build/source/texk/web2c/cwebdir/texinputs/dcwebmac.tex b/Build/source/texk/web2c/cwebdir/texinputs/dcwebmac.tex
new file mode 100644
index 00000000000..564e7a9c84d
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/texinputs/dcwebmac.tex
@@ -0,0 +1,106 @@
+% standard macros for CWEB listings (in addition to plain.tex)
+% modified for use with "tex2pdf" --- March 1997
+% Version 2.0 --- Don Knuth, July 1990
+% Version 2.0 [german] --- Carsten Steger, October 1991
+% Version 2.0 [german] --- Andreas Scherer, February 1993
+% Version 2.7 --- Don Knuth, July 1992
+% Version 2.7 [p6c] --- Andreas Scherer, September 1993
+% Version 2.8 --- Don Knuth, September 1992
+% Version 2.8 [german] --- Carsten Steger, 1993
+% Version 2.8 [p7] --- Andreas Scherer, October 1993
+% Version 3.0 --- Don Knuth, June 1993
+% Version 3.0 [p8e] --- Andreas Scherer, November 1993
+% Version 3.1 [p9b] --- Andreas Scherer, January 1994
+% Version 3.1 [p9c] --- Andreas Scherer, March 1994
+% Version 3.1 [p9d] --- Andreas Scherer, July 1994
+% Version 3.2 [p10] --- Andreas Scherer, August 1994
+% Version 3.2 [p10b] --- Andreas Scherer, October 1994
+% Version 3.3 [p11a] --- Andreas Scherer, December 1994
+% Version 3.3 [p11b] --- Andreas Scherer, March 1995
+% Version 3.4 [p13] --- Andreas Scherer, August 1995
+% Version 3.4 [p14] --- Andreas Scherer, March 1997
+% Version 3.42 [p15] --- Andreas Scherer, August 1998
+% Version 3.43 [p16] --- Andreas Scherer, October 1998
+% Version 3.5 [p17] --- Andreas Scherer, December 1999
+% Version 3.61 [p18] --- Andreas Scherer, July 2000
+% Version 3.63 [p19] --- Andreas Scherer, January 2001
+% Version 3.64 [p20] --- Andreas Scherer, March 2002
+% Version 3.64 [p21] --- Andreas Scherer, Octobre 2005
+% Version 3.64 [p22] --- Andreas Scherer, March 2016
+
+\ifx\undefined\documentclass\input Xcwebmac.tex
+\else\endinput\fi % LaTeX will use other macros
+
+\input dcwebstrings.tex
+
+\def\.#1{\leavevmode\hbox{\tentex % typewriter type for strings
+ \ifx\Cstringchars\undefined\else\Cstringchars\fi % special string characters
+ \let\\=\BS % backslash in a string
+ \let\{=\LB % left brace in a string
+ \let\}=\RB % right brace in a string
+ \let\~=\TL % tilde in a string
+ \let\ =\SP % space in a string
+ \let\_=\UL % underline in a string
+ \let\&=\AM % ampersand in a string
+ \let\^=\CF % circumflex in a string
+ \ifx\originalTeX\undefined\else\originalTeX\fi#1\kern.05em}}
+
+\def\postATL#1 #2 {\bf Buchstabe \\{\uppercase{\char"#1}}
+ wird getangled als \tentex "#2"\egroup\par}
+
+\gtitle={\.{CWEB} Ausgabe} % this running head is reset by starred sections
+\mark{\noexpand\nullsec0{\the\gtitle}}
+
+\def\fin{\par\vfill\eject % this is done when we are ending the index
+ \ifpagesaved\null\vfill\eject\fi % output a null index column
+ \if L\lr\else\null\vfill\eject\fi % finish the current page
+ \ifpdftex \makebookmarks \fi % added in Version 3.68
+ \parfillskip 0pt plus 1fil
+ \let\topsecno=\nullsec
+ \redeffin
+ \output={\normaloutput\page\lheader\rheader}
+ \setpage
+ \def\note##1##2.{\quad{\eightrm##1~\ifacro{\pdfnote##2.}\else{##2}\fi.}}
+ \def\I{\par\hangindent 2em}\let\*=*
+ \ifacro \let\Xpdf\X
+ \ifpdftex \pdfdest name {NOS} fith
+ \pdfoutline goto name {NOS} count -\secno {\outsecname}
+ \def\X##1:##2\X{\Xpdf##1:##2\X \firstsecno##1.%
+ {\toksF={}\makeoutlinetoks##2\outlinedone\outlinedone}%
+ \pdfoutline goto num \the\toksA \expandafter{\the\toksE}}
+ \else\ifpdf
+ \special{pdf: outline -1 << /Title (\outsecname)
+ /Dest [ @thispage /FitH @ypos ] >>}
+ \def\X##1:##2\X{\Xpdf##1:##2\X \firstsecno##1.%
+ {\toksF={}\makeoutlinetoks##2\outlinedone\outlinedone}%
+ \special{pdf: outline 0 << /Title (\the\toksE)
+ /A << /S /GoTo /D (\romannumeral\the\toksA) >> >>}}
+ \fi\fi\fi
+ \readsections}
+\def\con{\par\vfill\eject % finish the section names
+% \ifodd\pageno\else\titletrue\null\vfill\eject\fi % for duplex printers
+ \rightskip 0pt \hyphenpenalty 50 \tolerance 200
+ \setpage \output={\normaloutput\page\lheader\rheader}
+ \titletrue % prepare to output the table of contents
+ \pageno=\contentspagenumber
+ \redefcon
+ \topofcontents \startpdf
+ \line{\headerline}
+ \let\ZZ=\contentsline
+ \readcontents\relax % read the contents info
+ \botofcontents \end} % print the contents page(s) and terminate
+\def\today{\number\day.~\ifcase\month\or
+ Januar\or Februar\or M\"arz\or April\or Mai\or Juni\or
+ Juli\or August\or September\or Oktober\or November\or Dezember\fi
+ \space\number\year}
+\def\hours{\twodigits=\time \divide\twodigits by60 \printtwodigits
+ \null\space\sc Uhr\space % distinguish between time and year
+ \multiply\twodigits by-60 \advance\twodigits by\time \printtwodigits}
+\def\datethis{\def\startsection{\leftline{\sc\today\ um \hours}\bigskip
+ \let\startsection=\stsec\stsec}}
+ % say `\datethis' in limbo, to get your listing timestamped before section 1
+\def\datecontentspage{% changed in version 3.66
+ \def\botofcontents{\vfill
+ \centerline{\covernote}
+ \bigskip
+ \leftline{\sc\today\ um \hours}}} % timestamps the contents page
diff --git a/Build/source/texk/web2c/cwebdir/texinputs/dcwebstrings.tex b/Build/source/texk/web2c/cwebdir/texinputs/dcwebstrings.tex
new file mode 100644
index 00000000000..055f0ea45b8
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/texinputs/dcwebstrings.tex
@@ -0,0 +1,40 @@
+% In case `german.sty' has been loaded, we have to redefine the `\3'
+% macro for an optional break within a statement. This should be the
+% first command after `\input german.sty' in your CWEB source.
+\def\originalthree{\def\3##1{\hfil\penalty##10\hfilneg}}
+
+\def\ATH{{\acrofalse\X\kern-.5em:Pr\"aprozessor Definitionen\X}}
+
+\def\A{\note{Siehe auch Abschnitt}} % xref for doubly defined section name
+\def\As{\note{Siehe auch die Abschnitte}}
+ % xref for multiply defined section name
+
+\def\ET{ und~} % conjunction between two section numbers
+\def\ETs{ und~} % conjunction between the last two of several section numbers
+
+\def\Q{\note{Dieser Programmteil wird zitiert in Abschnitt}}
+ % xref for mention of a section
+\def\Qs{\note{Dieser Programmteil wird zitiert in den Abschnitten}}
+ % xref for mentions of a section
+
+\def\U{\note{Dieser Programmteil wird verwendet in Abschnitt}}
+ % xref for use of a section
+\def\Us{\note{Dieser Programmteil wird verwendet in den Abschnitten}}
+ % xref for uses of a section
+
+\def\ch{\note{Die folgenden Abschnitte sind vom Change-File ver\"andert worden:}
+ \let\*=\relax}
+
+\def\redeffin{\message{Abschnittsnamen:}
+ \def\grouptitle{ABSCHNITTSNAMEN}
+ \def\outsecname{Abschnittsnamen}
+ \def\Q{\note{Zitiert in Abschnitt}} % crossref for mention of a section
+ \def\Qs{\note{Zitiert in den Abschnitten}} % crossref for mentions of a section
+ \def\U{\note{Verwendet in Abschnitt}} % crossref for use of a section
+ \def\Us{\note{Verwendet in den Abschnitten}} % crossref for uses of a section
+}
+
+\def\redefcon{\message{Inhaltsverzeichnis:}
+ \def\grouptitle{INHALTSVERZEICHNIS:}
+ \def\headerline{\hfil Abschnitt\hbox to3em{\hss Seite}}
+}
diff --git a/Build/source/texk/web2c/cwebdir/texinputs/ecma94.sty b/Build/source/texk/web2c/cwebdir/texinputs/ecma94.sty
new file mode 100644
index 00000000000..c1865dd80c2
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/texinputs/ecma94.sty
@@ -0,0 +1,205 @@
+%
+% TEX/LATEX $VER: ECMA94.STY 1.11 (10.07.2017)
+%
+% SYNOPSIS:
+% Conversion of umlauts and special characters of the
+% ECMA-94/ISO-Latin-1/ISO-8859-1 charset for plain TeX
+% with the encoding of Computer Modern Font. ISO-8859-1
+% seems to be a standard charset for many conputers and
+% printers (https://en.m.wikipedia.org/wiki/ISO/IEC_8859-1).
+% Some (but not all) characters with codes higher than
+% code 127 are replaced by their TeX equivalents.
+% This encoding is *different* to the DC encoding, which
+% is very popular in the international TeX community.
+%
+% DATE OF CREATION:
+% 11.01.94: Derived from AMIGA.TEX by Georg He{\ss}mann (V1.0)
+%
+% AUTHOR:
+% Andreas Scherer <https://ascherer.github.io/>
+%
+% Please send suggestions (pull requests) and bug reports (issues)
+% to https://github.com/ascherer/cwebbin
+%
+% CHANGES:
+% 12.01.1994: Portable encoding with ^^xx notation for all systems
+% relying on ECMA-94/ISO-Latin-1. Intermediate systems
+% won't destroy its usability. (V1.1)
+% 14.01.1994: $^1$ added for ^^b9 (V1.2)
+% 15.03.1994: `\Cstringchars' implemented for use with
+% the CWEB macros (V1.3)
+% 27.07.1994: Two `\lccode' and `\uccode' bugs fixed. (V1.4)
+% 25.10.1994: Renamed for LaTeX package support. (V1.5)
+% 24.12.1994: Some more characters added. (V1.6)
+% 03.01.1995: Works with LaTeX again. Several modifications
+% according to Alain Aubord's `codepage' package. (V1.7)
+% 25.03.1996: New postal address. (V1.8)
+% 13.08.1998: New e-mail address. (V1.9)
+% 18.08.2011: New postal address. (V1.10)
+% 10.07.2017: Complete overhaul. (V1.11)
+%
+% COPYRIGHT:
+% There is no restriction to the usage of this file.
+%
+% if not(TeX >= 3.0) do_nothing, else ...
+\ifx\undefined\inputlineno \else
+\ifnum\inputlineno=-1 \else
+
+\newif\ifTeX % plain TeX or LaTeX?
+\ifx\undefined\documentclass\TeXtrue\else\TeXfalse\fi
+
+\message{ECMA94-to-TeX conversion}
+
+\lccode`^^a0=`^^a0 \uccode`^^a0=`^^a0 \catcode`^^a0=\active \def ^^a0{~}
+\lccode`^^a1=`^^a1 \uccode`^^a1=`^^a1 \catcode`^^a1=\active \def ^^a1{{!`}}
+% ^^a2 would be ¢
+\lccode`^^a3=`^^a3 \uccode`^^a3=`^^a3 \catcode`^^a3=\active
+ \def ^^a3{\ifTeX{\it\$}\else\pounds\fi}
+
+\lccode`^^a7=`^^a7 \uccode`^^a7=`^^a7 \catcode`^^a7=\active \def ^^a7{{\S}}
+\lccode`^^a8=`^^a8 \uccode`^^a8=`^^a8 \catcode`^^a8=\active \def ^^a8{\"{}}
+\lccode`^^a9=`^^a9 \uccode`^^a9=`^^a9 \catcode`^^a9=\active \def ^^a9{{\copyright}}
+\lccode`^^aa=`^^aa \uccode`^^aa=`^^aa \catcode`^^aa=\active
+ \def ^^aa{\ifmmode
+ {}^{\hbox{\ifTeX\sevenrm\else\small\fi\b{a}}}\else
+ $^{\hbox{\ifTeX\sevenrm\else\small\fi\b{a}}}$\fi}
+% ^^ab would be closing guillemet («)
+\lccode`^^ac=`^^ac \uccode`^^ac=`^^ac \catcode`^^ac=\active
+ \def ^^ac{\ifmmode\lnot\else$\lnot$\fi}
+\lccode`^^ad=`^^ad \uccode`^^ad=`^^ad \catcode`^^ad=\active \def ^^ad{--}
+% ^^ae would be 'registered trade mark' (circled R)
+\lccode`^^af=`^^af \uccode`^^af=`^^af \catcode`^^af=\active \def ^^af{\={}}
+
+\lccode`^^b0=`^^b0 \uccode`^^b0=`^^b0 \catcode`^^b0=\active
+ \def ^^b0{\ifmmode^\circ\else$^\circ$\fi}
+\lccode`^^b1=`^^b1 \uccode`^^b1=`^^b1 \catcode`^^b1=\active
+ \def ^^b1{\ifmmode\pm\else$\pm$\fi}
+\lccode`^^b2=`^^b2 \uccode`^^b2=`^^b2 \catcode`^^b2=\active
+ \def ^^b2{\ifmmode{}^2\else$^2$\fi}
+\lccode`^^b3=`^^b3 \uccode`^^b3=`^^b3 \catcode`^^b3=\active
+ \def ^^b3{\ifmmode{}^3\else$^3$\fi}
+\lccode`^^b4=`^^b4 \uccode`^^b4=`^^b4 \catcode`^^b4=\active \def ^^b4{\'{}}
+\lccode`^^b5=`^^b5 \uccode`^^b5=`^^b5 \catcode`^^b5=\active
+ \def ^^b5{\ifmmode\mu\else$\mu$\fi}
+\lccode`^^b6=`^^b6 \uccode`^^b6=`^^b6 \catcode`^^b6=\active \def ^^b6{{\P}}
+\lccode`^^b7=`^^b7 \uccode`^^b7=`^^b7 \catcode`^^b7=\active
+ \def ^^b7{\ifmmode\cdot\else$\cdot$\fi}
+\lccode`^^b8=`^^b8 \uccode`^^b8=`^^b8 \catcode`^^b8=\active \def ^^b8{\c{}}
+\lccode`^^b9=`^^b9 \uccode`^^b9=`^^b9 \catcode`^^b9=\active
+ \def ^^b9{\ifmmode{}^1\else$^1$\fi}
+\lccode`^^ba=`^^ba \uccode`^^ba=`^^ba \catcode`^^ba=\active
+ \def ^^ba{\ifmmode
+ {}^{\hbox{\ifTeX\sevenrm\else\small\fi\b{o}}}\else
+ $^{\hbox{\ifTeX\sevenrm\else\small\fi\b{o}}}$\fi}
+% ^^bb would be opening guillemet (»)
+
+\def\Fraction#1#2{\ifmmode\ifTeX{#1\over#2}\else\frac{#1}{#2}\fi\else
+ \ifTeX$#1\over#2$\else$\frac{#1}{#2}$\fi\fi}
+
+\lccode`^^bc=`^^bc \uccode`^^bc=`^^bc \catcode`^^bc=\active
+ \def ^^bc{\Fraction{1}{4}}
+\lccode`^^bd=`^^bd \uccode`^^bd=`^^bd \catcode`^^bd=\active
+ \def ^^bd{\Fraction{1}{2}}
+\lccode`^^be=`^^be \uccode`^^be=`^^be \catcode`^^be=\active
+ \def ^^be{\Fraction{3}{4}}
+\lccode`^^bf=`^^bf \uccode`^^bf=`^^bf \catcode`^^bf=\active \def ^^bf{{?`}}
+
+\lccode`^^c0=`^^e0 \uccode`^^c0=`^^c0 \catcode`^^c0=\active \def ^^c0{\`A}
+\lccode`^^c1=`^^e1 \uccode`^^c1=`^^c1 \catcode`^^c1=\active \def ^^c1{\'A}
+\lccode`^^c2=`^^e2 \uccode`^^c2=`^^c2 \catcode`^^c2=\active \def ^^c2{\^A}
+\lccode`^^c3=`^^e3 \uccode`^^c3=`^^c3 \catcode`^^c3=\active \def ^^c3{\~A}
+\lccode`^^c4=`^^e4 \uccode`^^c4=`^^c4 \catcode`^^c4=\active \def ^^c4{\"A}
+\lccode`^^c5=`^^e5 \uccode`^^c5=`^^c5 \catcode`^^c5=\active \def ^^c5{{\AA}}
+\lccode`^^c6=`^^e6 \uccode`^^c6=`^^c6 \catcode`^^c6=\active \def ^^c6{{\AE}}
+\lccode`^^c7=`^^e7 \uccode`^^c7=`^^c7 \catcode`^^c7=\active \def ^^c7{\c{C}}
+\lccode`^^c8=`^^e8 \uccode`^^c8=`^^c8 \catcode`^^c8=\active \def ^^c8{\`E}
+\lccode`^^c9=`^^e9 \uccode`^^c9=`^^c9 \catcode`^^c9=\active \def ^^c9{\'E}
+\lccode`^^ca=`^^ea \uccode`^^ca=`^^ca \catcode`^^ca=\active \def ^^ca{\^E}
+\lccode`^^cb=`^^eb \uccode`^^cb=`^^cb \catcode`^^cb=\active \def ^^cb{\"E}
+\lccode`^^cc=`^^ec \uccode`^^cc=`^^cc \catcode`^^cc=\active \def ^^cc{\`I}
+\lccode`^^cd=`^^ed \uccode`^^cd=`^^cd \catcode`^^cd=\active \def ^^cd{\'I}
+\lccode`^^ce=`^^ee \uccode`^^ce=`^^ce \catcode`^^ce=\active \def ^^ce{\^I}
+\lccode`^^cf=`^^ef \uccode`^^cf=`^^cf \catcode`^^cf=\active \def ^^cf{\"I}
+
+% ^^d0 would be capital 'eth'
+\lccode`^^d1=`^^f1 \uccode`^^d1=`^^d1 \catcode`^^d1=\active \def ^^d1{\~N}
+\lccode`^^d2=`^^f2 \uccode`^^d2=`^^d2 \catcode`^^d2=\active \def ^^d2{\`O}
+\lccode`^^d3=`^^f3 \uccode`^^d3=`^^d3 \catcode`^^d3=\active \def ^^d3{\'O}
+\lccode`^^d4=`^^f4 \uccode`^^d4=`^^d4 \catcode`^^d4=\active \def ^^d4{\^O}
+\lccode`^^d5=`^^f5 \uccode`^^d5=`^^d5 \catcode`^^d5=\active \def ^^d5{\~O}
+\lccode`^^d6=`^^f6 \uccode`^^d6=`^^d6 \catcode`^^d6=\active \def ^^d6{\"O}
+\lccode`^^d7=`^^d7 \uccode`^^d7=`^^d7 \catcode`^^d7=\active
+ \def ^^d7{\ifmmode\times\else$\times$\fi}
+\lccode`^^d8=`^^f8 \uccode`^^d8=`^^d8 \catcode`^^d8=\active \def ^^d8{{\O}}
+\lccode`^^d9=`^^f9 \uccode`^^d9=`^^d9 \catcode`^^d9=\active \def ^^d9{\`U}
+\lccode`^^da=`^^fa \uccode`^^da=`^^da \catcode`^^da=\active \def ^^da{\'U}
+\lccode`^^db=`^^fb \uccode`^^db=`^^db \catcode`^^db=\active \def ^^db{\^U}
+\lccode`^^dc=`^^fc \uccode`^^dc=`^^dc \catcode`^^dc=\active \def ^^dc{\"U}
+\lccode`^^dd=`^^fd \uccode`^^dd=`^^dd \catcode`^^dd=\active \def ^^dd{\'Y}
+% ^^de would be capital 'thorn'
+\lccode`^^df=`^^df \uccode`^^df=`^^df \catcode`^^df=\active \def ^^df{{\ss}}
+
+\lccode`^^e0=`^^e0 \uccode`^^e0=`^^c0 \catcode`^^e0=\active \def ^^e0{\`a}
+\lccode`^^e1=`^^e1 \uccode`^^e1=`^^c1 \catcode`^^e1=\active \def ^^e1{\'a}
+\lccode`^^e2=`^^e2 \uccode`^^e2=`^^c2 \catcode`^^e2=\active \def ^^e2{\^a}
+\lccode`^^e3=`^^e3 \uccode`^^e3=`^^c3 \catcode`^^e3=\active \def ^^e3{\~a}
+\lccode`^^e4=`^^e4 \uccode`^^e4=`^^c4 \catcode`^^e4=\active \def ^^e4{\"a}
+\lccode`^^e5=`^^e5 \uccode`^^e5=`^^c5 \catcode`^^e5=\active \def ^^e5{{\aa}}
+\lccode`^^e6=`^^e6 \uccode`^^e6=`^^c6 \catcode`^^e6=\active \def ^^e6{{\ae}}
+\lccode`^^e7=`^^e7 \uccode`^^e7=`^^c7 \catcode`^^e7=\active \def ^^e7{\c{c}}
+\lccode`^^e8=`^^e8 \uccode`^^e8=`^^c8 \catcode`^^e8=\active \def ^^e8{\`e}
+\lccode`^^e9=`^^e9 \uccode`^^e9=`^^c9 \catcode`^^e9=\active \def ^^e9{\'e}
+\lccode`^^ea=`^^ea \uccode`^^ea=`^^ca \catcode`^^ea=\active \def ^^ea{\^e}
+\lccode`^^eb=`^^eb \uccode`^^eb=`^^cb \catcode`^^eb=\active \def ^^eb{\"e}
+\lccode`^^ec=`^^ec \uccode`^^ec=`^^cc \catcode`^^ec=\active \def ^^ec{{\`\i}}
+\lccode`^^ed=`^^ed \uccode`^^ed=`^^cd \catcode`^^ed=\active \def ^^ed{{\'\i}}
+\lccode`^^ee=`^^ee \uccode`^^ee=`^^ce \catcode`^^ee=\active \def ^^ee{{\^\i}}
+\lccode`^^ef=`^^ef \uccode`^^ef=`^^cf \catcode`^^ef=\active \def ^^ef{{\"\i}}
+
+% ^^f0 would be miniscule 'eth'
+\lccode`^^f1=`^^f1 \uccode`^^f1=`^^d1 \catcode`^^f1=\active \def ^^f1{\~n}
+\lccode`^^f2=`^^f2 \uccode`^^f2=`^^d2 \catcode`^^f2=\active \def ^^f2{\`o}
+\lccode`^^f3=`^^f3 \uccode`^^f3=`^^d3 \catcode`^^f3=\active \def ^^f3{\'o}
+\lccode`^^f4=`^^f4 \uccode`^^f4=`^^d4 \catcode`^^f4=\active \def ^^f4{\^o}
+\lccode`^^f5=`^^f5 \uccode`^^f5=`^^d5 \catcode`^^f5=\active \def ^^f5{\~o}
+\lccode`^^f6=`^^f6 \uccode`^^f6=`^^d6 \catcode`^^f6=\active \def ^^f6{\"o}
+\lccode`^^f7=`^^f7 \uccode`^^f7=`^^f7 \catcode`^^f7=\active
+ \def ^^f7{\ifmmode\div\else$\div$\fi}
+\lccode`^^f8=`^^f8 \uccode`^^f8=`^^d8 \catcode`^^f8=\active \def ^^f8{{\o}}
+\lccode`^^f9=`^^f9 \uccode`^^f9=`^^d9 \catcode`^^f9=\active \def ^^f9{\`u}
+\lccode`^^fa=`^^fa \uccode`^^fa=`^^da \catcode`^^fa=\active \def ^^fa{\'u}
+\lccode`^^fb=`^^fb \uccode`^^fb=`^^db \catcode`^^fb=\active \def ^^fb{\^u}
+\lccode`^^fc=`^^fc \uccode`^^fc=`^^dc \catcode`^^fc=\active \def ^^fc{\"u}
+\lccode`^^fd=`^^fd \uccode`^^fd=`^^dd \catcode`^^fd=\active \def ^^fd{\'y}
+% ^^fe would be miniscule 'thorn'
+\lccode`^^ff=`^^ff \uccode`^^ff=`^^ff \catcode`^^ff=\active \def ^^ff{\"y}
+
+% The following macro supports 8-bit characters in "strings".
+% Not all definitions above are repeated, so you can't use
+% all text characters in strings.
+
+\def\Cstringchars{% Avoid any whitespace!
+ \def ^^a1{{\tt !`}}\def ^^bf{{\tt ?`}}\def ^^c0{{\tt\`A}}%
+ \def ^^c1{{\tt\'A}}\def ^^c2{{\tt\^A}}\def ^^c3{{\tt\~A}}%
+ \def ^^c4{{\tt\"A}}\def ^^c5{{\tt\AA}}\def ^^c6{{\tt\AE}}%
+ \def ^^c7{{\tt\c{C}}}\def ^^c8{{\tt\`E}}\def ^^c9{{\tt\'E}}%
+ \def ^^ca{{\tt\^E}}\def ^^cb{{\tt\"E}}\def ^^cc{{\tt\`I}}%
+ \def ^^cd{{\tt\'I}}\def ^^ce{{\tt\^I}}\def ^^cf{{\tt\"I}}%
+ \def ^^d1{{\tt\~N}}\def ^^d2{{\tt\`O}}\def ^^d3{{\tt\'O}}%
+ \def ^^d4{{\tt\^O}}\def ^^d5{{\tt\~O}}\def ^^d6{{\tt\"O}}%
+ \def ^^d8{{\tt\O}}\def ^^d9{{\tt\`U}}\def ^^da{{\tt\'U}}%
+ \def ^^db{{\tt\^U}}\def ^^dc{{\tt\"U}}\def ^^dd{{\tt\'Y}}%
+ \def ^^df{{\tt\ss}}\def ^^e0{{\tt\`a}}\def ^^e1{{\tt\'a}}%
+ \def ^^e2{{\tt\^a}}\def ^^e3{{\tt\~a}}\def ^^e4{{\tt\"a}}%
+ \def ^^e5{{\tt\aa}}\def ^^e6{{\tt\ae}}\def ^^e7{{\tt\c{c}}}%
+ \def ^^e8{{\tt\`e}}\def ^^e9{{\tt\'e}}\def ^^ea{{\tt\^e}}%
+ \def ^^eb{{\tt\"e}}\def ^^ec{{\tt\`\i}}\def ^^ed{{\tt\'\i}}%
+ \def ^^ee{{\tt\^\i}}\def ^^ef{{\tt\"\i}}\def ^^f1{{\tt\~n}}%
+ \def ^^f2{{\tt\`o}}\def ^^f3{{\tt\'o}}\def ^^f4{{\tt\^o}}%
+ \def ^^f5{{\tt\~o}}\def ^^f6{{\tt\"o}}\def ^^f8{{\tt\o}}%
+ \def ^^f9{{\tt\`u}}\def^^fa{{\tt\'u}}\def ^^fb{{\tt\^u}}%
+ \def ^^fc{{\tt\"u}}\def ^^fd{{\tt\'y}}\def ^^ff{{\tt\"y}}}%
+
+\fi\fi
+
+\endinput
diff --git a/Build/source/texk/web2c/cwebdir/texinputs/fcwebmac.tex b/Build/source/texk/web2c/cwebdir/texinputs/fcwebmac.tex
new file mode 100644
index 00000000000..3e0892eb091
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/texinputs/fcwebmac.tex
@@ -0,0 +1,137 @@
+% standard macros for CWEB listings (in addition to plain.tex)
+% modified for use with "tex2pdf" --- March 1997
+% Version 2.0 --- Don Knuth, July 1990
+% Version 2.0 [german] --- Carsten Steger, October 1991
+% Version 2.0 [german] --- Andreas Scherer, February 1993
+% Version 2.7 --- Don Knuth, July 1992
+% Version 2.7 [p6c] --- Andreas Scherer, September 1993
+% Version 2.8 --- Don Knuth, September 1992
+% Version 2.8 [german] --- Carsten Steger, 1993
+% Version 2.8 [p7] --- Andreas Scherer, October 1993
+% Version 3.0 --- Don Knuth, June 1993
+% Version 3.0 [p8e] --- Andreas Scherer, November 1993
+% Version 3.1 [p9b] --- Andreas Scherer, January 1994
+% Version 3.1 [p9c] --- Andreas Scherer, March 1994
+% Version 3.1 [p9d] --- Andreas Scherer, July 1994
+% Version 3.2 [p10] --- Andreas Scherer, July 1994
+% Version 3.2 [p10a] --- Denis B. Roegel, September 1994
+% Version 3.3 [p10b] --- Andreas Scherer, October 1994
+% Version 3.3 [p11b] --- Andreas Scherer, March 1995
+% Version 3.4 [p13] --- Andreas Scherer, August 1995
+% Version 3.4 [p14] --- Andreas Scherer, March 1997
+% Version 3.42 [p15] --- Andreas Scherer, August 1998
+% Version 3.43 [p16] --- Andreas Scherer, October 1998
+% Version 3.5 [p17] --- Andreas Scherer, December 1999
+% Version 3.61 [p18] --- Andreas Scherer, July 2000
+% Version 3.63 [p19] --- Andreas Scherer, January 2001
+% Version 3.64 [p20] --- Andreas Scherer, March 2002
+% Version 3.64 [p21] --- Andreas Scherer, Octobre 2005
+% Version 3.64 [p22] --- Andreas Scherer, March 2016
+
+% french translations --- Denis Roegel, 18 September 1994
+
+\ifx\undefined\documentclass\input Xcwebmac.tex
+\else\endinput\fi % LaTeX will use other macros
+
+\def\.#1{\leavevmode\hbox{\tentex % typewriter type for strings
+ \ifx\Cstringchars\undefined\else\Cstringchars\fi % special string characters
+ \let\\=\BS % backslash in a string
+ \let\{=\LB % left brace in a string
+ \let\}=\RB % right brace in a string
+ \let\~=\TL % tilde in a string
+ \let\ =\SP % space in a string
+ \let\_=\UL % underline in a string
+ \let\&=\AM % ampersand in a string
+ \let\^=\CF % circumflex in a string
+ #1\kern.05em}}
+
+\def\postATL#1 #2 {\bf La lettre \\{\uppercase{\char"#1}}
+ est \string`\string`tanglee\string'\string' en \tentex "#2"\egroup\par}
+\def\ATH{{\acrofalse\X\kern-.5em:D\'efinitions du pr\'eprocesseur\X}}
+
+\def\A{\note{Voir aussi la section}} % xref for doubly defined section name
+\def\As{\note{Voir aussi les sections}} % xref for multiply defined
+ % section name
+
+\def\ET{ et~} % conjunction between two section numbers
+\def\ETs{ et~} % conjunction between the last two of several section numbers
+
+\def\Q{\note{Cette partie du programme est cit\'ee dans la section}}
+ % xref for mention of a section
+\def\Qs{\note{Cette partie du programme est cit\'ee dans les sections}}
+ % xref for mentions of a section
+
+\def\U{\note{Cette partie du programme est utilis\'ee dans la section}}
+ % xref for use of a section
+\def\Us{\note{Cette partie du programme est utilis\'ee dans les sections}}
+ % xref for uses of a section
+
+\gtitle={Sortie \.{CWEB}} % this running head is reset by starred sections
+\mark{\noexpand\nullsec0{\the\gtitle}}
+
+\def\ch{\note{Les sections suivantes ont \'et\'e modifi\'ees dans le
+ Change-File:}\let\*=\relax}
+
+\def\fin{\par\vfill\eject % this is done when we are ending the index
+ \ifpagesaved\null\vfill\eject\fi % output a null index column
+ \if L\lr\else\null\vfill\eject\fi % finish the current page
+ \ifpdftex \makebookmarks \fi % added in Version 3.68
+ \parfillskip 0pt plus 1fil
+ \def\grouptitle{NOMS DES SECTIONS}
+ \let\topsecno=\nullsec
+ \message{Noms des sections:}
+ \output={\normaloutput\page\lheader\rheader}
+ \setpage
+ \def\note##1##2.{\quad{\eightrm##1~\ifacro{\pdfnote##2.}\else{##2}\fi.}}
+ \def\Q{\note{Cit\'e dans la section}} % crossref for mention of a section
+ \def\Qs{\note{Cit\'e dans les sections}} % crossref for mentions of a section
+ \def\U{\note{Utilis\'e dans la section}} % crossref for use of a section
+ \def\Us{\note{Utilis\'e dans les sections}} % crossref for uses of a section
+ \def\I{\par\hangindent 2em}\let\*=*
+ \ifacro \def\outsecname{Noms des sections} \let\Xpdf\X
+% \ifpdftex \makebookmarks \pdfdest name {NOS} fitb % in versions < 3.68
+ \ifpdftex \pdfdest name {NOS} fith % changed in version 3.69
+ \pdfoutline goto name {NOS} count -\secno {\outsecname}
+ \def\X##1:##2\X{\Xpdf##1:##2\X \firstsecno##1.%
+ {\toksF={}\makeoutlinetoks##2\outlinedone\outlinedone}%
+ \pdfoutline goto num \the\toksA \expandafter{\the\toksE}}
+ \else\ifpdf
+ \special{pdf: outline -1 << /Title (\outsecname)
+ /Dest [ @thispage /FitH @ypos ] >>}
+ \def\X##1:##2\X{\Xpdf##1:##2\X \firstsecno##1.%
+ {\toksF={}\makeoutlinetoks##2\outlinedone\outlinedone}%
+ \special{pdf: outline 0 << /Title (\the\toksE)
+ /A << /S /GoTo /D (\romannumeral\the\toksA) >> >>}}
+ \fi\fi\fi
+ \readsections}
+\def\con{\par\vfill\eject % finish the section names
+% \ifodd\pageno\else\titletrue\null\vfill\eject\fi % for duplex printers
+ \rightskip 0pt \hyphenpenalty 50 \tolerance 200
+ \setpage \output={\normaloutput\page\lheader\rheader}
+ \titletrue % prepare to output the table of contents
+ \pageno=\contentspagenumber
+ \def\grouptitle{SOMMAIRE:}
+ \message{Sommaire:}
+ \topofcontents \startpdf
+ \line{\hfil Section\hbox to3em{\hss Page}}
+ \let\ZZ=\contentsline
+ \readcontents\relax % read the contents info
+ \botofcontents \end} % print the contents page(s) and terminate
+\def\today{\number\day.~\ifcase\month\or
+ Janvier\or F\'evrier\or Mars\or Avril\or Mai\or Juin\or
+ Juillet\or Ao\^ut\or Septembre\or Octobre\or Novembre\or D\'ecembre\fi
+ \space\number\year}
+\def\hours{\twodigits=\time \divide\twodigits by60 \printtwodigits
+ \null\space\sc h\space % distinguish between time and year
+ \multiply\twodigits by-60 \advance\twodigits by\time \printtwodigits}
+\def\datethis{\def\startsection{\leftline{\sc\today\ \`a \hours}\bigskip
+ \let\startsection=\stsec\stsec}}
+ % say `\datethis' in limbo, to get your listing timestamped before section 1
+%\def\datecontentspage{% versions up to 3.65
+% \def\topofcontents{\leftline{\sc\today\ \`a \hours}\bigskip
+% \centerline{\titlefont\title}\vfill}} % timestamps the contents page
+\def\datecontentspage{% changed in version 3.66
+ \def\botofcontents{\vfill
+ \centerline{\covernote}
+ \bigskip
+ \leftline{\sc\today\ \`a \hours}}} % timestamps the contents page
diff --git a/Build/source/texk/web2c/cwebdir/texinputs/hp8.sty b/Build/source/texk/web2c/cwebdir/texinputs/hp8.sty
new file mode 100644
index 00000000000..825533ddd04
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/texinputs/hp8.sty
@@ -0,0 +1,183 @@
+%
+% TEX/LATEX $VER: HP8.STY 1.8 (18.08.2011)
+%
+% SYNOPSIS:
+% Conversion of umlauts and special characters of the
+% HP Roman8 charset for plain TeX with the encoding of
+% Computer Modern Font. HP Roman8 seems to be a standard
+% charset for some conputers and printers.
+% Some (but not all) characters with codes higher than
+% code 127 are replaced by their TeX equivalents.
+% This encoding is *different* to the DC encoding, which
+% is very popular in the international TeX community.
+%
+% DATE OF CREATION:
+% 14.01.94: Derived from ECMA94.TEX by manual encoding. (V1.0)
+%
+% AUTHOR: Andreas Scherer
+%
+% CHANGES:
+% 15.03.1994: `\Cstringchars' implemented for use with
+% the CWEB macros (V1.1)
+% 27.07.1994: Two `\lccode' and `\uccode' bugs fixed. (V1.2)
+% 25.10.1994: Renamed for LaTeX package support. (V1.3)
+% 24.12.1994: Some more characters added. (V1.4)
+% 03.01.1995: Works with LaTeX again. Several modifications
+% accoding to Alain Aubord's `codepage' package. (V1.5)
+% 25.03.1996: New postal address. (V1.6)
+% 13.08.1998: New e-mail address. (V1.7)
+% 18.08.2011: New postal address. (V1.8)
+%
+% COPYRIGHT:
+% There is no restriction to the usage of this file.
+%
+% if not(TeX >= 3.0) do_nothing, else ...
+\ifx\undefined\inputlineno \else
+\ifnum\inputlineno=-1 \else
+
+\newif\ifTeX % plain TeX or LaTeX?
+\ifx\undefined\documentclass\TeXtrue\else\TeXfalse\fi
+
+\message{HP8-to-TeX conversion}
+
+\lccode`^^a0=`^^a0 \uccode`^^a0=`^^a0 \catcode`^^a0=\active \def ^^a0{~}
+\lccode`^^a1=`^^c8 \uccode`^^a1=`^^a1 \catcode`^^a1=\active \def ^^a1{\`A}
+\lccode`^^a2=`^^c0 \uccode`^^a2=`^^a2 \catcode`^^a2=\active \def ^^a2{\^A}
+\lccode`^^a3=`^^c9 \uccode`^^a3=`^^a3 \catcode`^^a3=\active \def ^^a3{\`E}
+\lccode`^^a4=`^^c1 \uccode`^^a4=`^^a4 \catcode`^^a4=\active \def ^^a4{\^E}
+\lccode`^^a5=`^^cd \uccode`^^a5=`^^a5 \catcode`^^a5=\active \def ^^a5{\"E}
+\lccode`^^a6=`^^d1 \uccode`^^a6=`^^a6 \catcode`^^a6=\active \def ^^a6{\^I}
+\lccode`^^a7=`^^dd \uccode`^^a7=`^^a7 \catcode`^^a7=\active \def ^^a7{\"I}
+\lccode`^^a8=`^^a8 \uccode`^^a8=`^^a8 \catcode`^^a8=\active \def ^^a8{\'{}}
+\lccode`^^a9=`^^a9 \uccode`^^a9=`^^a9 \catcode`^^a9=\active \def ^^a9{\`{}}
+\lccode`^^aa=`^^aa \uccode`^^aa=`^^aa \catcode`^^aa=\active \def ^^aa{\^{}}
+\lccode`^^ab=`^^ab \uccode`^^ab=`^^ab \catcode`^^ab=\active \def ^^ab{\"{}}
+\lccode`^^ac=`^^ac \uccode`^^ac=`^^ac \catcode`^^ac=\active \def ^^ac{\~{}}
+\lccode`^^ad=`^^cb \uccode`^^ad=`^^ad \catcode`^^ad=\active \def ^^ad{\`U}
+\lccode`^^ae=`^^c3 \uccode`^^ae=`^^ae \catcode`^^ae=\active \def ^^ae{\^U}
+\lccode`^^af=`^^af \uccode`^^af=`^^af \catcode`^^af=\active
+ \def ^^af{\ifTeX{\it\$}\else\pounds\fi}
+
+\lccode`^^b0=`^^b0 \uccode`^^b0=`^^b0 \catcode`^^b0=\active \def ^^b0{\={}}
+\lccode`^^b1=`^^b2 \uccode`^^b1=`^^b1 \catcode`^^b1=\active \def ^^b1{\'Y}
+\lccode`^^b2=`^^b2 \uccode`^^b2=`^^b1 \catcode`^^b2=\active \def ^^b2{\'y}
+\lccode`^^b3=`^^b3 \uccode`^^b3=`^^b3 \catcode`^^b3=\active
+ \def ^^b3{\ifmmode^\circ\else$^\circ$\fi}
+\lccode`^^b4=`^^b5 \uccode`^^b4=`^^b4 \catcode`^^b4=\active \def ^^b4{\c{C}}
+\lccode`^^b5=`^^b5 \uccode`^^b5=`^^b4 \catcode`^^b5=\active \def ^^b5{\c{c}}
+\lccode`^^b6=`^^b7 \uccode`^^b6=`^^b6 \catcode`^^b6=\active \def ^^b6{\~N}
+\lccode`^^b7=`^^b7 \uccode`^^b7=`^^b6 \catcode`^^b7=\active \def ^^b7{\~n}
+\lccode`^^b8=`^^b8 \uccode`^^b8=`^^b8 \catcode`^^b8=\active \def ^^b8{{!`}}
+\lccode`^^b9=`^^b9 \uccode`^^b9=`^^b9 \catcode`^^b9=\active \def ^^b9{{?`}}
+
+\lccode`^^bb=`^^bb \uccode`^^bb=`^^bb \catcode`^^bb=\active
+ \def ^^bb{\ifTeX{\it\$}\else\pounds\fi}
+
+\lccode`^^bd=`^^bd \uccode`^^bd=`^^bd \catcode`^^bd=\active \def ^^bd{{\S}}
+\lccode`^^be=`^^be \uccode`^^be=`^^be \catcode`^^be=\active \def ^^be{{\it f\/}}
+
+\lccode`^^c0=`^^c0 \uccode`^^c0=`^^a2 \catcode`^^c0=\active \def ^^c0{\^a}
+\lccode`^^c1=`^^c1 \uccode`^^c1=`^^a4 \catcode`^^c1=\active \def ^^c1{\^e}
+\lccode`^^c2=`^^c2 \uccode`^^c2=`^^df \catcode`^^c2=\active \def ^^c2{\^o}
+\lccode`^^c3=`^^c3 \uccode`^^c3=`^^ae \catcode`^^c3=\active \def ^^c3{\^u}
+\lccode`^^c4=`^^c4 \uccode`^^c4=`^^e0 \catcode`^^c4=\active \def ^^c4{\'a}
+\lccode`^^c5=`^^c5 \uccode`^^c5=`^^dc \catcode`^^c5=\active \def ^^c5{\'e}
+\lccode`^^c6=`^^c6 \uccode`^^c6=`^^e7 \catcode`^^c6=\active \def ^^c6{\'o}
+\lccode`^^c7=`^^c7 \uccode`^^c7=`^^ed \catcode`^^c7=\active \def ^^c7{\'u}
+\lccode`^^c8=`^^c8 \uccode`^^c8=`^^a1 \catcode`^^c8=\active \def ^^c8{\`a}
+\lccode`^^c9=`^^c9 \uccode`^^c9=`^^a3 \catcode`^^c9=\active \def ^^c9{\`e}
+\lccode`^^ca=`^^ca \uccode`^^ca=`^^e8 \catcode`^^ca=\active \def ^^ca{\`o}
+\lccode`^^cb=`^^cb \uccode`^^cb=`^^ad \catcode`^^cb=\active \def ^^cb{\`u}
+\lccode`^^cc=`^^cc \uccode`^^cc=`^^d8 \catcode`^^cc=\active \def ^^cc{\"a}
+\lccode`^^cd=`^^cd \uccode`^^cd=`^^a5 \catcode`^^cd=\active \def ^^cd{\"e}
+\lccode`^^ce=`^^ce \uccode`^^ce=`^^da \catcode`^^ce=\active \def ^^ce{\"o}
+\lccode`^^cf=`^^cf \uccode`^^cf=`^^db \catcode`^^cf=\active \def ^^cf{\"u}
+
+\lccode`^^d0=`^^d4 \uccode`^^d0=`^^d0 \catcode`^^d0=\active \def ^^d0{{\AA}}
+\lccode`^^d1=`^^d1 \uccode`^^d1=`^^a6 \catcode`^^d1=\active \def ^^d1{{\^\i}}
+\lccode`^^d2=`^^d6 \uccode`^^d2=`^^d2 \catcode`^^d2=\active \def ^^d2{{\O}}
+\lccode`^^d3=`^^d7 \uccode`^^d3=`^^d3 \catcode`^^d3=\active \def ^^d3{{\AE}}
+\lccode`^^d4=`^^d4 \uccode`^^d4=`^^d0 \catcode`^^d4=\active \def ^^d4{{\aa}}
+\lccode`^^d5=`^^d5 \uccode`^^d5=`^^e5 \catcode`^^d5=\active \def ^^d5{{\'\i}}
+\lccode`^^d6=`^^d6 \uccode`^^d6=`^^d2 \catcode`^^d6=\active \def ^^d6{{\o}}
+\lccode`^^d7=`^^d7 \uccode`^^d7=`^^d3 \catcode`^^d7=\active \def ^^d7{{\ae}}
+\lccode`^^d8=`^^cc \uccode`^^d8=`^^d8 \catcode`^^d8=\active \def ^^d8{\"A}
+\lccode`^^d9=`^^d9 \uccode`^^d9=`^^e6 \catcode`^^d9=\active \def ^^d9{{\`\i}}
+\lccode`^^da=`^^ce \uccode`^^da=`^^da \catcode`^^da=\active \def ^^da{\"O}
+\lccode`^^db=`^^cf \uccode`^^db=`^^db \catcode`^^db=\active \def ^^db{\"U}
+\lccode`^^dc=`^^c5 \uccode`^^dc=`^^dc \catcode`^^dc=\active \def ^^dc{\'E}
+\lccode`^^dd=`^^dd \uccode`^^dd=`^^a7 \catcode`^^dd=\active \def ^^dd{{\"\i}}
+\lccode`^^de=`^^de \uccode`^^de=`^^de \catcode`^^de=\active \def ^^de{{\ss}}
+\lccode`^^df=`^^c2 \uccode`^^df=`^^df \catcode`^^df=\active \def ^^df{\^O}
+
+\lccode`^^e0=`^^c4 \uccode`^^e0=`^^e0 \catcode`^^e0=\active \def ^^e0{\'A}
+\lccode`^^e1=`^^e2 \uccode`^^e1=`^^e1 \catcode`^^e1=\active \def ^^e1{\~A}
+\lccode`^^e2=`^^e2 \uccode`^^e2=`^^e1 \catcode`^^e2=\active \def ^^e2{\~a}
+
+\lccode`^^e5=`^^d5 \uccode`^^e5=`^^e5 \catcode`^^e5=\active \def ^^e5{\'I}
+\lccode`^^e6=`^^d9 \uccode`^^e6=`^^e6 \catcode`^^e6=\active \def ^^e6{\`I}
+\lccode`^^e7=`^^c6 \uccode`^^e7=`^^e7 \catcode`^^e7=\active \def ^^e7{\'O}
+\lccode`^^e8=`^^ca \uccode`^^e8=`^^e8 \catcode`^^e8=\active \def ^^e8{\`O}
+\lccode`^^e9=`^^ea \uccode`^^e9=`^^e9 \catcode`^^e9=\active \def ^^e9{\~O}
+\lccode`^^ea=`^^ea \uccode`^^ea=`^^e9 \catcode`^^ea=\active \def ^^ea{\~o}
+\lccode`^^eb=`^^ec \uccode`^^eb=`^^eb \catcode`^^eb=\active \def ^^eb{\v{S}}
+\lccode`^^ec=`^^ec \uccode`^^ec=`^^ec \catcode`^^ec=\active \def ^^ec{\v{s}}
+\lccode`^^ed=`^^c7 \uccode`^^ed=`^^ed \catcode`^^ed=\active \def ^^ed{\'U}
+\lccode`^^ee=`^^ef \uccode`^^ee=`^^ee \catcode`^^ee=\active \def ^^ee{\"Y}
+\lccode`^^ef=`^^ef \uccode`^^ef=`^^ee \catcode`^^ef=\active \def ^^ef{\"y}
+
+\lccode`^^f2=`^^f2 \uccode`^^f2=`^^f2 \catcode`^^f2=\active
+ \def ^^f2{\ifmmode\cdot\else$\cdot$\fi}
+\lccode`^^f3=`^^f3 \uccode`^^f3=`^^f3 \catcode`^^f3=\active
+ \def ^^f3{\ifmmode\mu\else$\mu$\fi}
+\lccode`^^f4=`^^f4 \uccode`^^f4=`^^f4 \catcode`^^f4=\active \def ^^f4{{\P}}
+
+\def\Fraction#1#2{\ifmmode\ifTeX{#1\over#2}\else\frac{#1}{#2}\fi\else
+ \ifTeX$#1\over#2$\else$\frac{#1}{#2}$\fi\fi}
+
+\lccode`^^f5=`^^f5 \uccode`^^f5=`^^f5 \catcode`^^f5=\active
+ \def ^^f5{\Fraction{3}{4}}
+\lccode`^^f6=`^^f6 \uccode`^^f6=`^^f6 \catcode`^^f6=\active \def ^^f6{---}
+\lccode`^^f7=`^^f7 \uccode`^^f7=`^^f7 \catcode`^^f7=\active
+ \def ^^f7{\Fraction{1}{4}}
+\lccode`^^f8=`^^f8 \uccode`^^f8=`^^f8 \catcode`^^f8=\active
+ \def ^^f8{\Fraction{1}{2}}
+\lccode`^^f9=`^^f9 \uccode`^^f9=`^^f9 \catcode`^^f9=\active
+ \def ^^f9{\ifmmode
+ {}^{\hbox{\ifTeX\sevenrm\else\small\fi\b{a}}}\else
+ $^{\hbox{\ifTeX\sevenrm\else\small\fi\b{a}}}$\fi}
+\lccode`^^fa=`^^fa \uccode`^^fa=`^^fa \catcode`^^fa=\active
+ \def ^^fa{\ifmmode
+ {}^{\hbox{\ifTeX\sevenrm\else\small\fi\b{o}}}\else
+ $^{\hbox{\ifTeX\sevenrm\else\small\fi\b{o}}}$\fi}
+
+\lccode`^^fe=`^^fe \uccode`^^fe=`^^fe \catcode`^^fe=\active
+ \def ^^fe{\ifmmode\pm\else$\pm$\fi}
+\lccode`^^ff=`^^ff \uccode`^^ff=`^^ff \catcode`^^ff=\active \def ^^ff{~}
+
+\def\Cstringchars{% Avoid any whitespace!
+ \def ^^a1{{\tt\`A}}\def ^^a2{{\tt\^A}}\def ^^a3{{\tt\`E}}%
+ \def ^^a4{{\tt\^E}}\def ^^a5{{\tt\"E}}\def ^^a6{{\tt\^I}}%
+ \def ^^a7{{\tt\"I}}\def ^^ad{{\tt\`U}}\def ^^ae{{\tt\^U}}%
+ \def ^^b1{{\tt\'Y}}\def ^^b2{{\tt\'y}}\def ^^b4{{\tt\c{C}}}%
+ \def ^^b5{{\tt\c{c}}}\def ^^b6{{\tt\~N}}\def ^^b7{{\tt\~n}}%
+ \def ^^b8{{\tt!`}}\def ^^b9{{\tt?`}}\def ^^c0{{\tt\^a}}%
+ \def ^^c1{{\tt\^e}}\def ^^c2{{\tt\^o}}\def ^^c3{{\tt\^u}}%
+ \def ^^c4{{\tt\'a}}\def ^^c5{{\tt\'e}}\def ^^c6{{\tt\'o}}%
+ \def ^^c7{{\tt\'u}}\def ^^c8{{\tt\`a}}\def ^^c9{{\tt\`e}}%
+ \def ^^ca{{\tt\`o}}\def ^^cb{{\tt\`u}}\def ^^cc{{\tt\"a}}%
+ \def ^^cd{{\tt\"e}}\def ^^ce{{\tt\"o}}\def ^^cf{{\tt\"u}}%
+ \def ^^d0{{\tt\AA}}\def ^^d1{{\tt\^\i}}\def ^^d2{{\tt\O}}%
+ \def ^^d3{{\tt\AE}}\def ^^d4{{\tt\aa}}\def ^^d5{{\tt\'\i}}%
+ \def ^^d6{{\tt\o}}\def ^^d7{{\tt\ae}}\def ^^d8{{\tt\"A}}%
+ \def ^^d9{{\tt\`\i}}\def ^^da{{\tt\"O}}\def ^^db{{\tt\"U}}%
+ \def ^^dc{{\tt\'E}}\def ^^dd{{\tt\"\i}}\def ^^de{{\tt\ss}}%
+ \def ^^df{{\tt\^O}}\def ^^e0{{\tt\'A}}\def ^^e1{{\tt\~A}}%
+ \def ^^e2{{\tt\~a}}\def ^^e5{{\tt\'I}}\def ^^e6{{\tt\`I}}%
+ \def ^^e7{{\tt\'O}}\def^^e8{{\tt\`O}}\def ^^e9{{\tt\~O}}%
+ \def ^^ea{{\tt\~o}}\def ^^ed{{\tt\'U}}\def ^^ee{{\tt\"Y}}%
+ \def ^^ef{{\tt\"y}}}%
+
+\fi\fi
+
+\endinput
diff --git a/Build/source/texk/web2c/cwebdir/texinputs/icwebmac.tex b/Build/source/texk/web2c/cwebdir/texinputs/icwebmac.tex
new file mode 100644
index 00000000000..7d605c9fe42
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/texinputs/icwebmac.tex
@@ -0,0 +1,157 @@
+% standard macros for CWEB listings (in addition to plain.tex)
+% modified for use with "tex2pdf" --- March 1997
+% Version 2.0 --- Don Knuth, July 1990
+% Version 2.0 [german] --- Carsten Steger, October 1991
+% Version 2.0 [german] --- Andreas Scherer, February 1993
+% Version 2.7 --- Don Knuth, July 1992
+% Version 2.7 [p6c] --- Andreas Scherer, September 1993
+% Version 2.8 --- Don Knuth, September 1992
+% Version 2.8 [german] --- Carsten Steger, 1993
+% Version 2.8 [p7] --- Andreas Scherer, October 1993
+% Version 3.0 --- Don Knuth, June 1993
+% Version 3.0 [p8e] --- Andreas Scherer, November 1993
+% Version 3.1 [p9b] --- Andreas Scherer, January 1994
+% Version 3.1 [p9c] --- Andreas Scherer, March 1994
+% Version 3.1 [p9d] --- Andreas Scherer, July 1994
+% Version 3.2 [p10] --- Andreas Scherer, July 1994
+% Version 3.2 [p10a] --- Giuseppe Ghibò, September 1994
+% Version 3.2 [p10b] --- Andreas Scherer, October 1994
+% Version 3.3 [p11b] --- Andreas Scherer, March 1995
+% Version 3.4 [p13] --- Andreas Scherer, August 1995
+% Version 3.4 [p14] --- Andreas Scherer, March 1997
+% Version 3.42 [p15] --- Andreas Scherer, August 1998
+% Version 3.43 [p16] --- Andreas Scherer, October 1998
+% Version 3.5 [p17] --- Andreas Scherer, December 1999
+% Version 3.61 [p18] --- Andreas Scherer, July 2000
+% Version 3.63 [p19] --- Andreas Scherer, January 2001
+% Version 3.64 [p20] --- Andreas Scherer, March 2002
+% Version 3.64 [p21] --- Andreas Scherer, Octobre 2005
+% Version 3.64 [p22] --- Andreas Scherer, March 2016
+
+\ifx\undefined\documentclass\input Xcwebmac.tex
+\else\endinput\fi % LaTeX will use other macros
+
+\def\.#1{\leavevmode\hbox{\tentex % typewriter type for strings
+ \ifx\Cstringchars\undefined\else\Cstringchars\fi % special string characters
+ \let\\=\BS % backslash in a string
+ \let\{=\LB % left brace in a string
+ \let\}=\RB % right brace in a string
+ \let\~=\TL % tilde in a string
+ \let\ =\SP % space in a string
+ \let\_=\UL % underline in a string
+ \let\&=\AM % ampersand in a string
+ \let\^=\CF % circumflex in a string
+ #1\kern.05em}}
+
+\def\postATL#1 #2 {\bf lettera \\{\uppercase{\char"#1}}
+ tangles as \tentex "#2"\egroup\par}
+\def\ATH{{\acrofalse\X\kern-.5em:Definizioni preprocessore\X}}
+
+\def\A{\note{Vedi anche sezione}} % xref for doubly defined section name
+\def\As{\note{Vedi anche sezioni}} % xref for multiply defined section name
+
+\def\ET{ e~} % conjunction between two section numbers
+\def\ETs{ e~} % conjunction between the last two of several section numbers
+
+\def\Q{\note{Questo codice \`e citato nella sezione}}
+ % xref for mention of a section
+\def\Qs{\note{Questo codice \`e citato nelle sezioni}}
+ % xref for mentions of a section
+
+\def\U{\note{Questo codice \`e usato nella sezione}}
+ % xref for use of a section
+\def\Us{\note{Questo codice \`e usato nelle sezioni}}
+ % xref for uses of a section
+
+\gtitle={Output \.{CWEB}} % this running head is reset by starred sections
+\mark{\noexpand\nullsec0{\the\gtitle}}
+
+\def\ch{\note{Le seguenti sezioni sono state modificate tramite il change-file:}
+ \let\*=\relax}
+
+\def\inx{\par\vskip6pt plus 1fil % we are beginning the index
+ \def\page{\box255 } \normalbottom
+ \write\cont{} % ensure that the contents file isn't empty
+ \write\cont{\catcode `\noexpand\@=12\relax} % \makeatother
+ \closeout\cont % the contents information has been fully gathered
+ \output{\ifpagesaved\normaloutput{\box\sbox}\lheader\rheader\fi
+ \global\setbox\sbox=\page \global\pagesavedtrue}
+ \pagesavedfalse \eject % eject the page-so-far and predecessors
+ \setbox\sbox\vbox{\unvbox\sbox} % take it out of its box
+ \vsize=\pageheight \advance\vsize by -\ht\sbox % the remaining height
+ \hsize=.5\pagewidth \advance\hsize by -10pt
+ % column width for the index (20pt between cols)
+ \parfillskip 0pt plus .6\hsize % try to avoid almost empty lines
+ \def\lr{L} % this tells whether the left or right column is next
+ \output{\if L\lr\global\setbox\lbox=\page \gdef\lr{R}
+ \else\normaloutput{\vbox to\pageheight{\box\sbox\vss
+ \hbox to\pagewidth{\box\lbox\hfil\page}}}\lheader\rheader
+ \global\vsize\pageheight\gdef\lr{L}\global\pagesavedfalse\fi}
+ \message{Indice Analitico:}
+ \parskip 0pt plus .5pt
+ \outer\def\I##1, ##2.{\par\hangindent2em\noindent##1:\kern1em
+ \ifacro\pdfnote##2.\else##2\fi.} % index entry
+ \def\[##1]{$\underline{##1}$} % underlined index item
+ \rm \rightskip0pt plus 2.5em \tolerance 10000 \let\*=\lapstar
+ \hyphenpenalty 10000 \parindent0pt
+ \readindex}
+\def\fin{\par\vfill\eject % this is done when we are ending the index
+ \ifpagesaved\null\vfill\eject\fi % output a null index column
+ \if L\lr\else\null\vfill\eject\fi % finish the current page
+ \ifpdftex \makebookmarks \fi % added in Version 3.68
+ \parfillskip 0pt plus 1fil
+ \def\grouptitle{NOMI DELLE SEZIONI}
+ \let\topsecno=\nullsec
+ \message{Nomi delle sezioni:}
+ \output={\normaloutput\page\lheader\rheader}
+ \setpage
+ \def\note##1##2.{\quad{\eightrm##1~\ifacro{\pdfnote##2.}\else{##2}\fi.}}
+ \def\Q{\note{Citato nella sezione}} % crossref for mention of a section
+ \def\Qs{\note{Citato nelle sezioni}} % crossref for mentions of a section
+ \def\U{\note{Usato nella sezione}} % crossref for use of a section
+ \def\Us{\note{Usato nelle sezioni}} % crossref for uses of a section
+ \def\I{\par\hangindent 2em}\let\*=*
+ \ifacro \def\outsecname{Nomi delle sezioni} \let\Xpdf\X
+% \ifpdftex \makebookmarks \pdfdest name {NOS} fitb % in versions < 3.68
+ \ifpdftex \pdfdest name {NOS} fith % changed in version 3.69
+ \pdfoutline goto name {NOS} count -\secno {\outsecname}
+ \def\X##1:##2\X{\Xpdf##1:##2\X \firstsecno##1.%
+ {\toksF={}\makeoutlinetoks##2\outlinedone\outlinedone}%
+ \pdfoutline goto num \the\toksA \expandafter{\the\toksE}}
+ \else\ifpdf
+ \special{pdf: outline -1 << /Title (\outsecname)
+ /Dest [ @thispage /FitH @ypos ] >>}
+ \def\X##1:##2\X{\Xpdf##1:##2\X \firstsecno##1.%
+ {\toksF={}\makeoutlinetoks##2\outlinedone\outlinedone}%
+ \special{pdf: outline 0 << /Title (\the\toksE)
+ /A << /S /GoTo /D (\romannumeral\the\toksA) >> >>}}
+ \fi\fi\fi
+ \readsections}
+\def\con{\par\vfill\eject % finish the section names
+% \ifodd\pageno\else\titletrue\null\vfill\eject\fi % for duplex printers
+ \rightskip 0pt \hyphenpenalty 50 \tolerance 200
+ \setpage \output={\normaloutput\page\lheader\rheader}
+ \titletrue % prepare to output the table of contents
+ \pageno=\contentspagenumber
+ \def\grouptitle{INDICE}
+ \message{Indice:}
+ \topofcontents \startpdf
+ \line{\hfil Sezione\hbox to3em{\hss Pag.}}
+ \let\ZZ=\contentsline
+ \readcontents\relax % read the contents info
+ \botofcontents \end} % print the contents page(s) and terminate
+\def\today{\number\day\space\ifcase\month\or
+ gennaio\or febbraio\or marzo\or aprile\or maggio\or giugno\or
+ luglio\or agosto\or settembre\or ottobre\or novembre\or dicembre\fi
+ \space\number\year}
+\def\datethis{\def\startsection{\leftline{\sc\today, ore \hours}\bigskip
+ \let\startsection=\stsec\stsec}}
+ % say `\datethis' in limbo, to get your listing timestamped before section 1
+%\def\datecontentspage{% versions up to 3.65
+% \def\topofcontents{\leftline{\sc\today, ore \hours}\bigskip
+% \centerline{\titlefont\title}\vfill}} % timestamps the contents page
+\def\datecontentspage{% changed in version 3.66
+ \def\botofcontents{\vfill
+ \centerline{\covernote}
+ \bigskip
+ \leftline{\sc\today, ore \hours}}} % timestamps the contents page
diff --git a/Build/source/texk/web2c/cwebdir/texinputs/mac8.sty b/Build/source/texk/web2c/cwebdir/texinputs/mac8.sty
new file mode 100644
index 00000000000..e462a52dbc8
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/texinputs/mac8.sty
@@ -0,0 +1,231 @@
+%
+% TEX/LATEX $VER: MAC8.STY 1.6 (18.08.2011)
+%
+% SYNOPSIS:
+% Conversion of umlauts and special characters of the
+% Macintosh 8-bit charset for plain TeX with the encoding
+% of Computer Modern Font. Some (but not all) characters
+% with codes higher than code 127 are replaced by their
+% TeX equivalents. This encoding is *different* to the
+% DC encoding, which is very popular in the international
+% TeX community.
+%
+% DATE OF CREATION:
+% 23.06.94: Derived from ECMA94.TEX by manual encoding according
+% to the font table presented by Yannis Haralambous in
+% his article ``A typewriter font for the Macintosh
+% 8-bit font table'', TUGboat 13/4 (1992). (V1.0)
+%
+% AUTHOR: Andreas Scherer
+%
+% CHANGES:
+% 27.07.1994: Two `\lccode' and `\uccode' bugs fixed. (V1.1)
+% 25.10.1994: Renamed for LaTeX package support. (V1.2)
+% 25.12.1994: Some more characters added. (V1.3)
+% 03.01.1995: Works with LaTeX again. Several modifications
+% according to Alain Aubord's `codepage' package. (V1.4)
+% 13.08.1998: New e-mail address. (V1.5)
+% 18.08.2011: New postal address. (V1.6)
+%
+% COPYRIGHT: There is no restriction to the usage of this file.
+%
+% if not(TeX >= 3.0) do_nothing, else ...
+\ifx\undefined\inputlineno \else
+\ifnum\inputlineno=-1 \else
+
+\newif\ifTeX % plain TeX or LaTeX?
+\ifx\undefined\documentclass\TeXtrue\else\TeXfalse\fi
+
+\message{MAC8-to-TeX conversion}
+
+\lccode`^^80=`^^8a \uccode`^^80=`^^80 \catcode`^^80=\active \def ^^80{\"A}
+\lccode`^^81=`^^8c \uccode`^^81=`^^81 \catcode`^^81=\active \def ^^81{{\AA}}
+\lccode`^^82=`^^8d \uccode`^^82=`^^82 \catcode`^^82=\active \def ^^82{\c{C}}
+\lccode`^^83=`^^8e \uccode`^^83=`^^83 \catcode`^^83=\active \def ^^83{\'E}
+\lccode`^^84=`^^96 \uccode`^^84=`^^84 \catcode`^^84=\active \def ^^84{\~N}
+\lccode`^^85=`^^9a \uccode`^^85=`^^85 \catcode`^^85=\active \def ^^85{\"O}
+\lccode`^^86=`^^9f \uccode`^^86=`^^86 \catcode`^^86=\active \def ^^86{\"U}
+\lccode`^^87=`^^87 \uccode`^^87=`^^e7 \catcode`^^87=\active \def ^^87{\'a}
+\lccode`^^88=`^^88 \uccode`^^88=`^^cb \catcode`^^88=\active \def ^^88{\`a}
+\lccode`^^89=`^^89 \uccode`^^89=`^^e5 \catcode`^^89=\active \def ^^89{\^a}
+\lccode`^^8a=`^^8a \uccode`^^8a=`^^80 \catcode`^^8a=\active \def ^^8a{\"a}
+\lccode`^^8b=`^^8b \uccode`^^8b=`^^cc \catcode`^^8b=\active \def ^^8b{\~a}
+\lccode`^^8c=`^^8c \uccode`^^8c=`^^81 \catcode`^^8c=\active \def ^^8c{{\aa}}
+\lccode`^^8d=`^^8d \uccode`^^8d=`^^82 \catcode`^^8d=\active \def ^^8d{\c{c}}
+\lccode`^^8e=`^^8e \uccode`^^8e=`^^83 \catcode`^^8e=\active \def ^^8e{\'e}
+\lccode`^^8f=`^^8f \uccode`^^8f=`^^e9 \catcode`^^8f=\active \def ^^8f{\`e}
+
+\lccode`^^90=`^^90 \uccode`^^90=`^^e6 \catcode`^^90=\active \def ^^90{\^e}
+\lccode`^^91=`^^91 \uccode`^^91=`^^e8 \catcode`^^91=\active \def ^^91{\"e}
+\lccode`^^92=`^^92 \uccode`^^92=`^^ea \catcode`^^92=\active \def ^^92{{\'\i}}
+\lccode`^^93=`^^93 \uccode`^^93=`^^ed \catcode`^^93=\active \def ^^93{{\`\i}}
+\lccode`^^94=`^^94 \uccode`^^94=`^^eb \catcode`^^94=\active \def ^^94{{\^\i}}
+\lccode`^^95=`^^95 \uccode`^^95=`^^ec \catcode`^^95=\active \def ^^95{{\"\i}}
+\lccode`^^96=`^^96 \uccode`^^96=`^^84 \catcode`^^96=\active \def ^^96{\~n}
+\lccode`^^97=`^^97 \uccode`^^97=`^^ee \catcode`^^97=\active \def ^^97{\'o}
+\lccode`^^98=`^^98 \uccode`^^98=`^^f1 \catcode`^^98=\active \def ^^98{\`o}
+\lccode`^^99=`^^99 \uccode`^^99=`^^ef \catcode`^^99=\active \def ^^99{\^o}
+\lccode`^^9a=`^^9a \uccode`^^9a=`^^85 \catcode`^^9a=\active \def ^^9a{\"o}
+\lccode`^^9b=`^^9b \uccode`^^9b=`^^cd \catcode`^^9b=\active \def ^^9b{\~o}
+\lccode`^^9c=`^^9c \uccode`^^9c=`^^f2 \catcode`^^9c=\active \def ^^9c{\'u}
+\lccode`^^9d=`^^9d \uccode`^^9d=`^^f4 \catcode`^^9d=\active \def ^^9d{\`u}
+\lccode`^^9e=`^^9e \uccode`^^9e=`^^f3 \catcode`^^9e=\active \def ^^9e{\^u}
+\lccode`^^9f=`^^9f \uccode`^^9f=`^^86 \catcode`^^9f=\active \def ^^9f{\"u}
+
+\lccode`^^a0=`^^a0 \uccode`^^a0=`^^a0 \catcode`^^a0=\active \def ^^a0{{\dag}}
+\lccode`^^a1=`^^a1 \uccode`^^a1=`^^a1 \catcode`^^a1=\active
+ \def ^^a1{\ifmmode{}^\circ\else$^\circ$\fi}
+
+\lccode`^^a3=`^^a3 \uccode`^^a3=`^^a3 \catcode`^^a3=\active
+ \def ^^a3{\ifTeX{\it\$}\else\pounds\fi}
+\lccode`^^a4=`^^a4 \uccode`^^a4=`^^a4 \catcode`^^a4=\active \def ^^a4{{\S}}
+\lccode`^^a5=`^^a5 \uccode`^^a5=`^^a5 \catcode`^^a5=\active
+ \def ^^a5{\ifmmode\bullet\else$\bullet$\fi}
+\lccode`^^a6=`^^a6 \uccode`^^a6=`^^a6 \catcode`^^a6=\active \def ^^a6{{\P}}
+\lccode`^^a7=`^^a7 \uccode`^^a7=`^^a7 \catcode`^^a7=\active \def ^^a7{{\ss}}
+
+\lccode`^^a9=`^^a9 \uccode`^^a9=`^^a9 \catcode`^^a9=\active \def ^^a9{{\copyright}}
+
+\lccode`^^ac=`^^ac \uccode`^^ac=`^^ac \catcode`^^ac=\active \def ^^ac{\'{}}
+\lccode`^^ad=`^^ad \uccode`^^ad=`^^ad \catcode`^^ad=\active \def ^^ad{\"{}}
+\lccode`^^ae=`^^be \uccode`^^ae=`^^ae \catcode`^^ae=\active \def ^^ae{{\AE}}
+\lccode`^^af=`^^bf \uccode`^^af=`^^af \catcode`^^af=\active \def ^^af{{\O}}
+
+\lccode`^^b0=`^^b0 \uccode`^^b0=`^^b0 \catcode`^^b0=\active
+ \def ^^b0{\ifmmode\infty\else$\infty$\fi}
+\lccode`^^b1=`^^b1 \uccode`^^b1=`^^b1 \catcode`^^b1=\active
+ \def ^^b1{\ifmmode\pm\else$\pm$\fi}
+\lccode`^^b2=`^^b2 \uccode`^^b2=`^^b2 \catcode`^^b2=\active
+ \def ^^b2{\ifmmode\leq\else$\leq$\fi}
+\lccode`^^b3=`^^b3 \uccode`^^b3=`^^b3 \catcode`^^b3=\active
+ \def ^^b3{\ifmmode\geq\else$\geq$\fi}
+
+\lccode`^^b5=`^^b5 \uccode`^^b5=`^^b5 \catcode`^^b5=\active
+ \def ^^b5{\ifmmode\mu\else$\mu$\fi}
+\lccode`^^b6=`^^b6 \uccode`^^b6=`^^b6 \catcode`^^b6=\active
+ \def ^^b6{\ifmmode\partial\else$\partial$\fi}
+\lccode`^^b7=`^^b7 \uccode`^^b7=`^^b7 \catcode`^^b7=\active
+ \def ^^b7{\ifmmode\Sigma\else$\Sigma$\fi}
+\lccode`^^b8=`^^b9 \uccode`^^b8=`^^b8 \catcode`^^b8=\active
+ \def ^^b8{\ifmmode\Pi\else$\Pi$\fi}
+\lccode`^^b9=`^^b9 \uccode`^^b9=`^^b8 \catcode`^^b9=\active
+ \def ^^b9{\ifmmode\pi\else$\pi$\fi}
+\lccode`^^ba=`^^ba \uccode`^^ba=`^^ba \catcode`^^ba=\active
+ \def ^^ba{\ifmmode\int\else$\int$\fi}
+\lccode`^^bb=`^^bb \uccode`^^bb=`^^bb \catcode`^^bb=\active
+ \def ^^bb{\ifmmode
+ {}^{\hbox{\ifTeX\sevenrm\else\small\fi\b{a}}}\else
+ $^{\hbox{\ifTeX\sevenrm\else\small\fi\b{a}}}$\fi}
+\lccode`^^bc=`^^bc \uccode`^^bc=`^^bc \catcode`^^bc=\active
+ \def ^^bc{\ifmmode
+ {}^{\hbox{\ifTeX\sevenrm\else\small\fi\b{o}}}\else
+ $^{\hbox{\ifTeX\sevenrm\else\small\fi\b{o}}}$\fi}
+\lccode`^^bd=`^^bd \uccode`^^bd=`^^bd \catcode`^^bd=\active
+ \def ^^bd{\ifmmode\Omega\else$\Omega$\fi}
+\lccode`^^be=`^^be \uccode`^^be=`^^ae \catcode`^^be=\active \def ^^be{{\ae}}
+\lccode`^^bf=`^^bf \uccode`^^bf=`^^af \catcode`^^bf=\active \def ^^bf{{\o}}
+
+\lccode`^^c0=`^^c0 \uccode`^^c0=`^^c0 \catcode`^^c0=\active \def ^^c0{{?`}}
+\lccode`^^c1=`^^c1 \uccode`^^c1=`^^c1 \catcode`^^c1=\active \def ^^c1{{!`}}
+\lccode`^^c2=`^^c2 \uccode`^^c2=`^^c2 \catcode`^^c2=\active
+ \def ^^c2{\ifmmode\lnot\else$\lnot$\fi}
+\lccode`^^c3=`^^c3 \uccode`^^c3=`^^c3 \catcode`^^c3=\active
+ \def ^^c3{\ifmmode\sqrt{}\else$\sqrt{}$\fi}
+\lccode`^^c4=`^^c4 \uccode`^^c4=`^^c4 \catcode`^^c4=\active \def ^^c4{{\it f\/}}
+\lccode`^^c5=`^^c5 \uccode`^^c5=`^^c5 \catcode`^^c5=\active
+ \def ^^c5{\ifmmode\approx\else$\approx$\fi}
+\lccode`^^c6=`^^c6 \uccode`^^c6=`^^c6 \catcode`^^c6=\active
+ \def ^^c6{\ifmmode\Delta\else$\Delta$\fi}
+
+\lccode`^^c9=`^^c9 \uccode`^^c9=`^^c9 \catcode`^^c9=\active
+ \def ^^c9{\ifmmode\ldots\else$\ldots$\fi}
+\lccode`^^ca=`^^ca \uccode`^^ca=`^^ca \catcode`^^ca=\active \def ^^ca{~}
+\lccode`^^cb=`^^88 \uccode`^^cb=`^^cb \catcode`^^cb=\active \def ^^cb{\`A}
+\lccode`^^cc=`^^8b \uccode`^^cc=`^^cc \catcode`^^cc=\active \def ^^cc{\~A}
+\lccode`^^cd=`^^9b \uccode`^^cd=`^^cd \catcode`^^cd=\active \def ^^cd{\~O}
+\lccode`^^ce=`^^cf \uccode`^^ce=`^^ce \catcode`^^ce=\active \def ^^ce{{\OE}}
+\lccode`^^cf=`^^cf \uccode`^^cf=`^^ce \catcode`^^cf=\active \def ^^cf{{\oe}}
+
+\lccode`^^d0=`^^d0 \uccode`^^d0=`^^d0 \catcode`^^d0=\active \def ^^d0{--}
+\lccode`^^d1=`^^d1 \uccode`^^d1=`^^d1 \catcode`^^d1=\active \def ^^d1{---}
+\lccode`^^d2=`^^d2 \uccode`^^d2=`^^d2 \catcode`^^d2=\active \def ^^d2{``}
+\lccode`^^d3=`^^d3 \uccode`^^d3=`^^d3 \catcode`^^d3=\active \def ^^d3{''}
+\lccode`^^d4=`^^d4 \uccode`^^d4=`^^d4 \catcode`^^d4=\active \def ^^d4{`}
+\lccode`^^d5=`^^d5 \uccode`^^d5=`^^d5 \catcode`^^d5=\active \def ^^d5{'}
+\lccode`^^d6=`^^d6 \uccode`^^d6=`^^d6 \catcode`^^d6=\active
+ \def ^^d6{\ifmmode\div\else$\div$\fi}
+\lccode`^^d7=`^^d7 \uccode`^^d7=`^^d7 \catcode`^^d7=\active
+ \def ^^d7{\ifmmode\diamond\else$\diamond$\fi}
+\lccode`^^d8=`^^d8 \uccode`^^d8=`^^d9 \catcode`^^d8=\active \def ^^d8{\"y}
+\lccode`^^d9=`^^d8 \uccode`^^d9=`^^d9 \catcode`^^d9=\active \def ^^d9{\"Y}
+\lccode`^^da=`^^da \uccode`^^da=`^^da \catcode`^^da=\active
+ \def ^^da{\ifmmode/\else$/$\fi}
+
+\lccode`^^dc=`^^dc \uccode`^^dc=`^^dc \catcode`^^dc=\active
+ \def ^^dc{\ifmmode<\else$<$\fi}
+\lccode`^^dd=`^^dd \uccode`^^dd=`^^dd \catcode`^^dd=\active
+ \def ^^dd{\ifmmode>\else$>$\fi}
+\lccode`^^de=`^^de \uccode`^^de=`^^de \catcode`^^de=\active \def ^^de{fi}
+\lccode`^^df=`^^df \uccode`^^df=`^^df \catcode`^^df=\active \def ^^df{fl}
+
+\lccode`^^e0=`^^e0 \uccode`^^e0=`^^e0 \catcode`^^e0=\active \def ^^e0{\ddag}
+\lccode`^^e1=`^^e1 \uccode`^^e1=`^^e1 \catcode`^^e1=\active
+ \def ^^e1{\ifmmode\cdot\else$\cdot$\fi}
+\lccode`^^e2=`^^e2 \uccode`^^e2=`^^e2 \catcode`^^e2=\active \def ^^e2{,}
+\lccode`^^e3=`^^e3 \uccode`^^e3=`^^e3 \catcode`^^e3=\active \def ^^e3{,\kern-.1em,\/}
+
+\lccode`^^e5=`^^89 \uccode`^^e5=`^^e5 \catcode`^^e5=\active \def ^^e5{\^A}
+\lccode`^^e6=`^^90 \uccode`^^e6=`^^e6 \catcode`^^e6=\active \def ^^e6{\^E}
+\lccode`^^e7=`^^87 \uccode`^^e7=`^^e7 \catcode`^^e7=\active \def ^^e7{\'A}
+\lccode`^^e8=`^^91 \uccode`^^e8=`^^e8 \catcode`^^e8=\active \def ^^e8{\"E}
+\lccode`^^e9=`^^8f \uccode`^^e9=`^^e9 \catcode`^^e9=\active \def ^^e9{\`E}
+\lccode`^^ea=`^^92 \uccode`^^ea=`^^ea \catcode`^^ea=\active \def ^^ea{\'I}
+\lccode`^^eb=`^^94 \uccode`^^eb=`^^eb \catcode`^^eb=\active \def ^^eb{\^I}
+\lccode`^^ec=`^^95 \uccode`^^ec=`^^ec \catcode`^^ec=\active \def ^^ec{\"I}
+\lccode`^^ed=`^^93 \uccode`^^ed=`^^ed \catcode`^^ed=\active \def ^^ed{\`I}
+\lccode`^^ee=`^^97 \uccode`^^ee=`^^ee \catcode`^^ee=\active \def ^^ee{\'O}
+\lccode`^^ef=`^^99 \uccode`^^ef=`^^ef \catcode`^^ef=\active \def ^^ef{\^O}
+
+\lccode`^^f1=`^^98 \uccode`^^f1=`^^f1 \catcode`^^f1=\active \def ^^f1{\`O}
+\lccode`^^f2=`^^9c \uccode`^^f2=`^^f2 \catcode`^^f2=\active \def ^^f2{\'U}
+\lccode`^^f3=`^^9e \uccode`^^f3=`^^f3 \catcode`^^f3=\active \def ^^f3{\^U}
+\lccode`^^f4=`^^9d \uccode`^^f4=`^^f4 \catcode`^^f4=\active \def ^^f4{\`U}
+\lccode`^^f5=`^^f5 \uccode`^^f5=`^^f5 \catcode`^^f5=\active \def ^^f5{{\i}}
+\lccode`^^f6=`^^f6 \uccode`^^f6=`^^f6 \catcode`^^f6=\active \def ^^f6{\^{}}
+\lccode`^^f7=`^^f7 \uccode`^^f7=`^^f7 \catcode`^^f7=\active \def ^^f7{\~{}}
+\lccode`^^f8=`^^f8 \uccode`^^f8=`^^f8 \catcode`^^f8=\active \def ^^f8{\={}}
+\lccode`^^f9=`^^f9 \uccode`^^f9=`^^f9 \catcode`^^f9=\active \def ^^f9{\u{}}
+\lccode`^^fa=`^^fa \uccode`^^fa=`^^fa \catcode`^^fa=\active \def ^^fa{%
+ \ifx\datecontentspage\undefined\.{}\else\:{}\fi}
+\lccode`^^fb=`^^fb \uccode`^^fb=`^^fb \catcode`^^fb=\active \def ^^fb{%
+ \ifx\datecontentspage\undefined\.{}\else\:{}\fi}
+\lccode`^^fc=`^^fc \uccode`^^fc=`^^fc \catcode`^^fc=\active \def ^^fc{\c{}}
+\lccode`^^fd=`^^fd \uccode`^^fd=`^^fd \catcode`^^fd=\active \def ^^fd{\H{}}
+\lccode`^^fe=`^^fe \uccode`^^fe=`^^fe \catcode`^^fe=\active \def ^^fe{\c{}}
+\lccode`^^ff=`^^ff \uccode`^^ff=`^^ff \catcode`^^ff=\active \def ^^ff{\v{}}
+
+\def\Cstringchars{% Avoid any whitespace!
+ \def ^^80{{\tt\"A}}\def ^^81{{\tt\AA}}\def ^^82{{\tt\c{C}}}%
+ \def ^^83{{\tt\'E}}\def ^^84{{\tt\~N}}\def ^^85{{\tt\"O}}%
+ \def ^^86{{\tt\"U}}\def ^^87{{\tt\'a}}\def ^^88{{\tt\`a}}%
+ \def ^^89{{\tt\^a}}\def ^^8a{{\tt\"a}}\def ^^8b{{\tt\~a}}%
+ \def ^^8c{{\tt\aa}}\def ^^8d{{\tt\c{c}}}\def ^^8e{{\tt\'e}}%
+ \def ^^8f{{\tt\`e}}\def ^^90{{\tt\^e}}\def ^^91{{\tt\"e}}%
+ \def ^^92{{\tt\'\i}}\def ^^93{{\tt\`\i}}\def ^^94{{\tt\^\i}}%
+ \def ^^95{{\tt\"\i}}\def ^^96{{\tt\~n}}\def ^^97{{\tt\'o}}%
+ \def ^^98{{\tt\`o}}\def ^^99{{\tt\^o}}\def ^^9a{{\tt\"o}}%
+ \def ^^9b{{\tt\~o}}\def ^^9c{{\tt\'u}}\def ^^9d{{\tt\`u}}%
+ \def ^^9e{{\tt\^u}}\def ^^9f{{\tt\"u}}\def ^^a7{{\tt\ss}}%
+ \def ^^ae{{\tt\AE}}\def ^^af{{\tt\O}}\def ^^be{{\tt\ae}}%
+ \def ^^bf{{\tt\o}}\def ^^c0{{\tt?`}}\def ^^c1{{\tt!`}}%
+ \def ^^cb{{\tt\`A}}\def ^^cc{{\tt\~A}}\def ^^cd{{\tt\~O}}%
+ \def ^^d8{{\tt\"y}}\def ^^d9{{\tt\"Y}}\def ^^e5{{\tt\^A}}%
+ \def ^^e6{{\tt\^E}}\def ^^e7{{\tt\'A}}\def ^^e8{{\tt\"E}}%
+ \def ^^e9{{\tt\`E}}\def ^^ea{{\tt\'I}}\def ^^eb{{\tt\^I}}%
+ \def ^^ec{{\tt\"I}}\def ^^ed{{\tt\`I}}\def ^^ee{{\tt\'O}}%
+ \def ^^ef{{\tt\^O}}\def ^^f1{{\tt\`O}}\def ^^f2{{\tt\'U}}%
+ \def ^^f3{{\tt\^U}}\def ^^f4{{\tt\`U}}}
+
+\fi\fi
+
+\endinput
diff --git a/Build/source/texk/web2c/cwebdir/texinputs/pc850.sty b/Build/source/texk/web2c/cwebdir/texinputs/pc850.sty
new file mode 100644
index 00000000000..091f07f2f96
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/texinputs/pc850.sty
@@ -0,0 +1,193 @@
+%
+% TEX/LATEX $VER: PC850.STY 1.9 (18.08.2011)
+%
+% SYNOPSIS:
+% Conversion of umlauts and special characters of the
+% PC-850 charset for plain TeX with the encoding of
+% Computer Modern Font. PC-850 seems to be a standard
+% charset for some conputers and printers. Some (but
+% not all) characters with codes higher than code 127
+% are replaced by their TeX equivalents. PC-850 should
+% be almost identical to CodePage 437 used for DOS.
+% This encoding is *different* to the DC encoding, which
+% is very popular in the international TeX community.
+%
+% DATE OF CREATION:
+% 14.01.94: Derived from ECMA94.TEX by manual encoding. (V1.0)
+%
+% AUTHOR: Andreas Scherer
+%
+% COPYRIGHT:
+% There is no restriction to the usage of this file.
+%
+% CHANGES:
+% 15.03.1994: `\Cstringchars' implemented for use with
+% the CWEB macros (V1.1)
+% 13.07.1994: Exchange character positions O374 and 0375. (V1.2)
+% 27.07.1994: Two `\lccode' and `\uccode' bugs fixed. (V1.3)
+% 25.10.1994: Renamed for LaTeX package support. (V1.4)
+% 24.12.1994: Some more characters added. (V1.5)
+% 03.01.1995: Works with LaTeX again. Several modifications
+% according to Alain Aubord's `codepage' package. (V1.6)
+% 25.03.1996: New postal address. (V1.7)
+% 13.08.1998: New e-mail address. (V1.8)
+% 18.08.2011: New postal address. (V1.9)
+%
+% if not(TeX >= 3.0) do_nothing, else ...
+\ifx\undefined\inputlineno \else
+\ifnum\inputlineno=-1 \else
+
+\newif\ifTeX % plain TeX or LaTeX?
+\ifx\undefined\documentclass\TeXtrue\else\TeXfalse\fi
+
+\message{PC850-to-TeX conversion}
+
+\lccode`^^80=`^^87 \uccode`^^80=`^^80 \catcode`^^80=\active \def ^^80{\c{C}}
+\lccode`^^81=`^^81 \uccode`^^81=`^^9a \catcode`^^81=\active \def ^^81{\"u}
+\lccode`^^82=`^^82 \uccode`^^82=`^^90 \catcode`^^82=\active \def ^^82{\'e}
+\lccode`^^83=`^^83 \uccode`^^83=`^^b6 \catcode`^^83=\active \def ^^83{\^a}
+\lccode`^^84=`^^84 \uccode`^^84=`^^8e \catcode`^^84=\active \def ^^84{\"a}
+\lccode`^^85=`^^85 \uccode`^^85=`^^b7 \catcode`^^85=\active \def ^^85{\`a}
+\lccode`^^86=`^^86 \uccode`^^86=`^^8f \catcode`^^86=\active \def ^^86{{\aa}}
+\lccode`^^87=`^^87 \uccode`^^87=`^^80 \catcode`^^87=\active \def ^^87{\c{c}}
+\lccode`^^88=`^^88 \uccode`^^88=`^^d2 \catcode`^^88=\active \def ^^88{\^e}
+\lccode`^^89=`^^89 \uccode`^^89=`^^d3 \catcode`^^89=\active \def ^^89{\"e}
+\lccode`^^8a=`^^8a \uccode`^^8a=`^^d4 \catcode`^^8a=\active \def ^^8a{\`e}
+\lccode`^^8b=`^^8b \uccode`^^8b=`^^d8 \catcode`^^8b=\active \def ^^8b{{\"\i}}
+\lccode`^^8c=`^^8c \uccode`^^8c=`^^d7 \catcode`^^8c=\active \def ^^8c{{\^\i}}
+\lccode`^^8d=`^^8d \uccode`^^8d=`^^de \catcode`^^8d=\active \def ^^8d{{\`\i}}
+\lccode`^^8e=`^^84 \uccode`^^8e=`^^8e \catcode`^^8e=\active \def ^^8e{\"A}
+\lccode`^^8f=`^^86 \uccode`^^8f=`^^8f \catcode`^^8f=\active \def ^^8f{{\AA}}
+
+\lccode`^^90=`^^82 \uccode`^^90=`^^90 \catcode`^^90=\active \def ^^90{\'E}
+\lccode`^^91=`^^91 \uccode`^^91=`^^92 \catcode`^^91=\active \def ^^91{{\ae}}
+\lccode`^^92=`^^91 \uccode`^^92=`^^92 \catcode`^^92=\active \def ^^92{{\AE}}
+\lccode`^^93=`^^93 \uccode`^^93=`^^e2 \catcode`^^93=\active \def ^^93{\^o}
+\lccode`^^94=`^^94 \uccode`^^94=`^^99 \catcode`^^94=\active \def ^^94{\"o}
+\lccode`^^95=`^^95 \uccode`^^95=`^^e3 \catcode`^^95=\active \def ^^95{\`o}
+\lccode`^^96=`^^96 \uccode`^^96=`^^ea \catcode`^^96=\active \def ^^96{\^u}
+\lccode`^^97=`^^97 \uccode`^^97=`^^eb \catcode`^^97=\active \def ^^97{\`u}
+\lccode`^^98=`^^98 \uccode`^^98=`^^98 \catcode`^^98=\active \def ^^98{\"y}
+\lccode`^^99=`^^94 \uccode`^^99=`^^99 \catcode`^^99=\active \def ^^99{\"O}
+\lccode`^^9a=`^^81 \uccode`^^9a=`^^9a \catcode`^^9a=\active \def ^^9a{\"U}
+\lccode`^^9b=`^^9b \uccode`^^9b=`^^9d \catcode`^^9b=\active \def ^^9b{{\o}}
+\lccode`^^9c=`^^9c \uccode`^^9c=`^^9c \catcode`^^9c=\active
+ \def ^^9c{\ifTeX{\it\$}\else\pounds\fi}
+\lccode`^^9d=`^^9b \uccode`^^9d=`^^9d \catcode`^^9d=\active \def ^^9d{{\O}}
+\lccode`^^9e=`^^9e \uccode`^^9e=`^^9e \catcode`^^9e=\active
+ \def ^^9e{\ifmmode\times\else$\times$\fi}
+\lccode`^^9f=`^^9f \uccode`^^9f=`^^9f \catcode`^^9f=\active \def ^^9f{{\it f\/}}
+
+\lccode`^^a0=`^^a0 \uccode`^^a0=`^^b5 \catcode`^^a0=\active \def ^^a0{\'a}
+\lccode`^^a1=`^^a1 \uccode`^^a1=`^^d6 \catcode`^^a1=\active \def ^^a1{{\'\i}}
+\lccode`^^a2=`^^a2 \uccode`^^a2=`^^e0 \catcode`^^a2=\active \def ^^a2{\'o}
+\lccode`^^a3=`^^a3 \uccode`^^a3=`^^e9 \catcode`^^a3=\active \def ^^a3{\'u}
+\lccode`^^a4=`^^a4 \uccode`^^a4=`^^a5 \catcode`^^a4=\active \def ^^a4{\~n}
+\lccode`^^a5=`^^a4 \uccode`^^a5=`^^a5 \catcode`^^a5=\active \def ^^a5{\~N}
+\lccode`^^a6=`^^a6 \uccode`^^a6=`^^a6 \catcode`^^a6=\active
+ \def ^^a6{\ifmmode
+ {}^{\hbox{\ifTeX\sevenrm\else\small\fi\b{a}}}\else
+ $^{\hbox{\ifTeX\sevenrm\else\small\fi\b{a}}}$\fi}
+\lccode`^^a7=`^^a7 \uccode`^^a7=`^^a7 \catcode`^^a7=\active
+ \def ^^a7{\ifmmode
+ {}^{\hbox{\ifTeX\sevenrm\else\small\fi\b{o}}}\else
+ $^{\hbox{\ifTeX\sevenrm\else\small\fi\b{o}}}$\fi}
+\lccode`^^a8=`^^a8 \uccode`^^a8=`^^a8 \catcode`^^a8=\active \def ^^a8{{?`}}
+
+\lccode`^^aa=`^^aa \uccode`^^aa=`^^aa \catcode`^^aa=\active
+ \def ^^aa{\ifmmode\lnot\else$\lnot$\fi}
+
+\def\Fraction#1#2{\ifmmode\ifTeX{#1\over#2}\else\frac{#1}{#2}\fi\else
+ \ifTeX$#1\over#2$\else$\frac{#1}{#2}$\fi\fi}
+
+\lccode`^^ab=`^^ab \uccode`^^ab=`^^ab \catcode`^^ab=\active
+ \def ^^ab{\Fraction{1}{2}}
+\lccode`^^ac=`^^ac \uccode`^^ac=`^^ac \catcode`^^ac=\active
+ \def ^^ac{\Fraction{1}{4}}
+\lccode`^^ad=`^^ad \uccode`^^ad=`^^ad \catcode`^^ad=\active \def ^^ad{{!`}}
+
+\lccode`^^b5=`^^a0 \uccode`^^b5=`^^b5 \catcode`^^b5=\active \def ^^b5{\'A}
+\lccode`^^b6=`^^83 \uccode`^^b6=`^^b6 \catcode`^^b6=\active \def ^^b6{\^A}
+\lccode`^^b7=`^^85 \uccode`^^b7=`^^b7 \catcode`^^b7=\active \def ^^b7{\`A}
+\lccode`^^b8=`^^b8 \uccode`^^b8=`^^b8 \catcode`^^b8=\active \def ^^b8{{\copyright}}
+
+\lccode`^^c6=`^^c6 \uccode`^^c6=`^^c7 \catcode`^^c6=\active \def ^^c6{\~a}
+\lccode`^^c7=`^^c6 \uccode`^^c7=`^^c7 \catcode`^^c7=\active \def ^^c7{\~A}
+
+\lccode`^^d2=`^^88 \uccode`^^d2=`^^d2 \catcode`^^d2=\active \def ^^d2{\^E}
+\lccode`^^d3=`^^89 \uccode`^^d3=`^^d3 \catcode`^^d3=\active \def ^^d3{\"E}
+\lccode`^^d4=`^^8a \uccode`^^d4=`^^d4 \catcode`^^d4=\active \def ^^d4{\`E}
+\lccode`^^d5=`^^d5 \uccode`^^d5=`^^d5 \catcode`^^d5=\active \def ^^d5{{\i}}
+\lccode`^^d6=`^^a1 \uccode`^^d6=`^^d6 \catcode`^^d6=\active \def ^^d6{\'I}
+\lccode`^^d7=`^^8c \uccode`^^d7=`^^d7 \catcode`^^d7=\active \def ^^d7{\^I}
+\lccode`^^d8=`^^8b \uccode`^^d8=`^^d8 \catcode`^^d8=\active \def ^^d8{\"I}
+
+\lccode`^^de=`^^8d \uccode`^^de=`^^de \catcode`^^de=\active \def ^^de{\`I}
+
+\lccode`^^e0=`^^a2 \uccode`^^e0=`^^e0 \catcode`^^e0=\active \def ^^e0{\'O}
+\lccode`^^e1=`^^e1 \uccode`^^e1=`^^e1 \catcode`^^e1=\active \def ^^e1{{\ss}}
+\lccode`^^e2=`^^93 \uccode`^^e2=`^^e2 \catcode`^^e2=\active \def ^^e2{\^O}
+\lccode`^^e3=`^^95 \uccode`^^e3=`^^e3 \catcode`^^e3=\active \def ^^e3{\`O}
+\lccode`^^e4=`^^e4 \uccode`^^e4=`^^e5 \catcode`^^e4=\active \def ^^e4{\~o}
+\lccode`^^e5=`^^e4 \uccode`^^e5=`^^e5 \catcode`^^e5=\active \def ^^e5{\~O}
+\lccode`^^e6=`^^e6 \uccode`^^e6=`^^e6 \catcode`^^e6=\active
+ \def ^^e6{\ifmmode\mu\else$\mu$\fi}
+
+\lccode`^^e9=`^^a3 \uccode`^^e9=`^^e9 \catcode`^^e9=\active \def ^^e9{\'U}
+\lccode`^^ea=`^^96 \uccode`^^ea=`^^ea \catcode`^^ea=\active \def ^^ea{\^U}
+\lccode`^^eb=`^^97 \uccode`^^eb=`^^eb \catcode`^^eb=\active \def ^^eb{\`U}
+\lccode`^^ec=`^^ec \uccode`^^ec=`^^ed \catcode`^^ec=\active \def ^^ec{\'y}
+\lccode`^^ed=`^^ec \uccode`^^ed=`^^ed \catcode`^^ed=\active \def ^^ed{\'Y}
+\lccode`^^ee=`^^ee \uccode`^^ee=`^^ee \catcode`^^ee=\active \def ^^ee{\={}}
+\lccode`^^ef=`^^ef \uccode`^^ef=`^^ef \catcode`^^ef=\active \def ^^ef{\'{}}
+
+\lccode`^^f0=`^^f0 \uccode`^^f0=`^^f0 \catcode`^^f0=\active \def ^^f0{--}
+\lccode`^^f1=`^^f1 \uccode`^^f1=`^^f1 \catcode`^^f1=\active
+ \def ^^f1{\ifmmode\pm\else$\pm$\fi}
+
+\lccode`^^f3=`^^f3 \uccode`^^f3=`^^f3 \catcode`^^f3=\active
+ \def ^^f3{\Fraction{3}{4}}
+\lccode`^^f4=`^^f4 \uccode`^^f4=`^^f4 \catcode`^^f4=\active \def ^^f4{{\P}}
+\lccode`^^f5=`^^f5 \uccode`^^f5=`^^f5 \catcode`^^f5=\active \def ^^f5{{\S}}
+\lccode`^^f6=`^^f6 \uccode`^^f6=`^^f6 \catcode`^^f6=\active
+ \def ^^f6{\ifmmode\div\else$\div$\fi}
+\lccode`^^f7=`^^f7 \uccode`^^f7=`^^f7 \catcode`^^f7=\active \def ^^f7{\c{}}
+\lccode`^^f8=`^^f8 \uccode`^^f8=`^^f8 \catcode`^^f8=\active
+ \def ^^f8{\ifmmode{}^\circ\else$^\circ$\fi}
+\lccode`^^f9=`^^f9 \uccode`^^f9=`^^f9 \catcode`^^f9=\active \def ^^f9{\"{}}
+\lccode`^^fa=`^^fa \uccode`^^fa=`^^fa \catcode`^^fa=\active
+ \def ^^fa{\ifmmode\cdot\else$\cdot$\fi}
+\lccode`^^fb=`^^fb \uccode`^^fb=`^^fb \catcode`^^fb=\active
+ \def ^^fb{\ifmmode{}^1\else${}^1$\fi}
+\lccode`^^fc=`^^fc \uccode`^^fc=`^^fc \catcode`^^fc=\active
+ \def ^^fc{\ifmmode{}^3\else${}^3$\fi}
+\lccode`^^fd=`^^fd \uccode`^^fd=`^^fd \catcode`^^fd=\active
+ \def ^^fd{\ifmmode{}^2\else${}^2$\fi}
+
+\lccode`^^ff=`^^ff \uccode`^^ff=`^^ff \catcode`^^ff=\active \def ^^ff{~}
+
+\def\Cstringchars{% Avoid any whitespace!
+ \def ^^80{{\tt\c{C}}}\def ^^81{{\tt\"u}}\def ^^82{{\tt\'e}}%
+ \def ^^83{{\tt\^a}}\def ^^84{{\tt\"a}}\def ^^85{{\tt\`a}}%
+ \def ^^86{{\tt\aa}}\def ^^87{{\tt\c{c}}}\def ^^88{{\tt\^e}}%
+ \def ^^89{{\tt\"e}}\def ^^8a{{\tt\`e}}\def ^^8b{{\tt\"\i}}%
+ \def ^^8c{{\tt\^\i}}\def ^^8d{{\tt\`\i}}\def ^^8e{{\tt\"A}}%
+ \def ^^8f{{\tt\AA}}\def ^^90{{\tt\'E}}\def ^^91{{\tt\ae}}%
+ \def ^^92{{\tt\AE}}\def ^^93{{\tt\^o}}\def ^^94{{\tt\"o}}%
+ \def ^^95{{\tt\`o}}\def ^^96{{\tt\^u}}\def ^^97{{\tt\`u}}%
+ \def ^^98{{\tt\"y}}\def ^^99{{\tt\"O}}\def ^^9a{{\tt\"U}}%
+ \def ^^9b{{\tt\o}}\def ^^9d{{\tt\O}}\def ^^a0{{\tt\'a}}%
+ \def ^^a1{{\tt\'\i}}\def ^^a2{{\tt\'o}}\def ^^a3{{\tt\'u}}%
+ \def ^^a4{{\tt\~n}}\def ^^a5{{\tt\~N}}\def ^^a8{{\tt?`}}%
+ \def ^^ad{{\tt!`}}\def ^^b5{{\tt\'A}}\def ^^b6{{\tt\^A}}%
+ \def ^^b7{{\tt\`A}}\def ^^c6{{\tt\~a}}\def ^^c7{{\tt\~A}}%
+ \def ^^d2{{\tt\^E}}\def ^^d3{{\tt\"E}}\def ^^d4{{\tt\`E}}%
+ \def ^^d6{{\tt\'I}}\def ^^d7{{\tt\^I}}\def ^^d8{{\tt\"I}}%
+ \def ^^de{{\tt\`I}}\def ^^e0{{\tt\'O}}\def ^^e1{{\tt\ss}}%
+ \def ^^e2{{\tt\^O}}\def ^^e3{{\tt\`O}}\def ^^e4{{\tt\~o}}%
+ \def ^^e5{{\tt\~O}}\def^^e9{{\tt\'U}}\def ^^ea{{\tt\^U}}%
+ \def ^^eb{{\tt\`U}}\def ^^ec{{\tt\'y}}\def ^^ed{{\tt\'Y}}}%
+
+\fi\fi
+
+\endinput
diff --git a/Build/source/texk/web2c/cwebdir/twinx.w b/Build/source/texk/web2c/cwebdir/twinx.w
new file mode 100644
index 00000000000..c49906fa4e0
--- /dev/null
+++ b/Build/source/texk/web2c/cwebdir/twinx.w
@@ -0,0 +1,460 @@
+\datethis
+
+@*Introduction. This short program compiles a master index for a
+set of programs that have been processed by \.{CTWILL}.
+To use it, you say, e.g., \.{twinx} \.{*.tex} \.{>index.tex}.
+The individual programs should define their names with a line of
+the form `\.{\\def\\title\{NAME\}}'.
+
+@c
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+@<Type definitions@>@;
+@<Global variables@>@;
+@<Procedures@>@;
+@#
+int main(
+ int argc,
+ char *argv[])
+{ @<Local variables@>;
+ @<Initialize the data structures@>;
+ while (--argc) {
+ f=fopen(*++argv,"r");
+ if (!f)
+ fprintf(stderr,"twinx: Couldn't open file %s for reading!\n",*argv);
+ else {
+ @<Scan file |f| until coming to the title@>;
+ fclose(f);
+ strncpy(*argv+strlen(*argv)-3,"idx",3);
+ f=fopen(*argv,"r");
+ if (!f)
+ fprintf(stderr,"twinx: Couldn't open file %s for reading!\n",*argv);
+ else {
+ @<Copy the index file |f| into the data structures@>;
+ fclose(f);
+ }
+ }
+ }
+ @<Output the data structures to make a master index@>;
+ return 0;
+}
+
+@ @d buf_size 100 /* input lines won't be this long */
+
+@<Glob...@>=
+FILE *f;
+char buf[buf_size];
+char title[buf_size];
+char cur_name[buf_size];
+
+@ @<Scan file |f|...@>=
+while (1) {
+ if (fgets(buf,buf_size,f)==NULL) {
+ fprintf(stderr,"twinx: (no title found in file %s)\n",*argv);
+ title[0]='\0';
+ break;
+ }
+ if (strncmp(buf,"\\def\\title\{",11)==0) {@+register char *p,*q;
+ for (p=buf+11,q=title;*p && *p!='}';p++) *q++=*p;
+ *q='\0';
+ break;
+ }
+}
+
+@* Data structures.
+Our main task is to collate a bunch of texts associated with keys that
+have already been sorted. It seems easiest to do this by repeatedly merging
+the new data into the old, even though this means we'll be passing over
+some of the same keys 30 times or more; the computer is fast, and this
+program won't be run often.
+
+Further examination shows that a merging strategy isn't so easy after all,
+because the sorting done by \.{CTWILL} (and by \.{CWEAVE}) is weird
+in certain cases. When two index entries agree except for their
+``ilk,'' the order in which they appear in the index depends on the order in
+which they appear in the program. Thus, they might well appear in
+different order in two of the indexes we are merging.
+(There's also another glitch, although not quite as devasting:
+When two index entries have the
+same letters and the same ilk, but differ with respect to uppercase
+versus lowercase, the order in which they appear depends on the
+hash code used in \.{CWEB}'s \.{common.w} code!)
+
+So we'll use Plan B: All index entries will first be copied into a long
+list. The list will almost always consist of many sorted sublists,
+but we will not assume anything about its order. After all the copying
+has been done, we will use a list-merge sort to finish the job.
+
+The data structure is built from nodes that each contain three pointers.
+The first pointer is to an |id| string; the third pointer is to the
+|next| node; and the second pointer is either |data.s|, a pointer to
+a string of text, or |data.n|, a pointer to a node. In the main list,
+the |id| fields are the keys of the index, and the |data.n| fields
+point to lists of associated texts. In the latter lists, the |id| fields
+are the individual program titles, while the |data.s| fields are the
+texts.
+
+@<Type...@>=
+typedef union {
+ char *s;
+ struct node_struct *n;
+} mixed;
+typedef struct node_struct {
+ const char *id;
+ mixed data;
+ struct node_struct *next;
+} node;
+
+@ We copy strings into blocks of storage that are allocated as needed.
+Here's a routine that stashes away a given string. It makes no attempt to
+handle extremely long strings, because such strings will arise only
+if the input is all screwed up.
+
+@d string_block_size 8192 /* number of bytes per string block */
+
+@<Proc...@>=
+char *save_string(
+ char *s)
+{
+ register char *p,*q; register int l;
+ for (p=s;*p;p++) ;
+ l=p-s+1;
+ if (l>string_block_size) {
+ fprintf(stderr,"twinx: Huge string `%.20s...' will be truncated!\n",s);
+ l=string_block_size;
+ s[l-1]='\0';
+ }
+ if (next_string+l>=bad_string) {
+ next_string=(char*)malloc(string_block_size);
+ if (next_string==NULL) {
+ fprintf(stderr,"twinx: Not enough room for strings!\n");
+ exit(-1);
+ }
+ bad_string=next_string+string_block_size;
+ }
+ for (p=s,q=next_string;*p;p++) *q++=*p;
+ *q='\0';
+ next_string=q+1;
+ return next_string-l;
+}
+
+@ Nodes are allocated with a similar but simpler mechanism.
+
+@d nodes_per_block 340
+
+@<Proc...@>=
+node *new_node(void)
+{
+ if (next_node==bad_node) {
+ next_node=(node*)calloc(nodes_per_block,sizeof(node));
+ if (next_node==NULL) {
+ fprintf(stderr,"twinx: Not enough room for nodes!\n");
+ exit(-2);
+ }
+ bad_node=next_node+nodes_per_block;
+ }
+ next_node++;
+ return next_node-1;
+}
+
+@ @<Glob...@>=
+char *next_string,*bad_string;
+node *next_node,*bad_node;
+node header; /* the main list begins at |header.next| */
+node sentinel; /* intermediate lists will end at this node */
+
+@ We don't really have to initialize the string and node storage
+pointers, because global variables are zero already. But we might as
+well be tidy and state the initial conditions explicitly.
+
+It will be convenient to have extremely small and large keys in
+the dummy nodes.
+
+@<Initialize the data structures@>=
+next_string=bad_string=NULL;
+next_node=bad_node=NULL;
+header.next=NULL;
+header.id=" {"; /* smaller than any valid |id| */
+sentinel.id=" {\200}"; /* larger than any valid |id| */
+main_node=&header;
+
+@ @<Local v...@>=
+register node* main_node; /* current end of main list */
+
+@* Copying.
+Lines in the index file |f| that we're reading either begin a new
+entry or continue a long entry. In the first case, the line begins with
+\.{\\I} and then either \.{\\\\\{key\}} or \.{\\\char'174\{key\}} or
+\.{\\.\{key\}} or \.{\\\&\{key\}} or \.{\\\$\{key\}} or \.{\\9\{key\}}
+or just \.{\ \ \{key\}}. (These correspond to multi-character italic,
+single-digit italic, typewriter, bold, custom, variable, and roman styles.)
+In the second case, the line begins with a page number or \.{\\[};
+however, we recognize the second case by the fact that the previous line
+did not end with a period.
+
+@<Copy the index...@>=
+while (1) {@+register node *cur_node;
+ if (fgets(buf,buf_size,f)==NULL) break; /* end of file */
+ if (strncmp(buf,"\\I",2)==0) {
+ @<Copy a new index entry into |cur_name| and |cur_node|@>;
+ main_node->next=new_node();@+main_node=main_node->next;
+ main_node->id=save_string(cur_name);
+ main_node->data.n=cur_node;
+ }
+ else if (buf[0]!='\n')
+ fprintf(stderr,"twinx: couldn't deal with `%.10s...' in file %s!\n",
+ buf,*argv);
+}
+
+@ @<Copy a new index entry...@>=
+if (buf[4]!='{') {
+ fprintf(stderr,"twinx: missing brace in file %s: `%.20s...'\n",*argv,buf);
+ break;
+}
+{@+register char *p,*q;@+register int bal=1;
+ cur_name[0]=buf[2];@+cur_name[1]=buf[3];@+cur_name[2]='{';
+ for (p=buf+5,q=cur_name+3;*p&&(bal||*p=='{');p++) {
+ if (*p=='{') bal++;
+ else if (*p=='}') bal--;
+ *q++=*p;
+ }
+ if (bal) {
+ fprintf(stderr,"twinx: unbalanced entry in file %s: `%.20s...'\n",*argv,buf);
+ break;
+ }
+ if (*p++!=',') {
+ fprintf(stderr,"twinx: missing comma in file %s: `%.20s...'\n",*argv,buf);
+ break;
+ }
+ if (*p++!=' ') {
+ fprintf(stderr,"twinx: missing space in file %s: `%.20s...'\n",*argv,buf);
+ break;
+ }
+ *q='\0';
+ @<Copy the text part of the index entry into |cur_node|@>;
+}
+
+@ When we get here, |p| points to the beginning of the text following a key
+in the index. The index entry ends with the next period, possibly several
+lines hence. In the multiple-line case, |cur_node| will point to the
+final line, which points to the penultimate line, etc.
+
+@<Copy the text part of the index entry...@>=
+{@+int period_sensed=0;
+ node *continuation;
+ cur_node=new_node();
+ cur_node->id=save_string(title);
+ do@+{
+ for (q=p;*q&&*q!='\n'&&*q!='.';q++) ;
+ if (*q=='.') period_sensed=1;
+ *q='\0';
+ cur_node->data.s=save_string(p);
+ if (period_sensed) break;
+ continuation=new_node(); /* the |id| field is |NULL| */
+ continuation->next=cur_node;
+ cur_node=continuation;
+ p=buf;
+ }@+while(fgets(buf,buf_size,f));
+ if (!period_sensed) {
+ fprintf(stderr,"twinx: File %s ended in middle of entry for %s!\n",
+ *argv,cur_name);
+ break;
+ }
+}
+
+@* Sorting.
+Let us opt for simplicity instead of tuning up for speed. The idea in
+this step is to take a list that contains $k$ ascending runs and reduce it
+to a list that contains $\lceil k/2\rceil$ runs, repeating until $k=1$.
+We could make the program about twice as fast if we took the trouble to
+remember the boundaries of runs on the previous pass; here, every
+pass will be the same.
+
+@<Output the data structures to make a master index@>=
+@<Sort the main list, collapsing entries with the same |id|@>;
+@<Output the main list in suitable \TeX\ format@>;
+
+@ The |compare| subroutine, which specifies the relative order of
+|id| fields in two nodes, appears below. Let's get the sorting logic
+right first.
+
+The algorithm is, in fact, rather pretty---I hate to say cute, but
+that's the word that comes to mind. Some day I must write out the
+nice invariant relations in these loops. Too bad it's not more efficient.
+
+Remember that |header.id| is $-\infty$ and |sentinel.id| is $+\infty$.
+Also remember that the main list begins and ends at the header node.
+
+@<Sort the main list, collapsing entries with the same |id|@>=
+main_node->next=&header;
+while (1) {@+register node *p,*q,*r,*s,*t;
+ t=&header;
+ r=t->next;
+ while (1) {
+ if (r==&header) break;
+ p=s=r;
+ @<Advance |s| until it exceeds |r=s->next|@>;
+ if (r==&header) break;
+ s->next=&sentinel;
+ q=s=r;
+ @<Advance |s| until it exceeds |r=s->next|@>;
+ s->next=&sentinel;
+ @<Merge |p| and |q|, appending to |t|@>;
+ t->next=r;
+ }
+ if (t==&header) break;
+}
+
+@ @<Advance...@>=
+do@+{@+register int d;
+ r=s->next;
+ d=compare(s,r);
+ if (d>0) break; /* |s->id>r->id| */
+ if (d==0) { /* |s->id=r->id| */
+ collapse(s,r); /* put |r|'s data into |s|'s list */
+ s->next=r->next; /* node |r| will be unclaimed garbage */
+ } else s=r; /* this is the normal case, |s->id<r->id| */
+}@+while(1);
+
+@ Merging takes place in such a way that sorting is stable.
+Thus, index entries for a key that appears in different programs
+will remain in the order of the \.{.tex} files on the command line.
+
+@<Merge...@>=
+do@+{@+register int d;
+ d=compare(p,q);
+ if (d>0) { /* |p->id>q->id| */
+ t->next=q;
+ t=q;
+ q=q->next;
+ } else if (d<0) { /* |p->id<q->id| */
+ t->next=p; /* |p->id<q->id| */
+ t=p;
+ p=p->next;
+ } else if (p==&sentinel) break;
+ else {
+ collapse(p,q); /* put |q|'s data into |p|'s list */
+ q=q->next;
+ }
+}@+while(1);
+
+@ Comparison is a three-stage process in general. First we compare the
+keys without regarding case or format type. If they are equal with
+respect to that criterion, we try again, with case significant.
+If they are still equal, we look at the format characters (the first
+two characters of the |id| field).
+
+@<Proc...@>=
+int compare(
+ node *p, node *q)
+{@+register unsigned char *pp,*qq;
+ for (pp=(unsigned char*)p->id+3,qq=(unsigned char*)q->id+3;
+ *pp&&ord[*pp]==ord[*qq];pp++,qq++) ;
+ if (*pp || *qq) return ord[*pp]-ord[*qq];
+ for (pp=(unsigned char*)p->id+3,qq=(unsigned char*)q->id+3;
+ *pp&&*pp==*qq;pp++,qq++) ;
+ if (*pp || *qq) return (int)*pp-(int)*qq;
+ if (p->id[0]!=q->id[0]) return p->id[0]-q->id[0];
+ return p->id[1]-q->id[1];
+}
+
+@ The collation order follows a string copied from \.{CWEAVE}.
+
+@<Glob...@>=
+char collate[102]; /* collation order */
+char ord[256]; /* rank in collation order */
+
+@ The right brace is placed lowest in collating order, because each
+key is actually followed by a right brace when we are sorting.
+
+Apology: I haven't had time to update this part of the program to
+allow 8-bit characters. At present the data is assumed to be
+7-bit ASCII, as it was in the early versions of \.{CWEAVE}.
+
+@<Init...@>=
+collate[0]=0; strcpy(collate+1,"} \1\2\3\4\5\6\7\10\11\12\13\14\15\16\17\
+\20\21\22\23\24\25\26\27\30\31\32\33\34\35\36\37\
+!\42#$%&'()*+,-./:;<=>?@@[\\]^`{|~_\
+abcdefghijklmnopqrstuvwxyz0123456789");
+{@+register int j;
+ for (j=1;collate[j];j++) ord[(int)collate[j]]=j;
+ ord[128]=j; /* this affects the ordering of |sentinel.id| */
+ for (j='A';j<='Z';j++) ord[j]=ord[tolower(j)];
+}
+
+@ When two lists are combined, we put the data from the second node
+before the data from the first node, because we are going to reverse
+the order when printing. After this procedure has acted, the field
+|q->data.n| should not be considered an active pointer.
+
+@<Proc...@>=
+void collapse(
+ node *p, node *q)
+{@+register node *x;
+ for (x=q->data.n;x->next;x=x->next) ;
+ x->next=p->data.n;
+ p->data.n=q->data.n;
+}
+
+@ The only remaining trick is to format the underline characters
+properly, especially in the ``custom'' format when they must become
+\.x's.
+
+@<Output the main list in suitable \TeX\ format@>=
+{@+register node *x;
+ printf("\\input twinxmac\n");
+ for (x=header.next;x!=&header;x=x->next) {
+ printf("\\I");
+ @<Output |x->id| in suitable \TeX\ format@>;
+ @<Output the lines of |x->data.n| in reverse order@>;
+ }
+ printf("\\fin\n");
+}
+
+@ @<Output |x->id|...@>=
+{@+register const char *p=x->id;
+ if (*p==' ') {
+ if (*(p+1)!=' ') goto unknown;
+ goto known;
+ }
+ if (*p!='\\') goto unknown;
+ switch (*(p+1)) {
+ case '\\': case '|': case '.': case '&': case '9':
+ printf("\\%c",*(p+1));
+ goto known;
+ case '$': printf("$\\");
+ for (p+=3;*p!='}';p++)
+ if (*p=='_') putchar('x');
+ else putchar(*p);
+ putchar('$');
+ goto done;
+ default: goto unknown;
+ }
+ unknown: fprintf(stderr,"twinx: `%s' has unknown format!\n",p);
+ known: for (p+=2;*p;p++) {
+ if (*p=='_') putchar('\\');
+ putchar(*p);
+ }
+done:;
+}
+
+@ @<Output the lines of |x->data.n| in reverse order@>=
+{@+register node *y=x->data.n,*z=NULL;
+ while (y) {@+register node *w;
+ w=y->next;
+ y->next=z;
+ z=y;
+ y=w;
+ }
+ while (z) {
+ if (z->id) printf("\\unskip, {\\sc %s}~",z->id);
+ fputs(z->data.s,stdout);
+ z=z->next;
+ if (z) putchar('\n');
+ else puts(".");
+ }
+}
+
+@* Index.
diff --git a/Build/source/texk/web2c/help.h b/Build/source/texk/web2c/help.h
index ffde71c0b49..9e6da6a25e2 100644
--- a/Build/source/texk/web2c/help.h
+++ b/Build/source/texk/web2c/help.h
@@ -10,7 +10,7 @@
thing, the messages have a lot in common, so it's nice to have them
in one place.)
-Copyright 1995, 1996, 2009, 2011, 2012 Karl Berry.
+Copyright 1995, 1996, 2009, 2011-2019 Karl Berry.
Copyright 2008 Taco Hoekwater.
Copyright 2001, 2003, 2004 Olaf Weber.
@@ -56,9 +56,9 @@ const_string CTANGLEHELP[] = {
" unless otherwise specified by OUTFILE; in this case, '-' specifies",
" a null CHANGEFILE.",
"",
- "-b suppress banner line on terminal",
- "-h suppress success message on completion",
- "-p suppress progress report messages",
+ "+b print banner line on terminal",
+ "+h print success message on completion",
+ "+p print progress report messages",
"+s print usage statistics",
"--help display this help and exit",
"--version output version information and exit",
@@ -73,12 +73,39 @@ const_string CWEAVEHELP[] = {
" unless otherwise specified by OUTFILE; in this case, '-' specifies",
" a null CHANGEFILE.",
"",
- "-b suppress banner line on terminal",
+ "+b print banner line on terminal",
"-f do not force a newline after every C statement in output",
- "-h suppress success message on completion",
- "-p suppress progress report messages",
+ "+h print success message on completion",
+ "-i suppress indentation of parameter declarations",
+ "-o suppress separation of declarations and statements",
+ "+p print progress report messages",
"-x omit indices, section names, table of contents",
"+e enclose C material in \\PB{...}",
+ "+lX use macros for language X as of Xcwebmac.tex",
+ "+s print usage statistics",
+ "--help display this help and exit",
+ "--version output version information and exit",
+ NULL
+};
+
+const_string CTWILLHELP[] = {
+ "Usage: ctwill [OPTIONS] WEBFILE[.w] [{CHANGEFILE[.ch]|-} [OUTFILE[.tex]]]",
+ " Weave WEBFILE with CHANGEFILE into a TeX document with mini-indexes.",
+ " Default CHANGEFILE is " DEV_NULL ";",
+ " TeX output goes to the basename of WEBFILE extended with `.tex'",
+ " unless otherwise specified by OUTFILE; in this case, '-' specifies",
+ " a null CHANGEFILE.",
+ "",
+ "+b print banner line on terminal",
+ "-f do not force a newline after every C statement in output",
+ "+h print success message on completion",
+ "-i suppress indentation of parameter declarations",
+ "-o suppress separation of declarations and statements",
+ "+P \\input proofmac.tex instead of ctwimac.tex",
+ "+p print progress report messages",
+ "-x omit indices, section names, table of contents",
+ "+e enclose C material in \\PB{...}",
+ "+lX use macros for language X as of Xcwebmac.tex",
"+s print usage statistics",
"--help display this help and exit",
"--version output version information and exit",
diff --git a/Build/source/texk/web2c/man/ChangeLog b/Build/source/texk/web2c/man/ChangeLog
index 38f3f7588ed..bfac001673a 100644
--- a/Build/source/texk/web2c/man/ChangeLog
+++ b/Build/source/texk/web2c/man/ChangeLog
@@ -1,3 +1,7 @@
+2019-01-06 Andreas Scherer <https://ascherer.github.io>
+
+ * cweb.man: update for CWEBbin options, etc.
+
2018-12-21 Karl Berry <karl@freefriends.org>
* mpost.man: mention rmpost, (r)pmpost, and (r)upmpost.
diff --git a/Build/source/texk/web2c/man/cweb.man b/Build/source/texk/web2c/man/cweb.man
index 82a134a8dd2..f25d97d82ae 100644
--- a/Build/source/texk/web2c/man/cweb.man
+++ b/Build/source/texk/web2c/man/cweb.man
@@ -1,24 +1,22 @@
-.TH CWEB 1 "28 October 2018" "Web2C @VERSION@"
+.TH CWEB 1 "6 January 2018" "Web2C @VERSION@"
.\"=====================================================================
.SH NAME
ctangle, cweave \- translate CWEB to C and/or TeX
.\"=====================================================================
.SH SYNOPSIS
-.na
.B ctangle
-.RB [ \-bhp ]
-.RB [ +s ]
+.RB [ +bhps ]
.IR webfile [ \fB.w\fP ]
.RI [{ changefile [ \fB.ch\fP ]| \fB\-\fP }
.RI [ outfile [ \fB.c\fP ]]]
.br
.B cweave
-.RB [ \-befhpx ]
-.RB [ +s ]
+.RB [ \-fiox ]
+.RB [ \-lX | +lX ]
+.RB [ +behps ]
.IR webfile [ \fB.w\fP ]
.RI [{ changefile [ \fB.ch\fP ]| \fB\-\fP }
.RI [ outfile [ \fB.tex\fP ]]]
-.ad
.\"=====================================================================
.SH DESCRIPTION
The
@@ -72,27 +70,26 @@ default).
In fact, the options are processed from left to right,
so a sequence like -f\ +f corresponds to +f (which is the default).
.PP
+Both programs operate silently by default (as of 2019).
+.PP
The
-.B \-b
-option suppresses the banner line that normally appears on your terminal
+.B +b
+option prints the banner line on your terminal
when ctangle or cweave begins.
The
-.B \-h
-option suppresses the happy message that normally appears if the processing
+.B +h
+option prints the happy message if the processing
was successful.
The
-.B \-p
-option suppresses progress reports (starred module numbers) as the processing
+.B +p
+option prints progress reports (starred module numbers) as the processing
takes place.
-If you say
-.BR \-bhp ,
-you get nothing but error messages.
.PP
The
.B +s
option prints statistics about memory usage at the end of a run.
.PP
-There are three other options applicable to
+There are six other options applicable to
.B cweave
only:
.B \-f
@@ -106,6 +103,14 @@ Such brackets are normally inserted so that special hooks
can be used by
.I cweb-latex
and similar programs.
+.B \-i
+suppresses the indentation of parameter declarations.
+.B \-lX
+(or
+.B +lX
+) uses macros for language X\ from Xcwebmac.tex.
+.B \-o
+suppresses the visual separation of declarations and statements.
.B \-x
means omit the index and table of contents.
.\"=====================================================================
@@ -144,8 +149,11 @@ and the source code listings).
.\"=====================================================================
.SH AUTHORS
Don Knuth wrote WEB for TeX and Pascal.
+.br
Silvio Levy designed and developed CWEB
by adapting the WEB conventions to\ C and by recoding everything in CWEB.
Knuth began using CWEB and made further refinements.
Many other helpers are acknowledged in the CWEB manual.
-
+.br
+Andreas Scherer developed the extended CWEBbin version. As of 2019, the
+CWEB system in TeX Live is CWEBbin; see https://github.com/ascherer/cwebbin.