OSDN Git Service

removed libmd5.
authorClerk <maqiyuan@users.sourceforge.jp>
Sat, 16 Aug 2014 16:06:00 +0000 (00:06 +0800)
committerClerk <maqiyuan@users.sourceforge.jp>
Sat, 16 Aug 2014 16:06:00 +0000 (00:06 +0800)
37 files changed:
src/texsourc/Makefile.linux.android.static
src/texsourc/Makefile.linux.clang
src/texsourc/Makefile.linux.gcc
src/texsourc/Makefile.linux.gcc.static
src/texsourc/Makefile.win.clang
src/texsourc/Makefile.win.msvc
src/texsourc/README
src/texsourc/coerce.h
src/texsourc/dpx.c
src/texsourc/itex.c
src/texsourc/libmd5/md5.c [deleted file]
src/texsourc/libmd5/md5.h [deleted file]
src/texsourc/libmd5/md5main.c [deleted file]
src/texsourc/local.c
src/texsourc/macros.h
src/texsourc/makefile.txt
src/texsourc/memory.h
src/texsourc/notes.txt
src/texsourc/openinou.c
src/texsourc/pool.c
src/texsourc/subroute.c
src/texsourc/tex0.c
src/texsourc/tex1.c
src/texsourc/tex2.c
src/texsourc/tex3.c
src/texsourc/tex4.c
src/texsourc/tex5.c
src/texsourc/tex6.c
src/texsourc/tex7.c
src/texsourc/tex8.c
src/texsourc/tex9.c
src/texsourc/texd.h
src/texsourc/utils.c
src/texsourc/yandytex.c
src/texsourc/yandytex.h
src/texsourc/yandytex.rc
src/texsourc/zen-cls.bat

index 091224c..424651c 100644 (file)
@@ -1,82 +1,79 @@
-#
-# Copyright (c) 2014 Clerk Ma
-#
-# You may freely use, modify and/or distribute this file.
-#
-# makefile for linux (tested in ubuntu 14.04: gcc 4.8).
-# linked libkpathsea.a and libz.a
-# ./configure --prefix=/home/clerk/dev --host=arm-linux-androideabi
-#
-
-CC = arm-linux-androideabi-gcc
-CFLAGS = -c -O2 -Wno-unused-result -Ilibmd5 -I/home/clerk/android/include
-LDFLAGS = /home/clerk/android/lib/libkpathsea.a -lz
-
-objects = yandytex.o itex.o openinou.o subroute.o local.o \
-       tex0.o tex1.o tex2.o tex3.o tex4.o \
-       tex5.o tex6.o tex7.o tex8.o tex9.o \
-       pool.o md5.o utils.o
-
-headers = yandytex.h texd.h coerce.h macros.h memory.h
-
-yandytex: $(objects)
-       $(CC) -s -o yandytex $(objects) $(LDFLAGS)
-
-yandytex.o: yandytex.c $(headers)
-       $(CC) $(CFLAGS) yandytex.c
-itex.o: itex.c $(headers)
-       $(CC) $(CFLAGS) itex.c
-
-openinou.o: openinou.c $(headers)
-       $(CC) $(CFLAGS) openinou.c
-
-subroute.o: subroute.c $(headers)
-       $(CC) $(CFLAGS) subroute.c
-
-local.o: local.c $(headers)
-       $(CC) $(CFLAGS) local.c
-
-tex0.o: tex0.c $(headers)
-       $(CC) $(CFLAGS) tex0.c
-
-tex1.o: tex1.c $(headers)
-       $(CC) $(CFLAGS) tex1.c
-
-tex2.o: tex2.c $(headers)
-       $(CC) $(CFLAGS) tex2.c
-
-tex3.o: tex3.c $(headers)
-       $(CC) $(CFLAGS) tex3.c
-
-tex4.o: tex4.c $(headers)
-       $(CC) $(CFLAGS) tex4.c
-
-tex5.o: tex5.c $(headers)
-       $(CC) $(CFLAGS) tex5.c
-
-tex6.o: tex6.c $(headers)
-       $(CC) $(CFLAGS) tex6.c
-
-tex7.o: tex7.c $(headers)
-       $(CC) $(CFLAGS) tex7.c
-
-tex8.o: tex8.c $(headers)
-       $(CC) $(CFLAGS) tex8.c
-
-tex9.o: tex9.c $(headers)
-       $(CC) $(CFLAGS) tex9.c
-
-pool.o: pool.c $(headers)
-       $(CC) $(CFLAGS) pool.c
-
-md5.o: libmd5/md5.c $(headers)
-       $(CC) $(CFLAGS) libmd5/md5.c
-
-utils.o: utils.c $(headers)
-       $(CC) $(CFLAGS) utils.c
-
-.PHONY: clean
-
-clean:
-       rm yandytex *.o
+#\r
+# Copyright (c) 2014 Clerk Ma\r
+#\r
+# You may freely use, modify and/or distribute this file.\r
+#\r
+# makefile for linux (tested in ubuntu 14.04: gcc 4.8).\r
+# linked libkpathsea.a and libz.a\r
+# ./configure --prefix=/home/clerk/dev --host=arm-linux-androideabi\r
+#\r
+\r
+CC = arm-linux-androideabi-gcc\r
+CFLAGS = -c -O2 -Wno-unused-result -I/home/clerk/android/include\r
+LDFLAGS = /home/clerk/android/lib/libkpathsea.a -lz\r
+\r
+objects = yandytex.o itex.o openinou.o subroute.o local.o \\r
+       tex0.o tex1.o tex2.o tex3.o tex4.o \\r
+       tex5.o tex6.o tex7.o tex8.o tex9.o \\r
+       pool.o utils.o\r
+\r
+headers = yandytex.h texd.h coerce.h macros.h memory.h\r
+\r
+yandytex: $(objects)\r
+       $(CC) -s -o yandytex $(objects) $(LDFLAGS)\r
+\r
+yandytex.o: yandytex.c $(headers)\r
+       $(CC) $(CFLAGS) yandytex.c\r
\r
+itex.o: itex.c $(headers)\r
+       $(CC) $(CFLAGS) itex.c\r
+\r
+openinou.o: openinou.c $(headers)\r
+       $(CC) $(CFLAGS) openinou.c\r
+\r
+subroute.o: subroute.c $(headers)\r
+       $(CC) $(CFLAGS) subroute.c\r
+\r
+local.o: local.c $(headers)\r
+       $(CC) $(CFLAGS) local.c\r
+\r
+tex0.o: tex0.c $(headers)\r
+       $(CC) $(CFLAGS) tex0.c\r
+\r
+tex1.o: tex1.c $(headers)\r
+       $(CC) $(CFLAGS) tex1.c\r
+\r
+tex2.o: tex2.c $(headers)\r
+       $(CC) $(CFLAGS) tex2.c\r
+\r
+tex3.o: tex3.c $(headers)\r
+       $(CC) $(CFLAGS) tex3.c\r
+\r
+tex4.o: tex4.c $(headers)\r
+       $(CC) $(CFLAGS) tex4.c\r
+\r
+tex5.o: tex5.c $(headers)\r
+       $(CC) $(CFLAGS) tex5.c\r
+\r
+tex6.o: tex6.c $(headers)\r
+       $(CC) $(CFLAGS) tex6.c\r
+\r
+tex7.o: tex7.c $(headers)\r
+       $(CC) $(CFLAGS) tex7.c\r
+\r
+tex8.o: tex8.c $(headers)\r
+       $(CC) $(CFLAGS) tex8.c\r
+\r
+tex9.o: tex9.c $(headers)\r
+       $(CC) $(CFLAGS) tex9.c\r
+\r
+pool.o: pool.c $(headers)\r
+       $(CC) $(CFLAGS) pool.c\r
+\r
+utils.o: utils.c $(headers)\r
+       $(CC) $(CFLAGS) utils.c\r
+\r
+.PHONY: clean\r
+\r
+clean:\r
+       rm yandytex *.o\r
index 597a1ac..457ca3a 100644 (file)
@@ -1,83 +1,78 @@
-#
-# Copyright (c) 2014 Clerk Ma
-#
-# You may freely use, modify and/or distribute this file.
-#
-# makefile for linux (tested in ubuntu 14.04: clang/LLVM 4.3).
-#
-# apt-get install libkpathsea6 libkpathsea-dev
-# apt-get install zlib1g zlib1g-dev
-#
-
-CC = clang
-CFLAGS = -c -O2 -Ilibmd5
-LDFLAGS = -lkpathsea -lz
-
-objects = yandytex.o itex.o openinou.o subroute.o local.o \
-       tex0.o tex1.o tex2.o tex3.o tex4.o \
-       tex5.o tex6.o tex7.o tex8.o tex9.o \
-       pool.o md5.o utils.o
-
-headers = yandytex.h texd.h coerce.h macros.h memory.h
-
-yandytex: $(objects)
-       $(CC) -s -o yandytex $(objects) $(LDFLAGS)
-
-yandytex.o: yandytex.c $(headers)
-       $(CC) $(CFLAGS) yandytex.c
-itex.o: itex.c $(headers)
-       $(CC) $(CFLAGS) itex.c
-
-openinou.o: openinou.c $(headers)
-       $(CC) $(CFLAGS) openinou.c
-
-subroute.o: subroute.c $(headers)
-       $(CC) $(CFLAGS) subroute.c
-
-local.o: local.c $(headers)
-       $(CC) $(CFLAGS) local.c
-
-tex0.o: tex0.c $(headers)
-       $(CC) $(CFLAGS) tex0.c
-
-tex1.o: tex1.c $(headers)
-       $(CC) $(CFLAGS) tex1.c
-
-tex2.o: tex2.c $(headers)
-       $(CC) $(CFLAGS) tex2.c
-
-tex3.o: tex3.c $(headers)
-       $(CC) $(CFLAGS) tex3.c
-
-tex4.o: tex4.c $(headers)
-       $(CC) $(CFLAGS) tex4.c
-
-tex5.o: tex5.c $(headers)
-       $(CC) $(CFLAGS) tex5.c
-
-tex6.o: tex6.c $(headers)
-       $(CC) $(CFLAGS) tex6.c
-
-tex7.o: tex7.c $(headers)
-       $(CC) $(CFLAGS) tex7.c
-
-tex8.o: tex8.c $(headers)
-       $(CC) $(CFLAGS) tex8.c
-
-tex9.o: tex9.c $(headers)
-       $(CC) $(CFLAGS) tex9.c
-
-pool.o: pool.c $(headers)
-       $(CC) $(CFLAGS) pool.c
-
-md5.o: libmd5/md5.c $(headers)
-       $(CC) $(CFLAGS) libmd5/md5.c
-
-utils.o: utils.c $(headers)
-       $(CC) $(CFLAGS) utils.c
-
-.PHONY: clean
-
-clean:
-       rm yandytex *.o
+#\r
+# Copyright (c) 2014 Clerk Ma\r
+#\r
+# You may freely use, modify and/or distribute this file.\r
+#\r
+# makefile for linux (tested in ubuntu 14.04: clang/LLVM 4.3).\r
+#\r
+#\r
+\r
+CC = clang\r
+CFLAGS = -c -O2 -Ilibmd5\r
+LDFLAGS = -lkpathsea -lz\r
+\r
+objects = yandytex.o itex.o openinou.o subroute.o local.o \\r
+       tex0.o tex1.o tex2.o tex3.o tex4.o \\r
+       tex5.o tex6.o tex7.o tex8.o tex9.o \\r
+       pool.o utils.o dpx.o\r
+\r
+headers = yandytex.h texd.h coerce.h macros.h memory.h\r
+\r
+yandytex: $(objects)\r
+       $(CC) -s -o yandytex $(objects) $(LDFLAGS)\r
+\r
+yandytex.o: yandytex.c $(headers)\r
+       $(CC) $(CFLAGS) yandytex.c\r
\r
+itex.o: itex.c $(headers)\r
+       $(CC) $(CFLAGS) itex.c\r
+\r
+openinou.o: openinou.c $(headers)\r
+       $(CC) $(CFLAGS) openinou.c\r
+\r
+subroute.o: subroute.c $(headers)\r
+       $(CC) $(CFLAGS) subroute.c\r
+\r
+local.o: local.c $(headers)\r
+       $(CC) $(CFLAGS) local.c\r
+\r
+tex0.o: tex0.c $(headers)\r
+       $(CC) $(CFLAGS) tex0.c\r
+\r
+tex1.o: tex1.c $(headers)\r
+       $(CC) $(CFLAGS) tex1.c\r
+\r
+tex2.o: tex2.c $(headers)\r
+       $(CC) $(CFLAGS) tex2.c\r
+\r
+tex3.o: tex3.c $(headers)\r
+       $(CC) $(CFLAGS) tex3.c\r
+\r
+tex4.o: tex4.c $(headers)\r
+       $(CC) $(CFLAGS) tex4.c\r
+\r
+tex5.o: tex5.c $(headers)\r
+       $(CC) $(CFLAGS) tex5.c\r
+\r
+tex6.o: tex6.c $(headers)\r
+       $(CC) $(CFLAGS) tex6.c\r
+\r
+tex7.o: tex7.c $(headers)\r
+       $(CC) $(CFLAGS) tex7.c\r
+\r
+tex8.o: tex8.c $(headers)\r
+       $(CC) $(CFLAGS) tex8.c\r
+\r
+tex9.o: tex9.c $(headers)\r
+       $(CC) $(CFLAGS) tex9.c\r
+\r
+pool.o: pool.c $(headers)\r
+       $(CC) $(CFLAGS) pool.c\r
+\r
+utils.o: utils.c $(headers)\r
+       $(CC) $(CFLAGS) utils.c\r
+\r
+.PHONY: clean\r
+\r
+clean:\r
+       rm yandytex *.o\r
index 70d86e3..b50f0fc 100644 (file)
@@ -1,83 +1,80 @@
-#
-# Copyright (c) 2014 Clerk Ma
-#
-# You may freely use, modify and/or distribute this file.
-#
-# makefile for linux (tested in ubuntu 14.04: gcc 4.8).
-#
-# apt-get install libkpathsea6 libkpathsea-dev
-# apt-get install zlib1g zlib1g-dev
-#
-
-CC = gcc
-CFLAGS = -c -O2 -Wno-unused-result -Ilibmd5
-LDFLAGS = -lkpathsea -lz
-
-objects = yandytex.o itex.o openinou.o subroute.o local.o \
-       tex0.o tex1.o tex2.o tex3.o tex4.o \
-       tex5.o tex6.o tex7.o tex8.o tex9.o \
-       pool.o md5.o utils.o
-
-headers = yandytex.h texd.h coerce.h macros.h memory.h
-
-yandytex: $(objects)
-       $(CC) -s -o yandytex $(objects) $(LDFLAGS)
-
-yandytex.o: yandytex.c $(headers)
-       $(CC) $(CFLAGS) yandytex.c
-itex.o: itex.c $(headers)
-       $(CC) $(CFLAGS) itex.c
-
-openinou.o: openinou.c $(headers)
-       $(CC) $(CFLAGS) openinou.c
-
-subroute.o: subroute.c $(headers)
-       $(CC) $(CFLAGS) subroute.c
-
-local.o: local.c $(headers)
-       $(CC) $(CFLAGS) local.c
-
-tex0.o: tex0.c $(headers)
-       $(CC) $(CFLAGS) tex0.c
-
-tex1.o: tex1.c $(headers)
-       $(CC) $(CFLAGS) tex1.c
-
-tex2.o: tex2.c $(headers)
-       $(CC) $(CFLAGS) tex2.c
-
-tex3.o: tex3.c $(headers)
-       $(CC) $(CFLAGS) tex3.c
-
-tex4.o: tex4.c $(headers)
-       $(CC) $(CFLAGS) tex4.c
-
-tex5.o: tex5.c $(headers)
-       $(CC) $(CFLAGS) tex5.c
-
-tex6.o: tex6.c $(headers)
-       $(CC) $(CFLAGS) tex6.c
-
-tex7.o: tex7.c $(headers)
-       $(CC) $(CFLAGS) tex7.c
-
-tex8.o: tex8.c $(headers)
-       $(CC) $(CFLAGS) tex8.c
-
-tex9.o: tex9.c $(headers)
-       $(CC) $(CFLAGS) tex9.c
-
-pool.o: pool.c $(headers)
-       $(CC) $(CFLAGS) pool.c
-
-md5.o: libmd5/md5.c $(headers)
-       $(CC) $(CFLAGS) libmd5/md5.c
-
-utils.o: utils.c $(headers)
-       $(CC) $(CFLAGS) utils.c
-
-.PHONY: clean
-
-clean:
-       rm yandytex *.o
+#\r
+# Copyright (c) 2014 Clerk Ma\r
+#\r
+# You may freely use, modify and/or distribute this file.\r
+#\r
+# makefile for linux (tested in ubuntu 14.04: gcc 4.8).\r
+#\r
+# apt-get install libkpathsea6 libkpathsea-dev\r
+# apt-get install zlib1g zlib1g-dev\r
+#\r
+\r
+CC = gcc\r
+CFLAGS = -c -O2 -Wno-unused-result\r
+LDFLAGS = -lkpathsea -lz\r
+\r
+objects = yandytex.o itex.o openinou.o subroute.o local.o \\r
+       tex0.o tex1.o tex2.o tex3.o tex4.o \\r
+       tex5.o tex6.o tex7.o tex8.o tex9.o \\r
+       pool.o utils.o\r
+\r
+headers = yandytex.h texd.h coerce.h macros.h memory.h\r
+\r
+yandytex: $(objects)\r
+       $(CC) -s -o yandytex $(objects) $(LDFLAGS)\r
+\r
+yandytex.o: yandytex.c $(headers)\r
+       $(CC) $(CFLAGS) yandytex.c\r
\r
+itex.o: itex.c $(headers)\r
+       $(CC) $(CFLAGS) itex.c\r
+\r
+openinou.o: openinou.c $(headers)\r
+       $(CC) $(CFLAGS) openinou.c\r
+\r
+subroute.o: subroute.c $(headers)\r
+       $(CC) $(CFLAGS) subroute.c\r
+\r
+local.o: local.c $(headers)\r
+       $(CC) $(CFLAGS) local.c\r
+\r
+tex0.o: tex0.c $(headers)\r
+       $(CC) $(CFLAGS) tex0.c\r
+\r
+tex1.o: tex1.c $(headers)\r
+       $(CC) $(CFLAGS) tex1.c\r
+\r
+tex2.o: tex2.c $(headers)\r
+       $(CC) $(CFLAGS) tex2.c\r
+\r
+tex3.o: tex3.c $(headers)\r
+       $(CC) $(CFLAGS) tex3.c\r
+\r
+tex4.o: tex4.c $(headers)\r
+       $(CC) $(CFLAGS) tex4.c\r
+\r
+tex5.o: tex5.c $(headers)\r
+       $(CC) $(CFLAGS) tex5.c\r
+\r
+tex6.o: tex6.c $(headers)\r
+       $(CC) $(CFLAGS) tex6.c\r
+\r
+tex7.o: tex7.c $(headers)\r
+       $(CC) $(CFLAGS) tex7.c\r
+\r
+tex8.o: tex8.c $(headers)\r
+       $(CC) $(CFLAGS) tex8.c\r
+\r
+tex9.o: tex9.c $(headers)\r
+       $(CC) $(CFLAGS) tex9.c\r
+\r
+pool.o: pool.c $(headers)\r
+       $(CC) $(CFLAGS) pool.c\r
+\r
+utils.o: utils.c $(headers)\r
+       $(CC) $(CFLAGS) utils.c\r
+\r
+.PHONY: clean\r
+\r
+clean:\r
+       rm yandytex *.o\r
index b03c94a..87b8f66 100644 (file)
@@ -1,84 +1,81 @@
-#
-# Copyright (c) 2014 Clerk Ma
-#
-# You may freely use, modify and/or distribute this file.
-#
-# makefle for linux (tested in ubuntu 14.04: gcc 4.8).
-# linked libkpathsea.a and libz.a
-#
-
-CC = gcc
-CFLAGS = -g -c -O2 -Wno-unused-result -Ilibmd5
-LDFLAGS = /home/clerk/dev/android/lib/libkpathsea.a libdpx.a libpng.a libpaper.a /home/clerk/dev/android/lib/libz.a /home/clerk/dev/android/lib/libkpathsea.a -lm
-
-objects = yandytex.o itex.o openinou.o subroute.o local.o \
-       tex0.o tex1.o tex2.o tex3.o tex4.o \
-       tex5.o tex6.o tex7.o tex8.o tex9.o \
-       pool.o md5.o utils.o dpx.o
-
-headers = yandytex.h texd.h coerce.h macros.h memory.h
-
-yandytex: $(objects)
-       $(CC) -o yandytex $(objects) $(LDFLAGS)
-
-yandytex.o: yandytex.c $(headers)
-       $(CC) $(CFLAGS) yandytex.c
-
-dpx.o: dpx.c $(headers)
-       $(CC) $(CFLAGS) dpx.c
-
-itex.o: itex.c $(headers)
-       $(CC) $(CFLAGS) itex.c
-
-openinou.o: openinou.c $(headers)
-       $(CC) $(CFLAGS) openinou.c
-
-subroute.o: subroute.c $(headers)
-       $(CC) $(CFLAGS) subroute.c
-
-local.o: local.c $(headers)
-       $(CC) $(CFLAGS) local.c
-
-tex0.o: tex0.c $(headers)
-       $(CC) $(CFLAGS) tex0.c
-
-tex1.o: tex1.c $(headers)
-       $(CC) $(CFLAGS) tex1.c
-
-tex2.o: tex2.c $(headers)
-       $(CC) $(CFLAGS) tex2.c
-
-tex3.o: tex3.c $(headers)
-       $(CC) $(CFLAGS) tex3.c
-
-tex4.o: tex4.c $(headers)
-       $(CC) $(CFLAGS) tex4.c
-
-tex5.o: tex5.c $(headers)
-       $(CC) $(CFLAGS) tex5.c
-
-tex6.o: tex6.c $(headers)
-       $(CC) $(CFLAGS) tex6.c
-
-tex7.o: tex7.c $(headers)
-       $(CC) $(CFLAGS) tex7.c
-
-tex8.o: tex8.c $(headers)
-       $(CC) $(CFLAGS) tex8.c
-
-tex9.o: tex9.c $(headers)
-       $(CC) $(CFLAGS) tex9.c
-
-pool.o: pool.c $(headers)
-       $(CC) $(CFLAGS) pool.c
-
-md5.o: libmd5/md5.c $(headers)
-       $(CC) $(CFLAGS) libmd5/md5.c
-
-utils.o: utils.c $(headers)
-       $(CC) $(CFLAGS) utils.c
-
-.PHONY: clean
-
-clean:
-       rm yandytex *.o
+#\r
+# Copyright (c) 2014 Clerk Ma\r
+#\r
+# You may freely use, modify and/or distribute this file.\r
+#\r
+# makefle for linux (tested in ubuntu 14.04: gcc 4.8).\r
+# linked libkpathsea.a and libz.a\r
+#\r
+\r
+CC = gcc\r
+CFLAGS = -g -c -O2 -Wno-unused-result\r
+LDFLAGS = /home/clerk/dev/android/lib/libkpathsea.a libdpx.a libpng.a libpaper.a /home/clerk/dev/android/lib/libz.a /home/clerk/dev/android/lib/libkpathsea.a -lm\r
+\r
+objects = yandytex.o itex.o openinou.o subroute.o local.o \\r
+       tex0.o tex1.o tex2.o tex3.o tex4.o \\r
+       tex5.o tex6.o tex7.o tex8.o tex9.o \\r
+       pool.o utils.o dpx.o\r
+\r
+headers = yandytex.h texd.h coerce.h macros.h memory.h\r
+\r
+yandytex: $(objects)\r
+       $(CC) -o yandytex $(objects) $(LDFLAGS)\r
+\r
+yandytex.o: yandytex.c $(headers)\r
+       $(CC) $(CFLAGS) yandytex.c\r
+\r
+dpx.o: dpx.c $(headers)\r
+       $(CC) $(CFLAGS) dpx.c\r
+\r
+itex.o: itex.c $(headers)\r
+       $(CC) $(CFLAGS) itex.c\r
+\r
+openinou.o: openinou.c $(headers)\r
+       $(CC) $(CFLAGS) openinou.c\r
+\r
+subroute.o: subroute.c $(headers)\r
+       $(CC) $(CFLAGS) subroute.c\r
+\r
+local.o: local.c $(headers)\r
+       $(CC) $(CFLAGS) local.c\r
+\r
+tex0.o: tex0.c $(headers)\r
+       $(CC) $(CFLAGS) tex0.c\r
+\r
+tex1.o: tex1.c $(headers)\r
+       $(CC) $(CFLAGS) tex1.c\r
+\r
+tex2.o: tex2.c $(headers)\r
+       $(CC) $(CFLAGS) tex2.c\r
+\r
+tex3.o: tex3.c $(headers)\r
+       $(CC) $(CFLAGS) tex3.c\r
+\r
+tex4.o: tex4.c $(headers)\r
+       $(CC) $(CFLAGS) tex4.c\r
+\r
+tex5.o: tex5.c $(headers)\r
+       $(CC) $(CFLAGS) tex5.c\r
+\r
+tex6.o: tex6.c $(headers)\r
+       $(CC) $(CFLAGS) tex6.c\r
+\r
+tex7.o: tex7.c $(headers)\r
+       $(CC) $(CFLAGS) tex7.c\r
+\r
+tex8.o: tex8.c $(headers)\r
+       $(CC) $(CFLAGS) tex8.c\r
+\r
+tex9.o: tex9.c $(headers)\r
+       $(CC) $(CFLAGS) tex9.c\r
+\r
+pool.o: pool.c $(headers)\r
+       $(CC) $(CFLAGS) pool.c\r
+\r
+utils.o: utils.c $(headers)\r
+       $(CC) $(CFLAGS) utils.c\r
+\r
+.PHONY: clean\r
+\r
+clean:\r
+       rm yandytex *.o\r
index 7f5915f..7c132bf 100644 (file)
@@ -1,99 +1,96 @@
-# Copyright 2007 TeX Users Group.
-# Copyright 2014 Clerk Ma.
-#
-# You may freely use, modify and/or distribute this file.
-#
-# Makefile for Y&YTeX (tested on Clang/LLVM 3.4)
-
-CC = clang-cl
-LINK = link
-RC = rc
-
-CFLAGS=/nologo /c /MT /GF /Ox /W4 \
-       /I"kpathsea" /I"zlib" /I"libmd5" /D_CRT_SECURE_NO_WARNINGS \
-       -Wno-char-subscripts -Wno-dangling-else \
-       -Wno-deprecated-declarations
-
-LFLAGS=/NOLOGO /MAP
-
-objs = yandytex.obj itex.obj openinou.obj subroute.obj local.obj \
-       tex0.obj tex1.obj tex2.obj tex3.obj tex4.obj \
-       tex5.obj tex6.obj tex7.obj tex8.obj tex9.obj \
-       pool.obj yandytex.res md5.obj utils.obj
-
-yandytex.exe: $(objs)
-       $(LINK) $(LFLAGS) yandytex itex openinou subroute local \
-       tex0 tex1 tex2 tex3 tex4 tex5 tex6 tex7 tex8 tex9 \
-       pool yandytex.res md5 utils \
-       kpathsea\kpathsea.lib zlib\zlib.lib
-       del ..\yandy\bin\yandytex.exe
-       copy yandytex.exe ..\yandy\bin\yandytex.exe
-
-md5.obj: libmd5\md5.c
-       $(CC) -Ilibmd5 $(CFLAGS) libmd5\md5.c
-
-yandytex.res: yandytex.rc
-       $(RC) /nologo yandytex.rc
-
-yandytex.obj: yandytex.c \
-       texd.h yandytex.h memory.h coerce.h macros.h
-       $(CC) $(CFLAGS) yandytex.c
-
-itex.obj: itex.c \
-       texd.h yandytex.h memory.h coerce.h macros.h
-       $(CC) $(CFLAGS) itex.c
-
-openinou.obj: openinou.c \
-       texd.h yandytex.h memory.h coerce.h macros.h
-       $(CC) $(CFLAGS) openinou.c
-
-subroute.obj: subroute.c \
-       texd.h yandytex.h memory.h coerce.h macros.h
-       $(CC) $(CFLAGS) subroute.c
-
-local.obj: local.c \
-       texd.h yandytex.h memory.h coerce.h macros.h
-       $(CC) $(CFLAGS) local.c
-
-tex0.obj: tex0.c \
-       texd.h yandytex.h memory.h coerce.h macros.h
-
-tex1.obj: tex1.c \
-       texd.h yandytex.h memory.h coerce.h macros.h
-
-tex2.obj: tex2.c \
-       texd.h yandytex.h memory.h coerce.h macros.h
-
-tex3.obj: tex3.c \
-       texd.h yandytex.h memory.h coerce.h macros.h
-
-tex4.obj: tex4.c \
-       texd.h yandytex.h memory.h coerce.h macros.h
-
-tex5.obj: tex5.c \
-       texd.h yandytex.h memory.h coerce.h macros.h
-
-tex6.obj: tex6.c \
-       texd.h yandytex.h memory.h coerce.h macros.h
-
-tex7.obj: tex7.c \
-       texd.h yandytex.h memory.h coerce.h macros.h
-
-tex8.obj: tex8.c \
-       texd.h yandytex.h memory.h coerce.h macros.h
-
-tex9.obj: tex9.c \
-       texd.h yandytex.h memory.h coerce.h macros.h
-
-pool.obj: pool.c \
-       texd.h yandytex.h memory.h coerce.h macros.h
-
-utils.obj: utils.c \
-       texd.h yandytex.h memory.h coerce.h macros.h
-
-.SUFFIXES:
-.SUFFIXES: .obj .c
-
-c..obj:
-       $(CC) $(CFLAGS) $*.c
-
+# Copyright 2007 TeX Users Group.\r
+# Copyright 2014 Clerk Ma.\r
+#\r
+# You may freely use, modify and/or distribute this file.\r
+#\r
+# Makefile for Y&YTeX (tested on Clang/LLVM 3.4)\r
+\r
+CC = clang-cl\r
+LINK = link\r
+RC = rc\r
+\r
+CFLAGS=/nologo /c /MT /GF /Ox /W4 \\r
+       /I"kpathsea" /I"zlib" /D_CRT_SECURE_NO_WARNINGS \\r
+       -Wno-char-subscripts -Wno-dangling-else \\r
+       -Wno-deprecated-declarations\r
+\r
+LFLAGS=/NOLOGO /MAP\r
+\r
+objs = yandytex.obj itex.obj openinou.obj subroute.obj local.obj \\r
+       tex0.obj tex1.obj tex2.obj tex3.obj tex4.obj \\r
+       tex5.obj tex6.obj tex7.obj tex8.obj tex9.obj \\r
+       pool.obj yandytex.res utils.obj\r
+\r
+yandytex.exe: $(objs)\r
+       $(LINK) $(LFLAGS) yandytex itex openinou subroute local \\r
+       tex0 tex1 tex2 tex3 tex4 tex5 tex6 tex7 tex8 tex9 \\r
+       pool yandytex.res md5 utils \\r
+       kpathsea\kpathsea.lib zlib\zlib.lib\r
+       del ..\yandy\bin\yandytex.exe\r
+       copy yandytex.exe ..\yandy\bin\yandytex.exe\r
+\r
+yandytex.res: yandytex.rc\r
+       $(RC) /nologo yandytex.rc\r
+\r
+yandytex.obj: yandytex.c \\r
+       texd.h yandytex.h memory.h coerce.h macros.h\r
+       $(CC) $(CFLAGS) yandytex.c\r
+\r
+itex.obj: itex.c \\r
+       texd.h yandytex.h memory.h coerce.h macros.h\r
+       $(CC) $(CFLAGS) itex.c\r
+\r
+openinou.obj: openinou.c \\r
+       texd.h yandytex.h memory.h coerce.h macros.h\r
+       $(CC) $(CFLAGS) openinou.c\r
+\r
+subroute.obj: subroute.c \\r
+       texd.h yandytex.h memory.h coerce.h macros.h\r
+       $(CC) $(CFLAGS) subroute.c\r
+\r
+local.obj: local.c \\r
+       texd.h yandytex.h memory.h coerce.h macros.h\r
+       $(CC) $(CFLAGS) local.c\r
+\r
+tex0.obj: tex0.c \\r
+       texd.h yandytex.h memory.h coerce.h macros.h\r
+\r
+tex1.obj: tex1.c \\r
+       texd.h yandytex.h memory.h coerce.h macros.h\r
+\r
+tex2.obj: tex2.c \\r
+       texd.h yandytex.h memory.h coerce.h macros.h\r
+\r
+tex3.obj: tex3.c \\r
+       texd.h yandytex.h memory.h coerce.h macros.h\r
+\r
+tex4.obj: tex4.c \\r
+       texd.h yandytex.h memory.h coerce.h macros.h\r
+\r
+tex5.obj: tex5.c \\r
+       texd.h yandytex.h memory.h coerce.h macros.h\r
+\r
+tex6.obj: tex6.c \\r
+       texd.h yandytex.h memory.h coerce.h macros.h\r
+\r
+tex7.obj: tex7.c \\r
+       texd.h yandytex.h memory.h coerce.h macros.h\r
+\r
+tex8.obj: tex8.c \\r
+       texd.h yandytex.h memory.h coerce.h macros.h\r
+\r
+tex9.obj: tex9.c \\r
+       texd.h yandytex.h memory.h coerce.h macros.h\r
+\r
+pool.obj: pool.c \\r
+       texd.h yandytex.h memory.h coerce.h macros.h\r
+\r
+utils.obj: utils.c \\r
+       texd.h yandytex.h memory.h coerce.h macros.h\r
+\r
+.SUFFIXES:\r
+.SUFFIXES: .obj .c\r
+\r
+c..obj:\r
+       $(CC) $(CFLAGS) $*.c\r
+\r
index 981fb80..888f241 100644 (file)
@@ -1,98 +1,95 @@
-# Copyright 2007 TeX Users Group.
-# Copyright 2014 Clerk Ma.
-#
-# You may freely use, modify and/or distribute this file.
-#
-# Makefile for Y&YTeX (MSVC, tested on VS 2012 and VS 2013)
-
-CC = cl
-LINK = link
-RC = rc
-
-CFLAGS=/nologo /c /MT /GF /Gy /W4 \
-       /I"kpathsea" /I"zlib" /I"libmd5"
-
-LFLAGS=/NOLOGO /MAP
-
-objs = yandytex.obj itex.obj openinou.obj subroute.obj local.obj \
-       tex0.obj tex1.obj tex2.obj tex3.obj tex4.obj \
-       tex5.obj tex6.obj tex7.obj tex8.obj tex9.obj \
-       pool.obj yandytex.res md5.obj utils.obj
-
-yandytex.exe: $(objs)
-       $(LINK) $(LFLAGS) yandytex itex openinou subroute local \
-       tex0 tex1 tex2 tex3 tex4 tex5 tex6 tex7 tex8 tex9 \
-       pool yandytex.res md5 utils \
-       kpathsea\kpathsea.lib zlib\zlib.lib
-       del ..\yandy\bin\yandytex.exe
-       copy yandytex.exe ..\yandy\bin\yandytex.exe
-
-md5.obj: libmd5\md5.c
-       $(CC) -Ilibmd5 $(CFLAGS) libmd5\md5.c
-
-yandytex.res: yandytex.rc
-       $(RC) /nologo yandytex.rc
-
-yandytex.obj: yandytex.c \
-       texd.h yandytex.h memory.h coerce.h macros.h
-       $(CC) $(CFLAGS) yandytex.c
-
-itex.obj: itex.c \
-       texd.h yandytex.h memory.h coerce.h macros.h
-       $(CC) $(CFLAGS) itex.c
-
-openinou.obj: openinou.c \
-       texd.h yandytex.h memory.h coerce.h macros.h
-       $(CC) $(CFLAGS) openinou.c
-
-subroute.obj: subroute.c \
-       texd.h yandytex.h memory.h coerce.h macros.h
-       $(CC) $(CFLAGS) subroute.c
-
-local.obj: local.c \
-       texd.h yandytex.h memory.h coerce.h macros.h
-       $(CC) $(CFLAGS) local.c
-
-tex0.obj: tex0.c \
-       texd.h yandytex.h memory.h coerce.h macros.h
-
-tex1.obj: tex1.c \
-       texd.h yandytex.h memory.h coerce.h macros.h
-
-tex2.obj: tex2.c \
-       texd.h yandytex.h memory.h coerce.h macros.h
-
-tex3.obj: tex3.c \
-       texd.h yandytex.h memory.h coerce.h macros.h
-
-tex4.obj: tex4.c \
-       texd.h yandytex.h memory.h coerce.h macros.h
-
-tex5.obj: tex5.c \
-       texd.h yandytex.h memory.h coerce.h macros.h
-
-tex6.obj: tex6.c \
-       texd.h yandytex.h memory.h coerce.h macros.h
-
-tex7.obj: tex7.c \
-       texd.h yandytex.h memory.h coerce.h macros.h
-
-tex8.obj: tex8.c \
-       texd.h yandytex.h memory.h coerce.h macros.h
-
-tex9.obj: tex9.c \
-       texd.h yandytex.h memory.h coerce.h macros.h
-
-pool.obj: pool.c \
-       texd.h yandytex.h memory.h coerce.h macros.h
-
-utils.obj: utils.c \
-       texd.h yandytex.h memory.h coerce.h macros.h
-
-.SUFFIXES:
-.SUFFIXES: .obj .c
-
-c..obj:
-       $(CC) $(CFLAGS) $*.c
-
-
+# Copyright 2007 TeX Users Group.\r
+# Copyright 2014 Clerk Ma.\r
+#\r
+# You may freely use, modify and/or distribute this file.\r
+#\r
+# Makefile for Y&YTeX (MSVC, tested on VS 2012 and VS 2013)\r
+\r
+CC = cl\r
+LINK = link\r
+RC = rc\r
+\r
+CFLAGS=/nologo /c /MT /GF /Gy /W4 \\r
+       /I"kpathsea" /I"zlib"\r
+\r
+LFLAGS=/NOLOGO /MAP\r
+\r
+objs = yandytex.obj itex.obj openinou.obj subroute.obj local.obj \\r
+       tex0.obj tex1.obj tex2.obj tex3.obj tex4.obj \\r
+       tex5.obj tex6.obj tex7.obj tex8.obj tex9.obj \\r
+       pool.obj yandytex.res utils.obj\r
+\r
+yandytex.exe: $(objs)\r
+       $(LINK) $(LFLAGS) yandytex itex openinou subroute local \\r
+       tex0 tex1 tex2 tex3 tex4 tex5 tex6 tex7 tex8 tex9 \\r
+       pool yandytex.res utils \\r
+       kpathsea\kpathsea.lib zlib\zlib.lib\r
+       del ..\yandy\bin\yandytex.exe\r
+       copy yandytex.exe ..\yandy\bin\yandytex.exe\r
+\r
+yandytex.res: yandytex.rc\r
+       $(RC) /nologo yandytex.rc\r
+\r
+yandytex.obj: yandytex.c \\r
+       texd.h yandytex.h memory.h coerce.h macros.h\r
+       $(CC) $(CFLAGS) yandytex.c\r
+\r
+itex.obj: itex.c \\r
+       texd.h yandytex.h memory.h coerce.h macros.h\r
+       $(CC) $(CFLAGS) itex.c\r
+\r
+openinou.obj: openinou.c \\r
+       texd.h yandytex.h memory.h coerce.h macros.h\r
+       $(CC) $(CFLAGS) openinou.c\r
+\r
+subroute.obj: subroute.c \\r
+       texd.h yandytex.h memory.h coerce.h macros.h\r
+       $(CC) $(CFLAGS) subroute.c\r
+\r
+local.obj: local.c \\r
+       texd.h yandytex.h memory.h coerce.h macros.h\r
+       $(CC) $(CFLAGS) local.c\r
+\r
+tex0.obj: tex0.c \\r
+       texd.h yandytex.h memory.h coerce.h macros.h\r
+\r
+tex1.obj: tex1.c \\r
+       texd.h yandytex.h memory.h coerce.h macros.h\r
+\r
+tex2.obj: tex2.c \\r
+       texd.h yandytex.h memory.h coerce.h macros.h\r
+\r
+tex3.obj: tex3.c \\r
+       texd.h yandytex.h memory.h coerce.h macros.h\r
+\r
+tex4.obj: tex4.c \\r
+       texd.h yandytex.h memory.h coerce.h macros.h\r
+\r
+tex5.obj: tex5.c \\r
+       texd.h yandytex.h memory.h coerce.h macros.h\r
+\r
+tex6.obj: tex6.c \\r
+       texd.h yandytex.h memory.h coerce.h macros.h\r
+\r
+tex7.obj: tex7.c \\r
+       texd.h yandytex.h memory.h coerce.h macros.h\r
+\r
+tex8.obj: tex8.c \\r
+       texd.h yandytex.h memory.h coerce.h macros.h\r
+\r
+tex9.obj: tex9.c \\r
+       texd.h yandytex.h memory.h coerce.h macros.h\r
+\r
+pool.obj: pool.c \\r
+       texd.h yandytex.h memory.h coerce.h macros.h\r
+\r
+utils.obj: utils.c \\r
+       texd.h yandytex.h memory.h coerce.h macros.h\r
+\r
+.SUFFIXES:\r
+.SUFFIXES: .obj .c\r
+\r
+c..obj:\r
+       $(CC) $(CFLAGS) $*.c\r
+\r
+\r
index e6b77aa..e7bbcd3 100644 (file)
@@ -1,2 +1,2 @@
-In this directory, you can found sources of Y&Y TeX which is under
-developing in MS-Windows (a Linux port is working now).
+In this directory, you can found sources of Y&Y TeX which is under\r
+developing in MS-Windows (a Linux port is working now).\r
index ff84f80..86a08b8 100644 (file)
-/* Copyright 2007 TeX Users Group
-   Copyright 2014 Clerk Ma
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301 USA.  */
-
-void initialize (void);
-void print_ln (void);
-void print_char_(ASCII_code s);
-#define print_char(s) print_char_((ASCII_code) (s))
-void print_(integer s);
-#define print(s) print_((integer) (s))
-void prints_(const char * s);
-#define prints(s) prints_((const char *) s)
-void slow_print_(integer s);
-#define slow_print(s) slow_print_((integer) (s))
-void print_nl (const char * s);
-void print_esc (const char * s);
-void print_the_digs (eight_bits k);
-void print_int_(integer n);
-#define print_int(n) print_int_((integer) (n))
-void print_cs_(integer p);
-#define print_cs(p) print_cs_((integer) (p))
-void sprint_cs (pointer p);
-void print_file_name (integer n, integer a, integer e);
-void print_size_(integer s);
-#define print_size(s) print_size_((integer) (s))
-void print_write_whatsit_(const char * s, pointer p);
-#define print_write_whatsit(s, p) print_write_whatsit_((const char *) (s), (pointer) (p))
-void jump_out (void);
-void error (void);
-void fatal_error (const char * s);
-void overflow_(const char * s, integer n);
-#define overflow(s, n) overflow_((const char *) (s), (integer) (n))
-void confusion (const char * s);
-boolean init_terminal (void);
-str_number make_string (void);
-boolean str_eq_buf_(str_number s, integer k);
-#define str_eq_buf(s, k) str_eq_buf_((str_number) (s), (integer) (k))
-boolean str_eq_str_(str_number s, str_number t);
-#define str_eq_str(s, t) str_eq_str_((str_number) (s), (str_number) (t))
-boolean get_strings_started (void);
-void print_two_(integer n);
-#define print_two(n) print_two_((integer) (n))
-void print_hex_(integer n);
-#define print_hex(n) print_hex_((integer) (n))
-void print_roman_int_(integer n);
-#define print_roman_int(n) print_roman_int_((integer) (n))
-void print_current_string (void);
-void term_input (void);
-void int_error_(integer n);
-#define int_error(n) int_error_((integer) (n))
-void normalize_selector (void);
-void pause_for_instructions (void);
-integer half_(integer x);
-#define half(x) half_((integer) (x))
-scaled round_decimals_(small_number k);
-#define round_decimals(k) round_decimals_((small_number) (k))
-void print_scaled_(scaled s);
-#define print_scaled(s) print_scaled_((scaled) (s))
-scaled mult_and_add_(integer n, scaled x, scaled y, scaled max_answer);
-#define mult_and_add(n, x, y, max_answer) mult_and_add_((integer) (n), (scaled) (x), (scaled) (y), (scaled) (max_answer))
-scaled x_over_n_(scaled x, integer n);
-#define x_over_n(x, n) x_over_n_((scaled) (x), (integer) (n))
-scaled xn_over_d_(scaled x, integer n, integer d);
-#define xn_over_d(x, n, d) xn_over_d_((scaled) (x), (integer) (n), (integer) (d))
-halfword badness_(scaled t, scaled s);
-#define badness(t, s) badness_((scaled) (t), (scaled) (s))
-void print_word (memory_word w);
-void show_token_list_(integer p, integer q, integer l);
-#define show_token_list(p, q, l) show_token_list_((integer) (p), (integer) (q), (integer) (l))
-void runaway (void);
-pointer get_avail (void);
-void flush_list_(pointer p);
-#define flush_list(p) flush_list_((pointer) (p))
-pointer get_node (integer s);
-void free_node (pointer p, halfword s);
-void sort_avail (void);
-pointer new_null_box (void);
-pointer new_rule (void);
-pointer new_ligature_(quarterword f, quarterword c, pointer q);
-#define new_ligature(f, c, q) new_ligature_((quarterword) (f), (quarterword) (c), (pointer) (q))
-pointer new_lig_item_(quarterword c);
-#define new_lig_item(c) new_lig_item_((quarterword) (c))
-pointer new_disc (void);
-pointer new_math (scaled w, small_number s);
-pointer new_spec_(pointer p);
-#define new_spec(p) new_spec_((pointer) (p))
-pointer new_param_glue (small_number n);
-pointer new_glue (pointer q);
-pointer new_skip_param (small_number n);
-pointer new_kern (scaled w);
-pointer new_penalty (integer m);
-void check_mem (boolean print_locs);
-void search_mem_(pointer p);
-#define search_mem(p) search_mem_((pointer) (p))
-void short_display_(integer p);
-#define short_display(p) short_display_((integer) (p))
-void print_font_and_char(integer p);
-void print_mark (integer p);
-void print_rule_dimen (scaled d);
-void print_glue_(scaled d, integer order, const char * s);
-#define print_glue(d, order, s) print_glue_((scaled) (d), (integer) (order), (const char *) (s))
-void print_spec_(integer p, const char * s);
-#define print_spec(p, s) print_spec_((integer) (p), (const char *) (s))
-void print_fam_and_char_(pointer p);
-#define print_fam_and_char(p) print_fam_and_char_((pointer) (p))
-void print_delimiter_(pointer p);
-#define print_delimiter(p) print_delimiter_((pointer) (p))
-void print_subsidiary_data_(pointer p, ASCII_code c);
-#define print_subsidiary_data(p, c) print_subsidiary_data_((pointer) (p), (ASCII_code) (c))
-void print_style_(integer c);
-#define print_style(c) print_style_((integer) (c))
-void print_skip_param_(integer n);
-#define print_skip_param(n) print_skip_param_((integer) (n))
-void show_node_list_(integer p);
-#define show_node_list(p) show_node_list_((integer) (p))
-void show_box_(pointer p);
-#define show_box(p) show_box_((pointer) (p))
-void delete_token_ref_(pointer p);
-#define delete_token_ref(p) delete_token_ref_((pointer) (p))
-void delete_glue_ref_(pointer p);
-#define delete_glue_ref(p) delete_glue_ref_((pointer) (p))
-void flush_node_list_(pointer p);
-#define flush_node_list(p) flush_node_list_((pointer) (p))
-pointer copy_node_list_(pointer p);
-#define copy_node_list(p) copy_node_list_((pointer) (p))
-void print_mode_(integer m);
-#define print_mode(m) print_mode_((integer) (m))
-void push_nest (void);
-void pop_nest (void);
-void show_activities (void);
-void print_param_(integer n);
-#define print_param(n) print_param_((integer) (n))
-void begin_diagnostic (void);
-void end_diagnostic (boolean blank_line);
-void print_length_param_(integer n);
-#define print_length_param(n) print_length_param_((integer) (n))
-void print_cmd_chr_(quarterword cmd, halfword chr_code);
-#define print_cmd_chr(cmd, chr_code) print_cmd_chr_((quarterword) (cmd), (halfword) (chr_code))
-void show_eqtb (pointer n);
-pointer id_lookup_(integer j, integer l);
-#define id_lookup(j, l) id_lookup_((integer) (j), (integer) (l))
-void primitive_(str_number s, quarterword c, halfword o);
-#define primitive(s, c, o) primitive_(make_string_pool((const char *) s), (quarterword) (c), (halfword) (o))
-void new_save_level (group_code c);
-void eq_destroy (memory_word w);
-void eq_save (pointer p, quarterword l);
-void eq_define_(pointer p, quarterword t, halfword e);
-#define eq_define(p, t, e) eq_define_((pointer) (p), (quarterword) (t), (halfword) (e))
-void eq_word_define_(pointer p, integer w);
-#define eq_word_define(p, w) eq_word_define_((pointer) (p), (integer) (w))
-void geq_define_(pointer p, quarterword t, halfword e);
-#define geq_define(p, t, e) geq_define_((pointer) (p), (quarterword) (t), (halfword) (e))
-void geq_word_define_(pointer p, integer w);
-#define geq_word_define(p, w) geq_word_define_((pointer) (p), (integer) (w))
-void save_for_after (halfword t);
-void restore_trace (pointer p, const char * s);
-void unsave (void);
-void prepare_mag (void);
-void token_show (pointer p);
-void print_meaning (void);
-void show_cur_cmd_chr (void);
-void show_context (void);
-void begin_token_list_(pointer p, quarterword t);
-#define begin_token_list(p, t) begin_token_list_((pointer) (p), (quarterword) (t))
-void end_token_list (void);
-void back_input (void);
-void back_error (void);
-void ins_error (void);
-void begin_file_reading (void);
-void end_file_reading (void);
-void clear_for_error_prompt (void);
-void check_outer_validity (void);
-void get_next (void);
-void firm_up_the_line (void);
-void get_token (void);
-void macro_call (void);
-void insert_relax (void);
-void expand (void);
-void get_x_token (void);
-void x_token (void);
-void scan_left_brace (void);
-void scan_optional_equals (void);
-boolean scan_keyword (const char * s);
-void mu_error (void);
-void scan_eight_bit_int (void);
-void scan_char_num (void);
-void scan_four_bit_int (void);
-void scan_fifteen_bit_int (void);
-void scan_twenty_seven_bit_int (void);
-void scan_font_ident (void);
-void find_font_dimen (boolean writing);
-void scan_something_internal (small_number level, boolean negative);
-void scan_int (void);
-void scan_dimen (boolean mu, boolean inf, boolean shortcut);
-void scan_glue (small_number level);
-pointer scan_rule_spec (void);
-pointer str_toks (pool_pointer b);
-pointer the_toks (void);
-void ins_the_toks (void);
-void conv_toks (void);
-pointer scan_toks (boolean macro_def, boolean xpand);
-void read_toks (integer n, pointer r);
-void pass_text (void);
-void change_if_limit (small_number l, pointer p);
-void conditional (void);
-void begin_name (void);
-boolean more_name (ASCII_code c);
-void end_name (void);
-void pack_file_name (str_number n, str_number a, str_number e);
-void pack_buffered_name_(small_number n, integer a, integer b);
-#define pack_buffered_name(n, a, b) pack_buffered_name_((small_number) (n), (integer) (a), (integer) (b))
-str_number make_name_string (void);
-str_number a_make_name_string_(void);
-#define a_make_name_string(f) a_make_name_string_()
-str_number b_make_name_string_(void);
-#define b_make_name_string(f) b_make_name_string_()
-str_number w_make_name_string_(void);
-#define w_make_name_string(f) w_make_name_string_()
-void scan_file_name (void);
-void pack_job_name_(str_number s);
-#define pack_job_name(s) pack_job_name_(make_string_pool((const char *) (s)))
-void prompt_file_name_(const char * s, str_number e);
-#define prompt_file_name(s, e) prompt_file_name_((const char *) s, make_string_pool((const char*) e))
-void open_log_file (void);
-void start_input (void);
-internal_font_number read_font_info (pointer u, str_number nom, str_number arie, scaled s);
-void char_warning_(internal_font_number f, eight_bits c);
-#define char_warning(f, c) char_warning_((internal_font_number) (f), (eight_bits) (c))
-pointer new_character_(internal_font_number f, eight_bits c);
-#define new_character(f, c) new_character_((internal_font_number) (f), (eight_bits) (c))
-void dvi_swap (void);
-void dvi_four_(integer x);
-#define dvi_four(x) dvi_four_((integer) (x))
-void dvi_pop_(integer l);
-#define dvi_pop(l) dvi_pop_((integer) (l))
-void dvi_font_def (internal_font_number f);
-void movement (scaled w, eight_bits o);
-void special_out (pointer p);
-void hlist_out (void);
-void vlist_out (void);
-void pdf_ship_out (pointer p);
-void ship_out (pointer p);
-void prune_movements (integer l);
-void write_out (pointer p);
-void out_what (pointer p);
-void scan_spec (group_code c, boolean three_codes);
-pointer hpack_(pointer p, scaled w, small_number m);
-#define hpack(p, w, m) hpack_((pointer) (p), (scaled) (w), (small_number) (m))
-pointer vpackage_(pointer p, scaled h, small_number m, scaled l);
-#define vpackage(p, h, m, l) vpackage_((pointer) (p), (scaled) (h), (small_number) (m), (scaled) (l))
-void append_to_vlist (pointer b);
-pointer new_noad (void);
-pointer new_style (small_number s);
-pointer new_choice (void);
-void show_info (void);
-pointer fraction_rule (scaled t);
-pointer overbar (pointer b, scaled k, scaled t);
-pointer char_box (internal_font_number f, quarterword c);
-void stack_into_box (pointer b, internal_font_number f, quarterword c);
-scaled height_plus_depth (internal_font_number f, quarterword c);
-pointer var_delimiter (pointer d, small_number s, scaled v);
-pointer rebox (pointer b, scaled w);
-pointer math_glue (pointer g, scaled m);
-void math_kern (pointer p, scaled m);
-void flush_math (void);
-pointer clean_box (pointer p, small_number s);
-void fetch (pointer a);
-void make_over (pointer q);
-void make_under (pointer q);
-void make_vcenter (pointer q);
-void make_radical (pointer q);
-void make_math_accent (pointer q);
-void make_fraction (pointer q);
-scaled make_op (pointer q);
-void make_ord (pointer q);
-void make_scripts (pointer q, scaled delta);
-small_number make_left_right (pointer q, small_number style, scaled max_d, scaled max_h);
-void mlist_to_hlist (void);
-void push_alignment (void);
-void pop_alignment (void);
-void get_preamble_token (void);
-void init_align (void);
-void init_span (pointer p);
-void init_row (void);
-void init_col (void);
-boolean fin_col (void);
-void fin_row (void);
-void fin_align (void);
-void align_peek (void);
-pointer finite_shrink (pointer p);
-void try_break (integer pi, small_number breaktype);
-void post_line_break (integer final_widow_penalty);
-small_number reconstitute (small_number j, small_number n, halfword bchar, halfword hchar);
-void hyphenate (void);
-trie_op_code new_trie_op (small_number d, small_number n, trie_op_code v);
-trie_pointer trie_node (trie_pointer p);
-trie_pointer compress_trie (trie_pointer p);
-void first_fit (trie_pointer p);
-void trie_pack (trie_pointer p);
-void trie_fix (trie_pointer p);
-void new_patterns (void);
-void init_trie (void);
-void line_break (integer final_widow_penalty);
-void new_hyph_exceptions (void);
-pointer prune_page_top (pointer p);
-pointer vert_break (pointer p, scaled h, scaled d);
-pointer vsplit (eight_bits n, scaled h);
-void print_totals (void);
-void freeze_page_specs (small_number s);
-void box_error (eight_bits n);
-void ensure_vbox_(eight_bits n);
-#define ensure_vbox(n) ensure_vbox_((eight_bits) (n))
-void fire_up (pointer c);
-void build_page (void);
-void app_space (void);
-void insert_dollar_sign (void);
-void you_cant (void);
-void report_illegal_case (void);
-boolean privileged (void);
-boolean its_all_over (void);
-void append_glue (void);
-void append_kern (void);
-void off_save (void);
-void extra_right_brace (void);
-void normal_paragraph (void);
-void box_end (integer box_content);
-void begin_box (integer box_content);
-void scan_box_(integer box_content);
-#define scan_box(box_context) scan_box_((integer) (box_context))
-void package (small_number c);
-small_number norm_min (integer h);
-void new_graf (boolean indented);
-void indent_in_hmode (void);
-void head_for_vmode (void);
-void end_graf (void);
-void begin_insert_or_adjust (void);
-void make_mark (void);
-void append_penalty (void);
-void delete_last (void);
-void unpackage (void);
-void append_italic_correction (void);
-void append_discretionary (void);
-void build_discretionary (void);
-void make_accent (void);
-void align_error (void);
-void noalign_error (void);
-void omit_error (void);
-void do_endv (void);
-void cs_error (void);
-void push_math (group_code c);
-void init_math (void);
-void start_eq_no (void);
-void scan_math (pointer p);
-void set_math_char_(integer c);
-#define set_math_char(c) set_math_char_((integer) (c))
-void math_limit_switch(void);
-void scan_delimiter_(pointer p, boolean r);
-#define scan_delimiter(p, r) scan_delimiter_((pointer) (p), (boolean) (r))
-void math_radical (void);
-void math_ac (void);
-void append_choices (void);
-pointer fin_mlist (pointer p);
-void build_choices (void);
-void sub_sup (void);
-void math_fraction (void);
-void math_left_right (void);
-void after_math (void);
-void resume_after_display (void);
-void get_r_token (void);
-void trap_zero_glue (void);
-void do_register_command (small_number a);
-void alter_aux (void);
-void alter_prev_graf (void);
-void alter_page_so_far (void);
-void alter_integer (void);
-void alter_box_dimen (void);
-void new_font (small_number a);
-void new_interaction (void);
-void prefixed_command (void);
-void do_assignments (void);
-void open_or_close_in (void);
-void issue_message (void);
-void shift_case (void);
-void show_whatever (void);
-void store_fmt_file (void);
-void new_whatsit_(small_number s, small_number w);
-#define new_whatsit(s, w) new_whatsit_((small_number) (s), (small_number) (w))
-void new_write_whatsit (small_number w);
-void do_extension (void);
-void fix_language (void);
-void handle_right_brace (void);
-void main_control (void);
-void give_err_help (void);
-boolean open_fmt_file (void);
-boolean load_fmt_file (void);
-void close_files_and_terminate (void);
-void final_cleanup (void);
-void init_prim (void);
-void debug_help (void);
-void fix_date_and_time (void);
-void print_banner (void);
-
-int main_program (void);
+/* Copyright 2007 TeX Users Group\r
+   Copyright 2014 Clerk Ma\r
+\r
+   This program is free software; you can redistribute it and/or modify\r
+   it under the terms of the GNU General Public License as published by\r
+   the Free Software Foundation; either version 2 of the License, or\r
+   (at your option) any later version.\r
+\r
+   This program is distributed in the hope that it will be useful, but\r
+   WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+   General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with this program; if not, write to the Free Software\r
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA\r
+   02110-1301 USA.  */\r
+\r
+void initialize (void);\r
+void print_ln (void);\r
+void print_char_(ASCII_code s);\r
+#define print_char(s) print_char_((ASCII_code) (s))\r
+void print_(integer s);\r
+#define print(s) print_((integer) (s))\r
+void prints_(const char * s);\r
+#define prints(s) prints_((const char *) s)\r
+void slow_print_(integer s);\r
+#define slow_print(s) slow_print_((integer) (s))\r
+void print_nl (const char * s);\r
+void print_esc (const char * s);\r
+void print_the_digs (eight_bits k);\r
+void print_int_(integer n);\r
+#define print_int(n) print_int_((integer) (n))\r
+void print_cs_(integer p);\r
+#define print_cs(p) print_cs_((integer) (p))\r
+void sprint_cs (pointer p);\r
+void print_file_name (integer n, integer a, integer e);\r
+void print_size_(integer s);\r
+#define print_size(s) print_size_((integer) (s))\r
+void print_write_whatsit_(const char * s, pointer p);\r
+#define print_write_whatsit(s, p) print_write_whatsit_((const char *) (s), (pointer) (p))\r
+void jump_out (void);\r
+void error (void);\r
+void fatal_error (const char * s);\r
+void overflow_(const char * s, integer n);\r
+#define overflow(s, n) overflow_((const char *) (s), (integer) (n))\r
+void confusion (const char * s);\r
+boolean init_terminal (void);\r
+str_number make_string (void);\r
+boolean str_eq_buf_(str_number s, integer k);\r
+#define str_eq_buf(s, k) str_eq_buf_((str_number) (s), (integer) (k))\r
+boolean str_eq_str_(str_number s, str_number t);\r
+#define str_eq_str(s, t) str_eq_str_((str_number) (s), (str_number) (t))\r
+boolean get_strings_started (void);\r
+void print_two_(integer n);\r
+#define print_two(n) print_two_((integer) (n))\r
+void print_hex_(integer n);\r
+#define print_hex(n) print_hex_((integer) (n))\r
+void print_roman_int_(integer n);\r
+#define print_roman_int(n) print_roman_int_((integer) (n))\r
+void print_current_string (void);\r
+void term_input (void);\r
+void int_error_(integer n);\r
+#define int_error(n) int_error_((integer) (n))\r
+void normalize_selector (void);\r
+void pause_for_instructions (void);\r
+integer half_(integer x);\r
+#define half(x) half_((integer) (x))\r
+scaled round_decimals_(small_number k);\r
+#define round_decimals(k) round_decimals_((small_number) (k))\r
+void print_scaled_(scaled s);\r
+#define print_scaled(s) print_scaled_((scaled) (s))\r
+scaled mult_and_add_(integer n, scaled x, scaled y, scaled max_answer);\r
+#define mult_and_add(n, x, y, max_answer) mult_and_add_((integer) (n), (scaled) (x), (scaled) (y), (scaled) (max_answer))\r
+scaled x_over_n_(scaled x, integer n);\r
+#define x_over_n(x, n) x_over_n_((scaled) (x), (integer) (n))\r
+scaled xn_over_d_(scaled x, integer n, integer d);\r
+#define xn_over_d(x, n, d) xn_over_d_((scaled) (x), (integer) (n), (integer) (d))\r
+halfword badness_(scaled t, scaled s);\r
+#define badness(t, s) badness_((scaled) (t), (scaled) (s))\r
+void print_word (memory_word w);\r
+void show_token_list_(integer p, integer q, integer l);\r
+#define show_token_list(p, q, l) show_token_list_((integer) (p), (integer) (q), (integer) (l))\r
+void runaway (void);\r
+pointer get_avail (void);\r
+void flush_list_(pointer p);\r
+#define flush_list(p) flush_list_((pointer) (p))\r
+pointer get_node (integer s);\r
+void free_node (pointer p, halfword s);\r
+void sort_avail (void);\r
+pointer new_null_box (void);\r
+pointer new_rule (void);\r
+pointer new_ligature_(quarterword f, quarterword c, pointer q);\r
+#define new_ligature(f, c, q) new_ligature_((quarterword) (f), (quarterword) (c), (pointer) (q))\r
+pointer new_lig_item_(quarterword c);\r
+#define new_lig_item(c) new_lig_item_((quarterword) (c))\r
+pointer new_disc (void);\r
+pointer new_math (scaled w, small_number s);\r
+pointer new_spec_(pointer p);\r
+#define new_spec(p) new_spec_((pointer) (p))\r
+pointer new_param_glue (small_number n);\r
+pointer new_glue (pointer q);\r
+pointer new_skip_param (small_number n);\r
+pointer new_kern (scaled w);\r
+pointer new_penalty (integer m);\r
+void check_mem (boolean print_locs);\r
+void search_mem_(pointer p);\r
+#define search_mem(p) search_mem_((pointer) (p))\r
+void short_display_(integer p);\r
+#define short_display(p) short_display_((integer) (p))\r
+void print_font_and_char(integer p);\r
+void print_mark (integer p);\r
+void print_rule_dimen (scaled d);\r
+void print_glue_(scaled d, integer order, const char * s);\r
+#define print_glue(d, order, s) print_glue_((scaled) (d), (integer) (order), (const char *) (s))\r
+void print_spec_(integer p, const char * s);\r
+#define print_spec(p, s) print_spec_((integer) (p), (const char *) (s))\r
+void print_fam_and_char_(pointer p);\r
+#define print_fam_and_char(p) print_fam_and_char_((pointer) (p))\r
+void print_delimiter_(pointer p);\r
+#define print_delimiter(p) print_delimiter_((pointer) (p))\r
+void print_subsidiary_data_(pointer p, ASCII_code c);\r
+#define print_subsidiary_data(p, c) print_subsidiary_data_((pointer) (p), (ASCII_code) (c))\r
+void print_style_(integer c);\r
+#define print_style(c) print_style_((integer) (c))\r
+void print_skip_param_(integer n);\r
+#define print_skip_param(n) print_skip_param_((integer) (n))\r
+void show_node_list_(integer p);\r
+#define show_node_list(p) show_node_list_((integer) (p))\r
+void show_box_(pointer p);\r
+#define show_box(p) show_box_((pointer) (p))\r
+void delete_token_ref_(pointer p);\r
+#define delete_token_ref(p) delete_token_ref_((pointer) (p))\r
+void delete_glue_ref_(pointer p);\r
+#define delete_glue_ref(p) delete_glue_ref_((pointer) (p))\r
+void flush_node_list_(pointer p);\r
+#define flush_node_list(p) flush_node_list_((pointer) (p))\r
+pointer copy_node_list_(pointer p);\r
+#define copy_node_list(p) copy_node_list_((pointer) (p))\r
+void print_mode_(integer m);\r
+#define print_mode(m) print_mode_((integer) (m))\r
+void push_nest (void);\r
+void pop_nest (void);\r
+void show_activities (void);\r
+void print_param_(integer n);\r
+#define print_param(n) print_param_((integer) (n))\r
+void begin_diagnostic (void);\r
+void end_diagnostic (boolean blank_line);\r
+void print_length_param_(integer n);\r
+#define print_length_param(n) print_length_param_((integer) (n))\r
+void print_cmd_chr_(quarterword cmd, halfword chr_code);\r
+#define print_cmd_chr(cmd, chr_code) print_cmd_chr_((quarterword) (cmd), (halfword) (chr_code))\r
+void show_eqtb (pointer n);\r
+pointer id_lookup_(integer j, integer l);\r
+#define id_lookup(j, l) id_lookup_((integer) (j), (integer) (l))\r
+void primitive_(str_number s, quarterword c, halfword o);\r
+#define primitive(s, c, o) primitive_(make_string_pool((const char *) s), (quarterword) (c), (halfword) (o))\r
+void new_save_level (group_code c);\r
+void eq_destroy (memory_word w);\r
+void eq_save (pointer p, quarterword l);\r
+void eq_define_(pointer p, quarterword t, halfword e);\r
+#define eq_define(p, t, e) eq_define_((pointer) (p), (quarterword) (t), (halfword) (e))\r
+void eq_word_define_(pointer p, integer w);\r
+#define eq_word_define(p, w) eq_word_define_((pointer) (p), (integer) (w))\r
+void geq_define_(pointer p, quarterword t, halfword e);\r
+#define geq_define(p, t, e) geq_define_((pointer) (p), (quarterword) (t), (halfword) (e))\r
+void geq_word_define_(pointer p, integer w);\r
+#define geq_word_define(p, w) geq_word_define_((pointer) (p), (integer) (w))\r
+void save_for_after (halfword t);\r
+void restore_trace (pointer p, const char * s);\r
+void unsave (void);\r
+void prepare_mag (void);\r
+void token_show (pointer p);\r
+void print_meaning (void);\r
+void show_cur_cmd_chr (void);\r
+void show_context (void);\r
+void begin_token_list_(pointer p, quarterword t);\r
+#define begin_token_list(p, t) begin_token_list_((pointer) (p), (quarterword) (t))\r
+void end_token_list (void);\r
+void back_input (void);\r
+void back_error (void);\r
+void ins_error (void);\r
+void begin_file_reading (void);\r
+void end_file_reading (void);\r
+void clear_for_error_prompt (void);\r
+void check_outer_validity (void);\r
+void get_next (void);\r
+void firm_up_the_line (void);\r
+void get_token (void);\r
+void macro_call (void);\r
+void insert_relax (void);\r
+void expand (void);\r
+void get_x_token (void);\r
+void x_token (void);\r
+void scan_left_brace (void);\r
+void scan_optional_equals (void);\r
+boolean scan_keyword (const char * s);\r
+void mu_error (void);\r
+void scan_eight_bit_int (void);\r
+void scan_char_num (void);\r
+void scan_four_bit_int (void);\r
+void scan_fifteen_bit_int (void);\r
+void scan_twenty_seven_bit_int (void);\r
+void scan_font_ident (void);\r
+void find_font_dimen (boolean writing);\r
+void scan_something_internal (small_number level, boolean negative);\r
+void scan_int (void);\r
+void scan_dimen (boolean mu, boolean inf, boolean shortcut);\r
+void scan_glue (small_number level);\r
+pointer scan_rule_spec (void);\r
+pointer str_toks (pool_pointer b);\r
+pointer the_toks (void);\r
+void ins_the_toks (void);\r
+void conv_toks (void);\r
+pointer scan_toks (boolean macro_def, boolean xpand);\r
+void read_toks (integer n, pointer r);\r
+void pass_text (void);\r
+void change_if_limit (small_number l, pointer p);\r
+void conditional (void);\r
+void begin_name (void);\r
+boolean more_name (ASCII_code c);\r
+void end_name (void);\r
+void pack_file_name (str_number n, str_number a, str_number e);\r
+void pack_buffered_name_(small_number n, integer a, integer b);\r
+#define pack_buffered_name(n, a, b) pack_buffered_name_((small_number) (n), (integer) (a), (integer) (b))\r
+str_number make_name_string (void);\r
+str_number a_make_name_string_(void);\r
+#define a_make_name_string(f) a_make_name_string_()\r
+str_number b_make_name_string_(void);\r
+#define b_make_name_string(f) b_make_name_string_()\r
+str_number w_make_name_string_(void);\r
+#define w_make_name_string(f) w_make_name_string_()\r
+void scan_file_name (void);\r
+void pack_job_name_(str_number s);\r
+#define pack_job_name(s) pack_job_name_(make_string_pool((const char *) (s)))\r
+void prompt_file_name_(const char * s, str_number e);\r
+#define prompt_file_name(s, e) prompt_file_name_((const char *) s, make_string_pool((const char*) e))\r
+void open_log_file (void);\r
+void start_input (void);\r
+internal_font_number read_font_info (pointer u, str_number nom, str_number arie, scaled s);\r
+void char_warning_(internal_font_number f, eight_bits c);\r
+#define char_warning(f, c) char_warning_((internal_font_number) (f), (eight_bits) (c))\r
+pointer new_character_(internal_font_number f, eight_bits c);\r
+#define new_character(f, c) new_character_((internal_font_number) (f), (eight_bits) (c))\r
+void dvi_swap (void);\r
+void dvi_four_(integer x);\r
+#define dvi_four(x) dvi_four_((integer) (x))\r
+void dvi_pop_(integer l);\r
+#define dvi_pop(l) dvi_pop_((integer) (l))\r
+void dvi_font_def (internal_font_number f);\r
+void movement (scaled w, eight_bits o);\r
+void special_out (pointer p);\r
+void hlist_out (void);\r
+void vlist_out (void);\r
+void pdf_ship_out (pointer p);\r
+void ship_out (pointer p);\r
+void prune_movements (integer l);\r
+void write_out (pointer p);\r
+void out_what (pointer p);\r
+void scan_spec (group_code c, boolean three_codes);\r
+pointer hpack_(pointer p, scaled w, small_number m);\r
+#define hpack(p, w, m) hpack_((pointer) (p), (scaled) (w), (small_number) (m))\r
+pointer vpackage_(pointer p, scaled h, small_number m, scaled l);\r
+#define vpackage(p, h, m, l) vpackage_((pointer) (p), (scaled) (h), (small_number) (m), (scaled) (l))\r
+void append_to_vlist (pointer b);\r
+pointer new_noad (void);\r
+pointer new_style (small_number s);\r
+pointer new_choice (void);\r
+void show_info (void);\r
+pointer fraction_rule (scaled t);\r
+pointer overbar (pointer b, scaled k, scaled t);\r
+pointer char_box (internal_font_number f, quarterword c);\r
+void stack_into_box (pointer b, internal_font_number f, quarterword c);\r
+scaled height_plus_depth (internal_font_number f, quarterword c);\r
+pointer var_delimiter (pointer d, small_number s, scaled v);\r
+pointer rebox (pointer b, scaled w);\r
+pointer math_glue (pointer g, scaled m);\r
+void math_kern (pointer p, scaled m);\r
+void flush_math (void);\r
+pointer clean_box (pointer p, small_number s);\r
+void fetch (pointer a);\r
+void make_over (pointer q);\r
+void make_under (pointer q);\r
+void make_vcenter (pointer q);\r
+void make_radical (pointer q);\r
+void make_math_accent (pointer q);\r
+void make_fraction (pointer q);\r
+scaled make_op (pointer q);\r
+void make_ord (pointer q);\r
+void make_scripts (pointer q, scaled delta);\r
+small_number make_left_right (pointer q, small_number style, scaled max_d, scaled max_h);\r
+void mlist_to_hlist (void);\r
+void push_alignment (void);\r
+void pop_alignment (void);\r
+void get_preamble_token (void);\r
+void init_align (void);\r
+void init_span (pointer p);\r
+void init_row (void);\r
+void init_col (void);\r
+boolean fin_col (void);\r
+void fin_row (void);\r
+void fin_align (void);\r
+void align_peek (void);\r
+pointer finite_shrink (pointer p);\r
+void try_break (integer pi, small_number breaktype);\r
+void post_line_break (integer final_widow_penalty);\r
+small_number reconstitute (small_number j, small_number n, halfword bchar, halfword hchar);\r
+void hyphenate (void);\r
+trie_op_code new_trie_op (small_number d, small_number n, trie_op_code v);\r
+trie_pointer trie_node (trie_pointer p);\r
+trie_pointer compress_trie (trie_pointer p);\r
+void first_fit (trie_pointer p);\r
+void trie_pack (trie_pointer p);\r
+void trie_fix (trie_pointer p);\r
+void new_patterns (void);\r
+void init_trie (void);\r
+void line_break (integer final_widow_penalty);\r
+void new_hyph_exceptions (void);\r
+pointer prune_page_top (pointer p);\r
+pointer vert_break (pointer p, scaled h, scaled d);\r
+pointer vsplit (eight_bits n, scaled h);\r
+void print_totals (void);\r
+void freeze_page_specs (small_number s);\r
+void box_error (eight_bits n);\r
+void ensure_vbox_(eight_bits n);\r
+#define ensure_vbox(n) ensure_vbox_((eight_bits) (n))\r
+void fire_up (pointer c);\r
+void build_page (void);\r
+void app_space (void);\r
+void insert_dollar_sign (void);\r
+void you_cant (void);\r
+void report_illegal_case (void);\r
+boolean privileged (void);\r
+boolean its_all_over (void);\r
+void append_glue (void);\r
+void append_kern (void);\r
+void off_save (void);\r
+void extra_right_brace (void);\r
+void normal_paragraph (void);\r
+void box_end (integer box_content);\r
+void begin_box (integer box_content);\r
+void scan_box_(integer box_content);\r
+#define scan_box(box_context) scan_box_((integer) (box_context))\r
+void package (small_number c);\r
+small_number norm_min (integer h);\r
+void new_graf (boolean indented);\r
+void indent_in_hmode (void);\r
+void head_for_vmode (void);\r
+void end_graf (void);\r
+void begin_insert_or_adjust (void);\r
+void make_mark (void);\r
+void append_penalty (void);\r
+void delete_last (void);\r
+void unpackage (void);\r
+void append_italic_correction (void);\r
+void append_discretionary (void);\r
+void build_discretionary (void);\r
+void make_accent (void);\r
+void align_error (void);\r
+void noalign_error (void);\r
+void omit_error (void);\r
+void do_endv (void);\r
+void cs_error (void);\r
+void push_math (group_code c);\r
+void init_math (void);\r
+void start_eq_no (void);\r
+void scan_math (pointer p);\r
+void set_math_char_(integer c);\r
+#define set_math_char(c) set_math_char_((integer) (c))\r
+void math_limit_switch(void);\r
+void scan_delimiter_(pointer p, boolean r);\r
+#define scan_delimiter(p, r) scan_delimiter_((pointer) (p), (boolean) (r))\r
+void math_radical (void);\r
+void math_ac (void);\r
+void append_choices (void);\r
+pointer fin_mlist (pointer p);\r
+void build_choices (void);\r
+void sub_sup (void);\r
+void math_fraction (void);\r
+void math_left_right (void);\r
+void after_math (void);\r
+void resume_after_display (void);\r
+void get_r_token (void);\r
+void trap_zero_glue (void);\r
+void do_register_command (small_number a);\r
+void alter_aux (void);\r
+void alter_prev_graf (void);\r
+void alter_page_so_far (void);\r
+void alter_integer (void);\r
+void alter_box_dimen (void);\r
+void new_font (small_number a);\r
+void new_interaction (void);\r
+void prefixed_command (void);\r
+void do_assignments (void);\r
+void open_or_close_in (void);\r
+void issue_message (void);\r
+void shift_case (void);\r
+void show_whatever (void);\r
+void store_fmt_file (void);\r
+void new_whatsit_(small_number s, small_number w);\r
+#define new_whatsit(s, w) new_whatsit_((small_number) (s), (small_number) (w))\r
+void new_write_whatsit (small_number w);\r
+void do_extension (void);\r
+void fix_language (void);\r
+void handle_right_brace (void);\r
+void main_control (void);\r
+void give_err_help (void);\r
+boolean open_fmt_file (void);\r
+boolean load_fmt_file (void);\r
+void close_files_and_terminate (void);\r
+void final_cleanup (void);\r
+void init_prim (void);\r
+void debug_help (void);\r
+void fix_date_and_time (void);\r
+void print_banner (void);\r
+\r
+int main_program (void);\r
 int main_init (int ac, char ** av);
\ No newline at end of file
index e087ba9..e344911 100644 (file)
-/* Copyright 2014 Clerk Ma
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301 USA.  */
-
-/* Y&Y TeX's DVIPDFMX backend. */
-
-#define EXTERN extern
-
-#include "yandytex.h"
-
-void ensure_pdf_open(void)
-{
-  if (output_file_name == 0)
-  {
-    if (job_name == 0)
-      open_log_file();
-
-    pack_job_name(".pdf");
-
-    while (!b_open_out(pdf_file))
-      prompt_file_name("file name for output", ".pdf");
-
-    output_file_name = b_make_name_string(pdf_file);
-  }
-}
-
-extern void pdf_set_version(unsigned version);
-extern void pdf_set_compression(int level);
-extern void pdf_doc_set_creator(const char * creator);
-extern void pdf_files_init(void);
-extern void pdf_init_device(double dvi2pts, int precision, int black_and_white);
-extern void pdf_open_document(const char *filename,
-  int do_encryption,
-  double media_width, double media_height,
-  double annot_grow_amount, int bookmark_open_depth,
-  int check_gotos);
-extern void pdf_doc_begin_page(double scale, double x_origin, double y_origin);
-extern void pdf_doc_end_page(void);
-extern int spc_exec_at_begin_document(void);
-extern int spc_exec_at_end_document(void);
-extern int spc_exec_at_begin_page(void);
-extern int spc_exec_at_end_page(void);
-extern void read_config_file (const char *config);
-extern void pdf_hlist_out (void);
-extern void pdf_vlist_out (void);
-
-void pdf_ship_out (pointer p)
-{
-  integer page_loc;
-  char j, k;
-  pool_pointer s;
-  char old_setting;
-
-  if (tracing_output > 0)
-  {
-    print_nl("");
-    print_ln();
-    prints("Completed box being shipped out");
-  }
-
-  if (term_offset > max_print_line - 9)
-    print_ln();
-  else if ((term_offset > 0) || (file_offset > 0))
-    print_char(' ');
-
-  print_char('[');
-  j = 9;
-
-  while ((count(j) == 0) && (j > 0))
-    decr(j);
-
-  for (k = 0; k <= j; k++)
-  {
-    print_int(count(k));
-
-    if (k < j)
-      print_char('.');
-  }
-
-  update_terminal();
-
-  if (tracing_output > 0)
-  {
-    print_char(']');
-    begin_diagnostic();
-    show_box(p);
-    end_diagnostic(true);
-  }
-
-  if ((height(p) > max_dimen) || (depth(p) > max_dimen) ||
-    (height(p) + depth(p) + v_offset > max_dimen) ||
-    (width(p) + h_offset > max_dimen))
-  {
-    print_err("Huge page cannot be shipped out");
-    help2("The page just created is more than 18 feet tall or",
-      "more than 18 feet wide, so I suspect something went wrong.");
-    error();
-
-    if (tracing_output <= 0)
-    {
-      begin_diagnostic();
-      print_nl("The following box has been deleted:");
-      show_box(p);
-      end_diagnostic(true);
-    }
-
-    goto done;
-  }
-
-  if (height(p) + depth(p) + v_offset > max_v)
-    max_v = height(p) + depth(p) + v_offset;
-
-  if (width(p) + h_offset > max_h)
-    max_h = width(p) + h_offset;
-
-  dvi_h = 0;
-  dvi_v = 0;
-  cur_h = h_offset;
-  dvi_f = null_font;
-  ensure_pdf_open();
-
-  if (total_pages == 0)
-  {
-    //kpse_init_prog("", 600, NULL, NULL);
-    //kpse_set_program_enabled(kpse_pk_format, true, kpse_src_texmf_cnf);
-    //pdf_font_set_dpi(600);
-    //dpx_delete_old_cache(image_cache_life);
-    pdf_set_version(5);
-    pdf_set_compression(9);
-    pdf_init_fontmaps();
-    read_config_file("dvipdfmx.cfg");
-    pdf_doc_set_producer("Y&YTeX 2.3.0");
-    pdf_doc_set_creator("TeX");
-    pdf_files_init();
-    pdf_init_device(0.000015202, 2, 0);
-    // 0.000015259 1/65535
-    // 0.000152018
-    pdf_open_document(pdf_file_name, 0, 595.0, 842.0, 0, 0, (1 << 4));
-    //pdf_open_document(pdf_file_name, 0, 595.0 * 65535, 842.0 * 65535, 0, 0, (1 << 4));
-    spc_exec_at_begin_document();
-  }
-
-  page_loc = dvi_offset + dvi_ptr;
-  pdf_doc_begin_page(1.0, 72.0, 770.0);
-  spc_exec_at_begin_page();
-
-  last_bop = page_loc;
-  cur_v = height(p) + v_offset;
-  temp_ptr = p;
-
-  if (type(p) == vlist_node)
-    pdf_vlist_out();
-  else
-    pdf_hlist_out();
-
-  spc_exec_at_end_page();
-  pdf_doc_end_page();
-  incr(total_pages);
-  cur_s = -1;
-
-done:
-  if (tracing_output <= 0)
-    print_char(']');
-
-  dead_cycles = 0;
-  update_terminal();
-
-#ifdef STAT
-  if (tracing_stats > 1)
-  {
-    print_nl("Memory usage before: ");
-    print_int(var_used);
-    print_char('&');
-    print_int(dyn_used);
-    print_char(';');
-  }
-#endif
-
-  flush_node_list(p);
-
-#ifdef STAT
-  if (tracing_stats > 1)
-  {
-    prints(" after: ");
-    print_int(var_used);
-    print_char('&');
-    print_int(dyn_used);
-    prints("; still utouched: ");
-    print_int(hi_mem_min - lo_mem_max - 1);
-    print_ln();
-  }
-#endif
-}
-
-void pdf_synch_h (void)
-{
-  if (cur_h != dvi_h)
-    dvi_h = cur_h;
-}
-
-void pdf_synch_v (void)
-{
-  if (cur_v != dvi_v)
-    dvi_v = cur_v;
-}
-
-int pdf_get_font_id (internal_font_number f)
-{
-  char * sbuf = malloc(length(font_name[f]) + 1);
-  int id;
-  memset(sbuf, 0, length(font_name[f]) + 1);
-  memcpy(sbuf, str_pool + str_start[font_name[f]], length(font_name[f]));    
-  id = dvi_locate_font(sbuf, font_size[f]);
-  free(sbuf);
-
-  return id;
-}
-
-void pdf_hlist_out (void)
-{
-  scaled base_line;
-  scaled left_edge;
-  scaled save_h, save_v;
-  pointer this_box;
-  // glue_ord g_order;
-  int g_order;
-  // char g_sign;
-  int g_sign;
-  pointer p;
-  integer save_loc;
-  pointer leader_box;
-  scaled leader_wd;
-  scaled lx;
-  boolean outer_doing_leaders;
-  scaled edge;
-  real glue_temp;
-  real cur_glue;
-  scaled cur_g;
-
-  cur_g = 0;
-  cur_glue = 0.0;
-  this_box = temp_ptr;
-  g_order = glue_order(this_box);
-  g_sign = glue_sign(this_box);
-  p = list_ptr(this_box);
-  incr(cur_s);
-
-  if (cur_s > max_push)
-    max_push = cur_s;
-
-  save_loc = dvi_offset + dvi_ptr;
-  base_line = cur_v;
-  left_edge = cur_h;
-
-  while (p != 0)
-reswitch:
-  if (is_char_node(p))
-  {
-    pdf_synch_h();
-    pdf_synch_v();
-
-    do
-    {
-      f = font(p);
-      c = character(p);
-
-      if (f != dvi_f)
-      {
-        if (!font_used[f])
-        {
-          font_used[f] = true;
-          font_id[f]   = pdf_get_font_id(f); 
-        }
-
-        dvi_f = f;
-      }
-
-      char cbuf[2] = {c, 0};
-      pdf_dev_set_string(cur_h, -cur_v, cbuf, 1, char_width(f, char_info(f, c)), font_id[dvi_f], 1);
-      cur_h = cur_h + char_width(f, char_info(f, c));
-      p = link(p);
-    } while (!(!is_char_node(p)));
-
-    dvi_h = cur_h;
-  }
-  else
-  {
-    switch (type(p))
-    {
-      case hlist_node:
-      case vlist_node:
-        if (list_ptr(p) == 0)
-          cur_h = cur_h + width(p);
-        else
-        {
-          save_h = dvi_h;
-          save_v = dvi_v;
-          cur_v = base_line + shift_amount(p);
-          temp_ptr = p;
-          edge = cur_h;
-
-          if (type(p) == vlist_node)
-            pdf_vlist_out();
-          else
-            pdf_hlist_out();
-
-          dvi_h = save_h;
-          dvi_v = save_v;
-          cur_h = edge + width(p);
-          cur_v = base_line;
-        }
-        break;
-
-      case rule_node:
-      {
-        rule_ht = height(p);
-        rule_dp = depth(p);
-        rule_wd = width(p);
-        goto fin_rule;
-      }
-        break;
-
-      case whatsit_node:
-        out_what(p);
-        break;
-
-      case glue_node:
-      {
-        g = glue_ptr(p);
-        rule_wd = width(g) - cur_g;
-
-        if (g_sign != normal)
-        {
-          if (g_sign == stretching)
-          {
-            if (stretch_order(g) == g_order)
-            {
-              cur_glue = cur_glue + stretch(g);
-              vet_glue(glue_set(this_box) * cur_glue);
-              cur_g = round(glue_temp);
-            }
-          }
-          else if (shrink_order(g) == g_order)
-          {
-            cur_glue = cur_glue - shrink(g);
-            vet_glue(glue_set(this_box) * cur_glue);
-            cur_g = round(glue_temp);
-          }
-        }
-
-        rule_wd = rule_wd + cur_g;
-
-        if (subtype(p) >= a_leaders)
-        {
-          leader_box = leader_ptr(p);
-
-          if (type(leader_box) == rule_node)
-          {
-            rule_ht = height(leader_box);
-            rule_dp = depth(leader_box);
-            goto fin_rule;
-          }
-
-          leader_wd = width(leader_box);
-
-          if ((leader_wd > 0) && (rule_wd > 0))
-          {
-            rule_wd = rule_wd + 10;
-            edge = cur_h + rule_wd;
-            lx = 0;
-
-            if (subtype(p) == a_leaders)
-            {
-              save_h = cur_h;
-              cur_h = left_edge + leader_wd * ((cur_h - left_edge) / leader_wd);
-
-              if (cur_h < save_h)
-                cur_h = cur_h + leader_wd;
-            }
-            else
-            {
-              lq = rule_wd / leader_wd;
-              lr = rule_wd % leader_wd;
-
-              if (subtype(p) == c_leaders)
-                cur_h = cur_h + (lr / 2);
-              else
-              {
-                lx = (2 * lr + lq + 1) / (2 * lq + 2);
-                cur_h = cur_h + ((lr - (lq - 1)* lx) / 2);
-              }
-            }
-
-            while (cur_h + leader_wd <= edge)
-            {
-              cur_v = base_line + shift_amount(leader_box);
-              pdf_synch_v();
-              save_v = dvi_v;
-              pdf_synch_h();
-              save_h = dvi_h;
-              temp_ptr = leader_box;
-              outer_doing_leaders = doing_leaders;
-              doing_leaders = true;
-
-              if (type(leader_box) == vlist_node)
-                pdf_vlist_out();
-              else
-                pdf_hlist_out();
-
-              doing_leaders = outer_doing_leaders;
-              dvi_v = save_v;
-              dvi_h = save_h;
-              cur_v = base_line;
-              cur_h = save_h + leader_wd + lx;
-            }
-
-            cur_h = edge - 10;
-            goto next_p;
-          }
-        }
-
-        goto move_past;
-      }
-        break;
-
-      case kern_node:
-      case math_node:
-        cur_h = cur_h + width(p);
-        break;
-
-      case ligature_node:
-      {
-        mem[lig_trick] = mem[lig_char(p)];
-        link(lig_trick) = link(p);
-        p = lig_trick;
-        goto reswitch;
-      }
-        break;
-
-      default:
-        break;
-    }
-
-    goto next_p;
-
-fin_rule:
-    if (is_running(rule_ht))
-      rule_ht = height(this_box);
-
-    if (is_running(rule_dp))
-      rule_dp = depth(this_box);
-
-    rule_ht = rule_ht + rule_dp;
-
-    if ((rule_ht > 0) && (rule_wd > 0))
-    {
-      pdf_synch_h();
-      cur_v = base_line + rule_dp;
-      pdf_synch_v();
-      pdf_dev_set_rule(dvi_h, dvi_v, rule_wd, rule_ht);
-      cur_v = base_line;
-      dvi_h = dvi_h + rule_wd;
-    }
-
-move_past:
-    cur_h = cur_h + rule_wd;
-
-next_p:
-    p = link(p);
-  }
-
-  prune_movements(save_loc);
-  decr(cur_s);
-}
-
-void pdf_vlist_out (void)
-{
-  scaled left_edge;
-  scaled top_edge;
-  scaled save_h, save_v;
-  pointer this_box;
-  // glue_ord g_order;
-  int g_order;
-  // char g_sign;
-  int g_sign;
-  pointer p;
-  integer save_loc;
-  pointer leader_box;
-  scaled leader_ht;
-  scaled lx;
-  boolean outer_doing_leaders;
-  scaled edge;
-  real glue_temp;
-  real cur_glue;
-  scaled cur_g;
-
-  cur_g = 0;
-  cur_glue = 0.0;
-  this_box = temp_ptr;
-  g_order = glue_order(this_box);
-  g_sign = glue_sign(this_box);
-  p = list_ptr(this_box);
-  incr(cur_s);
-
-  if (cur_s > max_push)
-    max_push = cur_s;
-
-  save_loc = dvi_offset + dvi_ptr;
-  left_edge = cur_h;
-  cur_v = cur_v - height(this_box);
-  top_edge = cur_v;
-
-  while (p != 0)
-  {
-    if (is_char_node(p))
-    {
-      confusion("vlistout");
-      return;
-    }
-    else
-    {
-      switch (type(p))
-      {
-        case hlist_node:
-        case vlist_node:
-          if (list_ptr(p) == 0)
-            cur_v = cur_v + height(p) + depth(p);
-          else
-          {
-            cur_v = cur_v + height(p);
-            pdf_synch_v();
-            save_h = dvi_h;
-            save_v = dvi_v;
-            cur_h = left_edge + shift_amount(p);
-            temp_ptr = p;
-
-            if (type(p) == vlist_node)
-              pdf_vlist_out();
-            else
-              pdf_hlist_out();
-
-            dvi_h = save_h;
-            dvi_v = save_v;
-            cur_v = save_v + depth(p);
-            cur_h = left_edge;
-          }
-          break;
-
-        case rule_node:
-          {
-            rule_ht = height(p);
-            rule_dp = depth(p);
-            rule_wd = width(p);
-            goto fin_rule;
-          }
-          break;
-
-        case whatsit_node:
-          out_what(p);
-          break;
-
-        case glue_node:
-          {
-            g = glue_ptr(p);
-            rule_ht = width(g) - cur_g;
-
-            if (g_sign != normal)
-            {
-              if (g_sign == stretching)
-              {
-                if (stretch_order(g) == g_order)
-                {
-                  cur_glue = cur_glue + stretch(g);
-                  vet_glue(glue_set(this_box) * cur_glue);
-                  cur_g = round(glue_temp);
-                }
-              }
-              else if (shrink_order(g) == g_order)   /* BUG FIX !!! */
-              {
-                cur_glue = cur_glue - shrink(g);
-                vet_glue(glue_set(this_box) * cur_glue);
-                cur_g = round(glue_temp);
-              }
-            }
-
-            rule_ht = rule_ht + cur_g;
-
-            if (subtype(p) >= a_leaders)
-            {
-              leader_box = leader_ptr(p);
-
-              if (type(leader_box) == rule_node)
-              {
-                rule_wd = width(leader_box);
-                rule_dp = 0;
-                goto fin_rule;
-              }
-
-              leader_ht = height(leader_box) + depth(leader_box);
-
-              if ((leader_ht > 0) && (rule_ht > 0))
-              {
-                rule_ht = rule_ht + 10;
-                edge = cur_v + rule_ht;
-                lx = 0;
-
-                if (subtype(p) == a_leaders)
-                {
-                  save_v = cur_v;
-                  cur_v = top_edge + leader_ht * ((cur_v - top_edge) / leader_ht);
-
-                  if (cur_v < save_v)
-                    cur_v = cur_v + leader_ht;
-                }
-                else
-                {
-                  lq = rule_ht / leader_ht;
-                  lr = rule_ht % leader_ht;
-
-                  if (subtype(p) == c_leaders)
-                    cur_v = cur_v + (lr / 2);
-                  else
-                  {
-                    lx = (2 * lr + lq + 1) / (2 * lq + 2);
-                    cur_v = cur_v + ((lr - (lq - 1) * lx) / 2);
-                  }
-                }
-
-                while (cur_v + leader_ht <= edge)
-                {
-                  cur_h = left_edge + shift_amount(leader_box);
-                  pdf_synch_h();
-                  save_h = dvi_h;
-                  cur_v = cur_v + height(leader_box);
-                  pdf_synch_v();
-                  save_v = dvi_v;
-                  temp_ptr = leader_box;
-                  outer_doing_leaders = doing_leaders;
-                  doing_leaders = true;
-
-                  if (type(leader_box) == vlist_node)
-                    pdf_vlist_out();
-                  else
-                    pdf_hlist_out();
-
-                  doing_leaders = outer_doing_leaders;
-                  dvi_v = save_v;
-                  dvi_h = save_h;
-                  cur_h = left_edge;
-                  cur_v = save_v - height(leader_box) + leader_ht + lx;
-                }
-
-                cur_v = edge - 10;
-                goto next_p;
-              }
-            }
-
-            goto move_past;
-          }
-          break;
-
-        case kern_node:
-          cur_v = cur_v + width(p);
-          break;
-
-        default:
-          break;
-      }
-
-      goto next_p;
-
-fin_rule:
-      if (is_running(rule_wd))
-        rule_wd = width(this_box);
-
-      rule_ht = rule_ht + rule_dp;
-      cur_v = cur_v + rule_ht;
-
-      if ((rule_ht > 0) && (rule_wd > 0))
-      {
-        pdf_synch_h();
-        pdf_synch_v();
-        pdf_dev_set_rule(cur_h, -cur_v, rule_wd, rule_ht);
-      }
-
-      goto next_p;
-
-move_past:
-      cur_v = cur_v + rule_ht;
-    }
-
-next_p:
-    p = link(p);
-  }
-
-  prune_movements(save_loc);
-  decr(cur_s);
-}
+/* Copyright 2014 Clerk Ma\r
+\r
+   This program is free software; you can redistribute it and/or modify\r
+   it under the terms of the GNU General Public License as published by\r
+   the Free Software Foundation; either version 2 of the License, or\r
+   (at your option) any later version.\r
+\r
+   This program is distributed in the hope that it will be useful, but\r
+   WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+   General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with this program; if not, write to the Free Software\r
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA\r
+   02110-1301 USA.  */\r
+\r
+/* Y&Y TeX's DVIPDFMX backend. */\r
+\r
+#define EXTERN extern\r
+\r
+#include "yandytex.h"\r
+\r
+void ensure_pdf_open(void)\r
+{\r
+  if (output_file_name == 0)\r
+  {\r
+    if (job_name == 0)\r
+      open_log_file();\r
+\r
+    pack_job_name(".pdf");\r
+\r
+    while (!b_open_out(pdf_file))\r
+      prompt_file_name("file name for output", ".pdf");\r
+\r
+    output_file_name = b_make_name_string(pdf_file);\r
+  }\r
+}\r
+\r
+extern void pdf_set_version(unsigned version);\r
+extern void pdf_set_compression(int level);\r
+extern void pdf_doc_set_creator(const char * creator);\r
+extern void pdf_files_init(void);\r
+extern void pdf_init_device(double dvi2pts, int precision, int black_and_white);\r
+extern void pdf_open_document(const char *filename,\r
+  int do_encryption,\r
+  double media_width, double media_height,\r
+  double annot_grow_amount, int bookmark_open_depth,\r
+  int check_gotos);\r
+extern void pdf_doc_begin_page(double scale, double x_origin, double y_origin);\r
+extern void pdf_doc_end_page(void);\r
+extern int spc_exec_at_begin_document(void);\r
+extern int spc_exec_at_end_document(void);\r
+extern int spc_exec_at_begin_page(void);\r
+extern int spc_exec_at_end_page(void);\r
+extern void read_config_file (const char *config);\r
+extern void pdf_hlist_out (void);\r
+extern void pdf_vlist_out (void);\r
+\r
+void pdf_ship_out (pointer p)\r
+{\r
+  integer page_loc;\r
+  char j, k;\r
+  pool_pointer s;\r
+  char old_setting;\r
+\r
+  if (tracing_output > 0)\r
+  {\r
+    print_nl("");\r
+    print_ln();\r
+    prints("Completed box being shipped out");\r
+  }\r
+\r
+  if (term_offset > max_print_line - 9)\r
+    print_ln();\r
+  else if ((term_offset > 0) || (file_offset > 0))\r
+    print_char(' ');\r
+\r
+  print_char('[');\r
+  j = 9;\r
+\r
+  while ((count(j) == 0) && (j > 0))\r
+    decr(j);\r
+\r
+  for (k = 0; k <= j; k++)\r
+  {\r
+    print_int(count(k));\r
+\r
+    if (k < j)\r
+      print_char('.');\r
+  }\r
+\r
+  update_terminal();\r
+\r
+  if (tracing_output > 0)\r
+  {\r
+    print_char(']');\r
+    begin_diagnostic();\r
+    show_box(p);\r
+    end_diagnostic(true);\r
+  }\r
+\r
+  if ((height(p) > max_dimen) || (depth(p) > max_dimen) ||\r
+    (height(p) + depth(p) + v_offset > max_dimen) ||\r
+    (width(p) + h_offset > max_dimen))\r
+  {\r
+    print_err("Huge page cannot be shipped out");\r
+    help2("The page just created is more than 18 feet tall or",\r
+      "more than 18 feet wide, so I suspect something went wrong.");\r
+    error();\r
+\r
+    if (tracing_output <= 0)\r
+    {\r
+      begin_diagnostic();\r
+      print_nl("The following box has been deleted:");\r
+      show_box(p);\r
+      end_diagnostic(true);\r
+    }\r
+\r
+    goto done;\r
+  }\r
+\r
+  if (height(p) + depth(p) + v_offset > max_v)\r
+    max_v = height(p) + depth(p) + v_offset;\r
+\r
+  if (width(p) + h_offset > max_h)\r
+    max_h = width(p) + h_offset;\r
+\r
+  dvi_h = 0;\r
+  dvi_v = 0;\r
+  cur_h = h_offset;\r
+  dvi_f = null_font;\r
+  ensure_pdf_open();\r
+\r
+  if (total_pages == 0)\r
+  {\r
+    //kpse_init_prog("", 600, NULL, NULL);\r
+    //kpse_set_program_enabled(kpse_pk_format, true, kpse_src_texmf_cnf);\r
+    //pdf_font_set_dpi(600);\r
+    //dpx_delete_old_cache(image_cache_life);\r
+    pdf_set_version(5);\r
+    pdf_set_compression(9);\r
+    pdf_init_fontmaps();\r
+    read_config_file("dvipdfmx.cfg");\r
+    pdf_doc_set_producer("Y&YTeX 2.3.0");\r
+    pdf_doc_set_creator("TeX");\r
+    pdf_files_init();\r
+    pdf_init_device(0.000015202, 2, 0);\r
+    pdf_open_document(pdf_file_name, 0, 595.0, 842.0, 0, 0, (1 << 4));\r
+    spc_exec_at_begin_document();\r
+  }\r
+\r
+  page_loc = dvi_offset + dvi_ptr;\r
+  pdf_doc_begin_page(1.0, 72.0, 770.0);\r
+  spc_exec_at_begin_page();\r
+\r
+  last_bop = page_loc;\r
+  cur_v = height(p) + v_offset;\r
+  temp_ptr = p;\r
+\r
+  if (type(p) == vlist_node)\r
+    pdf_vlist_out();\r
+  else\r
+    pdf_hlist_out();\r
+\r
+  spc_exec_at_end_page();\r
+  pdf_doc_end_page();\r
+  incr(total_pages);\r
+  cur_s = -1;\r
+\r
+done:\r
+  if (tracing_output <= 0)\r
+    print_char(']');\r
+\r
+  dead_cycles = 0;\r
+  update_terminal();\r
+\r
+#ifdef STAT\r
+  if (tracing_stats > 1)\r
+  {\r
+    print_nl("Memory usage before: ");\r
+    print_int(var_used);\r
+    print_char('&');\r
+    print_int(dyn_used);\r
+    print_char(';');\r
+  }\r
+#endif\r
+\r
+  flush_node_list(p);\r
+\r
+#ifdef STAT\r
+  if (tracing_stats > 1)\r
+  {\r
+    prints(" after: ");\r
+    print_int(var_used);\r
+    print_char('&');\r
+    print_int(dyn_used);\r
+    prints("; still utouched: ");\r
+    print_int(hi_mem_min - lo_mem_max - 1);\r
+    print_ln();\r
+  }\r
+#endif\r
+}\r
+\r
+void pdf_synch_h (void)\r
+{\r
+  if (cur_h != dvi_h)\r
+    dvi_h = cur_h;\r
+}\r
+\r
+void pdf_synch_v (void)\r
+{\r
+  if (cur_v != dvi_v)\r
+    dvi_v = cur_v;\r
+}\r
+\r
+int pdf_get_font_id (internal_font_number f)\r
+{\r
+  char * sbuf = malloc(length(font_name[f]) + 1);\r
+  int id;\r
+  memset(sbuf, 0, length(font_name[f]) + 1);\r
+  memcpy(sbuf, str_pool + str_start[font_name[f]], length(font_name[f]));    \r
+  id = dvi_locate_font(sbuf, font_size[f]);\r
+  free(sbuf);\r
+\r
+  return id;\r
+}\r
+\r
+void pdf_hlist_out (void)\r
+{\r
+  scaled base_line;\r
+  scaled left_edge;\r
+  scaled save_h, save_v;\r
+  pointer this_box;\r
+  // glue_ord g_order;\r
+  int g_order;\r
+  // char g_sign;\r
+  int g_sign;\r
+  pointer p;\r
+  integer save_loc;\r
+  pointer leader_box;\r
+  scaled leader_wd;\r
+  scaled lx;\r
+  boolean outer_doing_leaders;\r
+  scaled edge;\r
+  real glue_temp;\r
+  real cur_glue;\r
+  scaled cur_g;\r
+\r
+  cur_g = 0;\r
+  cur_glue = 0.0;\r
+  this_box = temp_ptr;\r
+  g_order = glue_order(this_box);\r
+  g_sign = glue_sign(this_box);\r
+  p = list_ptr(this_box);\r
+  incr(cur_s);\r
+\r
+  if (cur_s > max_push)\r
+    max_push = cur_s;\r
+\r
+  save_loc = dvi_offset + dvi_ptr;\r
+  base_line = cur_v;\r
+  left_edge = cur_h;\r
+\r
+  while (p != 0)\r
+reswitch:\r
+  if (is_char_node(p))\r
+  {\r
+    pdf_synch_h();\r
+    pdf_synch_v();\r
+\r
+    do\r
+    {\r
+      f = font(p);\r
+      c = character(p);\r
+\r
+      if (f != dvi_f)\r
+      {\r
+        if (!font_used[f])\r
+        {\r
+          font_used[f] = true;\r
+          font_id[f]   = pdf_get_font_id(f); \r
+        }\r
+\r
+        dvi_f = f;\r
+      }\r
+\r
+      char cbuf[2] = {c, 0};\r
+      pdf_dev_set_string(cur_h, -cur_v, cbuf, 1, char_width(f, char_info(f, c)), font_id[dvi_f], 1);\r
+      cur_h = cur_h + char_width(f, char_info(f, c));\r
+      p = link(p);\r
+    } while (!(!is_char_node(p)));\r
+\r
+    dvi_h = cur_h;\r
+  }\r
+  else\r
+  {\r
+    switch (type(p))\r
+    {\r
+      case hlist_node:\r
+      case vlist_node:\r
+        if (list_ptr(p) == 0)\r
+          cur_h = cur_h + width(p);\r
+        else\r
+        {\r
+          save_h = dvi_h;\r
+          save_v = dvi_v;\r
+          cur_v = base_line + shift_amount(p);\r
+          temp_ptr = p;\r
+          edge = cur_h;\r
+\r
+          if (type(p) == vlist_node)\r
+            pdf_vlist_out();\r
+          else\r
+            pdf_hlist_out();\r
+\r
+          dvi_h = save_h;\r
+          dvi_v = save_v;\r
+          cur_h = edge + width(p);\r
+          cur_v = base_line;\r
+        }\r
+        break;\r
+\r
+      case rule_node:\r
+      {\r
+        rule_ht = height(p);\r
+        rule_dp = depth(p);\r
+        rule_wd = width(p);\r
+        goto fin_rule;\r
+      }\r
+        break;\r
+\r
+      case whatsit_node:\r
+        out_what(p);\r
+        break;\r
+\r
+      case glue_node:\r
+      {\r
+        g = glue_ptr(p);\r
+        rule_wd = width(g) - cur_g;\r
+\r
+        if (g_sign != normal)\r
+        {\r
+          if (g_sign == stretching)\r
+          {\r
+            if (stretch_order(g) == g_order)\r
+            {\r
+              cur_glue = cur_glue + stretch(g);\r
+              vet_glue(glue_set(this_box) * cur_glue);\r
+              cur_g = round(glue_temp);\r
+            }\r
+          }\r
+          else if (shrink_order(g) == g_order)\r
+          {\r
+            cur_glue = cur_glue - shrink(g);\r
+            vet_glue(glue_set(this_box) * cur_glue);\r
+            cur_g = round(glue_temp);\r
+          }\r
+        }\r
+\r
+        rule_wd = rule_wd + cur_g;\r
+\r
+        if (subtype(p) >= a_leaders)\r
+        {\r
+          leader_box = leader_ptr(p);\r
+\r
+          if (type(leader_box) == rule_node)\r
+          {\r
+            rule_ht = height(leader_box);\r
+            rule_dp = depth(leader_box);\r
+            goto fin_rule;\r
+          }\r
+\r
+          leader_wd = width(leader_box);\r
+\r
+          if ((leader_wd > 0) && (rule_wd > 0))\r
+          {\r
+            rule_wd = rule_wd + 10;\r
+            edge = cur_h + rule_wd;\r
+            lx = 0;\r
+\r
+            if (subtype(p) == a_leaders)\r
+            {\r
+              save_h = cur_h;\r
+              cur_h = left_edge + leader_wd * ((cur_h - left_edge) / leader_wd);\r
+\r
+              if (cur_h < save_h)\r
+                cur_h = cur_h + leader_wd;\r
+            }\r
+            else\r
+            {\r
+              lq = rule_wd / leader_wd;\r
+              lr = rule_wd % leader_wd;\r
+\r
+              if (subtype(p) == c_leaders)\r
+                cur_h = cur_h + (lr / 2);\r
+              else\r
+              {\r
+                lx = (2 * lr + lq + 1) / (2 * lq + 2);\r
+                cur_h = cur_h + ((lr - (lq - 1)* lx) / 2);\r
+              }\r
+            }\r
+\r
+            while (cur_h + leader_wd <= edge)\r
+            {\r
+              cur_v = base_line + shift_amount(leader_box);\r
+              pdf_synch_v();\r
+              save_v = dvi_v;\r
+              pdf_synch_h();\r
+              save_h = dvi_h;\r
+              temp_ptr = leader_box;\r
+              outer_doing_leaders = doing_leaders;\r
+              doing_leaders = true;\r
+\r
+              if (type(leader_box) == vlist_node)\r
+                pdf_vlist_out();\r
+              else\r
+                pdf_hlist_out();\r
+\r
+              doing_leaders = outer_doing_leaders;\r
+              dvi_v = save_v;\r
+              dvi_h = save_h;\r
+              cur_v = base_line;\r
+              cur_h = save_h + leader_wd + lx;\r
+            }\r
+\r
+            cur_h = edge - 10;\r
+            goto next_p;\r
+          }\r
+        }\r
+\r
+        goto move_past;\r
+      }\r
+        break;\r
+\r
+      case kern_node:\r
+      case math_node:\r
+        cur_h = cur_h + width(p);\r
+        break;\r
+\r
+      case ligature_node:\r
+      {\r
+        mem[lig_trick] = mem[lig_char(p)];\r
+        link(lig_trick) = link(p);\r
+        p = lig_trick;\r
+        goto reswitch;\r
+      }\r
+        break;\r
+\r
+      default:\r
+        break;\r
+    }\r
+\r
+    goto next_p;\r
+\r
+fin_rule:\r
+    if (is_running(rule_ht))\r
+      rule_ht = height(this_box);\r
+\r
+    if (is_running(rule_dp))\r
+      rule_dp = depth(this_box);\r
+\r
+    rule_ht = rule_ht + rule_dp;\r
+\r
+    if ((rule_ht > 0) && (rule_wd > 0))\r
+    {\r
+      pdf_synch_h();\r
+      cur_v = base_line + rule_dp;\r
+      pdf_synch_v();\r
+      pdf_dev_set_rule(dvi_h, dvi_v, rule_wd, rule_ht);\r
+      cur_v = base_line;\r
+      dvi_h = dvi_h + rule_wd;\r
+    }\r
+\r
+move_past:\r
+    cur_h = cur_h + rule_wd;\r
+\r
+next_p:\r
+    p = link(p);\r
+  }\r
+\r
+  prune_movements(save_loc);\r
+  decr(cur_s);\r
+}\r
+\r
+void pdf_vlist_out (void)\r
+{\r
+  scaled left_edge;\r
+  scaled top_edge;\r
+  scaled save_h, save_v;\r
+  pointer this_box;\r
+  // glue_ord g_order;\r
+  int g_order;\r
+  // char g_sign;\r
+  int g_sign;\r
+  pointer p;\r
+  integer save_loc;\r
+  pointer leader_box;\r
+  scaled leader_ht;\r
+  scaled lx;\r
+  boolean outer_doing_leaders;\r
+  scaled edge;\r
+  real glue_temp;\r
+  real cur_glue;\r
+  scaled cur_g;\r
+\r
+  cur_g = 0;\r
+  cur_glue = 0.0;\r
+  this_box = temp_ptr;\r
+  g_order = glue_order(this_box);\r
+  g_sign = glue_sign(this_box);\r
+  p = list_ptr(this_box);\r
+  incr(cur_s);\r
+\r
+  if (cur_s > max_push)\r
+    max_push = cur_s;\r
+\r
+  save_loc = dvi_offset + dvi_ptr;\r
+  left_edge = cur_h;\r
+  cur_v = cur_v - height(this_box);\r
+  top_edge = cur_v;\r
+\r
+  while (p != 0)\r
+  {\r
+    if (is_char_node(p))\r
+    {\r
+      confusion("vlistout");\r
+      return;\r
+    }\r
+    else\r
+    {\r
+      switch (type(p))\r
+      {\r
+        case hlist_node:\r
+        case vlist_node:\r
+          if (list_ptr(p) == 0)\r
+            cur_v = cur_v + height(p) + depth(p);\r
+          else\r
+          {\r
+            cur_v = cur_v + height(p);\r
+            pdf_synch_v();\r
+            save_h = dvi_h;\r
+            save_v = dvi_v;\r
+            cur_h = left_edge + shift_amount(p);\r
+            temp_ptr = p;\r
+\r
+            if (type(p) == vlist_node)\r
+              pdf_vlist_out();\r
+            else\r
+              pdf_hlist_out();\r
+\r
+            dvi_h = save_h;\r
+            dvi_v = save_v;\r
+            cur_v = save_v + depth(p);\r
+            cur_h = left_edge;\r
+          }\r
+          break;\r
+\r
+        case rule_node:\r
+          {\r
+            rule_ht = height(p);\r
+            rule_dp = depth(p);\r
+            rule_wd = width(p);\r
+            goto fin_rule;\r
+          }\r
+          break;\r
+\r
+        case whatsit_node:\r
+          out_what(p);\r
+          break;\r
+\r
+        case glue_node:\r
+          {\r
+            g = glue_ptr(p);\r
+            rule_ht = width(g) - cur_g;\r
+\r
+            if (g_sign != normal)\r
+            {\r
+              if (g_sign == stretching)\r
+              {\r
+                if (stretch_order(g) == g_order)\r
+                {\r
+                  cur_glue = cur_glue + stretch(g);\r
+                  vet_glue(glue_set(this_box) * cur_glue);\r
+                  cur_g = round(glue_temp);\r
+                }\r
+              }\r
+              else if (shrink_order(g) == g_order)   /* BUG FIX !!! */\r
+              {\r
+                cur_glue = cur_glue - shrink(g);\r
+                vet_glue(glue_set(this_box) * cur_glue);\r
+                cur_g = round(glue_temp);\r
+              }\r
+            }\r
+\r
+            rule_ht = rule_ht + cur_g;\r
+\r
+            if (subtype(p) >= a_leaders)\r
+            {\r
+              leader_box = leader_ptr(p);\r
+\r
+              if (type(leader_box) == rule_node)\r
+              {\r
+                rule_wd = width(leader_box);\r
+                rule_dp = 0;\r
+                goto fin_rule;\r
+              }\r
+\r
+              leader_ht = height(leader_box) + depth(leader_box);\r
+\r
+              if ((leader_ht > 0) && (rule_ht > 0))\r
+              {\r
+                rule_ht = rule_ht + 10;\r
+                edge = cur_v + rule_ht;\r
+                lx = 0;\r
+\r
+                if (subtype(p) == a_leaders)\r
+                {\r
+                  save_v = cur_v;\r
+                  cur_v = top_edge + leader_ht * ((cur_v - top_edge) / leader_ht);\r
+\r
+                  if (cur_v < save_v)\r
+                    cur_v = cur_v + leader_ht;\r
+                }\r
+                else\r
+                {\r
+                  lq = rule_ht / leader_ht;\r
+                  lr = rule_ht % leader_ht;\r
+\r
+                  if (subtype(p) == c_leaders)\r
+                    cur_v = cur_v + (lr / 2);\r
+                  else\r
+                  {\r
+                    lx = (2 * lr + lq + 1) / (2 * lq + 2);\r
+                    cur_v = cur_v + ((lr - (lq - 1) * lx) / 2);\r
+                  }\r
+                }\r
+\r
+                while (cur_v + leader_ht <= edge)\r
+                {\r
+                  cur_h = left_edge + shift_amount(leader_box);\r
+                  pdf_synch_h();\r
+                  save_h = dvi_h;\r
+                  cur_v = cur_v + height(leader_box);\r
+                  pdf_synch_v();\r
+                  save_v = dvi_v;\r
+                  temp_ptr = leader_box;\r
+                  outer_doing_leaders = doing_leaders;\r
+                  doing_leaders = true;\r
+\r
+                  if (type(leader_box) == vlist_node)\r
+                    pdf_vlist_out();\r
+                  else\r
+                    pdf_hlist_out();\r
+\r
+                  doing_leaders = outer_doing_leaders;\r
+                  dvi_v = save_v;\r
+                  dvi_h = save_h;\r
+                  cur_h = left_edge;\r
+                  cur_v = save_v - height(leader_box) + leader_ht + lx;\r
+                }\r
+\r
+                cur_v = edge - 10;\r
+                goto next_p;\r
+              }\r
+            }\r
+\r
+            goto move_past;\r
+          }\r
+          break;\r
+\r
+        case kern_node:\r
+          cur_v = cur_v + width(p);\r
+          break;\r
+\r
+        default:\r
+          break;\r
+      }\r
+\r
+      goto next_p;\r
+\r
+fin_rule:\r
+      if (is_running(rule_wd))\r
+        rule_wd = width(this_box);\r
+\r
+      rule_ht = rule_ht + rule_dp;\r
+      cur_v = cur_v + rule_ht;\r
+\r
+      if ((rule_ht > 0) && (rule_wd > 0))\r
+      {\r
+        pdf_synch_h();\r
+        pdf_synch_v();\r
+        pdf_dev_set_rule(cur_h, -cur_v, rule_wd, rule_ht);\r
+      }\r
+\r
+      goto next_p;\r
+\r
+move_past:\r
+      cur_v = cur_v + rule_ht;\r
+    }\r
+\r
+next_p:\r
+    p = link(p);\r
+  }\r
+\r
+  prune_movements(save_loc);\r
+  decr(cur_s);\r
+}\r
index 843df60..0922014 100644 (file)
-/* Copyright 1992 Karl Berry
-   Copyright 2007 TeX Users Group
-   Copyright 2014 Clerk Ma
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301 USA.  */
-
-#define EXTERN extern
-
-#include "yandytex.h"
-
-#define BEGINFMTCHECKSUM 367403084L
-#define ENDFMTCHECKSUM   69069L
-
-#ifdef INITEX
-  void do_initex (void);
-#endif
-
-/* sec 0004 */
-void initialize (void)
-{
-  integer i;
-  integer k;
-  integer flag;
-
-#ifndef ALLOCATEHYPHEN
-  hyph_pointer z;
-#endif
-
-  if (!non_ascii)
-  {
-    for (i = 0; i <= 255; i++)
-      xchr[i] = (char) i;
-
-#ifdef JOKE
-    xchr[32] = ' ';  xchr[33] = '!';  xchr[34] = '"';  xchr[35] = '#';
-    xchr[36] = '$';  xchr[37] = '%';  xchr[38] = '&';  xchr[39] = '\'';
-    xchr[40] = '(';  xchr[41] = ')';  xchr[42] = '*';  xchr[43] = '+';
-    xchr[44] = ',';  xchr[45] = '-';  xchr[46] = '.';  xchr[47] = '/';
-    xchr[48] = '0';  xchr[49] = '1';  xchr[50] = '2';  xchr[51] = '3';
-    xchr[52] = '4';  xchr[53] = '5';  xchr[54] = '6';  xchr[55] = '7';
-    xchr[56] = '8';  xchr[57] = '9';  xchr[58] = ':';  xchr[59] = ';';
-    xchr[60] = '<';  xchr[61] = '=';  xchr[62] = '>';  xchr[63] = '?';
-    xchr[64] = '@';  xchr[65] = 'A';  xchr[66] = 'B';  xchr[67] = 'C';
-    xchr[68] = 'D';  xchr[69] = 'E';  xchr[70] = 'F';  xchr[71] = 'G';
-    xchr[72] = 'H';  xchr[73] = 'I';  xchr[74] = 'J';  xchr[75] = 'K';
-    xchr[76] = 'L';  xchr[77] = 'M';  xchr[78] = 'N';  xchr[79] = 'O';
-    xchr[80] = 'P';  xchr[81] = 'Q';  xchr[82] = 'R';  xchr[83] = 'S';
-    xchr[84] = 'T';  xchr[85] = 'U';  xchr[86] = 'V';  xchr[87] = 'W';
-    xchr[88] = 'X';  xchr[89] = 'Y';  xchr[90] = 'Z';  xchr[91] = '[';
-    xchr[92] = '\\'; xchr[93] = ']';  xchr[94] = '^';  xchr[95] = '_';
-    xchr[96] = '`';  xchr[97] = 'a';  xchr[98] = 'b';  xchr[99] = 'c';
-    xchr[100] = 'd'; xchr[101] = 'e'; xchr[102] = 'f'; xchr[103] = 'g';
-    xchr[104] = 'h'; xchr[105] = 'i'; xchr[106] = 'j'; xchr[107] = 'k';
-    xchr[108] = 'l'; xchr[109] = 'm'; xchr[110] = 'n'; xchr[111] = 'o';
-    xchr[112] = 'p'; xchr[113] = 'q'; xchr[114] = 'r'; xchr[115] = 's';
-    xchr[116] = 't'; xchr[117] = 'u'; xchr[118] = 'v'; xchr[119] = 'w';
-    xchr[120] = 'x'; xchr[121] = 'y'; xchr[122] = 'z'; xchr[123] = '{';
-    xchr[124] = '|'; xchr[125] = '}'; xchr[126] = '~';
-
-    for (i = 0; i <= 31; i++)
-      xchr[i] = chr(i);
-
-    for (i = 127; i <= 255; i++)
-      xchr[i]= chr(i);
-#endif
-  }
-
-  for (i = 0; i <= 255; i++)
-    xord[chr(i)] = invalid_code;
-
-#ifdef JOKE
-  for (i = 128; i <= 255 ; i++)
-    xord[xchr[i]] = i;
-
-  for (i = 0; i <= 126; i++)
-    xord[xchr[i]] = i;
-#endif
-
-  for (i = 0; i <= 255; i++)
-    xord[xchr[i]] = (char) i;
-
-  xord[127] = 127;
-
-  flag = 0;
-
-  if (trace_flag != 0)
-  {
-    for (k = 0; k < 256; k++)
-      if (xord[k] != k)
-      {
-        flag = 1;
-        break;
-      }
-
-    if (flag)
-    {
-      puts("Inverted mapping xord[] pairs:");
-
-      for (k = 0; k < 256; k++)
-      {
-        if (xord[k] != 127)
-          printf("%lld => %d\n", k, xord[k]);
-      }
-    }
-  }
-
-  if (interaction < batch_mode)
-    interaction = error_stop_mode;
-
-  deletions_allowed = true;
-  set_box_allowed = true;
-  error_count = 0;
-  help_ptr = 0;
-  use_err_help = false;
-  interrupt = 0;
-  OK_to_interrupt = true;
-
-#ifdef DEBUG
-  was_mem_end = mem_min;
-  was_lo_max = mem_bot; // mem_min
-  was_hi_min = mem_top; // mem_max
-  panicking = false;
-#endif
-
-  nest_ptr = 0;
-  max_nest_stack = 0;
-  mode = vmode;
-  head = contrib_head;
-  tail = contrib_head;
-  prev_depth = ignore_depth;
-  mode_line = 0;
-  prev_graf = 0;
-  shown_mode = 0;
-  page_contents = 0;
-  page_tail = page_head;
-
-#ifdef ALLOCATEMAIN
-  if (is_initex)
-#endif
-    link(page_head) = 0;
-
-  last_glue = max_halfword;
-  last_penalty = 0;
-  last_kern = 0;
-  page_depth = 0;
-  page_max_depth = 0;
-
-  for (k = int_base; k <= eqtb_size; k++)
-    xeq_level[k] = level_one;
-
-  no_new_control_sequence = true;
-  next(hash_base) = 0;
-  text(hash_base) = 0;
-
-  for (k = hash_base + 1; k <= undefined_control_sequence - 1; k++)
-    hash[k] = hash[hash_base];
-
-  save_ptr = 0;
-  cur_level = 1;
-  cur_group = 0;
-  cur_boundary = 0;
-  max_save_stack = 0;
-  mag_set = 0;
-  cur_mark[0] = 0;
-  cur_mark[1] = 0;
-  cur_mark[2] = 0;
-  cur_mark[3] = 0;
-  cur_mark[4] = 0;
-  cur_val = 0;
-  cur_val_level = int_val;
-  radix = 0;
-  cur_order = normal;
-
-  for (k = 0; k <= 16; k++)
-    read_open[k] = closed;
-
-  cond_ptr = 0;
-  if_limit = normal;
-  cur_if = 0;
-  if_line = 0;
-
-  for (k = 0; k <= font_max; k++)
-    font_used[k] = false;
-
-  null_character.b0 = min_quarterword;
-  null_character.b1 = min_quarterword;
-  null_character.b2 = min_quarterword;
-  null_character.b3 = min_quarterword;
-  total_pages = 0;
-  max_v = 0;
-  max_h = 0;
-  max_push = 0;
-  last_bop = -1;
-  doing_leaders = false;
-  dead_cycles = 0;
-  cur_s = -1;
-  half_buf = dvi_buf_size / 2;
-  dvi_limit = dvi_buf_size;
-  dvi_ptr = 0;
-  dvi_offset = 0;
-  dvi_gone = 0;
-  down_ptr = 0;
-  right_ptr = 0;
-  adjust_tail = 0;
-  last_badness = 0;
-  pack_begin_line = 0;
-  empty_field.rh = 0;
-  empty_field.lh = 0;
-  null_delimiter.b0 = 0;
-  null_delimiter.b1 = 0;
-  null_delimiter.b2 = 0;
-  null_delimiter.b3 = 0;
-  align_ptr = 0;
-  cur_align = 0;
-  cur_span = 0;
-  cur_loop = 0;
-  cur_head = 0;
-  cur_tail = 0;
-
-/*  *not* OK with ALLOCATEHYPHEN, since may not be allocated yet */
-#ifndef ALLOCATEHYPHEN
-  for (z = 0; z <= hyphen_prime; z++)
-  {
-    hyph_word[z] = 0;
-    hyph_list[z] = 0;
-  }
-#endif
-
-  hyph_count = 0;
-  output_active = false;
-  insert_penalties = 0;
-  ligature_present = false;
-  cancel_boundary = false;
-  lft_hit = false;
-  rt_hit = false;
-  ins_disc = false;
-  after_token = 0;
-  long_help_seen = false;
-  format_ident = 0;
-
-  for (k = 0; k <= 17; k++)
-    write_open[k] = false;
-
-  edit_name_start = 0;
-
-#ifdef INITEX
-  if (is_initex)
-    do_initex();
-#endif
-}
-
-/* do the part of initialize() that requires mem_top, mem_max or mem[] */
-/* do this part after allocating main memory */
-
-#ifdef ALLOCATEMAIN
-void initialize_aux (void)
-{
-#ifdef DEBUG
-  was_mem_end = mem_min;
-  was_lo_max = mem_bot; // mem_min
-  was_hi_min = mem_top; // mem_max
-  panicking = false;
-#endif
-
-/*  nest_ptr = 0; */
-/*  max_nest_stack = 0; */
-  mode = vmode;
-  head = contrib_head;
-  tail = contrib_head;
-  prev_depth = ignore_depth;
-  mode_line = 0;
-  prev_graf = 0;
-/*  shown_mode = 0; */
-/*  page_contents = 0; */
-  page_tail = page_head;
-  link(page_head) = 0;
-}
-#endif
-/* sec 0815 */
-void line_break (integer final_widow_penalty)
-{
-  boolean auto_breaking;
-  pointer prev_p;
-  pointer q, r, s, prev_s;
-  internal_font_number f;
-  /* small_number j; */
-  int j;
-  /* unsigned char c; */
-  unsigned int c;
-
-  pack_begin_line = mode_line;
-  link(temp_head) = link(head);
-
-  if (is_char_node(tail))
-    tail_append(new_penalty(inf_penalty));
-  else if (type(tail) != glue_node)
-    tail_append(new_penalty(inf_penalty));
-  else
-  {
-    type(tail) = penalty_node;
-    delete_glue_ref(glue_ptr(tail));
-    flush_node_list(leader_ptr(tail));
-    penalty(tail) = inf_penalty;
-  }
-
-  link(tail) = new_param_glue(par_fill_skip_code);
-  init_cur_lang = prev_graf % 65536L;
-  init_l_hyf = prev_graf / 4194304L; /* 2^22 */
-  init_r_hyf = (prev_graf / 65536L) % 64;
-  pop_nest();
-  no_shrink_error_yet = true;
-  check_shrinkage(left_skip);
-  check_shrinkage(right_skip);
-  q = left_skip;
-  r = right_skip;
-  background[1] = width(q) + width(r);
-  background[2] = 0;
-  background[3] = 0;
-  background[4] = 0;
-  background[5] = 0;
-  background[2 + stretch_order(q)] = stretch(q);
-  background[2 + stretch_order(r)] = background[2 + stretch_order(r)] + stretch(r);
-  background[6] = shrink(q) + shrink(r);
-  minimum_demerits = awful_bad;
-  minimal_demerits[tight_fit] = awful_bad;
-  minimal_demerits[decent_fit] = awful_bad;
-  minimal_demerits[loose_fit] = awful_bad;
-  minimal_demerits[very_loose_fit] = awful_bad;
-
-  if (par_shape_ptr == 0)
-    if (hang_indent == 0)
-    {
-      last_special_line = 0;
-      second_width = hsize;
-      second_indent = 0;
-    }
-    else
-    {
-      last_special_line = abs(hang_after);
-
-      if (hang_after < 0)
-      {
-        first_width = hsize - abs(hang_indent);
-
-        if (hang_indent >= 0)
-          first_indent = hang_indent;
-        else
-          first_indent = 0;
-
-        second_width = hsize;
-        second_indent = 0;
-      }
-      else
-      {
-        first_width = hsize;
-        first_indent = 0;
-        second_width = hsize - abs(hang_indent);
-
-        if (hang_indent >= 0)
-          second_indent = hang_indent;
-        else
-          second_indent = 0;
-      }
-    }
-  else
-  {
-    last_special_line = info(par_shape_ptr) - 1;
-    second_width = mem[par_shape_ptr + 2 * (last_special_line + 1)].cint;
-    second_indent = mem[par_shape_ptr + 2 * last_special_line + 1].cint;
-  }
-
-  if (looseness == 0)
-    easy_line = last_special_line;
-  else
-    easy_line = empty_flag;
-
-  threshold = pretolerance;
-
-  if (threshold >= 0)
-  {
-#ifdef STAT
-    if (tracing_paragraphs > 0)
-    {
-      begin_diagnostic();
-      print_nl("@firstpass");
-    }
-#endif
-
-    second_pass = false;
-    final_pass = false;
-    first_pass_count++;
-  }
-  else
-  {
-    threshold = tolerance;
-    second_pass = true;
-    final_pass = (emergency_stretch <= 0);
-
-#ifdef STAT
-    if (tracing_paragraphs > 0)
-      begin_diagnostic();
-#endif
-  }
-
-  while (true)
-  {
-    if (threshold > inf_bad)
-      threshold = inf_bad;
-
-    if (second_pass)
-    {
-#ifdef INITEX
-      if (is_initex)
-      {
-        if (trie_not_ready)
-          init_trie();
-      }
-#endif
-
-      cur_lang = init_cur_lang;
-      l_hyf = init_l_hyf;
-      r_hyf = init_r_hyf;
-    }
-
-    q = get_node(active_node_size);
-    type(q) = unhyphenated;
-    fitness(q) = decent_fit;
-    link(q) = active;
-    break_node(q) = 0;
-    line_number(q) = prev_graf + 1;
-    total_demerits(q) = 0;
-    link(active) = q;
-    act_width = background[1];
-    do_all_six(store_background);
-    passive = 0;
-    printed_node = temp_head;
-    pass_number = 0;
-    font_in_short_display = null_font;
-    cur_p = link(temp_head);
-    auto_breaking = true;
-    prev_p = cur_p;
-
-    while ((cur_p != 0) && (link(active) != active))
-    {
-      if (is_char_node(cur_p))
-      {
-        prev_p = cur_p;
-
-        do
-          {
-            f = font(cur_p);
-            act_width = act_width + char_width(f, char_info(f, character(cur_p)));
-            cur_p = link(cur_p);
-          }
-        while (!(!is_char_node(cur_p)));
-      }
-
-      switch (type(cur_p))
-      {
-        case hlist_node:
-        case vlist_node:
-        case rule_node:
-          act_width = act_width + width(cur_p);
-          break;
-
-        case whatsit_node:
-          if (subtype(cur_p) == language_node)
-          {
-            cur_lang = what_lang(cur_p);
-            l_hyf = what_lhm(cur_p);
-            r_hyf = what_rhm(cur_p);
-          }
-          break;
-
-        case glue_node:
-          {
-            if (auto_breaking)
-            {
-              if (is_char_node(prev_p))
-                try_break(0, unhyphenated);
-              else if (precedes_break(prev_p))
-                try_break(0, unhyphenated);
-              else if ((type(prev_p) == kern_node) && (subtype(prev_p) != explicit))
-                try_break(0, unhyphenated);
-            }
-
-            check_shrinkage(glue_ptr(cur_p));
-            q = glue_ptr(cur_p);
-            act_width = act_width+ width(q);
-            active_width[2 + stretch_order(q)] = active_width[2 + stretch_order(q)] + stretch(q);
-            active_width[6] = active_width[6] + shrink(q);
-
-            if (second_pass && auto_breaking)
-            {
-              prev_s = cur_p;
-              s = link(prev_s);
-
-              if (s != 0)
-              {
-                while (true)
-                {
-                  if (is_char_node(s))
-                  {
-                    c = character(s);
-                    hf = font(s);
-                  }
-                  else if (type(s) == ligature_node)
-                    if (lig_ptr(s) == 0)
-                      goto continu;
-                    else
-                    {
-                      q = lig_ptr(s);
-                      c = character(q);
-                      hf = font(q);
-                    }
-                  else if ((type(s) == kern_node) && (subtype(s) == normal))
-                    goto continu;
-                  else if (type(s) == whatsit_node)
-                  {
-                    if (subtype(s) == language_node)
-                    {
-                      cur_lang = what_lang(s);
-                      l_hyf = what_lhm(s);
-                      r_hyf = what_rhm(s);
-                    }
-                    goto continu;
-                  }
-                  else
-                    goto done1;
-
-                  if (lc_code(c) != 0)
-                    if ((lc_code(c) == (halfword) c) || (uc_hyph > 0))
-                      goto done2;
-                    else
-                      goto done1;
-continu:
-                  prev_s = s;
-                  s = link(prev_s);
-                }
-done2:
-                hyf_char = hyphen_char[hf];
-
-                if (hyf_char < 0)
-                  goto done1; 
-
-                if (hyf_char > 255)
-                  goto done1;
-
-                ha = prev_s;
-
-                if (l_hyf + r_hyf > 63)
-                  goto done1;
-
-                hn = 0;
-
-                while (true)
-                {
-                  if (is_char_node(s))
-                  {
-                    if (font(s) != hf)
-                      goto done3;
-
-                    hyf_bchar = character(s);
-
-                    c = hyf_bchar;
-
-                    if (lc_code(c) == 0)
-                      goto done3;
-
-                    if (hn == 63)
-                      goto done3;
-
-                    hb = s;
-                    incr(hn);
-                    hu[hn] = c;
-                    hc[hn]= lc_code(c);
-                    hyf_bchar = non_char;
-                  }
-                  else if (type(s) == ligature_node)
-                  {
-                    if (font(lig_char(s)) != hf)
-                      goto done3;
-
-                    j = hn;
-                    q = lig_ptr(s);
-
-                    if (q != 0)
-                      hyf_bchar = character(q);
-
-                    while (q != 0)
-                    {
-                      c = character(q);
-
-                      if (lc_code(c) == 0)
-                        goto done3;
-
-                      if (j == 63)
-                        goto done3;
-
-                      incr(j);
-                      hu[j] = c;
-                      hc[j] = lc_code(c);
-                      q = link(q);
-                    }
-
-                    hb = s;
-                    hn = j;
-
-                    if (odd(subtype(s)))
-                      hyf_bchar = font_bchar[hf];
-                    else
-                      hyf_bchar = non_char;
-                  }
-                  else if ((type(s) == kern_node) && (subtype(s) == normal))
-                  {
-                    hb = s;
-                    hyf_bchar = font_bchar[hf];
-                  }
-                  else
-                    goto done3;
-
-                  s = link(s);
-                }
-done3:
-                if (hn < l_hyf + r_hyf)
-                  goto done1;
-
-                while (true)
-                {
-                  if (!(is_char_node(s)))
-                    switch (type(s))
-                    {
-                      case ligature_node:
-                        break;
-    
-                      case kern_node:
-                        if (subtype(s) != normal)
-                          goto done4;
-                        break;
-
-                      case whatsit_node:
-                      case glue_node:
-                      case penalty_node:
-                      case ins_node:
-                      case adjust_node:
-                      case mark_node:
-                        goto done4;
-                        break;
-
-                      default:
-                        goto done1;
-                        break;
-                    }
-                  s = link(s);
-                }
-done4:
-                hyphenate();
-              }
-done1:;
-            }
-          }
-          break;
-
-        case kern_node:
-          if (subtype(cur_p) == explicit)
-            kern_break();
-          else
-            act_width = act_width + width(cur_p);
-          break;
-
-        case ligature_node:
-          {
-            f = font(lig_char(cur_p));
-            act_width = act_width + char_width(f, char_info(f, character(lig_char(cur_p))));
-          }
-          break;
-
-        case disc_node:
-          {
-            s = pre_break(cur_p);
-            disc_width = 0;
-
-            if (s == 0)
-              try_break(ex_hyphen_penalty, hyphenated);
-            else
-            {
-              do
-                {
-                  if (is_char_node(s))
-                  {
-                    f = font(s);
-                    disc_width = disc_width + char_width(f, char_info(f, character(s)));
-                  }
-                  else switch (type(s))
-                  {
-                    case ligature_node:
-                      {
-                        f = font(lig_char(s));
-                        disc_width = disc_width + char_width(f, char_info(f, character(lig_char(s))));
-                      }
-                      break;
-
-                    case hlist_node:
-                    case vlist_node:
-                    case rule_node:
-                    case kern_node:
-                      disc_width = disc_width + width(s);
-                      break;
-
-                    default:
-                      {
-                        confusion("disc3");
-                        return;
-                      }
-                      break;
-                  }
-
-                  s = link(s);
-                }
-              while (!(s == 0));
-
-              act_width = act_width + disc_width;
-              try_break(hyphen_penalty, hyphenated);
-              act_width = act_width - disc_width;
-            }
-
-            r = replace_count(cur_p);
-            s = link(cur_p);
-
-            while (r > 0)
-            {
-              if (is_char_node(s))
-              {
-                f = font(s);
-                act_width = act_width + char_width(f, char_info(f, character(s)));
-              }
-              else switch (type(s))
-              {
-                case ligature_node:
-                  {
-                    f = font(lig_char(s));
-                    act_width = act_width + char_width(f, char_info(f, character(lig_char(s))));
-                  }
-                  break;
-
-                case hlist_node:
-                case vlist_node:
-                case rule_node:
-                case kern_node:
-                  act_width = act_width + width(s);
-                  break;
-
-                default:
-                  {
-                    confusion("disc4");
-                    return;
-                  }
-                  break;
-              }
-
-              decr(r);
-              s = link(s);
-            }
-
-            prev_p = cur_p;
-            cur_p = s;
-            goto done5;
-          }
-          break;
-
-        case math_node:
-          {
-            auto_breaking = (subtype(cur_p) == after);
-            kern_break();
-          }
-          break;
-
-        case penalty_node:
-          try_break(penalty(cur_p), unhyphenated);
-          break;
-
-        case mark_node:
-        case ins_node:
-        case adjust_node:
-          break;
-
-        default:
-          {
-            confusion("paragraph");
-            return;
-          }
-          break;
-      }
-
-      prev_p = cur_p;
-      cur_p = link(cur_p);
-done5:;
-    }
-
-    if (cur_p == 0)
-    {
-      try_break(eject_penalty, hyphenated);
-
-      if (link(active) != active)
-      {
-        r = link(active);
-        fewest_demerits = awful_bad;
-
-        do
-          {
-            if (type(r) != delta_node)
-              if (total_demerits(r) < fewest_demerits)
-              {
-                fewest_demerits = total_demerits(r);
-                best_bet = r;
-              }
-
-            r = link(r);
-          }
-        while (!(r == active));
-
-        best_line = line_number(best_bet);
-
-        if (looseness == 0)
-        {
-          goto done;
-        }
-
-        {
-          r = link(active);
-          actual_looseness = 0;
-
-          do
-            {
-              if (type(r) != delta_node)
-              {
-                line_diff = toint(line_number(r)) - toint(best_line);
-
-                if (((line_diff < actual_looseness) && (looseness <= line_diff)) ||
-                    ((line_diff > actual_looseness) && (looseness >= line_diff)))
-                {
-                  best_bet = r;
-                  actual_looseness = line_diff;
-                  fewest_demerits = total_demerits(r);
-                }
-                else if ((line_diff == actual_looseness) && (total_demerits(r) < fewest_demerits))
-                {
-                  best_bet = r;
-                  fewest_demerits = total_demerits(r);
-                }
-              }
-
-              r = link(r);
-            }
-          while (!(r == active));
-
-          best_line = line_number(best_bet);
-        }
-
-        if ((actual_looseness == looseness) || final_pass)
-        {
-          goto done;
-        }
-      }
-    }
-
-    q = link(active);
-
-    while (q != active)
-    {
-      cur_p = link(q);
-
-      if (type(q) == delta_node)
-        free_node(q, delta_node_size);
-      else
-        free_node(q, active_node_size);
-
-      q = cur_p;
-    }
-
-    q = passive;
-
-    while (q != 0)
-    {
-      cur_p = link(q);
-      free_node(q, passive_node_size);
-      q = cur_p;
-    }
-
-    if (!second_pass)
-    {
-#ifdef STAT
-      if (tracing_paragraphs > 0)
-        print_nl("@secondpass");
-#endif
-      threshold = tolerance;
-      second_pass = true;
-      second_pass_count++;
-      final_pass = (emergency_stretch <= 0);
-    }
-    else
-    {
-#ifdef STAT
-      if (tracing_paragraphs > 0)
-        print_nl("@emergencypass");
-#endif
-
-      background[2] = background[2] + emergency_stretch;
-      final_pass = true;
-      ++final_pass_count;
-    }
-  }
-
-done:
-  if (best_line == decent_fit)
-    single_line++;
-
-#ifdef STAT
-  if (tracing_paragraphs > 0)
-  {
-    end_diagnostic(true);
-    normalize_selector();
-  }
-#endif
-
-  post_line_break(final_widow_penalty);
-  q = link(active);
-
-  while (q != active)
-  {
-    cur_p = link(q);
-
-    if (type(q) == delta_node)
-      free_node(q, delta_node_size);
-    else
-      free_node(q, active_node_size);
-
-    q = cur_p;
-  }
-
-  q = passive;
-
-  while (q != 0)
-  {
-    cur_p = link(q);
-    free_node(q, passive_node_size);
-    q = cur_p;
-  }
-
-  pack_begin_line = 0;
-}
-/* sec 1211 */
-void prefixed_command (void)
-{
-  small_number a;
-  internal_font_number f;
-  halfword j;
-  font_index k;
-  pointer p, q;
-  integer n;
-  boolean e;
-
-  a = 0;
-
-  while (cur_cmd == prefix)
-  {
-    if (!odd(a / cur_chr))
-      a = a + cur_chr;
-
-    do
-      {
-        get_x_token();
-      }
-    while (!((cur_cmd != spacer) && (cur_cmd != relax)));
-
-    if (cur_cmd <= max_non_prefixed_command)
-    {
-      print_err("You can't use a prefix with `");
-      print_cmd_chr(cur_cmd, cur_chr);
-      print_char('\'');
-      help1("I'll pretend you didn't say \\long or \\outer or \\global.");
-      back_error();
-      return;
-    }
-  }
-
-  if ((cur_cmd != def) && (a % 4 != 0))
-  {
-    print_err("You can't use `");
-    print_esc("long");
-    prints("' or `");
-    print_esc("outer");
-    prints("' with `");
-    print_cmd_chr(cur_cmd, cur_chr);
-    print_char('\'');
-    help1("I'll pretend you didn't say \\long or \\outer here.");
-    error();
-  }
-
-  if (global_defs != 0)
-    if (global_defs < 0)
-    {
-      if ((a >= 4))
-        a = a - 4;
-    }
-    else
-    {
-      if (!(a >= 4))
-        a = a + 4;
-    }
-
-  switch (cur_cmd)
-  {
-    case set_font:
-      define(cur_font_loc, data, cur_chr);
-      break;
-
-    case def:
-      {
-        if (odd(cur_chr) && !(a >= 4) && (global_defs >= 0))
-          a = a + 4;
-
-        e = (cur_chr >= 2);
-        get_r_token();
-        p = cur_cs;
-        q = scan_toks(true, e);
-        define(p, call + (a % 4), def_ref);
-      }
-      break;
-
-    case let:
-      {
-        n = cur_chr;
-        get_r_token();
-        p = cur_cs;
-
-        if (n == 0)
-        {
-          do
-            {
-              get_token();
-            }
-          while (!(cur_cmd != spacer));
-
-          if (cur_tok == other_token + '=')
-          {
-            get_token();
-
-            if (cur_cmd == spacer)
-              get_token();
-          }
-        }
-        else
-        {
-          get_token();
-          q = cur_tok;
-          get_token();
-          back_input();
-          cur_tok = q;
-          back_input();
-        }
-
-        if (cur_cmd >= call)
-          add_token_ref(cur_chr);
-
-        define(p, cur_cmd, cur_chr);
-      }
-      break;
-
-    case shorthand_def:
-      {
-        n = cur_chr;
-        get_r_token();
-        p = cur_cs;
-        define(p, relax, 256);
-        scan_optional_equals();
-
-        switch (n)
-        {
-          case char_def_code:
-            {
-              scan_char_num();
-              define(p, char_given, cur_val);
-            }
-            break;
-
-          case math_char_def_code:
-            {
-              scan_fifteen_bit_int();
-              define(p, math_given, cur_val);
-            }
-            break;
-
-          default:
-            {
-              scan_eight_bit_int();
-
-              switch (n)
-              {
-                case count_def_code:
-                  define(p, assign_int, count_base + cur_val);
-                  break;
-
-                case dimen_def_code:
-                  define(p, assign_dimen, scaled_base + cur_val);
-                  break;
-
-                case skip_def_code:
-                  define(p, assign_glue, skip_base + cur_val);
-                  break;
-
-                case mu_skip_def_code:
-                  define(p, assign_mu_glue, mu_skip_base + cur_val);
-                  break;
-
-                case toks_def_code:
-                  define(p, assign_toks, toks_base + cur_val);
-                  break;
-              }
-            }
-            break;
-        }
-      }
-      break;
-
-    case read_to_cs:
-      {
-        scan_int();
-        n = cur_val;
-
-        if (!scan_keyword("to"))
-        {
-          print_err("Missing `to' inserted");
-          help2("You should have said `\\read<number> to \\cs'.",
-              "I'm going to look for the \\cs now.");
-          error();
-        }
-
-        get_r_token();
-        p = cur_cs;
-        read_toks(n, p);
-        define(p, call, cur_val);
-      }
-      break;
-
-    case toks_register:
-    case assign_toks:
-      {
-        q = cur_cs;
-
-        if (cur_cmd == toks_register)
-        {
-          scan_eight_bit_int();
-          p = toks_base + cur_val;
-        }
-        else
-          p = cur_chr;
-
-        scan_optional_equals();
-
-        do
-          {
-            get_x_token();
-          }
-        while (!((cur_cmd != spacer) && (cur_cmd != relax)));
-
-        if (cur_cmd != left_brace)
-        {
-          if (cur_cmd == toks_register)
-          {
-            scan_eight_bit_int();
-            cur_cmd = assign_toks;
-            cur_chr = toks_base + cur_val;
-          }
-
-          if (cur_cmd == assign_toks)
-          {
-            q = equiv(cur_chr);
-
-            if (q == 0)
-              define(p, undefined_cs, 0);
-            else
-            {
-              add_token_ref(q);
-              define(p, call, q);
-            }
-            goto done;
-          }
-        }
-
-        back_input();
-        cur_cs = q;
-        q = scan_toks(false, false);
-
-        if (link(def_ref) == 0)
-        {
-          define(p, undefined_cs, 0);
-          free_avail(def_ref);
-        }
-        else
-        {
-          if (p == output_routine_loc)
-          {
-            link(q) = get_avail();
-            q = link(q);
-            info(q) = right_brace_token + '}';
-            q = get_avail();
-            info(q) = left_brace_token + '{';
-            link(q) = link(def_ref);
-            link(def_ref) = q;
-          }
-
-          define(p, call, def_ref);
-        }
-      }
-      break;
-
-    case assign_int:
-      {
-        p = cur_chr;
-        scan_optional_equals();
-        scan_int();
-        word_define(p, cur_val);
-      }
-      break;
-
-    case assign_dimen:
-      {
-        p = cur_chr;
-        scan_optional_equals();
-        scan_dimen(false, false, false);
-        word_define(p, cur_val);
-      }
-      break;
-
-    case assign_glue:
-    case assign_mu_glue:
-      {
-        p = cur_chr;
-        n = cur_cmd;
-        scan_optional_equals();
-
-        if (n == assign_mu_glue)
-          scan_glue(mu_val);
-        else
-          scan_glue(glue_val);
-
-        trap_zero_glue();
-        define(p, glue_ref, cur_val);
-      }
-      break;
-
-    case def_code:
-      {
-        if (cur_chr == cat_code_base)
-          n = max_char_code;
-        else if (cur_chr == math_code_base)
-          n = 32768L; /* 2^15 */
-        else if (cur_chr == sf_code_base)
-          n = 32767; /* 2^15 - 1*/
-        else if (cur_chr == del_code_base)
-          n = 16777215L; /* 2^24 - 1 */
-        else
-          n = 255;
-
-        p = cur_chr;
-        scan_char_num();
-        p = p + cur_val;
-        scan_optional_equals();
-        scan_int();
-
-        if (((cur_val < 0) && (p < del_code_base)) || (cur_val > n))
-        {
-          print_err("Invalid code(");
-          print_int(cur_val);
-
-          if (p < del_code_base)
-            prints("), should be in the range 0..");
-          else
-            prints("), should be at most ");
-
-          print_int(n);
-          help1("I'm going to use 0 instead of that illegal code value.");
-          error();
-          cur_val = 0;
-        }
-
-        if (p < math_code_base)
-          define(p, data, cur_val);
-        else if (p < del_code_base)
-          define(p, data, cur_val);
-        else 
-          word_define(p, cur_val);
-      }
-      break;
-
-    case def_family:
-      {
-        p = cur_chr;
-        scan_four_bit_int();
-        p = p + cur_val;
-        scan_optional_equals();
-        scan_font_ident();
-        define(p, data, cur_val);
-      }
-      break;
-
-    case tex_register:
-    case advance:
-    case multiply:
-    case divide:
-      do_register_command(a);
-      break;
-
-    case set_box:
-      {
-        scan_eight_bit_int();
-
-        if ((a >= 4))
-          n = 256 + cur_val;
-        else
-          n = cur_val;
-
-        scan_optional_equals();
-
-        if (set_box_allowed)
-          scan_box(box_flag + n);
-        else
-        {
-          print_err("Improper ");
-          print_esc("setbox");
-          help2("Sorry, \\setbox is not allowed after \\halign in a display,",
-              "or between \\accent and an accented character.");
-          error();
-        }
-      }
-      break;
-
-    case set_aux:
-      alter_aux();
-      break;
-
-    case set_prev_graf:
-      alter_prev_graf();
-      break;
-
-    case set_page_dimen:
-      alter_page_so_far();
-      break;
-
-    case set_page_int:
-      alter_integer();
-      break;
-
-    case set_box_dimen:
-      alter_box_dimen();
-      break;
-
-    case set_shape:
-      {
-        scan_optional_equals();
-        scan_int();
-        n = cur_val;
-
-        if (n <= 0)
-          p = 0;
-        else
-        {
-          p = get_node(2 * n + 1);
-          info(p) = n;
-
-          for (j = 1; j <= n; j++)
-          {
-            scan_dimen(false, false, false);
-            mem[p + 2 * j - 1].cint = cur_val;
-            scan_dimen(false, false, false);
-            mem[p + 2 * j].cint = cur_val;
-          }
-        }
-
-        define(par_shape_loc, shape_ref, p);
-      }
-      break;
-
-    case hyph_data:
-      if (cur_chr == 1)
-      {
-#ifdef INITEX
-        if (is_initex)
-        {
-          new_patterns();
-          goto done;
-        }
-#endif
-        print_err("Patterns can be loaded only by INITEX");
-        help_ptr = 0;
-        error();
-
-        do
-          {
-            get_token();
-          }
-        while (!(cur_cmd == right_brace));
-
-        return;
-      }
-      else
-      {
-        new_hyph_exceptions();
-        goto done;
-      }
-      break;
-
-    case assign_font_dimen:
-      {
-        find_font_dimen(true);
-        k = cur_val;
-        scan_optional_equals();
-        scan_dimen(false, false, false);
-        font_info[k].cint = cur_val;
-      }
-      break;
-
-    case assign_font_int:
-      {
-        n = cur_chr;
-        scan_font_ident();
-        f = cur_val;
-        scan_optional_equals();
-        scan_int();
-
-        if (n == 0)
-          hyphen_char[f] = cur_val;
-        else
-          skew_char[f] = cur_val;
-      }
-      break;
-
-    case def_font:
-      new_font(a);
-      break;
-
-    case set_interaction:
-      new_interaction();
-      break;
-
-    default:
-      {
-        confusion("prefix");
-        return;
-      }
-      break;
-  }
-
-done:
-  if (after_token != 0)
-  {
-    cur_tok = after_token;
-    back_input();
-    after_token = 0;
-  }
-}
-/* sec 1303 */
-boolean load_fmt_file (void)
-{
-  integer j, k;
-  pointer p, q;
-  integer x;
-
-  undump_int(x);
-
-  if (x != BEGINFMTCHECKSUM)
-    goto bad_fmt;
-
-  undump_int(x); /* mem_bot */
-
-  if (x != mem_bot)
-    goto bad_fmt;
-
-  undump_int(x); /* mem_top */
-
-#ifdef ALLOCATEMAIN
-/* we already read this once earlier to grab mem_top */
-  if (trace_flag)
-    printf("Read from fmt file mem_top = %lld TeX words\n", x);
-
-  mem = allocate_main_memory(x);
-
-  if (mem == NULL)
-    exit(EXIT_FAILURE);
-
-  initialize_aux(); /* do `mem' part of initialize */
-#endif
-
-  if (x != mem_top)
-    goto bad_fmt;
-
-  undump_int(x); /* eqtb_size */
-
-  if (x != eqtb_size)
-    goto bad_fmt;
-
-  undump_int(x); /* hash_prime */
-
-  if (x != hash_prime)
-    goto bad_fmt;
-
-  undump_int(x); /* hyphen_prime */
-
-#ifdef ALLOCATEHYPHEN
-/* allow format files dumped with arbitrary (prime) hyphenation exceptions */
-  realloc_hyphen(x);
-  hyphen_prime = x;
-#endif
-
-  if (x != hyphen_prime)
-    goto bad_fmt;
-
-  {
-    undump_int(x); /* pool_size */
-
-    if (x < 0)
-      goto bad_fmt; 
-
-#ifdef ALLOCATESTRING
-    if (x > current_pool_size)
-    {
-      if (trace_flag)
-        printf("undump string pool reallocation (%lld > %d)\n", x, current_pool_size);
-
-      str_pool = realloc_str_pool(x - current_pool_size + increment_pool_size);
-    }
-
-    if (x > current_pool_size)
-#else
-    if (x > pool_size)
-#endif
-    {
-      printf("%s%s\n", "---! Must increase the ", "string pool size");
-      goto bad_fmt;
-    }
-    else
-      pool_ptr = x;
-  }
-
-  {
-    undump_int(x);  /* max_strings */
-
-    if (x < 0)
-      goto bad_fmt;
-
-#ifdef ALLOCATESTRING
-    if (x > current_max_strings)
-    {
-      if (trace_flag)
-        printf("undump string pointer reallocation (%lld > %d)\n", x, current_max_strings);
-
-      str_start = realloc_str_start(x - current_max_strings + increment_max_strings);
-    }
-
-    if (x > current_max_strings)
-#else
-    if (x > max_strings)
-#endif
-    {
-      printf("%s%s\n", "---! Must increase the ", "max strings");
-      goto bad_fmt;
-    }
-    else
-      str_ptr = x;
-  }
-
-  undumpthings(str_start[0], str_ptr + 1);
-  undumpthings(str_pool[0], pool_ptr);
-  init_str_ptr = str_ptr;
-  init_pool_ptr = pool_ptr;
-  undump(lo_mem_stat_max + 1000, hi_mem_stat_min - 1, lo_mem_max);
-  undump(lo_mem_stat_max + 1, lo_mem_max, rover);
-  p = mem_bot;
-  q = rover;
-
-  do
-    {
-      if (undumpthings(mem[p], q + 2 - p))
-        return -1;
-
-      p = q + node_size(q);
-
-      if ((p > lo_mem_max) || ((q >= rlink(q)) && (rlink(q) != rover)))
-        goto bad_fmt;
-
-      q = rlink(q);
-    }
-  while (!(q == rover));
-
-  if (undumpthings(mem[p], lo_mem_max + 1 - p))
-    return -1;
-
-  if (mem_min < mem_bot - 2)
-  {
-/*  or call add_variable_space(mem_bot - (mem_min + 1)) */
-    if (trace_flag)
-      puts("Splicing in mem_min space in undump!");
-
-    p = llink(rover);
-    q = mem_min + 1;
-    link(mem_min) = 0;       /* null */
-    info(mem_min) = 0;       /* null */
-    rlink(p) = q;
-    llink(rover) = q;
-    rlink(q) = rover;
-    llink(q) = p;
-    link(q) = empty_flag;
-    node_size(q) = mem_bot - q;
-  }
-
-  undump(lo_mem_max + 1, hi_mem_stat_min, hi_mem_min);
-  undump(mem_bot, mem_top, avail);
-  mem_end = mem_top;
-
-  if (undumpthings(mem[hi_mem_min], mem_end + 1 - hi_mem_min))
-    return -1;
-
-  undump_int(var_used);
-  undump_int(dyn_used);
-
-  k = active_base;
-
-  do
-    {
-      undump_int(x);
-
-      if ((x < 1) || (k + x > (eqtb_size + 1)))
-        goto bad_fmt;
-
-      if (undumpthings(eqtb[k], x))
-        return -1;
-
-      k = k + x;
-      undump_int(x);
-
-      if ((x < 0) || (k + x > (eqtb_size + 1)))
-        goto bad_fmt;
-
-      for (j = k; j <= k + x - 1; j++)
-        eqtb[j] = eqtb[k - 1];
-
-      k = k + x;
-    }
-  while (!(k > eqtb_size));
-
-  undump(hash_base, frozen_control_sequence, par_loc);
-  par_token = cs_token_flag + par_loc;
-  undump(hash_base, frozen_control_sequence, write_loc);
-  undump(hash_base, frozen_control_sequence, hash_used);
-
-  p = hash_base - 1;
-
-  do
-    {
-      undump(p + 1, hash_used, p);
-      undump_hh(hash[p]);
-    }
-  while (!(p == hash_used));
-
-  if (undumpthings(hash[hash_used + 1], undefined_control_sequence - 1 - hash_used))
-    return -1;
-
-  undump_int(cs_count);
-
-  if (trace_flag)
-    printf("itex undump cs_count %lld ", cs_count);
-
-  {
-    undump_int(x); /* font_mem_size */
-
-    if (x < 7)
-      goto bad_fmt;
-
-#ifdef ALLOCATEFONT
-    if (trace_flag)
-      printf("Read from fmt fmem_ptr = %lld\n", x);
-
-    if (x > current_font_mem_size)
-    {
-      if (trace_flag)
-        printf("Undump realloc font_info (%lld > %d)\n", x, current_font_mem_size);
-
-      font_info = realloc_font_info (x - current_font_mem_size + increment_font_mem_size);
-    }
-
-    if (x > current_font_mem_size)
-#else
-    if (x > font_mem_size)
-#endif
-    {
-      puts("---! Must increase the font mem size");
-      goto bad_fmt;
-    }
-    else
-      fmem_ptr = x;
-  }
-
-  {
-    undumpthings(font_info[0], fmem_ptr);
-    undump_size(font_base, font_max, "font max", font_ptr);
-    frozen_font_ptr = font_ptr;
-    undumpthings(font_check[0], font_ptr + 1);
-    undumpthings(font_size[0], font_ptr + 1);
-    undumpthings(font_dsize[0], font_ptr + 1);
-    undumpthings(font_params[0], font_ptr + 1);
-    undumpthings(hyphen_char[0], font_ptr + 1);
-    undumpthings(skew_char[0], font_ptr + 1);
-    undumpthings(font_name[0], font_ptr + 1);
-    undumpthings(font_area[0], font_ptr + 1);
-    undumpthings(font_bc[0], font_ptr + 1);
-    undumpthings(font_ec[0], font_ptr + 1);
-    undumpthings(char_base[0], font_ptr + 1);
-    undumpthings(width_base[0], font_ptr + 1);
-    undumpthings(height_base[0], font_ptr + 1);
-    undumpthings(depth_base[0], font_ptr + 1);
-    undumpthings(italic_base[0], font_ptr + 1);
-    undumpthings(lig_kern_base[0], font_ptr + 1);
-    undumpthings(kern_base[0], font_ptr + 1);
-    undumpthings(exten_base[0], font_ptr + 1);
-    undumpthings(param_base[0], font_ptr + 1);
-    undumpthings(font_glue[0], font_ptr + 1);
-    undumpthings(bchar_label[0], font_ptr + 1);
-    undumpthings(font_bchar[0], font_ptr + 1);
-    undumpthings(font_false_bchar[0], font_ptr + 1);
-  }
-
-/* log not opened yet, so can't show fonts frozen into format */
-/* May be able to avoid the following since we switched to */
-/* non_address from font_mem_size to 0 96/Jan/15 ??? */
-
-#ifdef ALLOCATEFONT
-  {
-    int count = 0, oldfont_mem_size = 0;
-    
-    for (x = 0; x <= font_ptr; x++)
-    {
-      if (bchar_label[x] > oldfont_mem_size)
-        oldfont_mem_size = bchar_label[x];
-    }
-
-    if (oldfont_mem_size != non_address && oldfont_mem_size > font_max)
-    {
-      for (x = 0; x <= font_ptr; x++)
-      {
-        if (bchar_label[x] == oldfont_mem_size)
-        {
-          bchar_label[x] = non_address;
-          count++;
-        }
-      }
-
-      if (trace_flag)
-        printf("oldfont_mem_size is %d --- hit %d times. Using non_address %d\n",
-            oldfont_mem_size, count, non_address);
-    }
-  }
-#endif
-
-  undump(0, hyphen_prime, hyph_count);
-
-  for (k = 1; k <= hyph_count; k++)
-  {
-    undump(0, hyphen_prime, j);
-    undump(0, str_ptr, hyph_word[j]);
-    undump(0, max_halfword, hyph_list[j]);
-  }
-
-#ifdef ALLOCATEHYPHEN
-/* if user specified new hyphen prime - flush existing exception patterns ! */
-/* but, we can reclaim the string storage wasted ... */
-  if (is_initex)
-  {
-    if (new_hyphen_prime != 0)
-    {
-      realloc_hyphen(new_hyphen_prime); /* reset_hyphen(); */
-      hyphen_prime = new_hyphen_prime;
-    }
-  }
-#endif
-
-  {
-    undump_int(x);
-
-    if (x < 0)
-      goto bad_fmt;
-
-#ifdef ALLOCATETRIES
-    if (!is_initex)
-    {
-      allocate_tries(x); /* allocate only as much as is needed */
-    }
-#endif
-
-    if (x > trie_size)
-    {
-      puts("---! Must increase the trie size");
-      goto bad_fmt;
-    }
-    else
-      j = x;
-  }
-
-#ifdef INITEX
-  if (is_initex)
-    trie_max = j;
-#endif
-
-  undumpthings(trie_trl[0], j + 1);
-  undumpthings(trie_tro[0], j + 1);
-  undumpthings(trie_trc[0], j + 1);
-  undump_size(0, trie_op_size, "trie op size", j);
-
-#ifdef INITEX
-  if (is_initex)
-    trie_op_ptr = j;
-#endif
-  
-  undumpthings(hyf_distance[1], j);
-  undumpthings(hyf_num[1], j);
-  undumpthings(hyf_next[1], j);
-
-#ifdef INITEX
-  if (is_initex)
-  {
-    for (k = 0; k <= 255; k++)
-      trie_used[k] = min_quarterword;
-  }
-#endif
-
-  k = 256;
-
-  while (j > 0)
-  {
-    undump(0, k - 1, k);
-    undump(1, j, x);
-
-#ifdef INITEX
-    if (is_initex)
-      trie_used[k] = x;
-#endif
-
-    j = j - x;
-    op_start[k] = j;
-  }
-
-#ifdef INITEX
-  if (is_initex)
-    trie_not_ready = false;
-#endif
-
-  undump(batch_mode, error_stop_mode, interaction);
-  undump(0, str_ptr, format_ident);
-  undump_int(x);
-  
-  if ((x != ENDFMTCHECKSUM) || feof(fmt_file))
-    goto bad_fmt;
-
-  return true;
-
-bad_fmt:
-  puts("(Fatal format file error; I'm stymied)");
-
-  return false;
-}
-/* sec 1335 */
-void final_cleanup (void)
-{
-  small_number c;
-
-  c = cur_chr;
-
-  if (job_name == 0)
-    open_log_file();
-
-  while (input_ptr > 0)
-  {
-    if (state == token_list)
-      end_token_list();
-    else
-      end_file_reading();
-  }
-
-  while (open_parens > 0)
-  {
-    prints(" )");
-    decr(open_parens);
-  }
-
-  if (cur_level > level_one)
-  {
-    print_nl("(");
-    print_esc("end occurred ");
-    prints("inside a group at level ");
-    print_int(cur_level - 1);
-    print_char(')');
-  }
-
-  while (cond_ptr != 0)
-  {
-    print_nl("(");
-    print_esc("end occurred ");
-    prints("when ");
-    print_cmd_chr(if_test, cur_if);
-
-    if (if_line != 0)
-    {
-      prints("on line ");
-      print_int(if_line);
-    }
-
-    prints(" was incomplete)");
-    if_line = if_line_field(cond_ptr);
-    cur_if = subtype(cond_ptr);
-    temp_ptr = cond_ptr;
-    cond_ptr = link(cond_ptr);
-    free_node(temp_ptr, if_node_size);
-  }
-
-  if (history != spotless)
-    if (((history == warning_issued) || (interaction < error_stop_mode)))
-      if (selector == term_and_log)
-      {
-        selector = term_only;
-        print_nl("(see the transcript file for additional information)");
-        selector = term_and_log;
-      }
-
-  if (c == 1)
-  {
-#ifdef INITEX
-    if (is_initex)
-    {
-      for (c = 0; c <= 4; c++)
-        if (cur_mark[c] != 0)
-          delete_token_ref(cur_mark[c]);
-
-      if (last_glue != max_halfword)
-        delete_glue_ref(last_glue);
-
-      store_fmt_file();
-    }
-#endif
-
-    if (!is_initex)
-      print_nl("(\\dump is performed only by INITEX)");
-  }
-}
-
-void show_frozen (void)
-{
-  int i;
-
-  fprintf(log_file, "\n(%lld fonts frozen in format file:\n", font_ptr);
-
-  for (i = 1; i <= font_ptr; i++)
-  {
-    if (i > 1)
-      fprintf(log_file, ", ");
-
-    if ((i % 8) == 0)
-      fprintf(log_file, "\n");
-
-    fwrite(&str_pool[str_start[font_name[i]]], 1, length(font_name[i]), log_file);
-  }
-
-  fprintf(log_file, ") ");
-}
-
-int main_program (void)
-{
-  history = fatal_error_stop;
-
-  if (ready_already == 314159L)
-    goto start_of_TEX;
-
-  bad = 0;
-
-  if ((half_error_line < 30) || (half_error_line > error_line - 15))
-    bad = 1;
-
-  if (max_print_line < 60)
-    bad = 2;
-
-  if (dvi_buf_size % 8 != 0)
-    bad = 3;
-
-  if (mem_bot + 1100 > mem_top)
-    bad = 4;
-
-  if (hash_prime > (hash_size + hash_extra))
-    bad = 5;
-
-  if (max_in_open >= 128)
-    bad = 6;
-
-  if (mem_top < 256 + 11)
-    bad = 7;
-
-#ifdef INITEX
-  if (is_initex)
-  {
-    if ((mem_min != 0) || (mem_max != mem_top))
-      bad = 10;
-  }
-#endif
-
-  if ((mem_min > mem_bot) || (mem_max < mem_top))
-    bad = 10;
-
-  if ((min_quarterword > 0) || (max_quarterword < 255))
-    bad = 11;
-
-  if ((min_halfword > 0) || (max_halfword < 32767))
-    bad = 12;
-
-  if ((min_quarterword < min_halfword) || (max_quarterword > max_halfword))
-    bad = 13;
-
-  if ((mem_min < min_halfword) || (mem_max >= max_halfword) || (mem_bot - mem_min >= max_halfword))
-    bad = 14;
-
-  if (mem_max > mem_top + mem_extra_high)
-    bad = 14;
-
-  if ((0 < min_quarterword) || (font_max > max_quarterword))
-    bad = 15;
-
-#ifdef INCREASEFONTS
-  if (font_max > 65535)
-#else
-  if (font_max > 256)
-#endif
-    bad = 16;
-
-  if ((save_size > max_halfword) || (max_strings > max_halfword))
-    bad = 17;
-
-  if (buf_size > max_halfword)
-    bad = 18;
-
-  if (max_quarterword - min_quarterword < 255)
-    bad = 19;
-
-  if (cs_token_flag + undefined_control_sequence > max_halfword)
-    bad = 21;
-
-  if (format_default_length > file_name_size)
-    bad = 31;
-
-  if (max_halfword < (mem_top - mem_min) / 2)
-    bad = 41;
-
-  if (bad > 0)
-  {
-    printf("%s%s%ld\n", "Ouch---my internal constants have been clobbered!",
-        "---case ", (long) bad);
-
-    goto final_end;
-  }
-
-  initialize();
-
-#ifdef INITEX
-  if (is_initex)
-  {
-    if (!get_strings_started())
-      goto final_end;
-
-    init_prim();
-    init_str_ptr = str_ptr;
-    init_pool_ptr = pool_ptr;
-    fix_date_and_time();
-  }
-#endif
-
-  ready_already = 314159L;
-
-start_of_TEX:
-  selector = term_only;
-  tally = 0;
-  term_offset = 0;
-  file_offset = 0;
-
-  print_banner();
-
-  if (format_ident == 0)
-  {
-    prints(" (preloaded format=");
-    prints(format_name);
-    prints(")");
-    print_ln();
-  }
-  else
-  {
-    slow_print(format_ident);
-    print_ln();
-  }
-
-  update_terminal();
-  job_name = 0;
-  name_in_progress = false;
-  log_opened = false;
-  output_file_name = 0;
-
-  {
-    {
-      input_ptr = 0;
-      max_in_stack = 0;
-      in_open = 0;
-      high_in_open = 0;
-      open_parens = 0;
-      max_open_parens = 0;
-      max_buf_stack = 0;
-      param_ptr = 0;
-      max_param_stack = 0;
-
-#ifdef ALLOCATEBUFFER
-      memset (buffer, 0, current_buf_size);
-#else
-      memset (buffer, 0, buf_size);
-#endif
-
-      first = 0;
-      scanner_status = 0;
-      warning_index = 0;
-      first = 1;
-      state = new_line;
-      start = 1;
-      index = 0;
-      line = 0;
-      name = 0;
-      force_eof = false;
-      align_state = 1000000L;
-
-      if (!init_terminal())
-        goto final_end;
-
-      limit = last;
-      first = last + 1;
-    }
-    
-    if ((format_ident == 0) || (buffer[loc] == '&') || (buffer[loc] == '+'))
-    {
-      if (format_ident != 0)
-        initialize();
-
-      if (!open_fmt_file())
-        goto final_end;
-
-      if (!load_fmt_file())
-      {
-#ifdef COMPACTFORMAT
-        gzclose(gz_fmt_file);
-#else
-        w_close(fmt_file);
-#endif
-        goto final_end;
-      }
-
-#ifdef COMPACTFORMAT
-      gzclose(gz_fmt_file);
-#else
-      w_close(fmt_file);
-#endif
-
-      while ((loc < limit) && (buffer[loc] == ' '))
-        incr(loc);
-    }
-
-    if (end_line_char_inactive())
-      decr(limit);
-    else
-      buffer[limit] = end_line_char;
-
-    fix_date_and_time();
-    magic_offset = str_start[886] - 9 * ord_noad;
-
-    if (interaction == batch_mode)
-      selector = no_print;
-    else
-      selector = term_only;
-
-    if ((loc < limit) && (cat_code(buffer[loc]) != escape))
-      start_input();
-  }
-
-  if (show_tfm_flag && log_opened && font_ptr > 0)
-    show_frozen();
-
-  main_time = clock();
-  history = spotless;
-
-  if (show_cs_names)
-    print_cs_names(stdout, 0);
-
-  main_control();
-
-  if (show_cs_names)
-    print_cs_names(stdout, 1);
-
-  final_cleanup();
-  close_files_and_terminate();
-
-final_end:
-  {
-    int code;
-
-    update_terminal();
-    ready_already = 0;
-
-    if ((history != spotless) && (history != warning_issued))
-      code = 1;
-    else
-      code = 0;
-
-    return code;
-  }
-}
-
-#ifdef ALLOCATEMAIN
-/* add a block of variable size node space below mem_bot(0) */
-void add_variable_space(int size)
-{
-  halfword p;
-  halfword q;
-  integer t;
-
-  if (mem_min == 0)
-    t = mem_min;
-  else
-    t = mem_min + 1;
-
-  mem_min = t - (size + 1);     /* first word in new block - 1 */
-
-  if (mem_min < mem_start)
-  {
-    if (trace_flag)
-      puts("WARNING: mem_min < mem_start!");
-
-    mem_min = mem_start;
-  }
-
-  p = llink(rover);
-  q = mem_min + 1;
-  link(mem_min) = 0; /* insert blank word below ??? */
-  info(mem_min) = 0; /* insert blank word below ??? */
-  rlink(p) = q;
-  llink(rover) = q;
-  rlink(q) = rover;
-  llink(q) = p;
-  link(q) = empty_flag;
-  info(q) = t - q; /* block size */
-  rover = q;
-}
-#endif
-
-#ifdef INITEX
-/* split out to allow sharing of code from do_initex and newpattern */
-void reset_trie (void)
-{
-  integer k;
-
-  for (k = -(integer) trie_op_size; k <= trie_op_size; k++)
-    trie_op_hash[k] = 0;
-
-  for (k = 0; k <= 255; k++)
-    trie_used[k] = min_trie_op;
-
-  max_op_used = min_trie_op;
-  trie_op_ptr = 0;
-  trie_not_ready = true;
-  trie_l[0] = 0;
-  trie_c[0] = 0;
-  trie_ptr = 0;
-  trie_not_ready = true;
-}
-/* borrowed code from initialize() */
-void reset_hyphen(void)
-{
-  hyph_pointer z;
-
-  for (z = 0; z <= hyphen_prime; z++)
-  {
-    hyph_word[z] = 0;
-    hyph_list[z] = 0;
-  }
-
-  hyph_count = 0;
-}
-/* split out to allow optimize for space, not time */
-void do_initex (void)
-{
-  /* integer i; */
-  integer k;
-  /* hyph_pointer z; */
-
-  for (k = mem_bot + 1; k <= lo_mem_stat_max; k++)
-    mem[k].cint = 0;
-
-  k = mem_bot;
-
-  while (k <= lo_mem_stat_max)
-  {
-    glue_ref_count(k) = 1;
-    stretch_order(k) = normal;
-    shrink_order(k) = normal;
-    k = k + glue_spec_size;
-  }
-
-  stretch(fil_glue) = unity;
-  stretch_order(fil_glue) = fil;
-  stretch(fill_glue) = unity;
-  stretch_order(fill_glue) = fill;
-  stretch(ss_glue) = unity;
-  stretch_order(ss_glue) = fil;
-  shrink(ss_glue) = unity;
-  shrink_order(ss_glue) = fil;
-  stretch(fil_neg_glue) = -unity;
-  stretch_order(fil_neg_glue) = fil;
-  rover = lo_mem_stat_max + 1;
-  link(rover) = empty_flag;
-  node_size(rover) = block_size;
-  llink(rover) = rover;
-  rlink(rover) = rover;
-  lo_mem_max = rover + block_size;
-  link(lo_mem_max) = 0;
-  info(lo_mem_max) = 0;
-
-  for (k = hi_mem_stat_min; k <= mem_top; k++)
-    mem[k] = mem[lo_mem_max];
-
-  info(omit_template) = end_template_token;
-  link(end_span) = max_quarterword + 1;
-  info(end_span) = 0;
-  type(last_active) = hyphenated;
-  line_number(last_active) = max_halfword;
-  subtype(last_active) = 0;
-  subtype(page_ins_head) = 255;
-  type(page_ins_head) = split_up;
-  link(mem_top) = page_ins_head;
-  type(page_head) = glue_node;
-  subtype(page_head) = normal;
-  avail = 0;
-  mem_end = mem_top;
-  hi_mem_min = hi_mem_stat_min;
-  var_used = lo_mem_stat_max + 1 - mem_bot;
-  dyn_used = hi_mem_stat_usage;
-  eq_type(undefined_control_sequence) = undefined_cs;
-  equiv(undefined_control_sequence) = 0;
-  eq_level(undefined_control_sequence) = level_zero;
-
-  for (k = active_base; k <= undefined_control_sequence - 1; k++)
-    eqtb[k] = eqtb[undefined_control_sequence];
-
-  equiv(glue_base) = zero_glue;
-  eq_level(glue_base) = level_one;
-  eq_type(glue_base) = glue_ref;
-
-  for (k = glue_base + 1; k <= local_base - 1; k++)
-    eqtb[k] = eqtb[glue_base];
-
-  glue_ref_count(zero_glue) = glue_ref_count(zero_glue) + local_base - glue_base;
-
-  par_shape_ptr = 0;
-  eq_type(par_shape_loc) = shape_ref;
-  eq_level(par_shape_loc) = level_one;
-
-  for (k = output_routine_loc; k <= toks_base + 255; k++)
-    eqtb[k] = eqtb[undefined_control_sequence];
-
-  box(0) = 0;
-  eq_type(box_base) = box_ref;
-  eq_level(box_base) = level_one;
-
-  for (k = box_base + 1; k <= box_base + 255; k++)
-    eqtb[k] = eqtb[box_base];
-
-  cur_font = null_font;
-  eq_type(cur_font_loc) = data;
-  eq_level(cur_font_loc) = level_one;
-
-  for (k = math_font_base; k <= math_font_base + 47; k++)
-    eqtb[k] = eqtb[cur_font_loc];
-
-  equiv(cat_code_base) = 0;
-  eq_type(cat_code_base) = data;
-  eq_level(cat_code_base) = level_one;
-
-  for (k = cat_code_base; k <= int_base - 1; k++)
-    eqtb[k] = eqtb[cat_code_base];
-
-  for (k = 0; k <= 255; k++)
-  {
-    cat_code(k) = other_char;
-    math_code(k) = k;
-    sf_code(k) = 1000;
-  }
-
-  cat_code(carriage_return) = car_ret;
-  cat_code(' ') = spacer;
-  cat_code('\\') = escape;
-  cat_code('%') = comment;
-  cat_code(invalid_code) = invalid_char;
-  cat_code(null_code) = ignore;
-
-  for (k = '0'; k <= '9'; k++)
-    math_code(k) = k + var_code;
-
-  for (k = 'A'; k <= 'Z'; k++)
-  {
-    cat_code(k) = letter;
-    cat_code(k + 'a' - 'A') = letter;
-    math_code(k) = k + var_code + 0x100;
-    math_code(k + 'a' - 'A') = k + 'a' - 'A' + var_code + 0x100;
-    lc_code(k) = k + 'a' - 'A';
-    lc_code(k + 'a' - 'A') = k + 'a' - 'A';
-    uc_code(k) = k;
-    uc_code(k + 'a' - 'A') = k;
-    sf_code(k) = 999;
-  }
-
-  for (k = int_base; k <= del_code_base - 1; k++)
-    eqtb[k].cint = 0;
-
-  mag = 1000;
-  tolerance = 10000;
-  hang_after = 1;
-  max_dead_cycles = 25;
-  escape_char = '\\';
-  end_line_char = carriage_return;
-
-  for (k = 0; k <= 255; k++)
-    del_code(k) = -1;
-
-  del_code('.') = 0;
-
-  for (k = dimen_base; k <= eqtb_size; k++)
-    eqtb[k].cint = 0;
-
-  hash_used = frozen_control_sequence;
-  cs_count = 0;
-
-  if (trace_flag)
-    puts("initex cs_count = 0 ");
-
-  eq_type(frozen_dont_expand) = dont_expand;
-  text(frozen_dont_expand) = 499;  /* "notexpanded:" */
-
-  font_ptr                    = null_font;
-  fmem_ptr                    = 7;
-  font_name[null_font]        = 795; /* nullfont */
-  font_area[null_font]        = 335; /* "" */
-  hyphen_char[null_font]      = '-';
-  skew_char[null_font]        = -1; 
-  bchar_label[null_font]      = non_address;
-  font_bchar[null_font]       = non_char;
-  font_false_bchar[null_font] = non_char;
-  font_bc[null_font]          = 1;
-  font_ec[null_font]          = 0;
-  font_size[null_font]        = 0;
-  font_dsize[null_font]       = 0;
-  char_base[null_font]        = 0;
-  width_base[null_font]       = 0;
-  height_base[null_font]      = 0;
-  depth_base[null_font]       = 0;
-  italic_base[null_font]      = 0;
-  lig_kern_base[null_font]    = 0;
-  kern_base[null_font]        = 0;
-  exten_base[null_font]       = 0;
-  font_glue[null_font]        = 0;
-  font_params[null_font]      = 7;
-  param_base[null_font]       = -1;
-
-  for (k = 0; k <= 6; k++)
-    font_info[k].cint = 0;
-
-  reset_trie();
-  text(frozen_protection) = 1184; /* "inaccessible" */
-  format_ident = 1251;            /* " (INITEX)" */
-  text(end_write) = 1290;         /* "endwrite" */
-  eq_level(end_write) = level_one;
-  eq_type(end_write) = outer_call;
-  equiv(end_write) = 0;
-}
-#endif
-
-#ifdef INITEX
-/* sec 0047 */
-boolean get_strings_started (void)
-{
-  integer k;
-  str_number g;
-
-  pool_ptr = 0;
-  str_ptr = 0;
-  str_start[0] = 0;
-
-  for (k = 0; k <= 255; k++)
-  {
-    if ( (k < ' ') || (k > '~') )
-    {
-      append_char('^');
-      append_char('^');
-
-      if (k < 64)
-        append_char(k + 64);
-      else if (k < 128)
-        append_char(k - 64);
-      else
-      {
-        append_lc_hex(k / 16);
-        append_lc_hex(k % 16);
-      }
-    }
-    else
-      append_char(k);
-
-    g = make_string();
-  }
-
-  g = load_pool_strings(pool_size - string_vacancies);
-
-  if (g == 0)
-  {
-    printf("%s\n", "! You have to increase POOLSIZE." );
-    return false;
-  }
-
-  return true;
-}
-#endif
-
-#ifdef INITEX
-/* sec 0131 */
-void sort_avail (void)
-{
-  pointer p, q, r;
-  pointer old_rover;
-
-  p = get_node(010000000000);
-  p = rlink(rover);
-  rlink(rover) = empty_flag;
-  old_rover = rover;
-
-  while (p != old_rover)
-  {
-    if (p < rover)
-    {
-      q = p;
-      p = rlink(q);
-      rlink(q) = rover;
-      rover = q;
-    }
-    else
-    {
-      q = rover;
-
-      while (rlink(q) < p)
-        q = rlink(q);
-
-      r = rlink(p);
-      rlink(p) = rlink(q);
-      rlink(q) = p;
-      p = r;
-    }
-  }
-
-  p = rover;
-
-  while (rlink(p) != empty_flag)
-  {
-    llink(rlink(p)) = p;
-    p = rlink(p);
-  }
-
-  rlink(p) = rover;
-  llink(rover) = p;
-}
-#endif
-
-#ifdef INITEX
-/* sec 0264 */
-void primitive_ (str_number s, quarterword c, halfword o)
-{ 
-  pool_pointer k;
-  small_number j;
-  /* small_number l; */
-  int l;
-
-  if (s < 256)
-    cur_val = s + single_base;
-  else
-  {
-    k = str_start[s];
-    l = str_start[s + 1] - k;
-
-    for (j = 0; j <= l - 1; j++)
-      buffer[j] = str_pool[k + j];
-
-    cur_val = id_lookup(0, l);
-    flush_string();
-    text(cur_val) = s;
-  }
-
-  eq_level(cur_val) = level_one;
-  eq_type(cur_val) = c;
-  equiv(cur_val) = o;
-}
-#endif
-
-#ifdef INITEX
-/* sec 0944 */
-trie_op_code new_trie_op (small_number d, small_number n, trie_op_code v)
-{
-  integer h;
-  trie_op_code u;
-  integer l;
-
-  h = abs(n + 313 * d + 361 * v + 1009 * cur_lang) % (trie_op_size + trie_op_size) + neg_trie_op_size;
-
-  while (true)
-  {
-    l = trie_op_hash[h];
-
-    if (l == 0)
-    {
-      if (trie_op_ptr == trie_op_size)
-      {
-        overflow("pattern memory ops", trie_op_size);
-        return 0;
-      }
-
-      u = trie_used[cur_lang];
-
-      if (u == max_trie_op)
-      {
-        overflow("pattern memory ops per language", max_trie_op - min_trie_op);
-        return 0;
-      }
-
-      incr(trie_op_ptr);
-      incr(u);
-      trie_used[cur_lang] = u;
-
-      if (u > max_op_used)
-        max_op_used = u;
-
-      hyf_distance[trie_op_ptr] = d;
-      hyf_num[trie_op_ptr] = n;
-      hyf_next[trie_op_ptr] = v;
-      trie_op_lang[trie_op_ptr] = cur_lang;
-      trie_op_hash[h] = trie_op_ptr;
-      trie_op_val[trie_op_ptr] = u;
-      return u;
-    }
-
-    if ((hyf_distance[l] == d) && (hyf_num[l] == n) && (hyf_next[l] == v) && (trie_op_lang[l] == cur_lang))
-    {
-      return trie_op_val[l];
-    }
-
-    if (h > - (integer) trie_op_size)
-      decr(h);
-    else
-      h = trie_op_size;
-  }
-}
-/* sec 0948 */
-trie_pointer trie_node (trie_pointer p)
-{
-  trie_pointer h;
-  trie_pointer q;
-
-  /* the 1009, 2718, 3142 are hard-wired constants here (not hyphen_prime) */
-  /* compute hash value */
-  h = abs(trie_c[p] + 1009 * trie_o[p] + 2718 * trie_l[p] + 3142 * trie_r[p]) % trie_size;
-
-  while (true)
-  {
-    q = trie_hash[h];
-
-    if (q == 0)
-    {
-      trie_hash[h] = p;
-      return p;
-    }
-
-    if ((trie_c[q] == trie_c[p]) && (trie_o[q] == trie_o[p]) &&
-      (trie_l[q] == trie_l[p]) && (trie_r[q] == trie_r[p]))
-    {
-      return q;
-    }
-
-    if (h > 0)
-      decr(h);
-    else
-      h = trie_size;
-  }
-}
-/* sec 0949 */
-trie_pointer compress_trie (trie_pointer p)
-{
-  if (p == 0)
-    return 0;
-  else
-  {
-    trie_l[p] = compress_trie(trie_l[p]);
-    trie_r[p] = compress_trie(trie_r[p]);
-
-    return trie_node(p);
-  }
-}
-/* sec 0953 */
-void first_fit (trie_pointer p)
-{
-  trie_pointer h;
-  trie_pointer z;
-  trie_pointer q;
-  ASCII_code c;
-  trie_pointer l, r;
-  short ll;
-
-  c = trie_c[p];
-  z = trie_min[c];
-
-  while (true)
-  {
-    h = z - c;
-
-    if (trie_max < h + 256)
-    {
-      if (trie_size <= h + 256)
-      {
-        overflow("pattern memory", trie_size);
-        return;
-      }
-
-      do
-        {
-          incr(trie_max);
-          trie_taken[trie_max] = false;
-          trie_trl[trie_max] = trie_max + 1;
-          trie_tro[trie_max] = trie_max - 1;
-        }
-      while (!(trie_max == h + 256));
-    }
-
-    if (trie_taken[h])
-      goto not_found;
-
-    q = trie_r[p];
-
-    while (q > 0)
-    {
-      if (trie_trl[h + trie_c[q]] == 0)
-        goto not_found;
-
-      q = trie_r[q];
-    }
-
-    goto found;
-
-not_found:
-    z = trie_trl[z];
-  }
-
-found:
-  trie_taken[h] = true;
-  trie_hash[p] = h;
-  q = p;
-
-  do
-    {
-      z = h + trie_c[q];
-      l = trie_tro[z];
-      r = trie_trl[z];
-      trie_tro[r] = l;
-      trie_trl[l] = r;
-      trie_trl[z] = 0;
-
-      if (l < 256)
-      {
-        if (z < 256)
-          ll = z;         /* short ll */
-        else
-          ll = 256;
-
-        do
-          {
-            trie_min[l] = r;
-            incr(l);
-          }
-        while (!(l == ll));
-      }
-
-      q = trie_r[q];
-    }
-  while (!(q == 0));
-}
-/* sec 0957 */
-void trie_pack (trie_pointer p)
-{
-  trie_pointer q;
-
-  do
-    {
-      q = trie_l[p];
-
-      if ((q > 0) && (trie_hash[q]== 0))
-      {
-        first_fit(q);
-        trie_pack(q);
-      }
-
-      p = trie_r[p];
-    }
-  while (!(p == 0));
-}
-/* sec 0959 */
-void trie_fix (trie_pointer p)
-{
-  trie_pointer q;
-  ASCII_code c;
-  trie_pointer z;
-
-  z = trie_hash[p];
-
-  do
-    {
-      q = trie_l[p];
-      c = trie_c[p];
-      trie_trl[z + c] = trie_hash[q];
-      trie_trc[z + c] = c;
-      trie_tro[z + c] = trie_o[p];
-
-      if (q > 0)
-        trie_fix(q);
-
-      p = trie_r[p];
-    }
-  while (!(p == 0));
-}
-/* sec 0960 */
-void new_patterns (void)
-{
-  char k, l;
-  boolean digit_sensed;
-  trie_op_code v;
-  trie_pointer p, q;
-  boolean first_child;
-  /* ASCII_code c; */
-  int c;
-
-  if (!trie_not_ready)
-  {
-    if (allow_patterns)
-    {
-      if (trace_flag)
-        puts("Resetting patterns");
-
-      reset_trie();
-
-      if (reset_exceptions)
-      {
-        if (trace_flag)
-          puts("Resetting exceptions");
-
-        reset_hyphen();
-      }
-    }
-  }
-
-  if (trie_not_ready)
-  {
-    set_cur_lang();
-    scan_left_brace();
-    k = 0;
-    hyf[0] = 0;
-    digit_sensed = false;
-
-    while (true)
-    {
-      get_x_token();
-
-      switch (cur_cmd)
-      {
-        case letter:
-        case other_char:
-          if (digit_sensed || (cur_chr < '0') || (cur_chr > '9'))
-          {
-            if (cur_chr == '.')
-              cur_chr = 0;
-            else
-            {
-              cur_chr = lc_code(cur_chr);
-
-              if (cur_chr == 0)
-              {
-                print_err("Nonletter");
-                help1("(See Appendix H.)");
-                error();
-              }
-            }
-
-            if (k < 63)
-            {
-              incr(k);
-              hc[k] = cur_chr;
-              hyf[k] = 0;
-              digit_sensed = false;
-            }
-          }
-          else if (k < 63)
-          {
-            hyf[k] = cur_chr - '0';
-            digit_sensed = true;
-          }
-          break;
-        case spacer:
-        case right_brace:
-          {
-            if (k > 0)
-            {
-              if (hc[1] == 0)
-                hyf[0] = 0;
-
-              if (hc[k] == 0)
-                hyf[k] = 0;
-
-              l = k;
-              v = min_trie_op;
-
-              while (true)
-              {
-                if (hyf[l]!= 0)
-                  v = new_trie_op(k - l, hyf[l], v);
-
-                if (l > 0)
-                  decr(l);
-                else
-                  goto done1;
-              }
-done1:
-              q = 0;
-              hc[0] = cur_lang;
-
-              while (l <= k)
-              {
-                c = hc[l];
-                incr(l);
-                p = trie_l[q];
-                first_child = true;
-
-                while ((p > 0) && (c > trie_c[p]))
-                {
-                  q = p;
-                  p = trie_r[q];
-                  first_child = false;
-                }
-
-                if ((p == 0) || (c < trie_c[p]))
-                {
-                  if (trie_ptr == trie_size)
-                  {
-                    overflow("pattern memory", trie_size);
-                    return;
-                  }
-
-                  incr(trie_ptr);
-                  trie_r[trie_ptr] = p;
-                  p = trie_ptr;
-                  trie_l[p] = 0;
-
-                  if (first_child)
-                    trie_l[q] = p;
-                  else
-                    trie_r[q] = p;
-
-                  trie_c[p] = c;
-                  trie_o[p] = min_trie_op;
-                }
-
-                q = p;
-              }
-
-              if (trie_o[q] != min_trie_op)
-              {
-                print_err("Duplicate pattern");
-                help1("(See Appendix H.)");
-                error();
-              }
-
-              trie_o[q] = v;
-            }
-
-            if (cur_cmd == right_brace)
-              goto done;
-
-            k = 0;
-            hyf[0] = 0;
-            digit_sensed = false;
-          }
-          break;
-        default:
-          {
-            print_err("Bad ");
-            print_esc("patterns");
-            help1("(See Appendix H.)");
-            error();
-          }
-          break;
-      }
-    }
-done:;
-  }
-  else
-  {
-    print_err("Too late for ");
-    print_esc("patterns");
-    help1("All patterns must be given before typesetting begins.");
-    error();
-    link(garbage) = scan_toks(false, false);
-    flush_list(def_ref);
-  }
-}
-/* sec 0966 */
-void init_trie (void)
-{
-  trie_pointer p;
-  /* integer j, k, t; */
-  integer j, k;
-  int t;
-  trie_pointer r, s;
-
-  op_start[0] = - (integer) min_trie_op;
-
-  for (j = 1; j <= 255; j++)
-    op_start[j] = op_start[j - 1] + trie_used[j - 1];
-
-  for (j = 1; j <= trie_op_ptr; j++)
-    trie_op_hash[j] = op_start[trie_op_lang[j]] + trie_op_val[j];
-
-  for (j = 1; j <= trie_op_ptr; j++)
-  {
-    while (trie_op_hash[j] > j)
-    {
-      k = trie_op_hash[j];
-      t = hyf_distance[k];
-      hyf_distance[k] = hyf_distance[j];
-      hyf_distance[j] = t;
-      t = hyf_num[k];
-      hyf_num[k] = hyf_num[j];
-      hyf_num[j] = t;
-      t = hyf_next[k];
-      hyf_next[k] = hyf_next[j];
-      hyf_next[j]= t;
-      trie_op_hash[j] = trie_op_hash[k];
-      trie_op_hash[k] = k;
-    }
-  }
-
-  for (p = 0; p <= trie_size; p++)
-    trie_hash[p] = 0;
-
-  trie_l[0] = compress_trie(trie_l[0]);
-
-  for (p = 0; p <= trie_ptr; p++)
-    trie_hash[p] = 0;
-
-  for (p = 0; p <= 255; p++)
-    trie_min[p] = p + 1;
-
-  trie_trl[0] = 1;
-  trie_max = 0;
-
-  if (trie_l[0] != 0)
-  {
-    first_fit(trie_l[0]);
-    trie_pack(trie_l[0]);
-  }
-
-  if (trie_l[0] == 0)
-  {
-    for (r = 0; r <= 256; r++)
-    {
-      trie_trl[r] = 0;
-      trie_tro[r] = min_trie_op;
-      trie_trc[r] = 0;
-    }
-
-    trie_max = 256;
-  }
-  else
-  {
-    trie_fix(trie_l[0]);
-    r = 0;
-
-    do
-      {
-        s = trie_trl[r];
-
-        {
-          trie_trl[r] = 0;
-          trie_tro[r] = min_trie_op;
-          trie_trc[r] = 0;
-        }
-
-        r = s;
-      }
-    while (!(r > trie_max));
-  }
-
-  trie_trc[0] = 63;
-  trie_not_ready = false;
-}
-#endif
-
-#ifdef INITEX
-/* sec 1302 */
-void store_fmt_file (void)
-{
-  integer j, k, l;
-  pointer p, q;
-  integer x;
-
-  if (!is_initex)
-  {
-    puts("! \\dump is performed only by INITEX");
-
-    if (!knuth_flag)
-      puts("  (Use -i on the command line)");
-
-    return;
-  }
-
-  if (save_ptr != 0)
-  {
-    print_err("You can't dump inside a group");
-    help1("`{...\\dump}' is a no-no.");
-    succumb();
-  }
-
-  selector = new_string;
-  prints(" (preloaded format=");
-  print(job_name);
-  print_char(' ');
-  print_int(year);
-  print_char('.');
-  print_int(month);
-  print_char('.');
-  print_int(day);
-  print_char(')');
-
-  if (interaction == batch_mode)
-    selector = log_only;
-  else
-    selector = term_and_log;
-
-  str_room(1);
-  format_ident = make_string();
-  pack_job_name(".fmt");
-
-  while (!w_open_out(fmt_file))
-    prompt_file_name("format file name", ".fmt");
-
-  print_nl("Beginning to dump on file ");
-  slow_print(w_make_name_string(fmt_file));
-  flush_string();
-  print_nl("");
-  slow_print(format_ident);
-
-  dump_int(BEGINFMTCHECKSUM);
-  dump_int(mem_bot);
-  dump_int(mem_top);
-  dump_int(eqtb_size);
-  dump_int(hash_prime);
-  dump_int(hyphen_prime);
-  dump_int(pool_ptr);
-  dump_int(str_ptr);
-  dumpthings(str_start[0], str_ptr + 1);
-  dumpthings(str_pool[0], pool_ptr);
-  print_ln();
-  print_int(str_ptr);
-  prints(" strings of total length ");
-  print_int(pool_ptr);
-
-  sort_avail();
-  var_used = 0;
-  dump_int(lo_mem_max);
-  dump_int(rover);
-  p = 0;
-  q = rover;
-  x = 0;
-
-  do
-    {
-      if (dumpthings(mem[p], q + 2 - p))
-        return;
-
-      x = x + q + 2 - p;
-      var_used = var_used + q - p;
-      p = q + node_size(q);
-      q = rlink(q);
-    }
-  while (!(q == rover));
-
-  var_used = var_used + lo_mem_max - p;
-  dyn_used = mem_end + 1 - hi_mem_min;
-
-  if (dumpthings(mem[p], lo_mem_max + 1 - p))
-    return;
-
-  x = x + lo_mem_max + 1 - p;
-  dump_int(hi_mem_min);
-  dump_int(avail); 
-
-  if (dumpthings(mem[hi_mem_min], mem_end + 1 - hi_mem_min))
-    return;
-
-  x = x + mem_end + 1 - hi_mem_min;
-  p = avail;
-
-  while (p != 0)
-  {
-    decr(dyn_used);
-    p = link(p);
-  }
-
-  dump_int(var_used);
-  dump_int(dyn_used);
-  print_ln();
-  print_int(x);
-  prints(" memory locations dumped; current usage is ");
-  print_int(var_used);
-  print_char('&');
-  print_int(dyn_used);
-
-  k = active_base;
-
-  do
-    {
-      j = k;
-
-      while (j < (int_base - 1))
-      {
-        if ((equiv(j) == equiv(j + 1)) &&
-          (eq_type(j) == eq_type(j + 1)) &&
-          (eq_level(j) == eq_level(j + 1)))
-          goto found1;
-
-        incr(j);
-      }
-
-      l = (int_base);
-      goto done1;
-
-found1:
-      incr(j);
-      l = j;
-
-      while (j < (int_base - 1))
-      {
-        if ((equiv(j) != equiv(j + 1)) ||
-          (eq_type(j) != eq_type(j + 1)) ||
-          (eq_level(j) != eq_level(j + 1)))
-          goto done1;
-
-        incr(j);
-      }
-
-done1:
-      dump_int(l - k);
-
-      if (dumpthings(eqtb[k], l - k))
-        return;
-
-      k = j + 1;
-      dump_int(k - l);
-    }
-  while (!(k == (int_base)));
-
-  do
-    {
-      j = k;
-
-      while (j < (eqtb_size))
-      {
-        if (eqtb[j].cint == eqtb[j + 1].cint)
-          goto found2;
-
-        incr(j);
-      }
-
-      l = (eqtb_size + 1);
-      goto done2;
-
-found2:
-      incr(j);
-      l = j;
-
-      while (j < (eqtb_size))
-      {
-        if (eqtb[j].cint != eqtb[j + 1].cint)
-          goto done2;
-
-        incr(j);
-      }
-
-done2:
-      dump_int(l - k);
-
-      if (dumpthings(eqtb[k], l - k))
-        return;
-
-      k = j + 1;
-      dump_int(k - l);
-    }
-  while (!(k > (eqtb_size)));
-
-  dump_int(par_loc);
-  dump_int(write_loc);
-
-  dump_int(hash_used);
-  cs_count = frozen_control_sequence - 1 - hash_used;
-
-  if (trace_flag)
-    printf("itex cs_count %lld hash_size %d hash_extra %d hash_used %d",
-        cs_count, hash_size, hash_extra, hash_used);
-
-  for (p = hash_base; p <= hash_used; p++)
-  {
-    if (text(p) != 0)
-    {
-      dump_int(p);
-      dump_hh(hash[p]);
-      incr(cs_count);
-
-      if (trace_flag)
-        puts("itex.c store_fmt_file() cs_count++ ");
-    }
-  }
-
-  if (dumpthings(hash[hash_used + 1], undefined_control_sequence - 1 - hash_used))
-    return;
-
-  dump_int(cs_count);
-  print_ln();
-  print_int(cs_count);
-  prints(" multiletter control sequences");
-
-  dump_int(fmem_ptr);
-
-  {
-    dumpthings(font_info[0], fmem_ptr);
-    dump_int(font_ptr);
-    dumpthings(font_check[0], font_ptr + 1);
-    dumpthings(font_size[0], font_ptr + 1);
-    dumpthings(font_dsize[0], font_ptr + 1);
-    dumpthings(font_params[0], font_ptr + 1);
-    dumpthings(hyphen_char[0], font_ptr + 1);
-    dumpthings(skew_char[0], font_ptr + 1);
-    dumpthings(font_name[0], font_ptr + 1);
-    dumpthings(font_area[0], font_ptr + 1);
-    dumpthings(font_bc[0], font_ptr + 1);
-    dumpthings(font_ec[0], font_ptr + 1);
-    dumpthings(char_base[0], font_ptr + 1);
-    dumpthings(width_base[0], font_ptr + 1);
-    dumpthings(height_base[0], font_ptr + 1);
-    dumpthings(depth_base[0], font_ptr + 1);
-    dumpthings(italic_base[0], font_ptr + 1);
-    dumpthings(lig_kern_base[0], font_ptr + 1);
-    dumpthings(kern_base[0], font_ptr + 1);
-    dumpthings(exten_base[0], font_ptr + 1);
-    dumpthings(param_base[0], font_ptr + 1);
-    dumpthings(font_glue[0], font_ptr + 1);
-    dumpthings(bchar_label[0], font_ptr + 1);
-    dumpthings(font_bchar[0], font_ptr + 1);
-    dumpthings(font_false_bchar[0], font_ptr + 1);
-
-    for (k = 0; k <= font_ptr; k++)
-    {
-      print_nl("\\font");
-      print_esc("");
-      print(font_id_text(k));
-      print_char('=');
-      print_file_name(font_name[k], font_area[k], 335);
-
-      if (font_size[k] != font_dsize[k])
-      {
-        prints(" at ");
-        print_scaled(font_size[k]);
-        prints("pt");
-      }
-    }
-  }
-
-  print_ln();
-  print_int(fmem_ptr - 7);
-  prints(" words of font info for ");
-  print_int(font_ptr - font_base);
-  prints(" preloaded font");
-
-  if (font_ptr != font_base + 1)
-    print_char('s');
-
-  dump_int(hyph_count);
-
-  for (k = 0; k <= hyphen_prime; k++)
-  {
-    if (hyph_word[k] != 0)
-    {
-      dump_int(k);
-      dump_int(hyph_word[k]);
-      dump_int(hyph_list[k]);
-    }
-  }
-
-  print_ln();
-  print_int(hyph_count);
-  prints(" hyphenation exception");
-
-  if (hyph_count != 1)
-    print_char('s');
-
-  if (trie_not_ready)
-    init_trie();
-
-  dump_int(trie_max);
-  dumpthings(trie_trl[0], trie_max + 1);
-  dumpthings(trie_tro[0], trie_max + 1);
-  dumpthings(trie_trc[0], trie_max + 1);
-  dump_int(trie_op_ptr);
-  dumpthings(hyf_distance[1], trie_op_ptr);
-  dumpthings(hyf_num[1], trie_op_ptr);
-  dumpthings(hyf_next[1], trie_op_ptr);
-  print_nl("Hyphenation trie of length ");
-  print_int(trie_max);
-  prints(" has ");
-  print_int(trie_op_ptr);
-  prints(" op");
-
-  if (trie_op_ptr != 1)
-    print_char('s');
-
-  prints(" out of ");
-  print_int(trie_op_size);
-
-  for (k = 255; k >= 0; k--)
-  {
-    if (trie_used[k] > 0)
-    {
-      print_nl("  ");
-      print_int(trie_used[k]);
-      prints(" for language ");
-      print_int(k);
-      dump_int(k);
-      dump_int(trie_used[k]);
-    }
-  }
-
-  dump_int(interaction);
-  dump_int(format_ident);
-  dump_int(ENDFMTCHECKSUM);
-  tracing_stats = 0;
-
-#ifdef COMPACTFORMAT
-  gz_w_close(gz_fmt_file);
-#else
-  w_close(fmt_file);
-#endif
-}
-#endif
-
-#ifdef INITEX
-/* sec 01336 */
-void init_prim (void)
-{
-  no_new_control_sequence = false;
-  /* sec 0266 */
-  primitive("lineskip", assign_glue, glue_base + line_skip_code);
-  primitive("baselineskip", assign_glue, glue_base + baseline_skip_code);
-  primitive("parskip", assign_glue, glue_base + par_skip_code);
-  primitive("abovedisplayskip", assign_glue, glue_base + above_display_skip_code);
-  primitive("belowdisplayskip", assign_glue, glue_base + below_display_skip_code);
-  primitive("abovedisplayshortskip", assign_glue, glue_base + above_display_short_skip_code);
-  primitive("belowdisplayshortskip", assign_glue, glue_base + below_display_short_skip_code);
-  primitive("leftskip", assign_glue, glue_base + left_skip_code);
-  primitive("rightskip", assign_glue, glue_base + right_skip_code);
-  primitive("topskip", assign_glue, glue_base + top_skip_code);
-  primitive("splittopskip", assign_glue, glue_base + split_top_skip_code);
-  primitive("tabskip", assign_glue, glue_base + tab_skip_code);
-  primitive("spaceskip", assign_glue, glue_base + space_skip_code);
-  primitive("xspaceskip", assign_glue, glue_base + xspace_skip_code);
-  primitive("parfillskip", assign_glue, glue_base + par_fill_skip_code);
-  primitive("thinmuskip", assign_mu_glue, glue_base + thin_mu_skip_code);
-  primitive("medmuskip", assign_mu_glue, glue_base + med_mu_skip_code);
-  primitive("thickmuskip", assign_mu_glue, glue_base + thick_mu_skip_code);
-  /* sec 0230 */
-  primitive("output", assign_toks, output_routine_loc);
-  primitive("everypar", assign_toks, every_par_loc);
-  primitive("everymath", assign_toks, every_math_loc);
-  primitive("everydisplay", assign_toks, every_display_loc);
-  primitive("everyhbox", assign_toks, every_hbox_loc);
-  primitive("everyvbox", assign_toks, every_vbox_loc);
-  primitive("everyjob", assign_toks, every_job_loc);
-  primitive("everycr", assign_toks, every_cr_loc);
-  primitive("errhelp", assign_toks, err_help_loc);
-  /* sec 0238 */
-  primitive("pretolerance", assign_int, int_base + pretolerance_code);
-  primitive("tolerance", assign_int, int_base + tolerance_code);
-  primitive("linepenalty", assign_int, int_base + line_penalty_code);
-  primitive("hyphenpenalty", assign_int, int_base + hyphen_penalty_code);
-  primitive("exhyphenpenalty", assign_int, int_base + ex_hyphen_penalty_code);
-  primitive("clubpenalty", assign_int, int_base + club_penalty_code);
-  primitive("widowpenalty", assign_int, int_base + widow_penalty_code);
-  primitive("displaywidowpenalty", assign_int, int_base + display_widow_penalty_code);
-  primitive("brokenpenalty", assign_int, int_base + broken_penalty_code);
-  primitive("binoppenalty", assign_int, int_base + bin_op_penalty_code);
-  primitive("relpenalty", assign_int, int_base + rel_penalty_code);
-  primitive("predisplaypenalty", assign_int, int_base + pre_display_penalty_code);
-  primitive("postdisplaypenalty", assign_int, int_base + post_display_penalty_code);
-  primitive("interlinepenalty", assign_int, int_base + inter_line_penalty_code);
-  primitive("doublehyphendemerits", assign_int, int_base + double_hyphen_demerits_code);
-  primitive("finalhyphendemerits", assign_int, int_base + final_hyphen_demerits_code);
-  primitive("adjdemerits", assign_int, int_base + adj_demerits_code);
-  primitive("mag", assign_int, int_base + mag_code);
-  primitive("delimiterfactor", assign_int, int_base + delimiter_factor_code);
-  primitive("looseness", assign_int, int_base + looseness_code);
-  primitive("time", assign_int, int_base + time_code);
-  primitive("day", assign_int, int_base + day_code);
-  primitive("month", assign_int, int_base + month_code);
-  primitive("year", assign_int, int_base + year_code);
-  primitive("showboxbreadth", assign_int, int_base + show_box_breadth_code);
-  primitive("showboxdepth", assign_int, int_base + show_box_depth_code);
-  primitive("hbadness", assign_int, int_base + hbadness_code);
-  primitive("vbadness", assign_int, int_base + vbadness_code);
-  primitive("pausing", assign_int, int_base + pausing_code);
-  primitive("tracingonline", assign_int, int_base + tracing_online_code);
-  primitive("tracingmacros", assign_int, int_base + tracing_macros_code);
-  primitive("tracingstats", assign_int, int_base + tracing_stats_code);
-  primitive("tracingparagraphs", assign_int, int_base + tracing_paragraphs_code);
-  primitive("tracingpages", assign_int, int_base + tracing_pages_code);
-  primitive("tracingoutput", assign_int, int_base + tracing_output_code);
-  primitive("tracinglostchars", assign_int, int_base + tracing_lost_chars_code);
-  primitive("tracingcommands", assign_int, int_base + tracing_commands_code);
-  primitive("tracingrestores", assign_int, int_base + tracing_restores_code);
-  primitive("uchyph", assign_int, int_base + uc_hyph_code);
-  primitive("outputpenalty", assign_int, int_base + output_penalty_code);
-  primitive("maxdeadcycles", assign_int, int_base + max_dead_cycles_code);
-  primitive("hangafter", assign_int, int_base + hang_after_code);
-  primitive("floatingpenalty", assign_int, int_base + floating_penalty_code);
-  primitive("globaldefs", assign_int, int_base + global_defs_code);
-  primitive("fam", assign_int, int_base + cur_fam_code);
-  primitive("escapechar", assign_int, int_base + escape_char_code);
-  primitive("defaulthyphenchar", assign_int, int_base + default_hyphen_char_code);
-  primitive("defaultskewchar", assign_int, int_base + default_skew_char_code);
-  primitive("endlinechar", assign_int, int_base + end_line_char_code);
-  primitive("newlinechar", assign_int, int_base + new_line_char_code);
-  primitive("language", assign_int, int_base + language_code);
-  primitive("lefthyphenmin", assign_int, int_base + left_hyphen_min_code);
-  primitive("righthyphenmin", assign_int, int_base + right_hyphen_min_code);
-  primitive("holdinginserts", assign_int, int_base + holding_inserts_code);
-  primitive("errorcontextlines", assign_int, int_base + error_context_lines_code);
-  /* sec 0248 */
-  primitive("parindent", assign_dimen, dimen_base + par_indent_code);
-  primitive("mathsurround", assign_dimen, dimen_base + math_surround_code);
-  primitive("lineskiplimit", assign_dimen, dimen_base + line_skip_limit_code);
-  primitive("hsize", assign_dimen, dimen_base + hsize_code);
-  primitive("vsize", assign_dimen, dimen_base + vsize_code);
-  primitive("maxdepth", assign_dimen, dimen_base + max_depth_code);
-  primitive("splitmaxdepth", assign_dimen, dimen_base + split_max_depth_code);
-  primitive("boxmaxdepth", assign_dimen, dimen_base + box_max_depth_code);
-  primitive("hfuzz", assign_dimen, dimen_base + hfuzz_code);
-  primitive("vfuzz", assign_dimen, dimen_base + vfuzz_code);
-  primitive("delimitershortfall", assign_dimen, dimen_base + delimiter_shortfall_code);
-  primitive("nulldelimiterspace", assign_dimen, dimen_base + null_delimiter_space_code);
-  primitive("scriptspace", assign_dimen, dimen_base + script_space_code);
-  primitive("predisplaysize", assign_dimen, dimen_base + pre_display_size_code);
-  primitive("displaywidth", assign_dimen, dimen_base + display_width_code);
-  primitive("displayindent", assign_dimen, dimen_base + display_indent_code);
-  primitive("overfullrule", assign_dimen, dimen_base + overfull_rule_code);
-  primitive("hangindent", assign_dimen, dimen_base + hang_indent_code);
-  primitive("hoffset", assign_dimen, dimen_base + h_offset_code);
-  primitive("voffset", assign_dimen, dimen_base + v_offset_code);
-  primitive("emergencystretch", assign_dimen, dimen_base + emergency_stretch_code);
-  primitive(" ", ex_space, 0);
-  primitive("/", ital_corr, 0);
-  primitive("accent", accent, 0);
-  primitive("advance", advance, 0);
-  primitive("afterassignment", after_assignment, 0);
-  primitive("aftergroup", after_group, 0);
-  primitive("begingroup", begin_group, 0);
-  primitive("char", char_num, 0);
-  primitive("csname", cs_name, 0);
-  primitive("delimiter", delim_num, 0);
-  primitive("divide", divide, 0);
-  primitive("endcsname", end_cs_name, 0);
-  primitive("endgroup", end_group, 0);
-  text(frozen_end_group) = make_string_pool("endgroup");
-  eqtb[frozen_end_group] = eqtb[cur_val]; 
-  primitive("expandafter", expand_after, 0);
-  primitive("font", def_font, 0);
-  primitive("fontdimen", assign_font_dimen, 0);
-  primitive("halign", halign, 0);
-  primitive("hrule", hrule, 0);
-  primitive("ignorespaces", ignore_spaces, 0);
-  primitive("insert", insert, 0);
-  primitive("mark", mark, 0);
-  primitive("mathaccent", math_accent, 0);
-  primitive("mathchar", math_char_num, 0);
-  primitive("mathchoice", math_choice, 0);
-  primitive("multiply", multiply, 0);
-  primitive("noalign", no_align, 0);
-  primitive("noboundary", no_boundary, 0);
-  primitive("noexpand", no_expand, 0);
-  primitive("nonscript", non_script, 0);
-  primitive("omit", omit, 0);
-  primitive("parshape", set_shape, 0);
-  primitive("penalty", break_penalty, 0);
-  primitive("prevgraf", set_prev_graf, 0);
-  primitive("radical", radical, 0);
-  primitive("read", read_to_cs, 0);
-  primitive("relax", relax, 256);
-  text(frozen_relax) = make_string_pool("relax");
-  eqtb[frozen_relax] = eqtb[cur_val];
-  primitive("setbox", set_box, 0);
-  primitive("the", the, 0);
-  primitive("toks", toks_register, 0);
-  primitive("vadjust", vadjust, 0);
-  primitive("valign", valign, 0);
-  primitive("vcenter", vcenter, 0);
-  primitive("vrule", vrule, 0);
-  primitive("par", par_end, 256);
-  par_loc = cur_val; 
-  par_token = cs_token_flag + par_loc;
-  primitive("input", input, 0);
-  primitive("endinput", input, 1);
-  primitive("topmark", top_bot_mark, top_mark_code);
-  primitive("firstmark", top_bot_mark, first_mark_code);
-  primitive("botmark", top_bot_mark, bot_mark_code);
-  primitive("splitfirstmark", top_bot_mark, split_first_mark_code);
-  primitive("splitbotmark", top_bot_mark, split_bot_mark_code);
-  primitive("count", tex_register, int_val);
-  primitive("dimen", tex_register, dimen_val);
-  primitive("skip", tex_register, glue_val);
-  primitive("muskip", tex_register, mu_val);
-  primitive("spacefactor", set_aux, hmode);
-  primitive("prevdepth", set_aux, vmode);
-  primitive("deadcycles", set_page_int, 0);
-  primitive("insertpenalties", set_page_int, 1);
-  primitive("wd", set_box_dimen, width_offset);
-  primitive("ht", set_box_dimen, height_offset);
-  primitive("dp", set_box_dimen, depth_offset);
-  primitive("lastpenalty", last_item, int_val);
-  primitive("lastkern", last_item, dimen_val);
-  primitive("lastskip", last_item, glue_val);
-  primitive("inputlineno", last_item, input_line_no_code);
-  primitive("badness", last_item, badness_code);
-  primitive("number", convert, number_code);
-  primitive("romannumeral", convert, roman_numeral_code);
-  primitive("string", convert, string_code);
-  primitive("meaning", convert, meaning_code);
-  primitive("fontname", convert, font_name_code);
-  primitive("jobname", convert, job_name_code);
-  primitive("if", if_test, if_char_code);
-  primitive("ifcat", if_test, if_cat_code);
-  primitive("ifnum", if_test, if_int_code);
-  primitive("ifdim", if_test, if_dim_code);
-  primitive("ifodd", if_test, if_odd_code);
-  primitive("ifvmode", if_test, if_vmode_code);
-  primitive("ifhmode", if_test, if_hmode_code);
-  primitive("ifmmode", if_test, if_mmode_code);
-  primitive("ifinner", if_test, if_inner_code);
-  primitive("ifvoid", if_test, if_void_code);
-  primitive("ifhbox", if_test, if_hbox_code);
-  primitive("ifvbox", if_test, if_vbox_code);
-  primitive("ifx", if_test, ifx_code);
-  primitive("ifeof", if_test, if_eof_code);
-  primitive("iftrue", if_test, if_true_code);
-  primitive("iffalse", if_test, if_false_code);
-  primitive("ifcase", if_test, if_case_code);
-  primitive("fi", fi_or_else, fi_code);
-  text(frozen_fi) = make_string_pool("fi");
-  eqtb[frozen_fi] = eqtb[cur_val];
-  primitive("or", fi_or_else, or_code);
-  primitive("else", fi_or_else, else_code);
-  primitive("nullfont", set_font, null_font);
-  text(frozen_null_font) = 795;
-  eqtb[frozen_null_font] = eqtb[cur_val];
-  primitive("span", tab_mark, span_code);
-  primitive("cr", car_ret, cr_code);
-  text(frozen_cr) = make_string_pool("cr");
-  eqtb[frozen_cr] = eqtb[cur_val];
-  primitive("crcr", car_ret, cr_cr_code);
-  text(frozen_end_template) = make_string_pool("endtemplate");
-  text(frozen_endv) = make_string_pool("endtemplate");
-  eq_type(frozen_endv) = endv;
-  equiv(frozen_endv) = null_list; 
-  eq_level(frozen_endv) = level_one; 
-  eqtb[frozen_end_template] = eqtb[frozen_endv]; 
-  eq_type(frozen_end_template) = end_template;
-  primitive("pagegoal", set_page_dimen, 0);
-  primitive("pagetotal", set_page_dimen, 1);
-  primitive("pagestretch", set_page_dimen, 2);
-  primitive("pagefilstretch", set_page_dimen, 3);
-  primitive("pagefillstretch", set_page_dimen, 4);
-  primitive("pagefilllstretch", set_page_dimen, 5);
-  primitive("pageshrink", set_page_dimen, 6);
-  primitive("pagedepth", set_page_dimen, 7);
-  primitive("end", stop, 0);
-  primitive("dump", stop, 1);
-  primitive("hskip", hskip, skip_code);
-  primitive("hfil", hskip, fil_code);
-  primitive("hfill", hskip, fill_code);
-  primitive("hss", hskip, ss_code);
-  primitive("hfilneg", hskip, fil_neg_code);
-  primitive("vskip", vskip, skip_code);
-  primitive("vfil", vskip, fil_code);
-  primitive("vfill", vskip, fill_code);
-  primitive("vss", vskip, ss_code);
-  primitive("vfilneg", vskip, fil_neg_code);
-  primitive("mskip", mskip, mskip_code);
-  primitive("kern", kern, explicit);
-  primitive("mkern", mkern, mu_glue);
-  primitive("moveleft", hmove, 1);
-  primitive("moveright", hmove, 0);
-  primitive("raise", vmove, 1);
-  primitive("lower", vmove, 0);
-  primitive("box", make_box, box_code);
-  primitive("copy", make_box, copy_code);
-  primitive("lastbox", make_box, last_box_code);
-  primitive("vsplit", make_box, vsplit_code);
-  primitive("vtop", make_box, vtop_code);
-  primitive("vbox", make_box, vtop_code + vmode);
-  primitive("hbox", make_box, vtop_code + hmode);
-  primitive("shipout", leader_ship, a_leaders - 1);
-  primitive("leaders", leader_ship, a_leaders);
-  primitive("cleaders", leader_ship, c_leaders);
-  primitive("xleaders", leader_ship, x_leaders);
-  primitive("indent", start_par, 1);
-  primitive("noindent", start_par, 0);
-  primitive("unpenalty", remove_item, penalty_node);
-  primitive("unkern", remove_item, kern_node);
-  primitive("unskip", remove_item, glue_node);
-  primitive("unhbox", un_hbox, box_code);
-  primitive("unhcopy", un_hbox, copy_code);
-  primitive("unvbox", un_vbox, box_code);
-  primitive("unvcopy", un_vbox, copy_code);
-  primitive("-", discretionary, 1);
-  primitive("discretionary", discretionary, 0);
-  primitive("eqno", eq_no, 0);
-  primitive("leqno", eq_no, 1);
-  primitive("mathord", math_comp, ord_noad);
-  primitive("mathop", math_comp, op_noad);
-  primitive("mathbin", math_comp, bin_noad);
-  primitive("mathrel", math_comp, rel_noad);
-  primitive("mathopen", math_comp, open_noad);
-  primitive("mathclose", math_comp, close_noad);
-  primitive("mathpunct", math_comp, punct_noad);
-  primitive("mathinner", math_comp, inner_noad);
-  primitive("underline", math_comp, under_noad);
-  primitive("overline", math_comp, over_noad);
-  primitive("displaylimits", limit_switch, normal);
-  primitive("limits", limit_switch, limits);
-  primitive("nolimits", limit_switch, no_limits);
-  primitive("displaystyle", math_style, display_style);
-  primitive("textstyle", math_style, text_style);
-  primitive("scriptstyle", math_style, script_style);
-  primitive("scriptscriptstyle", math_style, script_script_style);
-  primitive("above", above, above_code);
-  primitive("over", above, over_code);
-  primitive("atop", above, atop_code);
-  primitive("abovewithdelims", above, delimited_code + above_code);
-  primitive("overwithdelims", above, delimited_code + over_code);
-  primitive("atopwithdelims", above, delimited_code + atop_code);
-  primitive("left", left_right, left_noad);
-  primitive("right", left_right, right_noad);
-  text(frozen_right) = make_string_pool("right");
-  eqtb[frozen_right] = eqtb[cur_val]; 
-  primitive("long", prefix, 1);
-  primitive("outer", prefix, 2);
-  primitive("global", prefix, 4);
-  primitive("def", def, 0);
-  primitive("gdef", def, 1);
-  primitive("edef", def, 2);
-  primitive("xdef", def, 3);
-  primitive("let", let, normal);
-  primitive("futurelet", let, normal + 1);
-  primitive("chardef", shorthand_def, char_def_code);
-  primitive("mathchardef", shorthand_def, math_char_def_code);
-  primitive("countdef", shorthand_def, count_def_code);
-  primitive("dimendef", shorthand_def, dimen_def_code);
-  primitive("skipdef", shorthand_def, skip_def_code);
-  primitive("muskipdef", shorthand_def, mu_skip_def_code);
-  primitive("toksdef", shorthand_def, toks_def_code);
-  primitive("catcode", def_code, cat_code_base);
-  primitive("mathcode", def_code, math_code_base);
-  primitive("lccode", def_code, lc_code_base);
-  primitive("uccode", def_code, uc_code_base);
-  primitive("sfcode", def_code, sf_code_base);
-  primitive("delcode", def_code, del_code_base);
-  primitive("textfont", def_family, math_font_base);
-  primitive("scriptfont", def_family, math_font_base + script_size);
-  primitive("scriptscriptfont", def_family, math_font_base + script_script_size);
-  primitive("hyphenation", hyph_data, 0);
-  primitive("patterns", hyph_data, 1);
-  primitive("hyphenchar", assign_font_int, 0);
-  primitive("skewchar", assign_font_int, 1);
-  primitive("batchmode", set_interaction, batch_mode);
-  primitive("nonstopmode", set_interaction, nonstop_mode);
-  primitive("scrollmode", set_interaction, scroll_mode);
-  primitive("errorstopmode", set_interaction, error_stop_mode);
-  primitive("openin", in_stream, 1);
-  primitive("closein", in_stream, 0);
-  primitive("message", message, 0);
-  primitive("errmessage", message, 1);
-  primitive("lowercase", case_shift, lc_code_base);
-  primitive("uppercase", case_shift, uc_code_base);
-  primitive("show", xray, show_code);
-  primitive("showbox", xray, show_box_code);
-  primitive("showthe", xray, show_the_code);
-  primitive("showlists", xray, show_lists);
-  primitive("openout", extension, open_node);
-  primitive("write", extension, write_node);
-  write_loc = cur_val;
-  primitive("closeout", extension, close_node);
-  primitive("special", extension, special_node);
-  primitive("immediate", extension, immediate_code);
-  primitive("setlanguage", extension, set_language_code);
-  no_new_control_sequence = true; 
-}
-#endif
+/* Copyright 1992 Karl Berry\r
+   Copyright 2007 TeX Users Group\r
+   Copyright 2014 Clerk Ma\r
+\r
+   This program is free software; you can redistribute it and/or modify\r
+   it under the terms of the GNU General Public License as published by\r
+   the Free Software Foundation; either version 2 of the License, or\r
+   (at your option) any later version.\r
+\r
+   This program is distributed in the hope that it will be useful, but\r
+   WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+   General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with this program; if not, write to the Free Software\r
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA\r
+   02110-1301 USA.  */\r
+\r
+#define EXTERN extern\r
+\r
+#include "yandytex.h"\r
+\r
+#define BEGINFMTCHECKSUM 367403084L\r
+#define ENDFMTCHECKSUM   69069L\r
+\r
+#ifdef INITEX\r
+  void do_initex (void);\r
+#endif\r
+\r
+/* sec 0004 */\r
+void initialize (void)\r
+{\r
+  integer i;\r
+  integer k;\r
+  integer flag;\r
+\r
+#ifndef ALLOCATEHYPHEN\r
+  hyph_pointer z;\r
+#endif\r
+\r
+  if (!non_ascii)\r
+  {\r
+    for (i = 0; i <= 255; i++)\r
+      xchr[i] = (char) i;\r
+\r
+#ifdef JOKE\r
+    xchr[32] = ' ';  xchr[33] = '!';  xchr[34] = '"';  xchr[35] = '#';\r
+    xchr[36] = '$';  xchr[37] = '%';  xchr[38] = '&';  xchr[39] = '\'';\r
+    xchr[40] = '(';  xchr[41] = ')';  xchr[42] = '*';  xchr[43] = '+';\r
+    xchr[44] = ',';  xchr[45] = '-';  xchr[46] = '.';  xchr[47] = '/';\r
+    xchr[48] = '0';  xchr[49] = '1';  xchr[50] = '2';  xchr[51] = '3';\r
+    xchr[52] = '4';  xchr[53] = '5';  xchr[54] = '6';  xchr[55] = '7';\r
+    xchr[56] = '8';  xchr[57] = '9';  xchr[58] = ':';  xchr[59] = ';';\r
+    xchr[60] = '<';  xchr[61] = '=';  xchr[62] = '>';  xchr[63] = '?';\r
+    xchr[64] = '@';  xchr[65] = 'A';  xchr[66] = 'B';  xchr[67] = 'C';\r
+    xchr[68] = 'D';  xchr[69] = 'E';  xchr[70] = 'F';  xchr[71] = 'G';\r
+    xchr[72] = 'H';  xchr[73] = 'I';  xchr[74] = 'J';  xchr[75] = 'K';\r
+    xchr[76] = 'L';  xchr[77] = 'M';  xchr[78] = 'N';  xchr[79] = 'O';\r
+    xchr[80] = 'P';  xchr[81] = 'Q';  xchr[82] = 'R';  xchr[83] = 'S';\r
+    xchr[84] = 'T';  xchr[85] = 'U';  xchr[86] = 'V';  xchr[87] = 'W';\r
+    xchr[88] = 'X';  xchr[89] = 'Y';  xchr[90] = 'Z';  xchr[91] = '[';\r
+    xchr[92] = '\\'; xchr[93] = ']';  xchr[94] = '^';  xchr[95] = '_';\r
+    xchr[96] = '`';  xchr[97] = 'a';  xchr[98] = 'b';  xchr[99] = 'c';\r
+    xchr[100] = 'd'; xchr[101] = 'e'; xchr[102] = 'f'; xchr[103] = 'g';\r
+    xchr[104] = 'h'; xchr[105] = 'i'; xchr[106] = 'j'; xchr[107] = 'k';\r
+    xchr[108] = 'l'; xchr[109] = 'm'; xchr[110] = 'n'; xchr[111] = 'o';\r
+    xchr[112] = 'p'; xchr[113] = 'q'; xchr[114] = 'r'; xchr[115] = 's';\r
+    xchr[116] = 't'; xchr[117] = 'u'; xchr[118] = 'v'; xchr[119] = 'w';\r
+    xchr[120] = 'x'; xchr[121] = 'y'; xchr[122] = 'z'; xchr[123] = '{';\r
+    xchr[124] = '|'; xchr[125] = '}'; xchr[126] = '~';\r
+\r
+    for (i = 0; i <= 31; i++)\r
+      xchr[i] = chr(i);\r
+\r
+    for (i = 127; i <= 255; i++)\r
+      xchr[i]= chr(i);\r
+#endif\r
+  }\r
+\r
+  for (i = 0; i <= 255; i++)\r
+    xord[chr(i)] = invalid_code;\r
+\r
+#ifdef JOKE\r
+  for (i = 128; i <= 255 ; i++)\r
+    xord[xchr[i]] = i;\r
+\r
+  for (i = 0; i <= 126; i++)\r
+    xord[xchr[i]] = i;\r
+#endif\r
+\r
+  for (i = 0; i <= 255; i++)\r
+    xord[xchr[i]] = (char) i;\r
+\r
+  xord[127] = 127;\r
+\r
+  flag = 0;\r
+\r
+  if (trace_flag != 0)\r
+  {\r
+    for (k = 0; k < 256; k++)\r
+      if (xord[k] != k)\r
+      {\r
+        flag = 1;\r
+        break;\r
+      }\r
+\r
+    if (flag)\r
+    {\r
+      puts("Inverted mapping xord[] pairs:");\r
+\r
+      for (k = 0; k < 256; k++)\r
+      {\r
+        if (xord[k] != 127)\r
+          printf("%lld => %d\n", k, xord[k]);\r
+      }\r
+    }\r
+  }\r
+\r
+  if (interaction < batch_mode)\r
+    interaction = error_stop_mode;\r
+\r
+  deletions_allowed = true;\r
+  set_box_allowed = true;\r
+  error_count = 0;\r
+  help_ptr = 0;\r
+  use_err_help = false;\r
+  interrupt = 0;\r
+  OK_to_interrupt = true;\r
+\r
+#ifdef DEBUG\r
+  was_mem_end = mem_min;\r
+  was_lo_max = mem_bot; // mem_min\r
+  was_hi_min = mem_top; // mem_max\r
+  panicking = false;\r
+#endif\r
+\r
+  nest_ptr = 0;\r
+  max_nest_stack = 0;\r
+  mode = vmode;\r
+  head = contrib_head;\r
+  tail = contrib_head;\r
+  prev_depth = ignore_depth;\r
+  mode_line = 0;\r
+  prev_graf = 0;\r
+  shown_mode = 0;\r
+  page_contents = 0;\r
+  page_tail = page_head;\r
+\r
+#ifdef ALLOCATEMAIN\r
+  if (is_initex)\r
+#endif\r
+    link(page_head) = 0;\r
+\r
+  last_glue = max_halfword;\r
+  last_penalty = 0;\r
+  last_kern = 0;\r
+  page_depth = 0;\r
+  page_max_depth = 0;\r
+\r
+  for (k = int_base; k <= eqtb_size; k++)\r
+    xeq_level[k] = level_one;\r
+\r
+  no_new_control_sequence = true;\r
+  next(hash_base) = 0;\r
+  text(hash_base) = 0;\r
+\r
+  for (k = hash_base + 1; k <= undefined_control_sequence - 1; k++)\r
+    hash[k] = hash[hash_base];\r
+\r
+  save_ptr = 0;\r
+  cur_level = 1;\r
+  cur_group = 0;\r
+  cur_boundary = 0;\r
+  max_save_stack = 0;\r
+  mag_set = 0;\r
+  cur_mark[0] = 0;\r
+  cur_mark[1] = 0;\r
+  cur_mark[2] = 0;\r
+  cur_mark[3] = 0;\r
+  cur_mark[4] = 0;\r
+  cur_val = 0;\r
+  cur_val_level = int_val;\r
+  radix = 0;\r
+  cur_order = normal;\r
+\r
+  for (k = 0; k <= 16; k++)\r
+    read_open[k] = closed;\r
+\r
+  cond_ptr = 0;\r
+  if_limit = normal;\r
+  cur_if = 0;\r
+  if_line = 0;\r
+\r
+  for (k = 0; k <= font_max; k++)\r
+    font_used[k] = false;\r
+\r
+  null_character.b0 = min_quarterword;\r
+  null_character.b1 = min_quarterword;\r
+  null_character.b2 = min_quarterword;\r
+  null_character.b3 = min_quarterword;\r
+  total_pages = 0;\r
+  max_v = 0;\r
+  max_h = 0;\r
+  max_push = 0;\r
+  last_bop = -1;\r
+  doing_leaders = false;\r
+  dead_cycles = 0;\r
+  cur_s = -1;\r
+  half_buf = dvi_buf_size / 2;\r
+  dvi_limit = dvi_buf_size;\r
+  dvi_ptr = 0;\r
+  dvi_offset = 0;\r
+  dvi_gone = 0;\r
+  down_ptr = 0;\r
+  right_ptr = 0;\r
+  adjust_tail = 0;\r
+  last_badness = 0;\r
+  pack_begin_line = 0;\r
+  empty_field.rh = 0;\r
+  empty_field.lh = 0;\r
+  null_delimiter.b0 = 0;\r
+  null_delimiter.b1 = 0;\r
+  null_delimiter.b2 = 0;\r
+  null_delimiter.b3 = 0;\r
+  align_ptr = 0;\r
+  cur_align = 0;\r
+  cur_span = 0;\r
+  cur_loop = 0;\r
+  cur_head = 0;\r
+  cur_tail = 0;\r
+\r
+/*  *not* OK with ALLOCATEHYPHEN, since may not be allocated yet */\r
+#ifndef ALLOCATEHYPHEN\r
+  for (z = 0; z <= hyphen_prime; z++)\r
+  {\r
+    hyph_word[z] = 0;\r
+    hyph_list[z] = 0;\r
+  }\r
+#endif\r
+\r
+  hyph_count = 0;\r
+  output_active = false;\r
+  insert_penalties = 0;\r
+  ligature_present = false;\r
+  cancel_boundary = false;\r
+  lft_hit = false;\r
+  rt_hit = false;\r
+  ins_disc = false;\r
+  after_token = 0;\r
+  long_help_seen = false;\r
+  format_ident = 0;\r
+\r
+  for (k = 0; k <= 17; k++)\r
+    write_open[k] = false;\r
+\r
+  edit_name_start = 0;\r
+\r
+#ifdef INITEX\r
+  if (is_initex)\r
+    do_initex();\r
+#endif\r
+}\r
+\r
+/* do the part of initialize() that requires mem_top, mem_max or mem[] */\r
+/* do this part after allocating main memory */\r
+\r
+#ifdef ALLOCATEMAIN\r
+void initialize_aux (void)\r
+{\r
+#ifdef DEBUG\r
+  was_mem_end = mem_min;\r
+  was_lo_max = mem_bot; // mem_min\r
+  was_hi_min = mem_top; // mem_max\r
+  panicking = false;\r
+#endif\r
+\r
+/*  nest_ptr = 0; */\r
+/*  max_nest_stack = 0; */\r
+  mode = vmode;\r
+  head = contrib_head;\r
+  tail = contrib_head;\r
+  prev_depth = ignore_depth;\r
+  mode_line = 0;\r
+  prev_graf = 0;\r
+/*  shown_mode = 0; */\r
+/*  page_contents = 0; */\r
+  page_tail = page_head;\r
+  link(page_head) = 0;\r
+}\r
+#endif\r
+/* sec 0815 */\r
+void line_break (integer final_widow_penalty)\r
+{\r
+  boolean auto_breaking;\r
+  pointer prev_p;\r
+  pointer q, r, s, prev_s;\r
+  internal_font_number f;\r
+  /* small_number j; */\r
+  int j;\r
+  /* unsigned char c; */\r
+  unsigned int c;\r
+\r
+  pack_begin_line = mode_line;\r
+  link(temp_head) = link(head);\r
+\r
+  if (is_char_node(tail))\r
+    tail_append(new_penalty(inf_penalty));\r
+  else if (type(tail) != glue_node)\r
+    tail_append(new_penalty(inf_penalty));\r
+  else\r
+  {\r
+    type(tail) = penalty_node;\r
+    delete_glue_ref(glue_ptr(tail));\r
+    flush_node_list(leader_ptr(tail));\r
+    penalty(tail) = inf_penalty;\r
+  }\r
+\r
+  link(tail) = new_param_glue(par_fill_skip_code);\r
+  init_cur_lang = prev_graf % 65536L;\r
+  init_l_hyf = prev_graf / 4194304L; /* 2^22 */\r
+  init_r_hyf = (prev_graf / 65536L) % 64;\r
+  pop_nest();\r
+  no_shrink_error_yet = true;\r
+  check_shrinkage(left_skip);\r
+  check_shrinkage(right_skip);\r
+  q = left_skip;\r
+  r = right_skip;\r
+  background[1] = width(q) + width(r);\r
+  background[2] = 0;\r
+  background[3] = 0;\r
+  background[4] = 0;\r
+  background[5] = 0;\r
+  background[2 + stretch_order(q)] = stretch(q);\r
+  background[2 + stretch_order(r)] = background[2 + stretch_order(r)] + stretch(r);\r
+  background[6] = shrink(q) + shrink(r);\r
+  minimum_demerits = awful_bad;\r
+  minimal_demerits[tight_fit] = awful_bad;\r
+  minimal_demerits[decent_fit] = awful_bad;\r
+  minimal_demerits[loose_fit] = awful_bad;\r
+  minimal_demerits[very_loose_fit] = awful_bad;\r
+\r
+  if (par_shape_ptr == 0)\r
+    if (hang_indent == 0)\r
+    {\r
+      last_special_line = 0;\r
+      second_width = hsize;\r
+      second_indent = 0;\r
+    }\r
+    else\r
+    {\r
+      last_special_line = abs(hang_after);\r
+\r
+      if (hang_after < 0)\r
+      {\r
+        first_width = hsize - abs(hang_indent);\r
+\r
+        if (hang_indent >= 0)\r
+          first_indent = hang_indent;\r
+        else\r
+          first_indent = 0;\r
+\r
+        second_width = hsize;\r
+        second_indent = 0;\r
+      }\r
+      else\r
+      {\r
+        first_width = hsize;\r
+        first_indent = 0;\r
+        second_width = hsize - abs(hang_indent);\r
+\r
+        if (hang_indent >= 0)\r
+          second_indent = hang_indent;\r
+        else\r
+          second_indent = 0;\r
+      }\r
+    }\r
+  else\r
+  {\r
+    last_special_line = info(par_shape_ptr) - 1;\r
+    second_width = mem[par_shape_ptr + 2 * (last_special_line + 1)].cint;\r
+    second_indent = mem[par_shape_ptr + 2 * last_special_line + 1].cint;\r
+  }\r
+\r
+  if (looseness == 0)\r
+    easy_line = last_special_line;\r
+  else\r
+    easy_line = empty_flag;\r
+\r
+  threshold = pretolerance;\r
+\r
+  if (threshold >= 0)\r
+  {\r
+#ifdef STAT\r
+    if (tracing_paragraphs > 0)\r
+    {\r
+      begin_diagnostic();\r
+      print_nl("@firstpass");\r
+    }\r
+#endif\r
+\r
+    second_pass = false;\r
+    final_pass = false;\r
+    first_pass_count++;\r
+  }\r
+  else\r
+  {\r
+    threshold = tolerance;\r
+    second_pass = true;\r
+    final_pass = (emergency_stretch <= 0);\r
+\r
+#ifdef STAT\r
+    if (tracing_paragraphs > 0)\r
+      begin_diagnostic();\r
+#endif\r
+  }\r
+\r
+  while (true)\r
+  {\r
+    if (threshold > inf_bad)\r
+      threshold = inf_bad;\r
+\r
+    if (second_pass)\r
+    {\r
+#ifdef INITEX\r
+      if (is_initex)\r
+      {\r
+        if (trie_not_ready)\r
+          init_trie();\r
+      }\r
+#endif\r
+\r
+      cur_lang = init_cur_lang;\r
+      l_hyf = init_l_hyf;\r
+      r_hyf = init_r_hyf;\r
+    }\r
+\r
+    q = get_node(active_node_size);\r
+    type(q) = unhyphenated;\r
+    fitness(q) = decent_fit;\r
+    link(q) = active;\r
+    break_node(q) = 0;\r
+    line_number(q) = prev_graf + 1;\r
+    total_demerits(q) = 0;\r
+    link(active) = q;\r
+    act_width = background[1];\r
+    do_all_six(store_background);\r
+    passive = 0;\r
+    printed_node = temp_head;\r
+    pass_number = 0;\r
+    font_in_short_display = null_font;\r
+    cur_p = link(temp_head);\r
+    auto_breaking = true;\r
+    prev_p = cur_p;\r
+\r
+    while ((cur_p != 0) && (link(active) != active))\r
+    {\r
+      if (is_char_node(cur_p))\r
+      {\r
+        prev_p = cur_p;\r
+\r
+        do\r
+          {\r
+            f = font(cur_p);\r
+            act_width = act_width + char_width(f, char_info(f, character(cur_p)));\r
+            cur_p = link(cur_p);\r
+          }\r
+        while (!(!is_char_node(cur_p)));\r
+      }\r
+\r
+      switch (type(cur_p))\r
+      {\r
+        case hlist_node:\r
+        case vlist_node:\r
+        case rule_node:\r
+          act_width = act_width + width(cur_p);\r
+          break;\r
+\r
+        case whatsit_node:\r
+          if (subtype(cur_p) == language_node)\r
+          {\r
+            cur_lang = what_lang(cur_p);\r
+            l_hyf = what_lhm(cur_p);\r
+            r_hyf = what_rhm(cur_p);\r
+          }\r
+          break;\r
+\r
+        case glue_node:\r
+          {\r
+            if (auto_breaking)\r
+            {\r
+              if (is_char_node(prev_p))\r
+                try_break(0, unhyphenated);\r
+              else if (precedes_break(prev_p))\r
+                try_break(0, unhyphenated);\r
+              else if ((type(prev_p) == kern_node) && (subtype(prev_p) != explicit))\r
+                try_break(0, unhyphenated);\r
+            }\r
+\r
+            check_shrinkage(glue_ptr(cur_p));\r
+            q = glue_ptr(cur_p);\r
+            act_width = act_width+ width(q);\r
+            active_width[2 + stretch_order(q)] = active_width[2 + stretch_order(q)] + stretch(q);\r
+            active_width[6] = active_width[6] + shrink(q);\r
+\r
+            if (second_pass && auto_breaking)\r
+            {\r
+              prev_s = cur_p;\r
+              s = link(prev_s);\r
+\r
+              if (s != 0)\r
+              {\r
+                while (true)\r
+                {\r
+                  if (is_char_node(s))\r
+                  {\r
+                    c = character(s);\r
+                    hf = font(s);\r
+                  }\r
+                  else if (type(s) == ligature_node)\r
+                    if (lig_ptr(s) == 0)\r
+                      goto continu;\r
+                    else\r
+                    {\r
+                      q = lig_ptr(s);\r
+                      c = character(q);\r
+                      hf = font(q);\r
+                    }\r
+                  else if ((type(s) == kern_node) && (subtype(s) == normal))\r
+                    goto continu;\r
+                  else if (type(s) == whatsit_node)\r
+                  {\r
+                    if (subtype(s) == language_node)\r
+                    {\r
+                      cur_lang = what_lang(s);\r
+                      l_hyf = what_lhm(s);\r
+                      r_hyf = what_rhm(s);\r
+                    }\r
+                    goto continu;\r
+                  }\r
+                  else\r
+                    goto done1;\r
+\r
+                  if (lc_code(c) != 0)\r
+                    if ((lc_code(c) == (halfword) c) || (uc_hyph > 0))\r
+                      goto done2;\r
+                    else\r
+                      goto done1;\r
+continu:\r
+                  prev_s = s;\r
+                  s = link(prev_s);\r
+                }\r
+done2:\r
+                hyf_char = hyphen_char[hf];\r
+\r
+                if (hyf_char < 0)\r
+                  goto done1; \r
+\r
+                if (hyf_char > 255)\r
+                  goto done1;\r
+\r
+                ha = prev_s;\r
+\r
+                if (l_hyf + r_hyf > 63)\r
+                  goto done1;\r
+\r
+                hn = 0;\r
+\r
+                while (true)\r
+                {\r
+                  if (is_char_node(s))\r
+                  {\r
+                    if (font(s) != hf)\r
+                      goto done3;\r
+\r
+                    hyf_bchar = character(s);\r
+\r
+                    c = hyf_bchar;\r
+\r
+                    if (lc_code(c) == 0)\r
+                      goto done3;\r
+\r
+                    if (hn == 63)\r
+                      goto done3;\r
+\r
+                    hb = s;\r
+                    incr(hn);\r
+                    hu[hn] = c;\r
+                    hc[hn]= lc_code(c);\r
+                    hyf_bchar = non_char;\r
+                  }\r
+                  else if (type(s) == ligature_node)\r
+                  {\r
+                    if (font(lig_char(s)) != hf)\r
+                      goto done3;\r
+\r
+                    j = hn;\r
+                    q = lig_ptr(s);\r
+\r
+                    if (q != 0)\r
+                      hyf_bchar = character(q);\r
+\r
+                    while (q != 0)\r
+                    {\r
+                      c = character(q);\r
+\r
+                      if (lc_code(c) == 0)\r
+                        goto done3;\r
+\r
+                      if (j == 63)\r
+                        goto done3;\r
+\r
+                      incr(j);\r
+                      hu[j] = c;\r
+                      hc[j] = lc_code(c);\r
+                      q = link(q);\r
+                    }\r
+\r
+                    hb = s;\r
+                    hn = j;\r
+\r
+                    if (odd(subtype(s)))\r
+                      hyf_bchar = font_bchar[hf];\r
+                    else\r
+                      hyf_bchar = non_char;\r
+                  }\r
+                  else if ((type(s) == kern_node) && (subtype(s) == normal))\r
+                  {\r
+                    hb = s;\r
+                    hyf_bchar = font_bchar[hf];\r
+                  }\r
+                  else\r
+                    goto done3;\r
+\r
+                  s = link(s);\r
+                }\r
+done3:\r
+                if (hn < l_hyf + r_hyf)\r
+                  goto done1;\r
+\r
+                while (true)\r
+                {\r
+                  if (!(is_char_node(s)))\r
+                    switch (type(s))\r
+                    {\r
+                      case ligature_node:\r
+                        break;\r
+    \r
+                      case kern_node:\r
+                        if (subtype(s) != normal)\r
+                          goto done4;\r
+                        break;\r
+\r
+                      case whatsit_node:\r
+                      case glue_node:\r
+                      case penalty_node:\r
+                      case ins_node:\r
+                      case adjust_node:\r
+                      case mark_node:\r
+                        goto done4;\r
+                        break;\r
+\r
+                      default:\r
+                        goto done1;\r
+                        break;\r
+                    }\r
+                  s = link(s);\r
+                }\r
+done4:\r
+                hyphenate();\r
+              }\r
+done1:;\r
+            }\r
+          }\r
+          break;\r
+\r
+        case kern_node:\r
+          if (subtype(cur_p) == explicit)\r
+            kern_break();\r
+          else\r
+            act_width = act_width + width(cur_p);\r
+          break;\r
+\r
+        case ligature_node:\r
+          {\r
+            f = font(lig_char(cur_p));\r
+            act_width = act_width + char_width(f, char_info(f, character(lig_char(cur_p))));\r
+          }\r
+          break;\r
+\r
+        case disc_node:\r
+          {\r
+            s = pre_break(cur_p);\r
+            disc_width = 0;\r
+\r
+            if (s == 0)\r
+              try_break(ex_hyphen_penalty, hyphenated);\r
+            else\r
+            {\r
+              do\r
+                {\r
+                  if (is_char_node(s))\r
+                  {\r
+                    f = font(s);\r
+                    disc_width = disc_width + char_width(f, char_info(f, character(s)));\r
+                  }\r
+                  else switch (type(s))\r
+                  {\r
+                    case ligature_node:\r
+                      {\r
+                        f = font(lig_char(s));\r
+                        disc_width = disc_width + char_width(f, char_info(f, character(lig_char(s))));\r
+                      }\r
+                      break;\r
+\r
+                    case hlist_node:\r
+                    case vlist_node:\r
+                    case rule_node:\r
+                    case kern_node:\r
+                      disc_width = disc_width + width(s);\r
+                      break;\r
+\r
+                    default:\r
+                      {\r
+                        confusion("disc3");\r
+                        return;\r
+                      }\r
+                      break;\r
+                  }\r
+\r
+                  s = link(s);\r
+                }\r
+              while (!(s == 0));\r
+\r
+              act_width = act_width + disc_width;\r
+              try_break(hyphen_penalty, hyphenated);\r
+              act_width = act_width - disc_width;\r
+            }\r
+\r
+            r = replace_count(cur_p);\r
+            s = link(cur_p);\r
+\r
+            while (r > 0)\r
+            {\r
+              if (is_char_node(s))\r
+              {\r
+                f = font(s);\r
+                act_width = act_width + char_width(f, char_info(f, character(s)));\r
+              }\r
+              else switch (type(s))\r
+              {\r
+                case ligature_node:\r
+                  {\r
+                    f = font(lig_char(s));\r
+                    act_width = act_width + char_width(f, char_info(f, character(lig_char(s))));\r
+                  }\r
+                  break;\r
+\r
+                case hlist_node:\r
+                case vlist_node:\r
+                case rule_node:\r
+                case kern_node:\r
+                  act_width = act_width + width(s);\r
+                  break;\r
+\r
+                default:\r
+                  {\r
+                    confusion("disc4");\r
+                    return;\r
+                  }\r
+                  break;\r
+              }\r
+\r
+              decr(r);\r
+              s = link(s);\r
+            }\r
+\r
+            prev_p = cur_p;\r
+            cur_p = s;\r
+            goto done5;\r
+          }\r
+          break;\r
+\r
+        case math_node:\r
+          {\r
+            auto_breaking = (subtype(cur_p) == after);\r
+            kern_break();\r
+          }\r
+          break;\r
+\r
+        case penalty_node:\r
+          try_break(penalty(cur_p), unhyphenated);\r
+          break;\r
+\r
+        case mark_node:\r
+        case ins_node:\r
+        case adjust_node:\r
+          break;\r
+\r
+        default:\r
+          {\r
+            confusion("paragraph");\r
+            return;\r
+          }\r
+          break;\r
+      }\r
+\r
+      prev_p = cur_p;\r
+      cur_p = link(cur_p);\r
+done5:;\r
+    }\r
+\r
+    if (cur_p == 0)\r
+    {\r
+      try_break(eject_penalty, hyphenated);\r
+\r
+      if (link(active) != active)\r
+      {\r
+        r = link(active);\r
+        fewest_demerits = awful_bad;\r
+\r
+        do\r
+          {\r
+            if (type(r) != delta_node)\r
+              if (total_demerits(r) < fewest_demerits)\r
+              {\r
+                fewest_demerits = total_demerits(r);\r
+                best_bet = r;\r
+              }\r
+\r
+            r = link(r);\r
+          }\r
+        while (!(r == active));\r
+\r
+        best_line = line_number(best_bet);\r
+\r
+        if (looseness == 0)\r
+        {\r
+          goto done;\r
+        }\r
+\r
+        {\r
+          r = link(active);\r
+          actual_looseness = 0;\r
+\r
+          do\r
+            {\r
+              if (type(r) != delta_node)\r
+              {\r
+                line_diff = toint(line_number(r)) - toint(best_line);\r
+\r
+                if (((line_diff < actual_looseness) && (looseness <= line_diff)) ||\r
+                    ((line_diff > actual_looseness) && (looseness >= line_diff)))\r
+                {\r
+                  best_bet = r;\r
+                  actual_looseness = line_diff;\r
+                  fewest_demerits = total_demerits(r);\r
+                }\r
+                else if ((line_diff == actual_looseness) && (total_demerits(r) < fewest_demerits))\r
+                {\r
+                  best_bet = r;\r
+                  fewest_demerits = total_demerits(r);\r
+                }\r
+              }\r
+\r
+              r = link(r);\r
+            }\r
+          while (!(r == active));\r
+\r
+          best_line = line_number(best_bet);\r
+        }\r
+\r
+        if ((actual_looseness == looseness) || final_pass)\r
+        {\r
+          goto done;\r
+        }\r
+      }\r
+    }\r
+\r
+    q = link(active);\r
+\r
+    while (q != active)\r
+    {\r
+      cur_p = link(q);\r
+\r
+      if (type(q) == delta_node)\r
+        free_node(q, delta_node_size);\r
+      else\r
+        free_node(q, active_node_size);\r
+\r
+      q = cur_p;\r
+    }\r
+\r
+    q = passive;\r
+\r
+    while (q != 0)\r
+    {\r
+      cur_p = link(q);\r
+      free_node(q, passive_node_size);\r
+      q = cur_p;\r
+    }\r
+\r
+    if (!second_pass)\r
+    {\r
+#ifdef STAT\r
+      if (tracing_paragraphs > 0)\r
+        print_nl("@secondpass");\r
+#endif\r
+      threshold = tolerance;\r
+      second_pass = true;\r
+      second_pass_count++;\r
+      final_pass = (emergency_stretch <= 0);\r
+    }\r
+    else\r
+    {\r
+#ifdef STAT\r
+      if (tracing_paragraphs > 0)\r
+        print_nl("@emergencypass");\r
+#endif\r
+\r
+      background[2] = background[2] + emergency_stretch;\r
+      final_pass = true;\r
+      ++final_pass_count;\r
+    }\r
+  }\r
+\r
+done:\r
+  if (best_line == decent_fit)\r
+    single_line++;\r
+\r
+#ifdef STAT\r
+  if (tracing_paragraphs > 0)\r
+  {\r
+    end_diagnostic(true);\r
+    normalize_selector();\r
+  }\r
+#endif\r
+\r
+  post_line_break(final_widow_penalty);\r
+  q = link(active);\r
+\r
+  while (q != active)\r
+  {\r
+    cur_p = link(q);\r
+\r
+    if (type(q) == delta_node)\r
+      free_node(q, delta_node_size);\r
+    else\r
+      free_node(q, active_node_size);\r
+\r
+    q = cur_p;\r
+  }\r
+\r
+  q = passive;\r
+\r
+  while (q != 0)\r
+  {\r
+    cur_p = link(q);\r
+    free_node(q, passive_node_size);\r
+    q = cur_p;\r
+  }\r
+\r
+  pack_begin_line = 0;\r
+}\r
+/* sec 1211 */\r
+void prefixed_command (void)\r
+{\r
+  small_number a;\r
+  internal_font_number f;\r
+  halfword j;\r
+  font_index k;\r
+  pointer p, q;\r
+  integer n;\r
+  boolean e;\r
+\r
+  a = 0;\r
+\r
+  while (cur_cmd == prefix)\r
+  {\r
+    if (!odd(a / cur_chr))\r
+      a = a + cur_chr;\r
+\r
+    do\r
+      {\r
+        get_x_token();\r
+      }\r
+    while (!((cur_cmd != spacer) && (cur_cmd != relax)));\r
+\r
+    if (cur_cmd <= max_non_prefixed_command)\r
+    {\r
+      print_err("You can't use a prefix with `");\r
+      print_cmd_chr(cur_cmd, cur_chr);\r
+      print_char('\'');\r
+      help1("I'll pretend you didn't say \\long or \\outer or \\global.");\r
+      back_error();\r
+      return;\r
+    }\r
+  }\r
+\r
+  if ((cur_cmd != def) && (a % 4 != 0))\r
+  {\r
+    print_err("You can't use `");\r
+    print_esc("long");\r
+    prints("' or `");\r
+    print_esc("outer");\r
+    prints("' with `");\r
+    print_cmd_chr(cur_cmd, cur_chr);\r
+    print_char('\'');\r
+    help1("I'll pretend you didn't say \\long or \\outer here.");\r
+    error();\r
+  }\r
+\r
+  if (global_defs != 0)\r
+    if (global_defs < 0)\r
+    {\r
+      if ((a >= 4))\r
+        a = a - 4;\r
+    }\r
+    else\r
+    {\r
+      if (!(a >= 4))\r
+        a = a + 4;\r
+    }\r
+\r
+  switch (cur_cmd)\r
+  {\r
+    case set_font:\r
+      define(cur_font_loc, data, cur_chr);\r
+      break;\r
+\r
+    case def:\r
+      {\r
+        if (odd(cur_chr) && !(a >= 4) && (global_defs >= 0))\r
+          a = a + 4;\r
+\r
+        e = (cur_chr >= 2);\r
+        get_r_token();\r
+        p = cur_cs;\r
+        q = scan_toks(true, e);\r
+        define(p, call + (a % 4), def_ref);\r
+      }\r
+      break;\r
+\r
+    case let:\r
+      {\r
+        n = cur_chr;\r
+        get_r_token();\r
+        p = cur_cs;\r
+\r
+        if (n == 0)\r
+        {\r
+          do\r
+            {\r
+              get_token();\r
+            }\r
+          while (!(cur_cmd != spacer));\r
+\r
+          if (cur_tok == other_token + '=')\r
+          {\r
+            get_token();\r
+\r
+            if (cur_cmd == spacer)\r
+              get_token();\r
+          }\r
+        }\r
+        else\r
+        {\r
+          get_token();\r
+          q = cur_tok;\r
+          get_token();\r
+          back_input();\r
+          cur_tok = q;\r
+          back_input();\r
+        }\r
+\r
+        if (cur_cmd >= call)\r
+          add_token_ref(cur_chr);\r
+\r
+        define(p, cur_cmd, cur_chr);\r
+      }\r
+      break;\r
+\r
+    case shorthand_def:\r
+      {\r
+        n = cur_chr;\r
+        get_r_token();\r
+        p = cur_cs;\r
+        define(p, relax, 256);\r
+        scan_optional_equals();\r
+\r
+        switch (n)\r
+        {\r
+          case char_def_code:\r
+            {\r
+              scan_char_num();\r
+              define(p, char_given, cur_val);\r
+            }\r
+            break;\r
+\r
+          case math_char_def_code:\r
+            {\r
+              scan_fifteen_bit_int();\r
+              define(p, math_given, cur_val);\r
+            }\r
+            break;\r
+\r
+          default:\r
+            {\r
+              scan_eight_bit_int();\r
+\r
+              switch (n)\r
+              {\r
+                case count_def_code:\r
+                  define(p, assign_int, count_base + cur_val);\r
+                  break;\r
+\r
+                case dimen_def_code:\r
+                  define(p, assign_dimen, scaled_base + cur_val);\r
+                  break;\r
+\r
+                case skip_def_code:\r
+                  define(p, assign_glue, skip_base + cur_val);\r
+                  break;\r
+\r
+                case mu_skip_def_code:\r
+                  define(p, assign_mu_glue, mu_skip_base + cur_val);\r
+                  break;\r
+\r
+                case toks_def_code:\r
+                  define(p, assign_toks, toks_base + cur_val);\r
+                  break;\r
+              }\r
+            }\r
+            break;\r
+        }\r
+      }\r
+      break;\r
+\r
+    case read_to_cs:\r
+      {\r
+        scan_int();\r
+        n = cur_val;\r
+\r
+        if (!scan_keyword("to"))\r
+        {\r
+          print_err("Missing `to' inserted");\r
+          help2("You should have said `\\read<number> to \\cs'.",\r
+              "I'm going to look for the \\cs now.");\r
+          error();\r
+        }\r
+\r
+        get_r_token();\r
+        p = cur_cs;\r
+        read_toks(n, p);\r
+        define(p, call, cur_val);\r
+      }\r
+      break;\r
+\r
+    case toks_register:\r
+    case assign_toks:\r
+      {\r
+        q = cur_cs;\r
+\r
+        if (cur_cmd == toks_register)\r
+        {\r
+          scan_eight_bit_int();\r
+          p = toks_base + cur_val;\r
+        }\r
+        else\r
+          p = cur_chr;\r
+\r
+        scan_optional_equals();\r
+\r
+        do\r
+          {\r
+            get_x_token();\r
+          }\r
+        while (!((cur_cmd != spacer) && (cur_cmd != relax)));\r
+\r
+        if (cur_cmd != left_brace)\r
+        {\r
+          if (cur_cmd == toks_register)\r
+          {\r
+            scan_eight_bit_int();\r
+            cur_cmd = assign_toks;\r
+            cur_chr = toks_base + cur_val;\r
+          }\r
+\r
+          if (cur_cmd == assign_toks)\r
+          {\r
+            q = equiv(cur_chr);\r
+\r
+            if (q == 0)\r
+              define(p, undefined_cs, 0);\r
+            else\r
+            {\r
+              add_token_ref(q);\r
+              define(p, call, q);\r
+            }\r
+            goto done;\r
+          }\r
+        }\r
+\r
+        back_input();\r
+        cur_cs = q;\r
+        q = scan_toks(false, false);\r
+\r
+        if (link(def_ref) == 0)\r
+        {\r
+          define(p, undefined_cs, 0);\r
+          free_avail(def_ref);\r
+        }\r
+        else\r
+        {\r
+          if (p == output_routine_loc)\r
+          {\r
+            link(q) = get_avail();\r
+            q = link(q);\r
+            info(q) = right_brace_token + '}';\r
+            q = get_avail();\r
+            info(q) = left_brace_token + '{';\r
+            link(q) = link(def_ref);\r
+            link(def_ref) = q;\r
+          }\r
+\r
+          define(p, call, def_ref);\r
+        }\r
+      }\r
+      break;\r
+\r
+    case assign_int:\r
+      {\r
+        p = cur_chr;\r
+        scan_optional_equals();\r
+        scan_int();\r
+        word_define(p, cur_val);\r
+      }\r
+      break;\r
+\r
+    case assign_dimen:\r
+      {\r
+        p = cur_chr;\r
+        scan_optional_equals();\r
+        scan_dimen(false, false, false);\r
+        word_define(p, cur_val);\r
+      }\r
+      break;\r
+\r
+    case assign_glue:\r
+    case assign_mu_glue:\r
+      {\r
+        p = cur_chr;\r
+        n = cur_cmd;\r
+        scan_optional_equals();\r
+\r
+        if (n == assign_mu_glue)\r
+          scan_glue(mu_val);\r
+        else\r
+          scan_glue(glue_val);\r
+\r
+        trap_zero_glue();\r
+        define(p, glue_ref, cur_val);\r
+      }\r
+      break;\r
+\r
+    case def_code:\r
+      {\r
+        if (cur_chr == cat_code_base)\r
+          n = max_char_code;\r
+        else if (cur_chr == math_code_base)\r
+          n = 32768L; /* 2^15 */\r
+        else if (cur_chr == sf_code_base)\r
+          n = 32767; /* 2^15 - 1*/\r
+        else if (cur_chr == del_code_base)\r
+          n = 16777215L; /* 2^24 - 1 */\r
+        else\r
+          n = 255;\r
+\r
+        p = cur_chr;\r
+        scan_char_num();\r
+        p = p + cur_val;\r
+        scan_optional_equals();\r
+        scan_int();\r
+\r
+        if (((cur_val < 0) && (p < del_code_base)) || (cur_val > n))\r
+        {\r
+          print_err("Invalid code(");\r
+          print_int(cur_val);\r
+\r
+          if (p < del_code_base)\r
+            prints("), should be in the range 0..");\r
+          else\r
+            prints("), should be at most ");\r
+\r
+          print_int(n);\r
+          help1("I'm going to use 0 instead of that illegal code value.");\r
+          error();\r
+          cur_val = 0;\r
+        }\r
+\r
+        if (p < math_code_base)\r
+          define(p, data, cur_val);\r
+        else if (p < del_code_base)\r
+          define(p, data, cur_val);\r
+        else \r
+          word_define(p, cur_val);\r
+      }\r
+      break;\r
+\r
+    case def_family:\r
+      {\r
+        p = cur_chr;\r
+        scan_four_bit_int();\r
+        p = p + cur_val;\r
+        scan_optional_equals();\r
+        scan_font_ident();\r
+        define(p, data, cur_val);\r
+      }\r
+      break;\r
+\r
+    case tex_register:\r
+    case advance:\r
+    case multiply:\r
+    case divide:\r
+      do_register_command(a);\r
+      break;\r
+\r
+    case set_box:\r
+      {\r
+        scan_eight_bit_int();\r
+\r
+        if ((a >= 4))\r
+          n = 256 + cur_val;\r
+        else\r
+          n = cur_val;\r
+\r
+        scan_optional_equals();\r
+\r
+        if (set_box_allowed)\r
+          scan_box(box_flag + n);\r
+        else\r
+        {\r
+          print_err("Improper ");\r
+          print_esc("setbox");\r
+          help2("Sorry, \\setbox is not allowed after \\halign in a display,",\r
+              "or between \\accent and an accented character.");\r
+          error();\r
+        }\r
+      }\r
+      break;\r
+\r
+    case set_aux:\r
+      alter_aux();\r
+      break;\r
+\r
+    case set_prev_graf:\r
+      alter_prev_graf();\r
+      break;\r
+\r
+    case set_page_dimen:\r
+      alter_page_so_far();\r
+      break;\r
+\r
+    case set_page_int:\r
+      alter_integer();\r
+      break;\r
+\r
+    case set_box_dimen:\r
+      alter_box_dimen();\r
+      break;\r
+\r
+    case set_shape:\r
+      {\r
+        scan_optional_equals();\r
+        scan_int();\r
+        n = cur_val;\r
+\r
+        if (n <= 0)\r
+          p = 0;\r
+        else\r
+        {\r
+          p = get_node(2 * n + 1);\r
+          info(p) = n;\r
+\r
+          for (j = 1; j <= n; j++)\r
+          {\r
+            scan_dimen(false, false, false);\r
+            mem[p + 2 * j - 1].cint = cur_val;\r
+            scan_dimen(false, false, false);\r
+            mem[p + 2 * j].cint = cur_val;\r
+          }\r
+        }\r
+\r
+        define(par_shape_loc, shape_ref, p);\r
+      }\r
+      break;\r
+\r
+    case hyph_data:\r
+      if (cur_chr == 1)\r
+      {\r
+#ifdef INITEX\r
+        if (is_initex)\r
+        {\r
+          new_patterns();\r
+          goto done;\r
+        }\r
+#endif\r
+        print_err("Patterns can be loaded only by INITEX");\r
+        help_ptr = 0;\r
+        error();\r
+\r
+        do\r
+          {\r
+            get_token();\r
+          }\r
+        while (!(cur_cmd == right_brace));\r
+\r
+        return;\r
+      }\r
+      else\r
+      {\r
+        new_hyph_exceptions();\r
+        goto done;\r
+      }\r
+      break;\r
+\r
+    case assign_font_dimen:\r
+      {\r
+        find_font_dimen(true);\r
+        k = cur_val;\r
+        scan_optional_equals();\r
+        scan_dimen(false, false, false);\r
+        font_info[k].cint = cur_val;\r
+      }\r
+      break;\r
+\r
+    case assign_font_int:\r
+      {\r
+        n = cur_chr;\r
+        scan_font_ident();\r
+        f = cur_val;\r
+        scan_optional_equals();\r
+        scan_int();\r
+\r
+        if (n == 0)\r
+          hyphen_char[f] = cur_val;\r
+        else\r
+          skew_char[f] = cur_val;\r
+      }\r
+      break;\r
+\r
+    case def_font:\r
+      new_font(a);\r
+      break;\r
+\r
+    case set_interaction:\r
+      new_interaction();\r
+      break;\r
+\r
+    default:\r
+      {\r
+        confusion("prefix");\r
+        return;\r
+      }\r
+      break;\r
+  }\r
+\r
+done:\r
+  if (after_token != 0)\r
+  {\r
+    cur_tok = after_token;\r
+    back_input();\r
+    after_token = 0;\r
+  }\r
+}\r
+/* sec 1303 */\r
+boolean load_fmt_file (void)\r
+{\r
+  integer j, k;\r
+  pointer p, q;\r
+  integer x;\r
+\r
+  undump_int(x);\r
+\r
+  if (x != BEGINFMTCHECKSUM)\r
+    goto bad_fmt;\r
+\r
+  undump_int(x); /* mem_bot */\r
+\r
+  if (x != mem_bot)\r
+    goto bad_fmt;\r
+\r
+  undump_int(x); /* mem_top */\r
+\r
+#ifdef ALLOCATEMAIN\r
+/* we already read this once earlier to grab mem_top */\r
+  if (trace_flag)\r
+    printf("Read from fmt file mem_top = %lld TeX words\n", x);\r
+\r
+  mem = allocate_main_memory(x);\r
+\r
+  if (mem == NULL)\r
+    exit(EXIT_FAILURE);\r
+\r
+  initialize_aux(); /* do `mem' part of initialize */\r
+#endif\r
+\r
+  if (x != mem_top)\r
+    goto bad_fmt;\r
+\r
+  undump_int(x); /* eqtb_size */\r
+\r
+  if (x != eqtb_size)\r
+    goto bad_fmt;\r
+\r
+  undump_int(x); /* hash_prime */\r
+\r
+  if (x != hash_prime)\r
+    goto bad_fmt;\r
+\r
+  undump_int(x); /* hyphen_prime */\r
+\r
+#ifdef ALLOCATEHYPHEN\r
+/* allow format files dumped with arbitrary (prime) hyphenation exceptions */\r
+  realloc_hyphen(x);\r
+  hyphen_prime = x;\r
+#endif\r
+\r
+  if (x != hyphen_prime)\r
+    goto bad_fmt;\r
+\r
+  {\r
+    undump_int(x); /* pool_size */\r
+\r
+    if (x < 0)\r
+      goto bad_fmt; \r
+\r
+#ifdef ALLOCATESTRING\r
+    if (x > current_pool_size)\r
+    {\r
+      if (trace_flag)\r
+        printf("undump string pool reallocation (%lld > %d)\n", x, current_pool_size);\r
+\r
+      str_pool = realloc_str_pool(x - current_pool_size + increment_pool_size);\r
+    }\r
+\r
+    if (x > current_pool_size)\r
+#else\r
+    if (x > pool_size)\r
+#endif\r
+    {\r
+      printf("%s%s\n", "---! Must increase the ", "string pool size");\r
+      goto bad_fmt;\r
+    }\r
+    else\r
+      pool_ptr = x;\r
+  }\r
+\r
+  {\r
+    undump_int(x);  /* max_strings */\r
+\r
+    if (x < 0)\r
+      goto bad_fmt;\r
+\r
+#ifdef ALLOCATESTRING\r
+    if (x > current_max_strings)\r
+    {\r
+      if (trace_flag)\r
+        printf("undump string pointer reallocation (%lld > %d)\n", x, current_max_strings);\r
+\r
+      str_start = realloc_str_start(x - current_max_strings + increment_max_strings);\r
+    }\r
+\r
+    if (x > current_max_strings)\r
+#else\r
+    if (x > max_strings)\r
+#endif\r
+    {\r
+      printf("%s%s\n", "---! Must increase the ", "max strings");\r
+      goto bad_fmt;\r
+    }\r
+    else\r
+      str_ptr = x;\r
+  }\r
+\r
+  undumpthings(str_start[0], str_ptr + 1);\r
+  undumpthings(str_pool[0], pool_ptr);\r
+  init_str_ptr = str_ptr;\r
+  init_pool_ptr = pool_ptr;\r
+  undump(lo_mem_stat_max + 1000, hi_mem_stat_min - 1, lo_mem_max);\r
+  undump(lo_mem_stat_max + 1, lo_mem_max, rover);\r
+  p = mem_bot;\r
+  q = rover;\r
+\r
+  do\r
+    {\r
+      if (undumpthings(mem[p], q + 2 - p))\r
+        return -1;\r
+\r
+      p = q + node_size(q);\r
+\r
+      if ((p > lo_mem_max) || ((q >= rlink(q)) && (rlink(q) != rover)))\r
+        goto bad_fmt;\r
+\r
+      q = rlink(q);\r
+    }\r
+  while (!(q == rover));\r
+\r
+  if (undumpthings(mem[p], lo_mem_max + 1 - p))\r
+    return -1;\r
+\r
+  if (mem_min < mem_bot - 2)\r
+  {\r
+/*  or call add_variable_space(mem_bot - (mem_min + 1)) */\r
+    if (trace_flag)\r
+      puts("Splicing in mem_min space in undump!");\r
+\r
+    p = llink(rover);\r
+    q = mem_min + 1;\r
+    link(mem_min) = 0;       /* null */\r
+    info(mem_min) = 0;       /* null */\r
+    rlink(p) = q;\r
+    llink(rover) = q;\r
+    rlink(q) = rover;\r
+    llink(q) = p;\r
+    link(q) = empty_flag;\r
+    node_size(q) = mem_bot - q;\r
+  }\r
+\r
+  undump(lo_mem_max + 1, hi_mem_stat_min, hi_mem_min);\r
+  undump(mem_bot, mem_top, avail);\r
+  mem_end = mem_top;\r
+\r
+  if (undumpthings(mem[hi_mem_min], mem_end + 1 - hi_mem_min))\r
+    return -1;\r
+\r
+  undump_int(var_used);\r
+  undump_int(dyn_used);\r
+\r
+  k = active_base;\r
+\r
+  do\r
+    {\r
+      undump_int(x);\r
+\r
+      if ((x < 1) || (k + x > (eqtb_size + 1)))\r
+        goto bad_fmt;\r
+\r
+      if (undumpthings(eqtb[k], x))\r
+        return -1;\r
+\r
+      k = k + x;\r
+      undump_int(x);\r
+\r
+      if ((x < 0) || (k + x > (eqtb_size + 1)))\r
+        goto bad_fmt;\r
+\r
+      for (j = k; j <= k + x - 1; j++)\r
+        eqtb[j] = eqtb[k - 1];\r
+\r
+      k = k + x;\r
+    }\r
+  while (!(k > eqtb_size));\r
+\r
+  undump(hash_base, frozen_control_sequence, par_loc);\r
+  par_token = cs_token_flag + par_loc;\r
+  undump(hash_base, frozen_control_sequence, write_loc);\r
+  undump(hash_base, frozen_control_sequence, hash_used);\r
+\r
+  p = hash_base - 1;\r
+\r
+  do\r
+    {\r
+      undump(p + 1, hash_used, p);\r
+      undump_hh(hash[p]);\r
+    }\r
+  while (!(p == hash_used));\r
+\r
+  if (undumpthings(hash[hash_used + 1], undefined_control_sequence - 1 - hash_used))\r
+    return -1;\r
+\r
+  undump_int(cs_count);\r
+\r
+  if (trace_flag)\r
+    printf("itex undump cs_count %lld ", cs_count);\r
+\r
+  {\r
+    undump_int(x); /* font_mem_size */\r
+\r
+    if (x < 7)\r
+      goto bad_fmt;\r
+\r
+#ifdef ALLOCATEFONT\r
+    if (trace_flag)\r
+      printf("Read from fmt fmem_ptr = %lld\n", x);\r
+\r
+    if (x > current_font_mem_size)\r
+    {\r
+      if (trace_flag)\r
+        printf("Undump realloc font_info (%lld > %d)\n", x, current_font_mem_size);\r
+\r
+      font_info = realloc_font_info (x - current_font_mem_size + increment_font_mem_size);\r
+    }\r
+\r
+    if (x > current_font_mem_size)\r
+#else\r
+    if (x > font_mem_size)\r
+#endif\r
+    {\r
+      puts("---! Must increase the font mem size");\r
+      goto bad_fmt;\r
+    }\r
+    else\r
+      fmem_ptr = x;\r
+  }\r
+\r
+  {\r
+    undumpthings(font_info[0], fmem_ptr);\r
+    undump_size(font_base, font_max, "font max", font_ptr);\r
+    frozen_font_ptr = font_ptr;\r
+    undumpthings(font_check[0], font_ptr + 1);\r
+    undumpthings(font_size[0], font_ptr + 1);\r
+    undumpthings(font_dsize[0], font_ptr + 1);\r
+    undumpthings(font_params[0], font_ptr + 1);\r
+    undumpthings(hyphen_char[0], font_ptr + 1);\r
+    undumpthings(skew_char[0], font_ptr + 1);\r
+    undumpthings(font_name[0], font_ptr + 1);\r
+    undumpthings(font_area[0], font_ptr + 1);\r
+    undumpthings(font_bc[0], font_ptr + 1);\r
+    undumpthings(font_ec[0], font_ptr + 1);\r
+    undumpthings(char_base[0], font_ptr + 1);\r
+    undumpthings(width_base[0], font_ptr + 1);\r
+    undumpthings(height_base[0], font_ptr + 1);\r
+    undumpthings(depth_base[0], font_ptr + 1);\r
+    undumpthings(italic_base[0], font_ptr + 1);\r
+    undumpthings(lig_kern_base[0], font_ptr + 1);\r
+    undumpthings(kern_base[0], font_ptr + 1);\r
+    undumpthings(exten_base[0], font_ptr + 1);\r
+    undumpthings(param_base[0], font_ptr + 1);\r
+    undumpthings(font_glue[0], font_ptr + 1);\r
+    undumpthings(bchar_label[0], font_ptr + 1);\r
+    undumpthings(font_bchar[0], font_ptr + 1);\r
+    undumpthings(font_false_bchar[0], font_ptr + 1);\r
+  }\r
+\r
+/* log not opened yet, so can't show fonts frozen into format */\r
+/* May be able to avoid the following since we switched to */\r
+/* non_address from font_mem_size to 0 96/Jan/15 ??? */\r
+\r
+#ifdef ALLOCATEFONT\r
+  {\r
+    int count = 0, oldfont_mem_size = 0;\r
+    \r
+    for (x = 0; x <= font_ptr; x++)\r
+    {\r
+      if (bchar_label[x] > oldfont_mem_size)\r
+        oldfont_mem_size = bchar_label[x];\r
+    }\r
+\r
+    if (oldfont_mem_size != non_address && oldfont_mem_size > font_max)\r
+    {\r
+      for (x = 0; x <= font_ptr; x++)\r
+      {\r
+        if (bchar_label[x] == oldfont_mem_size)\r
+        {\r
+          bchar_label[x] = non_address;\r
+          count++;\r
+        }\r
+      }\r
+\r
+      if (trace_flag)\r
+        printf("oldfont_mem_size is %d --- hit %d times. Using non_address %d\n",\r
+            oldfont_mem_size, count, non_address);\r
+    }\r
+  }\r
+#endif\r
+\r
+  undump(0, hyphen_prime, hyph_count);\r
+\r
+  for (k = 1; k <= hyph_count; k++)\r
+  {\r
+    undump(0, hyphen_prime, j);\r
+    undump(0, str_ptr, hyph_word[j]);\r
+    undump(0, max_halfword, hyph_list[j]);\r
+  }\r
+\r
+#ifdef ALLOCATEHYPHEN\r
+/* if user specified new hyphen prime - flush existing exception patterns ! */\r
+/* but, we can reclaim the string storage wasted ... */\r
+  if (is_initex)\r
+  {\r
+    if (new_hyphen_prime != 0)\r
+    {\r
+      realloc_hyphen(new_hyphen_prime); /* reset_hyphen(); */\r
+      hyphen_prime = new_hyphen_prime;\r
+    }\r
+  }\r
+#endif\r
+\r
+  {\r
+    undump_int(x);\r
+\r
+    if (x < 0)\r
+      goto bad_fmt;\r
+\r
+#ifdef ALLOCATETRIES\r
+    if (!is_initex)\r
+    {\r
+      allocate_tries(x); /* allocate only as much as is needed */\r
+    }\r
+#endif\r
+\r
+    if (x > trie_size)\r
+    {\r
+      puts("---! Must increase the trie size");\r
+      goto bad_fmt;\r
+    }\r
+    else\r
+      j = x;\r
+  }\r
+\r
+#ifdef INITEX\r
+  if (is_initex)\r
+    trie_max = j;\r
+#endif\r
+\r
+  undumpthings(trie_trl[0], j + 1);\r
+  undumpthings(trie_tro[0], j + 1);\r
+  undumpthings(trie_trc[0], j + 1);\r
+  undump_size(0, trie_op_size, "trie op size", j);\r
+\r
+#ifdef INITEX\r
+  if (is_initex)\r
+    trie_op_ptr = j;\r
+#endif\r
+  \r
+  undumpthings(hyf_distance[1], j);\r
+  undumpthings(hyf_num[1], j);\r
+  undumpthings(hyf_next[1], j);\r
+\r
+#ifdef INITEX\r
+  if (is_initex)\r
+  {\r
+    for (k = 0; k <= 255; k++)\r
+      trie_used[k] = min_quarterword;\r
+  }\r
+#endif\r
+\r
+  k = 256;\r
+\r
+  while (j > 0)\r
+  {\r
+    undump(0, k - 1, k);\r
+    undump(1, j, x);\r
+\r
+#ifdef INITEX\r
+    if (is_initex)\r
+      trie_used[k] = x;\r
+#endif\r
+\r
+    j = j - x;\r
+    op_start[k] = j;\r
+  }\r
+\r
+#ifdef INITEX\r
+  if (is_initex)\r
+    trie_not_ready = false;\r
+#endif\r
+\r
+  undump(batch_mode, error_stop_mode, interaction);\r
+  undump(0, str_ptr, format_ident);\r
+  undump_int(x);\r
+  \r
+  if ((x != ENDFMTCHECKSUM) || feof(fmt_file))\r
+    goto bad_fmt;\r
+\r
+  return true;\r
+\r
+bad_fmt:\r
+  puts("(Fatal format file error; I'm stymied)");\r
+\r
+  return false;\r
+}\r
+/* sec 1335 */\r
+void final_cleanup (void)\r
+{\r
+  small_number c;\r
+\r
+  c = cur_chr;\r
+\r
+  if (job_name == 0)\r
+    open_log_file();\r
+\r
+  while (input_ptr > 0)\r
+  {\r
+    if (state == token_list)\r
+      end_token_list();\r
+    else\r
+      end_file_reading();\r
+  }\r
+\r
+  while (open_parens > 0)\r
+  {\r
+    prints(" )");\r
+    decr(open_parens);\r
+  }\r
+\r
+  if (cur_level > level_one)\r
+  {\r
+    print_nl("(");\r
+    print_esc("end occurred ");\r
+    prints("inside a group at level ");\r
+    print_int(cur_level - 1);\r
+    print_char(')');\r
+  }\r
+\r
+  while (cond_ptr != 0)\r
+  {\r
+    print_nl("(");\r
+    print_esc("end occurred ");\r
+    prints("when ");\r
+    print_cmd_chr(if_test, cur_if);\r
+\r
+    if (if_line != 0)\r
+    {\r
+      prints("on line ");\r
+      print_int(if_line);\r
+    }\r
+\r
+    prints(" was incomplete)");\r
+    if_line = if_line_field(cond_ptr);\r
+    cur_if = subtype(cond_ptr);\r
+    temp_ptr = cond_ptr;\r
+    cond_ptr = link(cond_ptr);\r
+    free_node(temp_ptr, if_node_size);\r
+  }\r
+\r
+  if (history != spotless)\r
+    if (((history == warning_issued) || (interaction < error_stop_mode)))\r
+      if (selector == term_and_log)\r
+      {\r
+        selector = term_only;\r
+        print_nl("(see the transcript file for additional information)");\r
+        selector = term_and_log;\r
+      }\r
+\r
+  if (c == 1)\r
+  {\r
+#ifdef INITEX\r
+    if (is_initex)\r
+    {\r
+      for (c = 0; c <= 4; c++)\r
+        if (cur_mark[c] != 0)\r
+          delete_token_ref(cur_mark[c]);\r
+\r
+      if (last_glue != max_halfword)\r
+        delete_glue_ref(last_glue);\r
+\r
+      store_fmt_file();\r
+    }\r
+#endif\r
+\r
+    if (!is_initex)\r
+      print_nl("(\\dump is performed only by INITEX)");\r
+  }\r
+}\r
+\r
+void show_frozen (void)\r
+{\r
+  int i;\r
+\r
+  fprintf(log_file, "\n(%lld fonts frozen in format file:\n", font_ptr);\r
+\r
+  for (i = 1; i <= font_ptr; i++)\r
+  {\r
+    if (i > 1)\r
+      fprintf(log_file, ", ");\r
+\r
+    if ((i % 8) == 0)\r
+      fprintf(log_file, "\n");\r
+\r
+    fwrite(&str_pool[str_start[font_name[i]]], 1, length(font_name[i]), log_file);\r
+  }\r
+\r
+  fprintf(log_file, ") ");\r
+}\r
+\r
+int main_program (void)\r
+{\r
+  history = fatal_error_stop;\r
+\r
+  if (ready_already == 314159L)\r
+    goto start_of_TEX;\r
+\r
+  bad = 0;\r
+\r
+  if ((half_error_line < 30) || (half_error_line > error_line - 15))\r
+    bad = 1;\r
+\r
+  if (max_print_line < 60)\r
+    bad = 2;\r
+\r
+  if (dvi_buf_size % 8 != 0)\r
+    bad = 3;\r
+\r
+  if (mem_bot + 1100 > mem_top)\r
+    bad = 4;\r
+\r
+  if (hash_prime > (hash_size + hash_extra))\r
+    bad = 5;\r
+\r
+  if (max_in_open >= 128)\r
+    bad = 6;\r
+\r
+  if (mem_top < 256 + 11)\r
+    bad = 7;\r
+\r
+#ifdef INITEX\r
+  if (is_initex)\r
+  {\r
+    if ((mem_min != 0) || (mem_max != mem_top))\r
+      bad = 10;\r
+  }\r
+#endif\r
+\r
+  if ((mem_min > mem_bot) || (mem_max < mem_top))\r
+    bad = 10;\r
+\r
+  if ((min_quarterword > 0) || (max_quarterword < 255))\r
+    bad = 11;\r
+\r
+  if ((min_halfword > 0) || (max_halfword < 32767))\r
+    bad = 12;\r
+\r
+  if ((min_quarterword < min_halfword) || (max_quarterword > max_halfword))\r
+    bad = 13;\r
+\r
+  if ((mem_min < min_halfword) || (mem_max >= max_halfword) || (mem_bot - mem_min >= max_halfword))\r
+    bad = 14;\r
+\r
+  if (mem_max > mem_top + mem_extra_high)\r
+    bad = 14;\r
+\r
+  if ((0 < min_quarterword) || (font_max > max_quarterword))\r
+    bad = 15;\r
+\r
+#ifdef INCREASEFONTS\r
+  if (font_max > 65535)\r
+#else\r
+  if (font_max > 256)\r
+#endif\r
+    bad = 16;\r
+\r
+  if ((save_size > max_halfword) || (max_strings > max_halfword))\r
+    bad = 17;\r
+\r
+  if (buf_size > max_halfword)\r
+    bad = 18;\r
+\r
+  if (max_quarterword - min_quarterword < 255)\r
+    bad = 19;\r
+\r
+  if (cs_token_flag + undefined_control_sequence > max_halfword)\r
+    bad = 21;\r
+\r
+  if (format_default_length > file_name_size)\r
+    bad = 31;\r
+\r
+  if (max_halfword < (mem_top - mem_min) / 2)\r
+    bad = 41;\r
+\r
+  if (bad > 0)\r
+  {\r
+    printf("%s%s%ld\n", "Ouch---my internal constants have been clobbered!",\r
+        "---case ", (long) bad);\r
+\r
+    goto final_end;\r
+  }\r
+\r
+  initialize();\r
+\r
+#ifdef INITEX\r
+  if (is_initex)\r
+  {\r
+    if (!get_strings_started())\r
+      goto final_end;\r
+\r
+    init_prim();\r
+    init_str_ptr = str_ptr;\r
+    init_pool_ptr = pool_ptr;\r
+    fix_date_and_time();\r
+  }\r
+#endif\r
+\r
+  ready_already = 314159L;\r
+\r
+start_of_TEX:\r
+  selector = term_only;\r
+  tally = 0;\r
+  term_offset = 0;\r
+  file_offset = 0;\r
+\r
+  print_banner();\r
+\r
+  if (format_ident == 0)\r
+  {\r
+    prints(" (preloaded format=");\r
+    prints(format_name);\r
+    prints(")");\r
+    print_ln();\r
+  }\r
+  else\r
+  {\r
+    slow_print(format_ident);\r
+    print_ln();\r
+  }\r
+\r
+  update_terminal();\r
+  job_name = 0;\r
+  name_in_progress = false;\r
+  log_opened = false;\r
+  output_file_name = 0;\r
+\r
+  {\r
+    {\r
+      input_ptr = 0;\r
+      max_in_stack = 0;\r
+      in_open = 0;\r
+      high_in_open = 0;\r
+      open_parens = 0;\r
+      max_open_parens = 0;\r
+      max_buf_stack = 0;\r
+      param_ptr = 0;\r
+      max_param_stack = 0;\r
+\r
+#ifdef ALLOCATEBUFFER\r
+      memset (buffer, 0, current_buf_size);\r
+#else\r
+      memset (buffer, 0, buf_size);\r
+#endif\r
+\r
+      first = 0;\r
+      scanner_status = 0;\r
+      warning_index = 0;\r
+      first = 1;\r
+      state = new_line;\r
+      start = 1;\r
+      index = 0;\r
+      line = 0;\r
+      name = 0;\r
+      force_eof = false;\r
+      align_state = 1000000L;\r
+\r
+      if (!init_terminal())\r
+        goto final_end;\r
+\r
+      limit = last;\r
+      first = last + 1;\r
+    }\r
+    \r
+    if ((format_ident == 0) || (buffer[loc] == '&') || (buffer[loc] == '+'))\r
+    {\r
+      if (format_ident != 0)\r
+        initialize();\r
+\r
+      if (!open_fmt_file())\r
+        goto final_end;\r
+\r
+      if (!load_fmt_file())\r
+      {\r
+#ifdef COMPACTFORMAT\r
+        gzclose(gz_fmt_file);\r
+#else\r
+        w_close(fmt_file);\r
+#endif\r
+        goto final_end;\r
+      }\r
+\r
+#ifdef COMPACTFORMAT\r
+      gzclose(gz_fmt_file);\r
+#else\r
+      w_close(fmt_file);\r
+#endif\r
+\r
+      while ((loc < limit) && (buffer[loc] == ' '))\r
+        incr(loc);\r
+    }\r
+\r
+    if (end_line_char_inactive())\r
+      decr(limit);\r
+    else\r
+      buffer[limit] = end_line_char;\r
+\r
+    fix_date_and_time();\r
+    magic_offset = str_start[886] - 9 * ord_noad;\r
+\r
+    if (interaction == batch_mode)\r
+      selector = no_print;\r
+    else\r
+      selector = term_only;\r
+\r
+    if ((loc < limit) && (cat_code(buffer[loc]) != escape))\r
+      start_input();\r
+  }\r
+\r
+  if (show_tfm_flag && log_opened && font_ptr > 0)\r
+    show_frozen();\r
+\r
+  main_time = clock();\r
+  history = spotless;\r
+\r
+  if (show_cs_names)\r
+    print_cs_names(stdout, 0);\r
+\r
+  main_control();\r
+\r
+  if (show_cs_names)\r
+    print_cs_names(stdout, 1);\r
+\r
+  final_cleanup();\r
+  close_files_and_terminate();\r
+\r
+final_end:\r
+  {\r
+    int code;\r
+\r
+    update_terminal();\r
+    ready_already = 0;\r
+\r
+    if ((history != spotless) && (history != warning_issued))\r
+      code = 1;\r
+    else\r
+      code = 0;\r
+\r
+    return code;\r
+  }\r
+}\r
+\r
+#ifdef ALLOCATEMAIN\r
+/* add a block of variable size node space below mem_bot(0) */\r
+void add_variable_space(int size)\r
+{\r
+  halfword p;\r
+  halfword q;\r
+  integer t;\r
+\r
+  if (mem_min == 0)\r
+    t = mem_min;\r
+  else\r
+    t = mem_min + 1;\r
+\r
+  mem_min = t - (size + 1);     /* first word in new block - 1 */\r
+\r
+  if (mem_min < mem_start)\r
+  {\r
+    if (trace_flag)\r
+      puts("WARNING: mem_min < mem_start!");\r
+\r
+    mem_min = mem_start;\r
+  }\r
+\r
+  p = llink(rover);\r
+  q = mem_min + 1;\r
+  link(mem_min) = 0; /* insert blank word below ??? */\r
+  info(mem_min) = 0; /* insert blank word below ??? */\r
+  rlink(p) = q;\r
+  llink(rover) = q;\r
+  rlink(q) = rover;\r
+  llink(q) = p;\r
+  link(q) = empty_flag;\r
+  info(q) = t - q; /* block size */\r
+  rover = q;\r
+}\r
+#endif\r
+\r
+#ifdef INITEX\r
+/* split out to allow sharing of code from do_initex and newpattern */\r
+void reset_trie (void)\r
+{\r
+  integer k;\r
+\r
+  for (k = -(integer) trie_op_size; k <= trie_op_size; k++)\r
+    trie_op_hash[k] = 0;\r
+\r
+  for (k = 0; k <= 255; k++)\r
+    trie_used[k] = min_trie_op;\r
+\r
+  max_op_used = min_trie_op;\r
+  trie_op_ptr = 0;\r
+  trie_not_ready = true;\r
+  trie_l[0] = 0;\r
+  trie_c[0] = 0;\r
+  trie_ptr = 0;\r
+  trie_not_ready = true;\r
+}\r
+/* borrowed code from initialize() */\r
+void reset_hyphen(void)\r
+{\r
+  hyph_pointer z;\r
+\r
+  for (z = 0; z <= hyphen_prime; z++)\r
+  {\r
+    hyph_word[z] = 0;\r
+    hyph_list[z] = 0;\r
+  }\r
+\r
+  hyph_count = 0;\r
+}\r
+/* split out to allow optimize for space, not time */\r
+void do_initex (void)\r
+{\r
+  /* integer i; */\r
+  integer k;\r
+  /* hyph_pointer z; */\r
+\r
+  for (k = mem_bot + 1; k <= lo_mem_stat_max; k++)\r
+    mem[k].cint = 0;\r
+\r
+  k = mem_bot;\r
+\r
+  while (k <= lo_mem_stat_max)\r
+  {\r
+    glue_ref_count(k) = 1;\r
+    stretch_order(k) = normal;\r
+    shrink_order(k) = normal;\r
+    k = k + glue_spec_size;\r
+  }\r
+\r
+  stretch(fil_glue) = unity;\r
+  stretch_order(fil_glue) = fil;\r
+  stretch(fill_glue) = unity;\r
+  stretch_order(fill_glue) = fill;\r
+  stretch(ss_glue) = unity;\r
+  stretch_order(ss_glue) = fil;\r
+  shrink(ss_glue) = unity;\r
+  shrink_order(ss_glue) = fil;\r
+  stretch(fil_neg_glue) = -unity;\r
+  stretch_order(fil_neg_glue) = fil;\r
+  rover = lo_mem_stat_max + 1;\r
+  link(rover) = empty_flag;\r
+  node_size(rover) = block_size;\r
+  llink(rover) = rover;\r
+  rlink(rover) = rover;\r
+  lo_mem_max = rover + block_size;\r
+  link(lo_mem_max) = 0;\r
+  info(lo_mem_max) = 0;\r
+\r
+  for (k = hi_mem_stat_min; k <= mem_top; k++)\r
+    mem[k] = mem[lo_mem_max];\r
+\r
+  info(omit_template) = end_template_token;\r
+  link(end_span) = max_quarterword + 1;\r
+  info(end_span) = 0;\r
+  type(last_active) = hyphenated;\r
+  line_number(last_active) = max_halfword;\r
+  subtype(last_active) = 0;\r
+  subtype(page_ins_head) = 255;\r
+  type(page_ins_head) = split_up;\r
+  link(mem_top) = page_ins_head;\r
+  type(page_head) = glue_node;\r
+  subtype(page_head) = normal;\r
+  avail = 0;\r
+  mem_end = mem_top;\r
+  hi_mem_min = hi_mem_stat_min;\r
+  var_used = lo_mem_stat_max + 1 - mem_bot;\r
+  dyn_used = hi_mem_stat_usage;\r
+  eq_type(undefined_control_sequence) = undefined_cs;\r
+  equiv(undefined_control_sequence) = 0;\r
+  eq_level(undefined_control_sequence) = level_zero;\r
+\r
+  for (k = active_base; k <= undefined_control_sequence - 1; k++)\r
+    eqtb[k] = eqtb[undefined_control_sequence];\r
+\r
+  equiv(glue_base) = zero_glue;\r
+  eq_level(glue_base) = level_one;\r
+  eq_type(glue_base) = glue_ref;\r
+\r
+  for (k = glue_base + 1; k <= local_base - 1; k++)\r
+    eqtb[k] = eqtb[glue_base];\r
+\r
+  glue_ref_count(zero_glue) = glue_ref_count(zero_glue) + local_base - glue_base;\r
+\r
+  par_shape_ptr = 0;\r
+  eq_type(par_shape_loc) = shape_ref;\r
+  eq_level(par_shape_loc) = level_one;\r
+\r
+  for (k = output_routine_loc; k <= toks_base + 255; k++)\r
+    eqtb[k] = eqtb[undefined_control_sequence];\r
+\r
+  box(0) = 0;\r
+  eq_type(box_base) = box_ref;\r
+  eq_level(box_base) = level_one;\r
+\r
+  for (k = box_base + 1; k <= box_base + 255; k++)\r
+    eqtb[k] = eqtb[box_base];\r
+\r
+  cur_font = null_font;\r
+  eq_type(cur_font_loc) = data;\r
+  eq_level(cur_font_loc) = level_one;\r
+\r
+  for (k = math_font_base; k <= math_font_base + 47; k++)\r
+    eqtb[k] = eqtb[cur_font_loc];\r
+\r
+  equiv(cat_code_base) = 0;\r
+  eq_type(cat_code_base) = data;\r
+  eq_level(cat_code_base) = level_one;\r
+\r
+  for (k = cat_code_base; k <= int_base - 1; k++)\r
+    eqtb[k] = eqtb[cat_code_base];\r
+\r
+  for (k = 0; k <= 255; k++)\r
+  {\r
+    cat_code(k) = other_char;\r
+    math_code(k) = k;\r
+    sf_code(k) = 1000;\r
+  }\r
+\r
+  cat_code(carriage_return) = car_ret;\r
+  cat_code(' ') = spacer;\r
+  cat_code('\\') = escape;\r
+  cat_code('%') = comment;\r
+  cat_code(invalid_code) = invalid_char;\r
+  cat_code(null_code) = ignore;\r
+\r
+  for (k = '0'; k <= '9'; k++)\r
+    math_code(k) = k + var_code;\r
+\r
+  for (k = 'A'; k <= 'Z'; k++)\r
+  {\r
+    cat_code(k) = letter;\r
+    cat_code(k + 'a' - 'A') = letter;\r
+    math_code(k) = k + var_code + 0x100;\r
+    math_code(k + 'a' - 'A') = k + 'a' - 'A' + var_code + 0x100;\r
+    lc_code(k) = k + 'a' - 'A';\r
+    lc_code(k + 'a' - 'A') = k + 'a' - 'A';\r
+    uc_code(k) = k;\r
+    uc_code(k + 'a' - 'A') = k;\r
+    sf_code(k) = 999;\r
+  }\r
+\r
+  for (k = int_base; k <= del_code_base - 1; k++)\r
+    eqtb[k].cint = 0;\r
+\r
+  mag = 1000;\r
+  tolerance = 10000;\r
+  hang_after = 1;\r
+  max_dead_cycles = 25;\r
+  escape_char = '\\';\r
+  end_line_char = carriage_return;\r
+\r
+  for (k = 0; k <= 255; k++)\r
+    del_code(k) = -1;\r
+\r
+  del_code('.') = 0;\r
+\r
+  for (k = dimen_base; k <= eqtb_size; k++)\r
+    eqtb[k].cint = 0;\r
+\r
+  hash_used = frozen_control_sequence;\r
+  cs_count = 0;\r
+\r
+  if (trace_flag)\r
+    puts("initex cs_count = 0 ");\r
+\r
+  eq_type(frozen_dont_expand) = dont_expand;\r
+  text(frozen_dont_expand) = 499;  /* "notexpanded:" */\r
+\r
+  font_ptr                    = null_font;\r
+  fmem_ptr                    = 7;\r
+  font_name[null_font]        = 795; /* nullfont */\r
+  font_area[null_font]        = 335; /* "" */\r
+  hyphen_char[null_font]      = '-';\r
+  skew_char[null_font]        = -1; \r
+  bchar_label[null_font]      = non_address;\r
+  font_bchar[null_font]       = non_char;\r
+  font_false_bchar[null_font] = non_char;\r
+  font_bc[null_font]          = 1;\r
+  font_ec[null_font]          = 0;\r
+  font_size[null_font]        = 0;\r
+  font_dsize[null_font]       = 0;\r
+  char_base[null_font]        = 0;\r
+  width_base[null_font]       = 0;\r
+  height_base[null_font]      = 0;\r
+  depth_base[null_font]       = 0;\r
+  italic_base[null_font]      = 0;\r
+  lig_kern_base[null_font]    = 0;\r
+  kern_base[null_font]        = 0;\r
+  exten_base[null_font]       = 0;\r
+  font_glue[null_font]        = 0;\r
+  font_params[null_font]      = 7;\r
+  param_base[null_font]       = -1;\r
+\r
+  for (k = 0; k <= 6; k++)\r
+    font_info[k].cint = 0;\r
+\r
+  reset_trie();\r
+  text(frozen_protection) = 1184; /* "inaccessible" */\r
+  format_ident = 1251;            /* " (INITEX)" */\r
+  text(end_write) = 1290;         /* "endwrite" */\r
+  eq_level(end_write) = level_one;\r
+  eq_type(end_write) = outer_call;\r
+  equiv(end_write) = 0;\r
+}\r
+#endif\r
+\r
+#ifdef INITEX\r
+/* sec 0047 */\r
+boolean get_strings_started (void)\r
+{\r
+  integer k;\r
+  str_number g;\r
+\r
+  pool_ptr = 0;\r
+  str_ptr = 0;\r
+  str_start[0] = 0;\r
+\r
+  for (k = 0; k <= 255; k++)\r
+  {\r
+    if ( (k < ' ') || (k > '~') )\r
+    {\r
+      append_char('^');\r
+      append_char('^');\r
+\r
+      if (k < 64)\r
+        append_char(k + 64);\r
+      else if (k < 128)\r
+        append_char(k - 64);\r
+      else\r
+      {\r
+        append_lc_hex(k / 16);\r
+        append_lc_hex(k % 16);\r
+      }\r
+    }\r
+    else\r
+      append_char(k);\r
+\r
+    g = make_string();\r
+  }\r
+\r
+  g = load_pool_strings(pool_size - string_vacancies);\r
+\r
+  if (g == 0)\r
+  {\r
+    printf("%s\n", "! You have to increase POOLSIZE." );\r
+    return false;\r
+  }\r
+\r
+  return true;\r
+}\r
+#endif\r
+\r
+#ifdef INITEX\r
+/* sec 0131 */\r
+void sort_avail (void)\r
+{\r
+  pointer p, q, r;\r
+  pointer old_rover;\r
+\r
+  p = get_node(010000000000);\r
+  p = rlink(rover);\r
+  rlink(rover) = empty_flag;\r
+  old_rover = rover;\r
+\r
+  while (p != old_rover)\r
+  {\r
+    if (p < rover)\r
+    {\r
+      q = p;\r
+      p = rlink(q);\r
+      rlink(q) = rover;\r
+      rover = q;\r
+    }\r
+    else\r
+    {\r
+      q = rover;\r
+\r
+      while (rlink(q) < p)\r
+        q = rlink(q);\r
+\r
+      r = rlink(p);\r
+      rlink(p) = rlink(q);\r
+      rlink(q) = p;\r
+      p = r;\r
+    }\r
+  }\r
+\r
+  p = rover;\r
+\r
+  while (rlink(p) != empty_flag)\r
+  {\r
+    llink(rlink(p)) = p;\r
+    p = rlink(p);\r
+  }\r
+\r
+  rlink(p) = rover;\r
+  llink(rover) = p;\r
+}\r
+#endif\r
+\r
+#ifdef INITEX\r
+/* sec 0264 */\r
+void primitive_ (str_number s, quarterword c, halfword o)\r
+{ \r
+  pool_pointer k;\r
+  small_number j;\r
+  /* small_number l; */\r
+  int l;\r
+\r
+  if (s < 256)\r
+    cur_val = s + single_base;\r
+  else\r
+  {\r
+    k = str_start[s];\r
+    l = str_start[s + 1] - k;\r
+\r
+    for (j = 0; j <= l - 1; j++)\r
+      buffer[j] = str_pool[k + j];\r
+\r
+    cur_val = id_lookup(0, l);\r
+    flush_string();\r
+    text(cur_val) = s;\r
+  }\r
+\r
+  eq_level(cur_val) = level_one;\r
+  eq_type(cur_val) = c;\r
+  equiv(cur_val) = o;\r
+}\r
+#endif\r
+\r
+#ifdef INITEX\r
+/* sec 0944 */\r
+trie_op_code new_trie_op (small_number d, small_number n, trie_op_code v)\r
+{\r
+  integer h;\r
+  trie_op_code u;\r
+  integer l;\r
+\r
+  h = abs(n + 313 * d + 361 * v + 1009 * cur_lang) % (trie_op_size + trie_op_size) + neg_trie_op_size;\r
+\r
+  while (true)\r
+  {\r
+    l = trie_op_hash[h];\r
+\r
+    if (l == 0)\r
+    {\r
+      if (trie_op_ptr == trie_op_size)\r
+      {\r
+        overflow("pattern memory ops", trie_op_size);\r
+        return 0;\r
+      }\r
+\r
+      u = trie_used[cur_lang];\r
+\r
+      if (u == max_trie_op)\r
+      {\r
+        overflow("pattern memory ops per language", max_trie_op - min_trie_op);\r
+        return 0;\r
+      }\r
+\r
+      incr(trie_op_ptr);\r
+      incr(u);\r
+      trie_used[cur_lang] = u;\r
+\r
+      if (u > max_op_used)\r
+        max_op_used = u;\r
+\r
+      hyf_distance[trie_op_ptr] = d;\r
+      hyf_num[trie_op_ptr] = n;\r
+      hyf_next[trie_op_ptr] = v;\r
+      trie_op_lang[trie_op_ptr] = cur_lang;\r
+      trie_op_hash[h] = trie_op_ptr;\r
+      trie_op_val[trie_op_ptr] = u;\r
+      return u;\r
+    }\r
+\r
+    if ((hyf_distance[l] == d) && (hyf_num[l] == n) && (hyf_next[l] == v) && (trie_op_lang[l] == cur_lang))\r
+    {\r
+      return trie_op_val[l];\r
+    }\r
+\r
+    if (h > - (integer) trie_op_size)\r
+      decr(h);\r
+    else\r
+      h = trie_op_size;\r
+  }\r
+}\r
+/* sec 0948 */\r
+trie_pointer trie_node (trie_pointer p)\r
+{\r
+  trie_pointer h;\r
+  trie_pointer q;\r
+\r
+  /* the 1009, 2718, 3142 are hard-wired constants here (not hyphen_prime) */\r
+  /* compute hash value */\r
+  h = abs(trie_c[p] + 1009 * trie_o[p] + 2718 * trie_l[p] + 3142 * trie_r[p]) % trie_size;\r
+\r
+  while (true)\r
+  {\r
+    q = trie_hash[h];\r
+\r
+    if (q == 0)\r
+    {\r
+      trie_hash[h] = p;\r
+      return p;\r
+    }\r
+\r
+    if ((trie_c[q] == trie_c[p]) && (trie_o[q] == trie_o[p]) &&\r
+      (trie_l[q] == trie_l[p]) && (trie_r[q] == trie_r[p]))\r
+    {\r
+      return q;\r
+    }\r
+\r
+    if (h > 0)\r
+      decr(h);\r
+    else\r
+      h = trie_size;\r
+  }\r
+}\r
+/* sec 0949 */\r
+trie_pointer compress_trie (trie_pointer p)\r
+{\r
+  if (p == 0)\r
+    return 0;\r
+  else\r
+  {\r
+    trie_l[p] = compress_trie(trie_l[p]);\r
+    trie_r[p] = compress_trie(trie_r[p]);\r
+\r
+    return trie_node(p);\r
+  }\r
+}\r
+/* sec 0953 */\r
+void first_fit (trie_pointer p)\r
+{\r
+  trie_pointer h;\r
+  trie_pointer z;\r
+  trie_pointer q;\r
+  ASCII_code c;\r
+  trie_pointer l, r;\r
+  short ll;\r
+\r
+  c = trie_c[p];\r
+  z = trie_min[c];\r
+\r
+  while (true)\r
+  {\r
+    h = z - c;\r
+\r
+    if (trie_max < h + 256)\r
+    {\r
+      if (trie_size <= h + 256)\r
+      {\r
+        overflow("pattern memory", trie_size);\r
+        return;\r
+      }\r
+\r
+      do\r
+        {\r
+          incr(trie_max);\r
+          trie_taken[trie_max] = false;\r
+          trie_trl[trie_max] = trie_max + 1;\r
+          trie_tro[trie_max] = trie_max - 1;\r
+        }\r
+      while (!(trie_max == h + 256));\r
+    }\r
+\r
+    if (trie_taken[h])\r
+      goto not_found;\r
+\r
+    q = trie_r[p];\r
+\r
+    while (q > 0)\r
+    {\r
+      if (trie_trl[h + trie_c[q]] == 0)\r
+        goto not_found;\r
+\r
+      q = trie_r[q];\r
+    }\r
+\r
+    goto found;\r
+\r
+not_found:\r
+    z = trie_trl[z];\r
+  }\r
+\r
+found:\r
+  trie_taken[h] = true;\r
+  trie_hash[p] = h;\r
+  q = p;\r
+\r
+  do\r
+    {\r
+      z = h + trie_c[q];\r
+      l = trie_tro[z];\r
+      r = trie_trl[z];\r
+      trie_tro[r] = l;\r
+      trie_trl[l] = r;\r
+      trie_trl[z] = 0;\r
+\r
+      if (l < 256)\r
+      {\r
+        if (z < 256)\r
+          ll = z;         /* short ll */\r
+        else\r
+          ll = 256;\r
+\r
+        do\r
+          {\r
+            trie_min[l] = r;\r
+            incr(l);\r
+          }\r
+        while (!(l == ll));\r
+      }\r
+\r
+      q = trie_r[q];\r
+    }\r
+  while (!(q == 0));\r
+}\r
+/* sec 0957 */\r
+void trie_pack (trie_pointer p)\r
+{\r
+  trie_pointer q;\r
+\r
+  do\r
+    {\r
+      q = trie_l[p];\r
+\r
+      if ((q > 0) && (trie_hash[q]== 0))\r
+      {\r
+        first_fit(q);\r
+        trie_pack(q);\r
+      }\r
+\r
+      p = trie_r[p];\r
+    }\r
+  while (!(p == 0));\r
+}\r
+/* sec 0959 */\r
+void trie_fix (trie_pointer p)\r
+{\r
+  trie_pointer q;\r
+  ASCII_code c;\r
+  trie_pointer z;\r
+\r
+  z = trie_hash[p];\r
+\r
+  do\r
+    {\r
+      q = trie_l[p];\r
+      c = trie_c[p];\r
+      trie_trl[z + c] = trie_hash[q];\r
+      trie_trc[z + c] = c;\r
+      trie_tro[z + c] = trie_o[p];\r
+\r
+      if (q > 0)\r
+        trie_fix(q);\r
+\r
+      p = trie_r[p];\r
+    }\r
+  while (!(p == 0));\r
+}\r
+/* sec 0960 */\r
+void new_patterns (void)\r
+{\r
+  char k, l;\r
+  boolean digit_sensed;\r
+  trie_op_code v;\r
+  trie_pointer p, q;\r
+  boolean first_child;\r
+  /* ASCII_code c; */\r
+  int c;\r
+\r
+  if (!trie_not_ready)\r
+  {\r
+    if (allow_patterns)\r
+    {\r
+      if (trace_flag)\r
+        puts("Resetting patterns");\r
+\r
+      reset_trie();\r
+\r
+      if (reset_exceptions)\r
+      {\r
+        if (trace_flag)\r
+          puts("Resetting exceptions");\r
+\r
+        reset_hyphen();\r
+      }\r
+    }\r
+  }\r
+\r
+  if (trie_not_ready)\r
+  {\r
+    set_cur_lang();\r
+    scan_left_brace();\r
+    k = 0;\r
+    hyf[0] = 0;\r
+    digit_sensed = false;\r
+\r
+    while (true)\r
+    {\r
+      get_x_token();\r
+\r
+      switch (cur_cmd)\r
+      {\r
+        case letter:\r
+        case other_char:\r
+          if (digit_sensed || (cur_chr < '0') || (cur_chr > '9'))\r
+          {\r
+            if (cur_chr == '.')\r
+              cur_chr = 0;\r
+            else\r
+            {\r
+              cur_chr = lc_code(cur_chr);\r
+\r
+              if (cur_chr == 0)\r
+              {\r
+                print_err("Nonletter");\r
+                help1("(See Appendix H.)");\r
+                error();\r
+              }\r
+            }\r
+\r
+            if (k < 63)\r
+            {\r
+              incr(k);\r
+              hc[k] = cur_chr;\r
+              hyf[k] = 0;\r
+              digit_sensed = false;\r
+            }\r
+          }\r
+          else if (k < 63)\r
+          {\r
+            hyf[k] = cur_chr - '0';\r
+            digit_sensed = true;\r
+          }\r
+          break;\r
+        case spacer:\r
+        case right_brace:\r
+          {\r
+            if (k > 0)\r
+            {\r
+              if (hc[1] == 0)\r
+                hyf[0] = 0;\r
+\r
+              if (hc[k] == 0)\r
+                hyf[k] = 0;\r
+\r
+              l = k;\r
+              v = min_trie_op;\r
+\r
+              while (true)\r
+              {\r
+                if (hyf[l]!= 0)\r
+                  v = new_trie_op(k - l, hyf[l], v);\r
+\r
+                if (l > 0)\r
+                  decr(l);\r
+                else\r
+                  goto done1;\r
+              }\r
+done1:\r
+              q = 0;\r
+              hc[0] = cur_lang;\r
+\r
+              while (l <= k)\r
+              {\r
+                c = hc[l];\r
+                incr(l);\r
+                p = trie_l[q];\r
+                first_child = true;\r
+\r
+                while ((p > 0) && (c > trie_c[p]))\r
+                {\r
+                  q = p;\r
+                  p = trie_r[q];\r
+                  first_child = false;\r
+                }\r
+\r
+                if ((p == 0) || (c < trie_c[p]))\r
+                {\r
+                  if (trie_ptr == trie_size)\r
+                  {\r
+                    overflow("pattern memory", trie_size);\r
+                    return;\r
+                  }\r
+\r
+                  incr(trie_ptr);\r
+                  trie_r[trie_ptr] = p;\r
+                  p = trie_ptr;\r
+                  trie_l[p] = 0;\r
+\r
+                  if (first_child)\r
+                    trie_l[q] = p;\r
+                  else\r
+                    trie_r[q] = p;\r
+\r
+                  trie_c[p] = c;\r
+                  trie_o[p] = min_trie_op;\r
+                }\r
+\r
+                q = p;\r
+              }\r
+\r
+              if (trie_o[q] != min_trie_op)\r
+              {\r
+                print_err("Duplicate pattern");\r
+                help1("(See Appendix H.)");\r
+                error();\r
+              }\r
+\r
+              trie_o[q] = v;\r
+            }\r
+\r
+            if (cur_cmd == right_brace)\r
+              goto done;\r
+\r
+            k = 0;\r
+            hyf[0] = 0;\r
+            digit_sensed = false;\r
+          }\r
+          break;\r
+        default:\r
+          {\r
+            print_err("Bad ");\r
+            print_esc("patterns");\r
+            help1("(See Appendix H.)");\r
+            error();\r
+          }\r
+          break;\r
+      }\r
+    }\r
+done:;\r
+  }\r
+  else\r
+  {\r
+    print_err("Too late for ");\r
+    print_esc("patterns");\r
+    help1("All patterns must be given before typesetting begins.");\r
+    error();\r
+    link(garbage) = scan_toks(false, false);\r
+    flush_list(def_ref);\r
+  }\r
+}\r
+/* sec 0966 */\r
+void init_trie (void)\r
+{\r
+  trie_pointer p;\r
+  /* integer j, k, t; */\r
+  integer j, k;\r
+  int t;\r
+  trie_pointer r, s;\r
+\r
+  op_start[0] = - (integer) min_trie_op;\r
+\r
+  for (j = 1; j <= 255; j++)\r
+    op_start[j] = op_start[j - 1] + trie_used[j - 1];\r
+\r
+  for (j = 1; j <= trie_op_ptr; j++)\r
+    trie_op_hash[j] = op_start[trie_op_lang[j]] + trie_op_val[j];\r
+\r
+  for (j = 1; j <= trie_op_ptr; j++)\r
+  {\r
+    while (trie_op_hash[j] > j)\r
+    {\r
+      k = trie_op_hash[j];\r
+      t = hyf_distance[k];\r
+      hyf_distance[k] = hyf_distance[j];\r
+      hyf_distance[j] = t;\r
+      t = hyf_num[k];\r
+      hyf_num[k] = hyf_num[j];\r
+      hyf_num[j] = t;\r
+      t = hyf_next[k];\r
+      hyf_next[k] = hyf_next[j];\r
+      hyf_next[j]= t;\r
+      trie_op_hash[j] = trie_op_hash[k];\r
+      trie_op_hash[k] = k;\r
+    }\r
+  }\r
+\r
+  for (p = 0; p <= trie_size; p++)\r
+    trie_hash[p] = 0;\r
+\r
+  trie_l[0] = compress_trie(trie_l[0]);\r
+\r
+  for (p = 0; p <= trie_ptr; p++)\r
+    trie_hash[p] = 0;\r
+\r
+  for (p = 0; p <= 255; p++)\r
+    trie_min[p] = p + 1;\r
+\r
+  trie_trl[0] = 1;\r
+  trie_max = 0;\r
+\r
+  if (trie_l[0] != 0)\r
+  {\r
+    first_fit(trie_l[0]);\r
+    trie_pack(trie_l[0]);\r
+  }\r
+\r
+  if (trie_l[0] == 0)\r
+  {\r
+    for (r = 0; r <= 256; r++)\r
+    {\r
+      trie_trl[r] = 0;\r
+      trie_tro[r] = min_trie_op;\r
+      trie_trc[r] = 0;\r
+    }\r
+\r
+    trie_max = 256;\r
+  }\r
+  else\r
+  {\r
+    trie_fix(trie_l[0]);\r
+    r = 0;\r
+\r
+    do\r
+      {\r
+        s = trie_trl[r];\r
+\r
+        {\r
+          trie_trl[r] = 0;\r
+          trie_tro[r] = min_trie_op;\r
+          trie_trc[r] = 0;\r
+        }\r
+\r
+        r = s;\r
+      }\r
+    while (!(r > trie_max));\r
+  }\r
+\r
+  trie_trc[0] = 63;\r
+  trie_not_ready = false;\r
+}\r
+#endif\r
+\r
+#ifdef INITEX\r
+/* sec 1302 */\r
+void store_fmt_file (void)\r
+{\r
+  integer j, k, l;\r
+  pointer p, q;\r
+  integer x;\r
+\r
+  if (!is_initex)\r
+  {\r
+    puts("! \\dump is performed only by INITEX");\r
+\r
+    if (!knuth_flag)\r
+      puts("  (Use -i on the command line)");\r
+\r
+    return;\r
+  }\r
+\r
+  if (save_ptr != 0)\r
+  {\r
+    print_err("You can't dump inside a group");\r
+    help1("`{...\\dump}' is a no-no.");\r
+    succumb();\r
+  }\r
+\r
+  selector = new_string;\r
+  prints(" (preloaded format=");\r
+  print(job_name);\r
+  print_char(' ');\r
+  print_int(year);\r
+  print_char('.');\r
+  print_int(month);\r
+  print_char('.');\r
+  print_int(day);\r
+  print_char(')');\r
+\r
+  if (interaction == batch_mode)\r
+    selector = log_only;\r
+  else\r
+    selector = term_and_log;\r
+\r
+  str_room(1);\r
+  format_ident = make_string();\r
+  pack_job_name(".fmt");\r
+\r
+  while (!w_open_out(fmt_file))\r
+    prompt_file_name("format file name", ".fmt");\r
+\r
+  print_nl("Beginning to dump on file ");\r
+  slow_print(w_make_name_string(fmt_file));\r
+  flush_string();\r
+  print_nl("");\r
+  slow_print(format_ident);\r
+\r
+  dump_int(BEGINFMTCHECKSUM);\r
+  dump_int(mem_bot);\r
+  dump_int(mem_top);\r
+  dump_int(eqtb_size);\r
+  dump_int(hash_prime);\r
+  dump_int(hyphen_prime);\r
+  dump_int(pool_ptr);\r
+  dump_int(str_ptr);\r
+  dumpthings(str_start[0], str_ptr + 1);\r
+  dumpthings(str_pool[0], pool_ptr);\r
+  print_ln();\r
+  print_int(str_ptr);\r
+  prints(" strings of total length ");\r
+  print_int(pool_ptr);\r
+\r
+  sort_avail();\r
+  var_used = 0;\r
+  dump_int(lo_mem_max);\r
+  dump_int(rover);\r
+  p = 0;\r
+  q = rover;\r
+  x = 0;\r
+\r
+  do\r
+    {\r
+      if (dumpthings(mem[p], q + 2 - p))\r
+        return;\r
+\r
+      x = x + q + 2 - p;\r
+      var_used = var_used + q - p;\r
+      p = q + node_size(q);\r
+      q = rlink(q);\r
+    }\r
+  while (!(q == rover));\r
+\r
+  var_used = var_used + lo_mem_max - p;\r
+  dyn_used = mem_end + 1 - hi_mem_min;\r
+\r
+  if (dumpthings(mem[p], lo_mem_max + 1 - p))\r
+    return;\r
+\r
+  x = x + lo_mem_max + 1 - p;\r
+  dump_int(hi_mem_min);\r
+  dump_int(avail); \r
+\r
+  if (dumpthings(mem[hi_mem_min], mem_end + 1 - hi_mem_min))\r
+    return;\r
+\r
+  x = x + mem_end + 1 - hi_mem_min;\r
+  p = avail;\r
+\r
+  while (p != 0)\r
+  {\r
+    decr(dyn_used);\r
+    p = link(p);\r
+  }\r
+\r
+  dump_int(var_used);\r
+  dump_int(dyn_used);\r
+  print_ln();\r
+  print_int(x);\r
+  prints(" memory locations dumped; current usage is ");\r
+  print_int(var_used);\r
+  print_char('&');\r
+  print_int(dyn_used);\r
+\r
+  k = active_base;\r
+\r
+  do\r
+    {\r
+      j = k;\r
+\r
+      while (j < (int_base - 1))\r
+      {\r
+        if ((equiv(j) == equiv(j + 1)) &&\r
+          (eq_type(j) == eq_type(j + 1)) &&\r
+          (eq_level(j) == eq_level(j + 1)))\r
+          goto found1;\r
+\r
+        incr(j);\r
+      }\r
+\r
+      l = (int_base);\r
+      goto done1;\r
+\r
+found1:\r
+      incr(j);\r
+      l = j;\r
+\r
+      while (j < (int_base - 1))\r
+      {\r
+        if ((equiv(j) != equiv(j + 1)) ||\r
+          (eq_type(j) != eq_type(j + 1)) ||\r
+          (eq_level(j) != eq_level(j + 1)))\r
+          goto done1;\r
+\r
+        incr(j);\r
+      }\r
+\r
+done1:\r
+      dump_int(l - k);\r
+\r
+      if (dumpthings(eqtb[k], l - k))\r
+        return;\r
+\r
+      k = j + 1;\r
+      dump_int(k - l);\r
+    }\r
+  while (!(k == (int_base)));\r
+\r
+  do\r
+    {\r
+      j = k;\r
+\r
+      while (j < (eqtb_size))\r
+      {\r
+        if (eqtb[j].cint == eqtb[j + 1].cint)\r
+          goto found2;\r
+\r
+        incr(j);\r
+      }\r
+\r
+      l = (eqtb_size + 1);\r
+      goto done2;\r
+\r
+found2:\r
+      incr(j);\r
+      l = j;\r
+\r
+      while (j < (eqtb_size))\r
+      {\r
+        if (eqtb[j].cint != eqtb[j + 1].cint)\r
+          goto done2;\r
+\r
+        incr(j);\r
+      }\r
+\r
+done2:\r
+      dump_int(l - k);\r
+\r
+      if (dumpthings(eqtb[k], l - k))\r
+        return;\r
+\r
+      k = j + 1;\r
+      dump_int(k - l);\r
+    }\r
+  while (!(k > (eqtb_size)));\r
+\r
+  dump_int(par_loc);\r
+  dump_int(write_loc);\r
+\r
+  dump_int(hash_used);\r
+  cs_count = frozen_control_sequence - 1 - hash_used;\r
+\r
+  if (trace_flag)\r
+    printf("itex cs_count %lld hash_size %d hash_extra %d hash_used %d",\r
+        cs_count, hash_size, hash_extra, hash_used);\r
+\r
+  for (p = hash_base; p <= hash_used; p++)\r
+  {\r
+    if (text(p) != 0)\r
+    {\r
+      dump_int(p);\r
+      dump_hh(hash[p]);\r
+      incr(cs_count);\r
+\r
+      if (trace_flag)\r
+        puts("itex.c store_fmt_file() cs_count++ ");\r
+    }\r
+  }\r
+\r
+  if (dumpthings(hash[hash_used + 1], undefined_control_sequence - 1 - hash_used))\r
+    return;\r
+\r
+  dump_int(cs_count);\r
+  print_ln();\r
+  print_int(cs_count);\r
+  prints(" multiletter control sequences");\r
+\r
+  dump_int(fmem_ptr);\r
+\r
+  {\r
+    dumpthings(font_info[0], fmem_ptr);\r
+    dump_int(font_ptr);\r
+    dumpthings(font_check[0], font_ptr + 1);\r
+    dumpthings(font_size[0], font_ptr + 1);\r
+    dumpthings(font_dsize[0], font_ptr + 1);\r
+    dumpthings(font_params[0], font_ptr + 1);\r
+    dumpthings(hyphen_char[0], font_ptr + 1);\r
+    dumpthings(skew_char[0], font_ptr + 1);\r
+    dumpthings(font_name[0], font_ptr + 1);\r
+    dumpthings(font_area[0], font_ptr + 1);\r
+    dumpthings(font_bc[0], font_ptr + 1);\r
+    dumpthings(font_ec[0], font_ptr + 1);\r
+    dumpthings(char_base[0], font_ptr + 1);\r
+    dumpthings(width_base[0], font_ptr + 1);\r
+    dumpthings(height_base[0], font_ptr + 1);\r
+    dumpthings(depth_base[0], font_ptr + 1);\r
+    dumpthings(italic_base[0], font_ptr + 1);\r
+    dumpthings(lig_kern_base[0], font_ptr + 1);\r
+    dumpthings(kern_base[0], font_ptr + 1);\r
+    dumpthings(exten_base[0], font_ptr + 1);\r
+    dumpthings(param_base[0], font_ptr + 1);\r
+    dumpthings(font_glue[0], font_ptr + 1);\r
+    dumpthings(bchar_label[0], font_ptr + 1);\r
+    dumpthings(font_bchar[0], font_ptr + 1);\r
+    dumpthings(font_false_bchar[0], font_ptr + 1);\r
+\r
+    for (k = 0; k <= font_ptr; k++)\r
+    {\r
+      print_nl("\\font");\r
+      print_esc("");\r
+      print(font_id_text(k));\r
+      print_char('=');\r
+      print_file_name(font_name[k], font_area[k], 335);\r
+\r
+      if (font_size[k] != font_dsize[k])\r
+      {\r
+        prints(" at ");\r
+        print_scaled(font_size[k]);\r
+        prints("pt");\r
+      }\r
+    }\r
+  }\r
+\r
+  print_ln();\r
+  print_int(fmem_ptr - 7);\r
+  prints(" words of font info for ");\r
+  print_int(font_ptr - font_base);\r
+  prints(" preloaded font");\r
+\r
+  if (font_ptr != font_base + 1)\r
+    print_char('s');\r
+\r
+  dump_int(hyph_count);\r
+\r
+  for (k = 0; k <= hyphen_prime; k++)\r
+  {\r
+    if (hyph_word[k] != 0)\r
+    {\r
+      dump_int(k);\r
+      dump_int(hyph_word[k]);\r
+      dump_int(hyph_list[k]);\r
+    }\r
+  }\r
+\r
+  print_ln();\r
+  print_int(hyph_count);\r
+  prints(" hyphenation exception");\r
+\r
+  if (hyph_count != 1)\r
+    print_char('s');\r
+\r
+  if (trie_not_ready)\r
+    init_trie();\r
+\r
+  dump_int(trie_max);\r
+  dumpthings(trie_trl[0], trie_max + 1);\r
+  dumpthings(trie_tro[0], trie_max + 1);\r
+  dumpthings(trie_trc[0], trie_max + 1);\r
+  dump_int(trie_op_ptr);\r
+  dumpthings(hyf_distance[1], trie_op_ptr);\r
+  dumpthings(hyf_num[1], trie_op_ptr);\r
+  dumpthings(hyf_next[1], trie_op_ptr);\r
+  print_nl("Hyphenation trie of length ");\r
+  print_int(trie_max);\r
+  prints(" has ");\r
+  print_int(trie_op_ptr);\r
+  prints(" op");\r
+\r
+  if (trie_op_ptr != 1)\r
+    print_char('s');\r
+\r
+  prints(" out of ");\r
+  print_int(trie_op_size);\r
+\r
+  for (k = 255; k >= 0; k--)\r
+  {\r
+    if (trie_used[k] > 0)\r
+    {\r
+      print_nl("  ");\r
+      print_int(trie_used[k]);\r
+      prints(" for language ");\r
+      print_int(k);\r
+      dump_int(k);\r
+      dump_int(trie_used[k]);\r
+    }\r
+  }\r
+\r
+  dump_int(interaction);\r
+  dump_int(format_ident);\r
+  dump_int(ENDFMTCHECKSUM);\r
+  tracing_stats = 0;\r
+\r
+#ifdef COMPACTFORMAT\r
+  gz_w_close(gz_fmt_file);\r
+#else\r
+  w_close(fmt_file);\r
+#endif\r
+}\r
+#endif\r
+\r
+#ifdef INITEX\r
+/* sec 01336 */\r
+void init_prim (void)\r
+{\r
+  no_new_control_sequence = false;\r
+  /* sec 0266 */\r
+  primitive("lineskip", assign_glue, glue_base + line_skip_code);\r
+  primitive("baselineskip", assign_glue, glue_base + baseline_skip_code);\r
+  primitive("parskip", assign_glue, glue_base + par_skip_code);\r
+  primitive("abovedisplayskip", assign_glue, glue_base + above_display_skip_code);\r
+  primitive("belowdisplayskip", assign_glue, glue_base + below_display_skip_code);\r
+  primitive("abovedisplayshortskip", assign_glue, glue_base + above_display_short_skip_code);\r
+  primitive("belowdisplayshortskip", assign_glue, glue_base + below_display_short_skip_code);\r
+  primitive("leftskip", assign_glue, glue_base + left_skip_code);\r
+  primitive("rightskip", assign_glue, glue_base + right_skip_code);\r
+  primitive("topskip", assign_glue, glue_base + top_skip_code);\r
+  primitive("splittopskip", assign_glue, glue_base + split_top_skip_code);\r
+  primitive("tabskip", assign_glue, glue_base + tab_skip_code);\r
+  primitive("spaceskip", assign_glue, glue_base + space_skip_code);\r
+  primitive("xspaceskip", assign_glue, glue_base + xspace_skip_code);\r
+  primitive("parfillskip", assign_glue, glue_base + par_fill_skip_code);\r
+  primitive("thinmuskip", assign_mu_glue, glue_base + thin_mu_skip_code);\r
+  primitive("medmuskip", assign_mu_glue, glue_base + med_mu_skip_code);\r
+  primitive("thickmuskip", assign_mu_glue, glue_base + thick_mu_skip_code);\r
+  /* sec 0230 */\r
+  primitive("output", assign_toks, output_routine_loc);\r
+  primitive("everypar", assign_toks, every_par_loc);\r
+  primitive("everymath", assign_toks, every_math_loc);\r
+  primitive("everydisplay", assign_toks, every_display_loc);\r
+  primitive("everyhbox", assign_toks, every_hbox_loc);\r
+  primitive("everyvbox", assign_toks, every_vbox_loc);\r
+  primitive("everyjob", assign_toks, every_job_loc);\r
+  primitive("everycr", assign_toks, every_cr_loc);\r
+  primitive("errhelp", assign_toks, err_help_loc);\r
+  /* sec 0238 */\r
+  primitive("pretolerance", assign_int, int_base + pretolerance_code);\r
+  primitive("tolerance", assign_int, int_base + tolerance_code);\r
+  primitive("linepenalty", assign_int, int_base + line_penalty_code);\r
+  primitive("hyphenpenalty", assign_int, int_base + hyphen_penalty_code);\r
+  primitive("exhyphenpenalty", assign_int, int_base + ex_hyphen_penalty_code);\r
+  primitive("clubpenalty", assign_int, int_base + club_penalty_code);\r
+  primitive("widowpenalty", assign_int, int_base + widow_penalty_code);\r
+  primitive("displaywidowpenalty", assign_int, int_base + display_widow_penalty_code);\r
+  primitive("brokenpenalty", assign_int, int_base + broken_penalty_code);\r
+  primitive("binoppenalty", assign_int, int_base + bin_op_penalty_code);\r
+  primitive("relpenalty", assign_int, int_base + rel_penalty_code);\r
+  primitive("predisplaypenalty", assign_int, int_base + pre_display_penalty_code);\r
+  primitive("postdisplaypenalty", assign_int, int_base + post_display_penalty_code);\r
+  primitive("interlinepenalty", assign_int, int_base + inter_line_penalty_code);\r
+  primitive("doublehyphendemerits", assign_int, int_base + double_hyphen_demerits_code);\r
+  primitive("finalhyphendemerits", assign_int, int_base + final_hyphen_demerits_code);\r
+  primitive("adjdemerits", assign_int, int_base + adj_demerits_code);\r
+  primitive("mag", assign_int, int_base + mag_code);\r
+  primitive("delimiterfactor", assign_int, int_base + delimiter_factor_code);\r
+  primitive("looseness", assign_int, int_base + looseness_code);\r
+  primitive("time", assign_int, int_base + time_code);\r
+  primitive("day", assign_int, int_base + day_code);\r
+  primitive("month", assign_int, int_base + month_code);\r
+  primitive("year", assign_int, int_base + year_code);\r
+  primitive("showboxbreadth", assign_int, int_base + show_box_breadth_code);\r
+  primitive("showboxdepth", assign_int, int_base + show_box_depth_code);\r
+  primitive("hbadness", assign_int, int_base + hbadness_code);\r
+  primitive("vbadness", assign_int, int_base + vbadness_code);\r
+  primitive("pausing", assign_int, int_base + pausing_code);\r
+  primitive("tracingonline", assign_int, int_base + tracing_online_code);\r
+  primitive("tracingmacros", assign_int, int_base + tracing_macros_code);\r
+  primitive("tracingstats", assign_int, int_base + tracing_stats_code);\r
+  primitive("tracingparagraphs", assign_int, int_base + tracing_paragraphs_code);\r
+  primitive("tracingpages", assign_int, int_base + tracing_pages_code);\r
+  primitive("tracingoutput", assign_int, int_base + tracing_output_code);\r
+  primitive("tracinglostchars", assign_int, int_base + tracing_lost_chars_code);\r
+  primitive("tracingcommands", assign_int, int_base + tracing_commands_code);\r
+  primitive("tracingrestores", assign_int, int_base + tracing_restores_code);\r
+  primitive("uchyph", assign_int, int_base + uc_hyph_code);\r
+  primitive("outputpenalty", assign_int, int_base + output_penalty_code);\r
+  primitive("maxdeadcycles", assign_int, int_base + max_dead_cycles_code);\r
+  primitive("hangafter", assign_int, int_base + hang_after_code);\r
+  primitive("floatingpenalty", assign_int, int_base + floating_penalty_code);\r
+  primitive("globaldefs", assign_int, int_base + global_defs_code);\r
+  primitive("fam", assign_int, int_base + cur_fam_code);\r
+  primitive("escapechar", assign_int, int_base + escape_char_code);\r
+  primitive("defaulthyphenchar", assign_int, int_base + default_hyphen_char_code);\r
+  primitive("defaultskewchar", assign_int, int_base + default_skew_char_code);\r
+  primitive("endlinechar", assign_int, int_base + end_line_char_code);\r
+  primitive("newlinechar", assign_int, int_base + new_line_char_code);\r
+  primitive("language", assign_int, int_base + language_code);\r
+  primitive("lefthyphenmin", assign_int, int_base + left_hyphen_min_code);\r
+  primitive("righthyphenmin", assign_int, int_base + right_hyphen_min_code);\r
+  primitive("holdinginserts", assign_int, int_base + holding_inserts_code);\r
+  primitive("errorcontextlines", assign_int, int_base + error_context_lines_code);\r
+  /* sec 0248 */\r
+  primitive("parindent", assign_dimen, dimen_base + par_indent_code);\r
+  primitive("mathsurround", assign_dimen, dimen_base + math_surround_code);\r
+  primitive("lineskiplimit", assign_dimen, dimen_base + line_skip_limit_code);\r
+  primitive("hsize", assign_dimen, dimen_base + hsize_code);\r
+  primitive("vsize", assign_dimen, dimen_base + vsize_code);\r
+  primitive("maxdepth", assign_dimen, dimen_base + max_depth_code);\r
+  primitive("splitmaxdepth", assign_dimen, dimen_base + split_max_depth_code);\r
+  primitive("boxmaxdepth", assign_dimen, dimen_base + box_max_depth_code);\r
+  primitive("hfuzz", assign_dimen, dimen_base + hfuzz_code);\r
+  primitive("vfuzz", assign_dimen, dimen_base + vfuzz_code);\r
+  primitive("delimitershortfall", assign_dimen, dimen_base + delimiter_shortfall_code);\r
+  primitive("nulldelimiterspace", assign_dimen, dimen_base + null_delimiter_space_code);\r
+  primitive("scriptspace", assign_dimen, dimen_base + script_space_code);\r
+  primitive("predisplaysize", assign_dimen, dimen_base + pre_display_size_code);\r
+  primitive("displaywidth", assign_dimen, dimen_base + display_width_code);\r
+  primitive("displayindent", assign_dimen, dimen_base + display_indent_code);\r
+  primitive("overfullrule", assign_dimen, dimen_base + overfull_rule_code);\r
+  primitive("hangindent", assign_dimen, dimen_base + hang_indent_code);\r
+  primitive("hoffset", assign_dimen, dimen_base + h_offset_code);\r
+  primitive("voffset", assign_dimen, dimen_base + v_offset_code);\r
+  primitive("emergencystretch", assign_dimen, dimen_base + emergency_stretch_code);\r
+  primitive(" ", ex_space, 0);\r
+  primitive("/", ital_corr, 0);\r
+  primitive("accent", accent, 0);\r
+  primitive("advance", advance, 0);\r
+  primitive("afterassignment", after_assignment, 0);\r
+  primitive("aftergroup", after_group, 0);\r
+  primitive("begingroup", begin_group, 0);\r
+  primitive("char", char_num, 0);\r
+  primitive("csname", cs_name, 0);\r
+  primitive("delimiter", delim_num, 0);\r
+  primitive("divide", divide, 0);\r
+  primitive("endcsname", end_cs_name, 0);\r
+  primitive("endgroup", end_group, 0);\r
+  text(frozen_end_group) = make_string_pool("endgroup");\r
+  eqtb[frozen_end_group] = eqtb[cur_val]; \r
+  primitive("expandafter", expand_after, 0);\r
+  primitive("font", def_font, 0);\r
+  primitive("fontdimen", assign_font_dimen, 0);\r
+  primitive("halign", halign, 0);\r
+  primitive("hrule", hrule, 0);\r
+  primitive("ignorespaces", ignore_spaces, 0);\r
+  primitive("insert", insert, 0);\r
+  primitive("mark", mark, 0);\r
+  primitive("mathaccent", math_accent, 0);\r
+  primitive("mathchar", math_char_num, 0);\r
+  primitive("mathchoice", math_choice, 0);\r
+  primitive("multiply", multiply, 0);\r
+  primitive("noalign", no_align, 0);\r
+  primitive("noboundary", no_boundary, 0);\r
+  primitive("noexpand", no_expand, 0);\r
+  primitive("nonscript", non_script, 0);\r
+  primitive("omit", omit, 0);\r
+  primitive("parshape", set_shape, 0);\r
+  primitive("penalty", break_penalty, 0);\r
+  primitive("prevgraf", set_prev_graf, 0);\r
+  primitive("radical", radical, 0);\r
+  primitive("read", read_to_cs, 0);\r
+  primitive("relax", relax, 256);\r
+  text(frozen_relax) = make_string_pool("relax");\r
+  eqtb[frozen_relax] = eqtb[cur_val];\r
+  primitive("setbox", set_box, 0);\r
+  primitive("the", the, 0);\r
+  primitive("toks", toks_register, 0);\r
+  primitive("vadjust", vadjust, 0);\r
+  primitive("valign", valign, 0);\r
+  primitive("vcenter", vcenter, 0);\r
+  primitive("vrule", vrule, 0);\r
+  primitive("par", par_end, 256);\r
+  par_loc = cur_val; \r
+  par_token = cs_token_flag + par_loc;\r
+  primitive("input", input, 0);\r
+  primitive("endinput", input, 1);\r
+  primitive("topmark", top_bot_mark, top_mark_code);\r
+  primitive("firstmark", top_bot_mark, first_mark_code);\r
+  primitive("botmark", top_bot_mark, bot_mark_code);\r
+  primitive("splitfirstmark", top_bot_mark, split_first_mark_code);\r
+  primitive("splitbotmark", top_bot_mark, split_bot_mark_code);\r
+  primitive("count", tex_register, int_val);\r
+  primitive("dimen", tex_register, dimen_val);\r
+  primitive("skip", tex_register, glue_val);\r
+  primitive("muskip", tex_register, mu_val);\r
+  primitive("spacefactor", set_aux, hmode);\r
+  primitive("prevdepth", set_aux, vmode);\r
+  primitive("deadcycles", set_page_int, 0);\r
+  primitive("insertpenalties", set_page_int, 1);\r
+  primitive("wd", set_box_dimen, width_offset);\r
+  primitive("ht", set_box_dimen, height_offset);\r
+  primitive("dp", set_box_dimen, depth_offset);\r
+  primitive("lastpenalty", last_item, int_val);\r
+  primitive("lastkern", last_item, dimen_val);\r
+  primitive("lastskip", last_item, glue_val);\r
+  primitive("inputlineno", last_item, input_line_no_code);\r
+  primitive("badness", last_item, badness_code);\r
+  primitive("number", convert, number_code);\r
+  primitive("romannumeral", convert, roman_numeral_code);\r
+  primitive("string", convert, string_code);\r
+  primitive("meaning", convert, meaning_code);\r
+  primitive("fontname", convert, font_name_code);\r
+  primitive("jobname", convert, job_name_code);\r
+  primitive("if", if_test, if_char_code);\r
+  primitive("ifcat", if_test, if_cat_code);\r
+  primitive("ifnum", if_test, if_int_code);\r
+  primitive("ifdim", if_test, if_dim_code);\r
+  primitive("ifodd", if_test, if_odd_code);\r
+  primitive("ifvmode", if_test, if_vmode_code);\r
+  primitive("ifhmode", if_test, if_hmode_code);\r
+  primitive("ifmmode", if_test, if_mmode_code);\r
+  primitive("ifinner", if_test, if_inner_code);\r
+  primitive("ifvoid", if_test, if_void_code);\r
+  primitive("ifhbox", if_test, if_hbox_code);\r
+  primitive("ifvbox", if_test, if_vbox_code);\r
+  primitive("ifx", if_test, ifx_code);\r
+  primitive("ifeof", if_test, if_eof_code);\r
+  primitive("iftrue", if_test, if_true_code);\r
+  primitive("iffalse", if_test, if_false_code);\r
+  primitive("ifcase", if_test, if_case_code);\r
+  primitive("fi", fi_or_else, fi_code);\r
+  text(frozen_fi) = make_string_pool("fi");\r
+  eqtb[frozen_fi] = eqtb[cur_val];\r
+  primitive("or", fi_or_else, or_code);\r
+  primitive("else", fi_or_else, else_code);\r
+  primitive("nullfont", set_font, null_font);\r
+  text(frozen_null_font) = 795;\r
+  eqtb[frozen_null_font] = eqtb[cur_val];\r
+  primitive("span", tab_mark, span_code);\r
+  primitive("cr", car_ret, cr_code);\r
+  text(frozen_cr) = make_string_pool("cr");\r
+  eqtb[frozen_cr] = eqtb[cur_val];\r
+  primitive("crcr", car_ret, cr_cr_code);\r
+  text(frozen_end_template) = make_string_pool("endtemplate");\r
+  text(frozen_endv) = make_string_pool("endtemplate");\r
+  eq_type(frozen_endv) = endv;\r
+  equiv(frozen_endv) = null_list; \r
+  eq_level(frozen_endv) = level_one; \r
+  eqtb[frozen_end_template] = eqtb[frozen_endv]; \r
+  eq_type(frozen_end_template) = end_template;\r
+  primitive("pagegoal", set_page_dimen, 0);\r
+  primitive("pagetotal", set_page_dimen, 1);\r
+  primitive("pagestretch", set_page_dimen, 2);\r
+  primitive("pagefilstretch", set_page_dimen, 3);\r
+  primitive("pagefillstretch", set_page_dimen, 4);\r
+  primitive("pagefilllstretch", set_page_dimen, 5);\r
+  primitive("pageshrink", set_page_dimen, 6);\r
+  primitive("pagedepth", set_page_dimen, 7);\r
+  primitive("end", stop, 0);\r
+  primitive("dump", stop, 1);\r
+  primitive("hskip", hskip, skip_code);\r
+  primitive("hfil", hskip, fil_code);\r
+  primitive("hfill", hskip, fill_code);\r
+  primitive("hss", hskip, ss_code);\r
+  primitive("hfilneg", hskip, fil_neg_code);\r
+  primitive("vskip", vskip, skip_code);\r
+  primitive("vfil", vskip, fil_code);\r
+  primitive("vfill", vskip, fill_code);\r
+  primitive("vss", vskip, ss_code);\r
+  primitive("vfilneg", vskip, fil_neg_code);\r
+  primitive("mskip", mskip, mskip_code);\r
+  primitive("kern", kern, explicit);\r
+  primitive("mkern", mkern, mu_glue);\r
+  primitive("moveleft", hmove, 1);\r
+  primitive("moveright", hmove, 0);\r
+  primitive("raise", vmove, 1);\r
+  primitive("lower", vmove, 0);\r
+  primitive("box", make_box, box_code);\r
+  primitive("copy", make_box, copy_code);\r
+  primitive("lastbox", make_box, last_box_code);\r
+  primitive("vsplit", make_box, vsplit_code);\r
+  primitive("vtop", make_box, vtop_code);\r
+  primitive("vbox", make_box, vtop_code + vmode);\r
+  primitive("hbox", make_box, vtop_code + hmode);\r
+  primitive("shipout", leader_ship, a_leaders - 1);\r
+  primitive("leaders", leader_ship, a_leaders);\r
+  primitive("cleaders", leader_ship, c_leaders);\r
+  primitive("xleaders", leader_ship, x_leaders);\r
+  primitive("indent", start_par, 1);\r
+  primitive("noindent", start_par, 0);\r
+  primitive("unpenalty", remove_item, penalty_node);\r
+  primitive("unkern", remove_item, kern_node);\r
+  primitive("unskip", remove_item, glue_node);\r
+  primitive("unhbox", un_hbox, box_code);\r
+  primitive("unhcopy", un_hbox, copy_code);\r
+  primitive("unvbox", un_vbox, box_code);\r
+  primitive("unvcopy", un_vbox, copy_code);\r
+  primitive("-", discretionary, 1);\r
+  primitive("discretionary", discretionary, 0);\r
+  primitive("eqno", eq_no, 0);\r
+  primitive("leqno", eq_no, 1);\r
+  primitive("mathord", math_comp, ord_noad);\r
+  primitive("mathop", math_comp, op_noad);\r
+  primitive("mathbin", math_comp, bin_noad);\r
+  primitive("mathrel", math_comp, rel_noad);\r
+  primitive("mathopen", math_comp, open_noad);\r
+  primitive("mathclose", math_comp, close_noad);\r
+  primitive("mathpunct", math_comp, punct_noad);\r
+  primitive("mathinner", math_comp, inner_noad);\r
+  primitive("underline", math_comp, under_noad);\r
+  primitive("overline", math_comp, over_noad);\r
+  primitive("displaylimits", limit_switch, normal);\r
+  primitive("limits", limit_switch, limits);\r
+  primitive("nolimits", limit_switch, no_limits);\r
+  primitive("displaystyle", math_style, display_style);\r
+  primitive("textstyle", math_style, text_style);\r
+  primitive("scriptstyle", math_style, script_style);\r
+  primitive("scriptscriptstyle", math_style, script_script_style);\r
+  primitive("above", above, above_code);\r
+  primitive("over", above, over_code);\r
+  primitive("atop", above, atop_code);\r
+  primitive("abovewithdelims", above, delimited_code + above_code);\r
+  primitive("overwithdelims", above, delimited_code + over_code);\r
+  primitive("atopwithdelims", above, delimited_code + atop_code);\r
+  primitive("left", left_right, left_noad);\r
+  primitive("right", left_right, right_noad);\r
+  text(frozen_right) = make_string_pool("right");\r
+  eqtb[frozen_right] = eqtb[cur_val]; \r
+  primitive("long", prefix, 1);\r
+  primitive("outer", prefix, 2);\r
+  primitive("global", prefix, 4);\r
+  primitive("def", def, 0);\r
+  primitive("gdef", def, 1);\r
+  primitive("edef", def, 2);\r
+  primitive("xdef", def, 3);\r
+  primitive("let", let, normal);\r
+  primitive("futurelet", let, normal + 1);\r
+  primitive("chardef", shorthand_def, char_def_code);\r
+  primitive("mathchardef", shorthand_def, math_char_def_code);\r
+  primitive("countdef", shorthand_def, count_def_code);\r
+  primitive("dimendef", shorthand_def, dimen_def_code);\r
+  primitive("skipdef", shorthand_def, skip_def_code);\r
+  primitive("muskipdef", shorthand_def, mu_skip_def_code);\r
+  primitive("toksdef", shorthand_def, toks_def_code);\r
+  primitive("catcode", def_code, cat_code_base);\r
+  primitive("mathcode", def_code, math_code_base);\r
+  primitive("lccode", def_code, lc_code_base);\r
+  primitive("uccode", def_code, uc_code_base);\r
+  primitive("sfcode", def_code, sf_code_base);\r
+  primitive("delcode", def_code, del_code_base);\r
+  primitive("textfont", def_family, math_font_base);\r
+  primitive("scriptfont", def_family, math_font_base + script_size);\r
+  primitive("scriptscriptfont", def_family, math_font_base + script_script_size);\r
+  primitive("hyphenation", hyph_data, 0);\r
+  primitive("patterns", hyph_data, 1);\r
+  primitive("hyphenchar", assign_font_int, 0);\r
+  primitive("skewchar", assign_font_int, 1);\r
+  primitive("batchmode", set_interaction, batch_mode);\r
+  primitive("nonstopmode", set_interaction, nonstop_mode);\r
+  primitive("scrollmode", set_interaction, scroll_mode);\r
+  primitive("errorstopmode", set_interaction, error_stop_mode);\r
+  primitive("openin", in_stream, 1);\r
+  primitive("closein", in_stream, 0);\r
+  primitive("message", message, 0);\r
+  primitive("errmessage", message, 1);\r
+  primitive("lowercase", case_shift, lc_code_base);\r
+  primitive("uppercase", case_shift, uc_code_base);\r
+  primitive("show", xray, show_code);\r
+  primitive("showbox", xray, show_box_code);\r
+  primitive("showthe", xray, show_the_code);\r
+  primitive("showlists", xray, show_lists);\r
+  primitive("openout", extension, open_node);\r
+  primitive("write", extension, write_node);\r
+  write_loc = cur_val;\r
+  primitive("closeout", extension, close_node);\r
+  primitive("special", extension, special_node);\r
+  primitive("immediate", extension, immediate_code);\r
+  primitive("setlanguage", extension, set_language_code);\r
+  no_new_control_sequence = true; \r
+}\r
+#endif\r
diff --git a/src/texsourc/libmd5/md5.c b/src/texsourc/libmd5/md5.c
deleted file mode 100644 (file)
index c35d96c..0000000
+++ /dev/null
@@ -1,381 +0,0 @@
-/*
-  Copyright (C) 1999, 2000, 2002 Aladdin Enterprises.  All rights reserved.
-
-  This software is provided 'as-is', without any express or implied
-  warranty.  In no event will the authors be held liable for any damages
-  arising from the use of this software.
-
-  Permission is granted to anyone to use this software for any purpose,
-  including commercial applications, and to alter it and redistribute it
-  freely, subject to the following restrictions:
-
-  1. The origin of this software must not be misrepresented; you must not
-     claim that you wrote the original software. If you use this software
-     in a product, an acknowledgment in the product documentation would be
-     appreciated but is not required.
-  2. Altered source versions must be plainly marked as such, and must not be
-     misrepresented as being the original software.
-  3. This notice may not be removed or altered from any source distribution.
-
-  L. Peter Deutsch
-  ghost@aladdin.com
-
- */
-/* $Id: md5.c,v 1.6 2002/04/13 19:20:28 lpd Exp $ */
-/*
-  Independent implementation of MD5 (RFC 1321).
-
-  This code implements the MD5 Algorithm defined in RFC 1321, whose
-  text is available at
-       http://www.ietf.org/rfc/rfc1321.txt
-  The code is derived from the text of the RFC, including the test suite
-  (section A.5) but excluding the rest of Appendix A.  It does not include
-  any code or documentation that is identified in the RFC as being
-  copyrighted.
-
-  The original and principal author of md5.c is L. Peter Deutsch
-  <ghost@aladdin.com>.  Other authors are noted in the change history
-  that follows (in reverse chronological order):
-
-  2002-04-13 lpd Clarified derivation from RFC 1321; now handles byte order
-       either statically or dynamically; added missing #include <string.h>
-       in library.
-  2002-03-11 lpd Corrected argument list for main(), and added int return
-       type, in test program and T value program.
-  2002-02-21 lpd Added missing #include <stdio.h> in test program.
-  2000-07-03 lpd Patched to eliminate warnings about "constant is
-       unsigned in ANSI C, signed in traditional"; made test program
-       self-checking.
-  1999-11-04 lpd Edited comments slightly for automatic TOC extraction.
-  1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5).
-  1999-05-03 lpd Original version.
- */
-
-#include "md5.h"
-#include <string.h>
-
-#undef BYTE_ORDER      /* 1 = big-endian, -1 = little-endian, 0 = unknown */
-#ifdef ARCH_IS_BIG_ENDIAN
-#  define BYTE_ORDER (ARCH_IS_BIG_ENDIAN ? 1 : -1)
-#else
-#  define BYTE_ORDER 0
-#endif
-
-#define T_MASK ((md5_word_t)~0)
-#define T1 /* 0xd76aa478 */ (T_MASK ^ 0x28955b87)
-#define T2 /* 0xe8c7b756 */ (T_MASK ^ 0x173848a9)
-#define T3    0x242070db
-#define T4 /* 0xc1bdceee */ (T_MASK ^ 0x3e423111)
-#define T5 /* 0xf57c0faf */ (T_MASK ^ 0x0a83f050)
-#define T6    0x4787c62a
-#define T7 /* 0xa8304613 */ (T_MASK ^ 0x57cfb9ec)
-#define T8 /* 0xfd469501 */ (T_MASK ^ 0x02b96afe)
-#define T9    0x698098d8
-#define T10 /* 0x8b44f7af */ (T_MASK ^ 0x74bb0850)
-#define T11 /* 0xffff5bb1 */ (T_MASK ^ 0x0000a44e)
-#define T12 /* 0x895cd7be */ (T_MASK ^ 0x76a32841)
-#define T13    0x6b901122
-#define T14 /* 0xfd987193 */ (T_MASK ^ 0x02678e6c)
-#define T15 /* 0xa679438e */ (T_MASK ^ 0x5986bc71)
-#define T16    0x49b40821
-#define T17 /* 0xf61e2562 */ (T_MASK ^ 0x09e1da9d)
-#define T18 /* 0xc040b340 */ (T_MASK ^ 0x3fbf4cbf)
-#define T19    0x265e5a51
-#define T20 /* 0xe9b6c7aa */ (T_MASK ^ 0x16493855)
-#define T21 /* 0xd62f105d */ (T_MASK ^ 0x29d0efa2)
-#define T22    0x02441453
-#define T23 /* 0xd8a1e681 */ (T_MASK ^ 0x275e197e)
-#define T24 /* 0xe7d3fbc8 */ (T_MASK ^ 0x182c0437)
-#define T25    0x21e1cde6
-#define T26 /* 0xc33707d6 */ (T_MASK ^ 0x3cc8f829)
-#define T27 /* 0xf4d50d87 */ (T_MASK ^ 0x0b2af278)
-#define T28    0x455a14ed
-#define T29 /* 0xa9e3e905 */ (T_MASK ^ 0x561c16fa)
-#define T30 /* 0xfcefa3f8 */ (T_MASK ^ 0x03105c07)
-#define T31    0x676f02d9
-#define T32 /* 0x8d2a4c8a */ (T_MASK ^ 0x72d5b375)
-#define T33 /* 0xfffa3942 */ (T_MASK ^ 0x0005c6bd)
-#define T34 /* 0x8771f681 */ (T_MASK ^ 0x788e097e)
-#define T35    0x6d9d6122
-#define T36 /* 0xfde5380c */ (T_MASK ^ 0x021ac7f3)
-#define T37 /* 0xa4beea44 */ (T_MASK ^ 0x5b4115bb)
-#define T38    0x4bdecfa9
-#define T39 /* 0xf6bb4b60 */ (T_MASK ^ 0x0944b49f)
-#define T40 /* 0xbebfbc70 */ (T_MASK ^ 0x4140438f)
-#define T41    0x289b7ec6
-#define T42 /* 0xeaa127fa */ (T_MASK ^ 0x155ed805)
-#define T43 /* 0xd4ef3085 */ (T_MASK ^ 0x2b10cf7a)
-#define T44    0x04881d05
-#define T45 /* 0xd9d4d039 */ (T_MASK ^ 0x262b2fc6)
-#define T46 /* 0xe6db99e5 */ (T_MASK ^ 0x1924661a)
-#define T47    0x1fa27cf8
-#define T48 /* 0xc4ac5665 */ (T_MASK ^ 0x3b53a99a)
-#define T49 /* 0xf4292244 */ (T_MASK ^ 0x0bd6ddbb)
-#define T50    0x432aff97
-#define T51 /* 0xab9423a7 */ (T_MASK ^ 0x546bdc58)
-#define T52 /* 0xfc93a039 */ (T_MASK ^ 0x036c5fc6)
-#define T53    0x655b59c3
-#define T54 /* 0x8f0ccc92 */ (T_MASK ^ 0x70f3336d)
-#define T55 /* 0xffeff47d */ (T_MASK ^ 0x00100b82)
-#define T56 /* 0x85845dd1 */ (T_MASK ^ 0x7a7ba22e)
-#define T57    0x6fa87e4f
-#define T58 /* 0xfe2ce6e0 */ (T_MASK ^ 0x01d3191f)
-#define T59 /* 0xa3014314 */ (T_MASK ^ 0x5cfebceb)
-#define T60    0x4e0811a1
-#define T61 /* 0xf7537e82 */ (T_MASK ^ 0x08ac817d)
-#define T62 /* 0xbd3af235 */ (T_MASK ^ 0x42c50dca)
-#define T63    0x2ad7d2bb
-#define T64 /* 0xeb86d391 */ (T_MASK ^ 0x14792c6e)
-
-
-static void
-md5_process(md5_state_t *pms, const md5_byte_t *data /*[64]*/)
-{
-    md5_word_t
-       a = pms->abcd[0], b = pms->abcd[1],
-       c = pms->abcd[2], d = pms->abcd[3];
-    md5_word_t t;
-#if BYTE_ORDER > 0
-    /* Define storage only for big-endian CPUs. */
-    md5_word_t X[16];
-#else
-    /* Define storage for little-endian or both types of CPUs. */
-    md5_word_t xbuf[16];
-    const md5_word_t *X;
-#endif
-
-    {
-#if BYTE_ORDER == 0
-       /*
-        * Determine dynamically whether this is a big-endian or
-        * little-endian machine, since we can use a more efficient
-        * algorithm on the latter.
-        */
-       static const int w = 1;
-
-       if (*((const md5_byte_t *)&w)) /* dynamic little-endian */
-#endif
-#if BYTE_ORDER <= 0            /* little-endian */
-       {
-           /*
-            * On little-endian machines, we can process properly aligned
-            * data without copying it.
-            */
-           if (!((data - (const md5_byte_t *)0) & 3)) {
-               /* data are properly aligned */
-               X = (const md5_word_t *)data;
-           } else {
-               /* not aligned */
-               memcpy(xbuf, data, 64);
-               X = xbuf;
-           }
-       }
-#endif
-#if BYTE_ORDER == 0
-       else                    /* dynamic big-endian */
-#endif
-#if BYTE_ORDER >= 0            /* big-endian */
-       {
-           /*
-            * On big-endian machines, we must arrange the bytes in the
-            * right order.
-            */
-           const md5_byte_t *xp = data;
-           int i;
-
-#  if BYTE_ORDER == 0
-           X = xbuf;           /* (dynamic only) */
-#  else
-#    define xbuf X             /* (static only) */
-#  endif
-           for (i = 0; i < 16; ++i, xp += 4)
-               xbuf[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24);
-       }
-#endif
-    }
-
-#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
-
-    /* Round 1. */
-    /* Let [abcd k s i] denote the operation
-       a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */
-#define F(x, y, z) (((x) & (y)) | (~(x) & (z)))
-#define SET(a, b, c, d, k, s, Ti)\
-  t = a + F(b,c,d) + X[k] + Ti;\
-  a = ROTATE_LEFT(t, s) + b
-    /* Do the following 16 operations. */
-    SET(a, b, c, d,  0,  7,  T1);
-    SET(d, a, b, c,  1, 12,  T2);
-    SET(c, d, a, b,  2, 17,  T3);
-    SET(b, c, d, a,  3, 22,  T4);
-    SET(a, b, c, d,  4,  7,  T5);
-    SET(d, a, b, c,  5, 12,  T6);
-    SET(c, d, a, b,  6, 17,  T7);
-    SET(b, c, d, a,  7, 22,  T8);
-    SET(a, b, c, d,  8,  7,  T9);
-    SET(d, a, b, c,  9, 12, T10);
-    SET(c, d, a, b, 10, 17, T11);
-    SET(b, c, d, a, 11, 22, T12);
-    SET(a, b, c, d, 12,  7, T13);
-    SET(d, a, b, c, 13, 12, T14);
-    SET(c, d, a, b, 14, 17, T15);
-    SET(b, c, d, a, 15, 22, T16);
-#undef SET
-
-     /* Round 2. */
-     /* Let [abcd k s i] denote the operation
-          a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
-#define G(x, y, z) (((x) & (z)) | ((y) & ~(z)))
-#define SET(a, b, c, d, k, s, Ti)\
-  t = a + G(b,c,d) + X[k] + Ti;\
-  a = ROTATE_LEFT(t, s) + b
-     /* Do the following 16 operations. */
-    SET(a, b, c, d,  1,  5, T17);
-    SET(d, a, b, c,  6,  9, T18);
-    SET(c, d, a, b, 11, 14, T19);
-    SET(b, c, d, a,  0, 20, T20);
-    SET(a, b, c, d,  5,  5, T21);
-    SET(d, a, b, c, 10,  9, T22);
-    SET(c, d, a, b, 15, 14, T23);
-    SET(b, c, d, a,  4, 20, T24);
-    SET(a, b, c, d,  9,  5, T25);
-    SET(d, a, b, c, 14,  9, T26);
-    SET(c, d, a, b,  3, 14, T27);
-    SET(b, c, d, a,  8, 20, T28);
-    SET(a, b, c, d, 13,  5, T29);
-    SET(d, a, b, c,  2,  9, T30);
-    SET(c, d, a, b,  7, 14, T31);
-    SET(b, c, d, a, 12, 20, T32);
-#undef SET
-
-     /* Round 3. */
-     /* Let [abcd k s t] denote the operation
-          a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */
-#define H(x, y, z) ((x) ^ (y) ^ (z))
-#define SET(a, b, c, d, k, s, Ti)\
-  t = a + H(b,c,d) + X[k] + Ti;\
-  a = ROTATE_LEFT(t, s) + b
-     /* Do the following 16 operations. */
-    SET(a, b, c, d,  5,  4, T33);
-    SET(d, a, b, c,  8, 11, T34);
-    SET(c, d, a, b, 11, 16, T35);
-    SET(b, c, d, a, 14, 23, T36);
-    SET(a, b, c, d,  1,  4, T37);
-    SET(d, a, b, c,  4, 11, T38);
-    SET(c, d, a, b,  7, 16, T39);
-    SET(b, c, d, a, 10, 23, T40);
-    SET(a, b, c, d, 13,  4, T41);
-    SET(d, a, b, c,  0, 11, T42);
-    SET(c, d, a, b,  3, 16, T43);
-    SET(b, c, d, a,  6, 23, T44);
-    SET(a, b, c, d,  9,  4, T45);
-    SET(d, a, b, c, 12, 11, T46);
-    SET(c, d, a, b, 15, 16, T47);
-    SET(b, c, d, a,  2, 23, T48);
-#undef SET
-
-     /* Round 4. */
-     /* Let [abcd k s t] denote the operation
-          a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
-#define I(x, y, z) ((y) ^ ((x) | ~(z)))
-#define SET(a, b, c, d, k, s, Ti)\
-  t = a + I(b,c,d) + X[k] + Ti;\
-  a = ROTATE_LEFT(t, s) + b
-     /* Do the following 16 operations. */
-    SET(a, b, c, d,  0,  6, T49);
-    SET(d, a, b, c,  7, 10, T50);
-    SET(c, d, a, b, 14, 15, T51);
-    SET(b, c, d, a,  5, 21, T52);
-    SET(a, b, c, d, 12,  6, T53);
-    SET(d, a, b, c,  3, 10, T54);
-    SET(c, d, a, b, 10, 15, T55);
-    SET(b, c, d, a,  1, 21, T56);
-    SET(a, b, c, d,  8,  6, T57);
-    SET(d, a, b, c, 15, 10, T58);
-    SET(c, d, a, b,  6, 15, T59);
-    SET(b, c, d, a, 13, 21, T60);
-    SET(a, b, c, d,  4,  6, T61);
-    SET(d, a, b, c, 11, 10, T62);
-    SET(c, d, a, b,  2, 15, T63);
-    SET(b, c, d, a,  9, 21, T64);
-#undef SET
-
-     /* Then perform the following additions. (That is increment each
-        of the four registers by the value it had before this block
-        was started.) */
-    pms->abcd[0] += a;
-    pms->abcd[1] += b;
-    pms->abcd[2] += c;
-    pms->abcd[3] += d;
-}
-
-void
-md5_init(md5_state_t *pms)
-{
-    pms->count[0] = pms->count[1] = 0;
-    pms->abcd[0] = 0x67452301;
-    pms->abcd[1] = /*0xefcdab89*/ T_MASK ^ 0x10325476;
-    pms->abcd[2] = /*0x98badcfe*/ T_MASK ^ 0x67452301;
-    pms->abcd[3] = 0x10325476;
-}
-
-void
-md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes)
-{
-    const md5_byte_t *p = data;
-    int left = nbytes;
-    int offset = (pms->count[0] >> 3) & 63;
-    md5_word_t nbits = (md5_word_t)(nbytes << 3);
-
-    if (nbytes <= 0)
-       return;
-
-    /* Update the message length. */
-    pms->count[1] += nbytes >> 29;
-    pms->count[0] += nbits;
-    if (pms->count[0] < nbits)
-       pms->count[1]++;
-
-    /* Process an initial partial block. */
-    if (offset) {
-       int copy = (offset + nbytes > 64 ? 64 - offset : nbytes);
-
-       memcpy(pms->buf + offset, p, copy);
-       if (offset + copy < 64)
-           return;
-       p += copy;
-       left -= copy;
-       md5_process(pms, pms->buf);
-    }
-
-    /* Process full blocks. */
-    for (; left >= 64; p += 64, left -= 64)
-       md5_process(pms, p);
-
-    /* Process a final partial block. */
-    if (left)
-       memcpy(pms->buf, p, left);
-}
-
-void
-md5_finish(md5_state_t *pms, md5_byte_t digest[16])
-{
-    static const md5_byte_t pad[64] = {
-       0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-    };
-    md5_byte_t data[8];
-    int i;
-
-    /* Save the length before padding. */
-    for (i = 0; i < 8; ++i)
-       data[i] = (md5_byte_t)(pms->count[i >> 2] >> ((i & 3) << 3));
-    /* Pad to 56 bytes mod 64. */
-    md5_append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1);
-    /* Append the length. */
-    md5_append(pms, data, 8);
-    for (i = 0; i < 16; ++i)
-       digest[i] = (md5_byte_t)(pms->abcd[i >> 2] >> ((i & 3) << 3));
-}
diff --git a/src/texsourc/libmd5/md5.h b/src/texsourc/libmd5/md5.h
deleted file mode 100644 (file)
index 698c995..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
-  Copyright (C) 1999, 2002 Aladdin Enterprises.  All rights reserved.
-
-  This software is provided 'as-is', without any express or implied
-  warranty.  In no event will the authors be held liable for any damages
-  arising from the use of this software.
-
-  Permission is granted to anyone to use this software for any purpose,
-  including commercial applications, and to alter it and redistribute it
-  freely, subject to the following restrictions:
-
-  1. The origin of this software must not be misrepresented; you must not
-     claim that you wrote the original software. If you use this software
-     in a product, an acknowledgment in the product documentation would be
-     appreciated but is not required.
-  2. Altered source versions must be plainly marked as such, and must not be
-     misrepresented as being the original software.
-  3. This notice may not be removed or altered from any source distribution.
-
-  L. Peter Deutsch
-  ghost@aladdin.com
-
- */
-/* $Id: md5.h,v 1.4 2002/04/13 19:20:28 lpd Exp $ */
-/*
-  Independent implementation of MD5 (RFC 1321).
-
-  This code implements the MD5 Algorithm defined in RFC 1321, whose
-  text is available at
-       http://www.ietf.org/rfc/rfc1321.txt
-  The code is derived from the text of the RFC, including the test suite
-  (section A.5) but excluding the rest of Appendix A.  It does not include
-  any code or documentation that is identified in the RFC as being
-  copyrighted.
-
-  The original and principal author of md5.h is L. Peter Deutsch
-  <ghost@aladdin.com>.  Other authors are noted in the change history
-  that follows (in reverse chronological order):
-
-  2002-04-13 lpd Removed support for non-ANSI compilers; removed
-       references to Ghostscript; clarified derivation from RFC 1321;
-       now handles byte order either statically or dynamically.
-  1999-11-04 lpd Edited comments slightly for automatic TOC extraction.
-  1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5);
-       added conditionalization for C++ compilation from Martin
-       Purschke <purschke@bnl.gov>.
-  1999-05-03 lpd Original version.
- */
-
-#ifndef md5_INCLUDED
-#  define md5_INCLUDED
-
-/*
- * This package supports both compile-time and run-time determination of CPU
- * byte order.  If ARCH_IS_BIG_ENDIAN is defined as 0, the code will be
- * compiled to run only on little-endian CPUs; if ARCH_IS_BIG_ENDIAN is
- * defined as non-zero, the code will be compiled to run only on big-endian
- * CPUs; if ARCH_IS_BIG_ENDIAN is not defined, the code will be compiled to
- * run on either big- or little-endian CPUs, but will run slightly less
- * efficiently on either one than if ARCH_IS_BIG_ENDIAN is defined.
- */
-
-typedef unsigned char md5_byte_t; /* 8-bit byte */
-typedef unsigned int md5_word_t; /* 32-bit word */
-
-/* Define the state of the MD5 Algorithm. */
-typedef struct md5_state_s {
-    md5_word_t count[2];       /* message length in bits, lsw first */
-    md5_word_t abcd[4];                /* digest buffer */
-    md5_byte_t buf[64];                /* accumulate block */
-} md5_state_t;
-
-#ifdef __cplusplus
-extern "C" 
-{
-#endif
-
-/* Initialize the algorithm. */
-void md5_init(md5_state_t *pms);
-
-/* Append a string to the message. */
-void md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes);
-
-/* Finish the message and return the digest. */
-void md5_finish(md5_state_t *pms, md5_byte_t digest[16]);
-
-#ifdef __cplusplus
-}  /* end extern "C" */
-#endif
-
-#endif /* md5_INCLUDED */
diff --git a/src/texsourc/libmd5/md5main.c b/src/texsourc/libmd5/md5main.c
deleted file mode 100644 (file)
index 625a619..0000000
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
-  Copyright (C) 2002 Aladdin Enterprises.  All rights reserved.
-
-  This software is provided 'as-is', without any express or implied
-  warranty.  In no event will the authors be held liable for any damages
-  arising from the use of this software.
-
-  Permission is granted to anyone to use this software for any purpose,
-  including commercial applications, and to alter it and redistribute it
-  freely, subject to the following restrictions:
-
-  1. The origin of this software must not be misrepresented; you must not
-     claim that you wrote the original software. If you use this software
-     in a product, an acknowledgment in the product documentation would be
-     appreciated but is not required.
-  2. Altered source versions must be plainly marked as such, and must not be
-     misrepresented as being the original software.
-  3. This notice may not be removed or altered from any source distribution.
-
-  L. Peter Deutsch
-  ghost@aladdin.com
-
- */
-/* $Id: md5main.c,v 1.1 2002/04/13 19:20:28 lpd Exp $ */
-/*
-  Independent implementation of MD5 (RFC 1321).
-
-  This code implements the MD5 Algorithm defined in RFC 1321, whose
-  text is available at
-       http://www.ietf.org/rfc/rfc1321.txt
-  The code is derived from the text of the RFC, including the test suite
-  (section A.5) but excluding the rest of Appendix A.  It does not include
-  any code or documentation that is identified in the RFC as being
-  copyrighted.
-
-  The original and principal author of md5.c is L. Peter Deutsch
-  <ghost@aladdin.com>.  Other authors are noted in the change history
-  that follows (in reverse chronological order):
-
-  2002-04-13 lpd Splits off main program into a separate file, md5main.c.
- */
-
-#include "md5.h"
-#include <math.h>
-#include <stdio.h>
-#include <string.h>
-
-/*
- * This file builds an executable that performs various functions related
- * to the MD5 library.  Typical compilation:
- *     gcc -o md5main -lm md5main.c md5.c
- */
-static const char *const usage = "\
-Usage:\n\
-    md5main --test             # run the self-test (A.5 of RFC 1321)\n\
-    md5main --t-values         # print the T values for the library\n\
-    md5main --version          # print the version of the package\n\
-";
-static const char *const version = "2002-04-13";
-
-/* Run the self-test. */
-static int
-do_test(void)
-{
-    static const char *const test[7*2] = {
-       "", "d41d8cd98f00b204e9800998ecf8427e",
-       "a", "0cc175b9c0f1b6a831c399e269772661",
-       "abc", "900150983cd24fb0d6963f7d28e17f72",
-       "message digest", "f96b697d7cb7938d525a2f31aaf161d0",
-       "abcdefghijklmnopqrstuvwxyz", "c3fcd3d76192e4007dfb496cca67e13b",
-       "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
-                               "d174ab98d277d9f5a5611c2c9f419d9f",
-       "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "57edf4a22be3c955ac49da2e2107b67a"
-    };
-    int i;
-    int status = 0;
-
-    for (i = 0; i < 7*2; i += 2) {
-       md5_state_t state;
-       md5_byte_t digest[16];
-       char hex_output[16*2 + 1];
-       int di;
-
-       md5_init(&state);
-       md5_append(&state, (const md5_byte_t *)test[i], strlen(test[i]));
-       md5_finish(&state, digest);
-       for (di = 0; di < 16; ++di)
-           sprintf(hex_output + di * 2, "%02x", digest[di]);
-       if (strcmp(hex_output, test[i + 1])) {
-           printf("MD5 (\"%s\") = ", test[i]);
-           puts(hex_output);
-           printf("**** ERROR, should be: %s\n", test[i + 1]);
-           status = 1;
-       }
-    }
-    if (status == 0)
-       puts("md5 self-test completed successfully.");
-    return status;
-}
-
-/* Print the T values. */
-static int
-do_t_values(void)
-{
-    int i;
-    for (i = 1; i <= 64; ++i) {
-       unsigned long v = (unsigned long)(4294967296.0 * fabs(sin((double)i)));
-
-       /*
-        * The following nonsense is only to avoid compiler warnings about
-        * "integer constant is unsigned in ANSI C, signed with -traditional".
-        */
-       if (v >> 31) {
-           printf("#define T%d /* 0x%08lx */ (T_MASK ^ 0x%08lx)\n", i,
-                  v, (unsigned long)(unsigned int)(~v));
-       } else {
-           printf("#define T%d    0x%08lx\n", i, v);
-       }
-    }
-    return 0;
-}
-
-/* Main program */
-int
-main(int argc, char *argv[])
-{
-    if (argc == 2) {
-       if (!strcmp(argv[1], "--test"))
-           return do_test();
-       if (!strcmp(argv[1], "--t-values"))
-           return do_t_values();
-       if (!strcmp(argv[1], "--version")) {
-           puts(version);
-           return 0;
-       }
-    }
-    puts(usage);
-    return 0;
-}
index 1cf3c1a..8da8af4 100644 (file)
-/* Copyright 2007 TeX Users Group
-   Copyright 2014 Clerk Ma   
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301 USA.  */
-
-#define EXTERN extern
-
-#include "yandytex.h"
-
-#define USEOUREALLOC
-#define USEMEMSET
-
-#ifdef USEOUREALLOC
-  #define REALLOC ourrealloc
-#else
-  #define REALLOC realloc
-#endif
-
-#if   defined (__ANDROID__)
-  #define malloc_usable_size dlmalloc_usable_size
-#elif defined (__APPLE__)
-  #define malloc_usable_size malloc_size
-#endif
-
-#if   defined (__clang__)
-const char * compiler = "Clang/LLVM";
-#elif defined (__GNUC__) || defined(__GNUG__)
-const char * compiler = "GCC";
-#elif defined (_MSC_VER)
-const char * compiler = "MSVC";
-#endif
-
-#if   defined (_WIN64)
-const char * dist = "Win64";
-#elif defined (_WIN32)
-const char * dist = "Win32";
-#elif defined (__ANDROID__)
-const char * dist = "Android";
-#elif defined (__APPLE__)
-const char * dist = "Darwin";
-#elif defined (__gnu_linux__)
-const char * dist = "Linux";
-#else
-const char * dist = "Unknown";
-#endif
-
-const char * compiletime  = __TIME__;
-const char * compiledate  = __DATE__;
-const char * yandyversion = "2.3.0";
-const char * application  = "Y&Y TeX";
-const char * banner       = "This is TeX, Version 3.14159265";
-
-void print_banner (void)
-{
-  char dist_ver[256];
-  memset(dist_ver, 0, sizeof(dist_ver));
-  sprintf(dist_ver, "%s (%s %s/%s)", banner, application, yandyversion, dist);
-  prints(dist_ver);
-}
-
-clock_t start_time, main_time, finish_time;
-
-char * dvi_directory = "";
-char * log_directory = "";
-char * aux_directory = "";
-char * fmt_directory = "";
-char * pdf_directory = "";
-
-char log_line[256];
-
-boolean mem_spec_flag     = false;
-boolean format_spec       = false;
-boolean reorder_arg_flag  = true;  /* put command line flags/arguments first */
-
-/* Mapping from Windows ANSI to DOS code page 850 96/Jan/20 */
-
-unsigned char wintodos[128] =
-{
-    0,   0,   0, 159,   0,   0,   0,   0,
-   94,   0,   0,   0,   0,   0,   0,   0,
-    0,  96,  39,   0,   0,   7,   0,   0,
-  126,   0,   0,   0,   0,   0,   0,   0,
-   32, 173, 189, 156, 207, 190, 221,  21,
-    0, 184, 166, 174, 170,  45, 169,   0,
-  248, 241, 253, 252,   0, 230,  20, 250,
-    0, 251, 167, 175, 172, 171, 243, 168,
-  183, 181, 182, 199, 142, 143, 146, 128,
-  212, 144, 210, 211, 222, 214, 215, 216,
-  209, 165, 227, 224, 226, 229, 153, 158,
-  157, 235, 233, 234, 154, 237, 232, 225,
-  133, 160, 131, 198, 132, 134, 145, 135,
-  138, 130, 136, 137, 141, 161, 140, 139,
-  208, 164, 149, 162, 147, 228, 148, 246,
-  155, 151, 163, 150, 129, 236, 231, 152
-};
-
-void show_usage (void)
-{
-  printf("\n"
-      "Useage: yandytex [OPTION]... [+format_file] [tex_file]\n\n"
-      "--help       -?  show this usage summary\n"
-      "--initex     -i  start up as initex (create format file)\n"
-      "--verbose    -v  be verbose (show implementation version number)\n"
-      "--ascii      -n  do not allow `non ASCII' characters in input files\n"
-      "                    (complain instead)\n"
-      "--showhex    -w  do not show `non ASCII' characters in hexadecimal\n"
-      "                    (show as is)\n"
-      "--nodos      -d  do not allow DOS style file names - i.e. do not convert\n"
-      "                    \\ to /\n"
-      "--nomac      -r  do not allow Mac style termination - i.e. do not convert\n"
-      "                    \\r to \\n\n"
-      "--patterns   -p  allow use of \\patterns after loading format (initex only)\n"
-      "--knuthify   -K  disable all extensions to basic TeX\n"
-      "--main-mem   -m  initial main memory size in kilo words (initex only)\n"
-      "--hyph-size  -e  hyphenation exception dictionary size (initex only)\n"
-      "--trie-size  -h  hyphenation pattern trie size (initex only)\n"
-      "--xchr-file  -x  use `non ASCII' character mapping (xchr[]) defined in file\n"
-      "--key-file   -k  use `key replacement' defined in file\n"
-      "--dvi-dir    -o  write DVI file in specified directory (default '.')\n"
-      "--log-dir    -l  write LOG file in specified directory (default '.')\n"
-      "--aux-dir    -a  write AUX file in specified directory (default '.')\n");
-  uexit(EXIT_FAILURE);
-}
-
-// Sep 27 1990 => 1990 Sep 27
-// 0123456789     0123456789
-void scivilize (char * date)
-{
-  int k;
-  char pyear[6];
-
-  strcpy(pyear, date + 7);
-
-  for (k = 5; k >= 0; k--)
-    date[k + 5] = date[k];
-
-  for (k = 0; k < 4; k++)
-    date[k] = pyear[k];
-
-  date[4] = ' ';
-
-  if (date[9] == ' ')
-    date[9] = '0';
-}
-
-// Thu Sep 27 06:26:35 1990 => 1990 Sep 27 06:26:35
-void lcivilize (char * date)
-{
-  int k;
-  char pyear[6];
-
-  strcpy(pyear, date + 20);
-
-  for (k = 18; k >= 0; k--)
-    date[k + 1] = date[k];
-
-  date[20] = '\0';
-
-  for (k = 0; k < 4; k++)
-    date[k] = pyear[k];
-
-  date[4] = ' ';
-}
-
-void stamp_it (char * s)
-{
-  char date[11 + 1];
-
-  strcpy(date, compiledate);
-  scivilize(date);
-  sprintf(s, "%s %s (compiled time: %s %s with %s)",
-    application, yandyversion, date, compiletime, compiler);
-  s += strlen(s);
-}
-
-#define MAXCHRS 256
-#define NOTDEF  127
-
-void read_xchr_sub (FILE * xchr_input)
-{
-  char buffer[file_name_size];
-  int k, from, to, count = 0;
-  char * s;
-
-  memset(xchr, NOTDEF, MAXCHRS);
-  memset(xord, NOTDEF, MAXCHRS);
-
-#ifdef ALLOCATEBUFFER
-  while (fgets(buffer, current_buf_size, xchr_input) != NULL)
-#else
-  while (fgets(buffer, sizeof(buffer), xchr_input) != NULL)
-#endif
-  {
-    if (*buffer == '%' || *buffer == ';' || *buffer == '\n')
-      continue;
-
-    from = (int) strtol (buffer, &s, 0);
-    to = (int) strtol (s, NULL, 0);
-
-    if (from >= 0 && from < MAXCHRS && to >= 0 && to < MAXCHRS)
-    {
-      if (xchr[from] == NOTDEF)
-        xchr[from] = (unsigned char) to;
-      else
-        printf("NOTE: %s collision: %d => %d, %d\n", "xchr", from, xchr[from], to);
-
-      if (xord[to] == NOTDEF)
-        xord[to] = (unsigned char) from;
-      else
-        printf("NOTE: %s collision: %d => %d, %d\n", "xord", to, xord[to], from);
-
-      count++;
-    }
-  }
-
-  for (k = 0; k < MAXCHRS; k++)
-  {
-    if (xchr[k] == NOTDEF)   /* if it has not been filled */
-    {
-      if (xord[k] == NOTDEF) /* see whether used already */
-      {
-        xchr[k] = (unsigned char) k; /* no, so make identity */
-        xord[k] = (unsigned char) k; /* no, so make identity */
-      }
-    }
-  }
-
-  xchr[NOTDEF] = NOTDEF;         /* fixed point of mapping */
-
-  if (trace_flag)
-  {
-    printf("Read %d xchr[] pairs:\n", count);
-
-    for (k = 0; k < MAXCHRS; k++)
-    {
-      if (xchr[k] != NOTDEF)
-        printf("%d => %d\n", k, xchr[k]);
-    }
-  }
-}
-
-char * replacement[MAXCHRS];     /* pointers to replacement strings */
-
-void read_repl_sub (FILE * repl_input)
-{
-  int k, n, m, chrs;
-  char buffer[file_name_size];
-  char charname[128];
-  int charnum[10];
-  char * s, * t;
-  
-  memset(replacement, 0, MAXCHRS * sizeof(replacement[0]));
-
-  while (fgets(buffer, file_name_size, repl_input) != NULL)
-  {
-    if (*buffer == '%' || *buffer == ';' || *buffer == '\n')
-      continue;
-
-    if ((m = sscanf(buffer, "%d%n %s", &chrs, &n, (char *)&charname)) == 0)
-      continue;
-    else if (m == 2)
-    {
-      if (*charname == '"')   /* deal with quoted string "..." */
-      {
-        s = buffer + n;
-        t = charname;
-
-        while (*s != '"' && *s != '\0')
-          s++;  /* step up to " */
-
-        if (*s++ == '\0')
-          continue;       /* sanity check */
-
-        while (*s != '\0')
-        {
-          if (*s == '"')
-          {
-            s++;            /* is it "" perhaps ? */
-
-            if (*s != '"')
-              break;   /* no, end of string */
-          }
-
-          *t++ = *s++;          /* copy over */
-        }
-
-        *t = '\0';              /* and terminate */
-      }
-
-      if (chrs >= 0 && chrs < MAXCHRS)
-        replacement[chrs] = xstrdup(charname);
-    }
-/*    presently the following can never get triggered */
-/*    which is good, because it is perhaps not right ... */
-    else if ((m = sscanf (buffer, "%d %d %d %d %d %d %d %d %d %d %d",
-      &chrs, charnum, charnum+1, charnum+2, charnum+3, charnum+4,
-        charnum+5, charnum+6, charnum+7, charnum+8, charnum+9)) > 1) {
-/*      for (k = 0; k < n-1; k++) charname[k] = (char) charnum; */
-      for (k = 0; k < n-1; k++) charname[k] = (char) charnum[k];
-      charname[m] = '\0';
-      if (chrs >= 0 && chrs < MAXCHRS)
-        replacement[chrs] = xstrdup(charname);      
-    }
-    else
-      printf("ERROR: don't understand %s", buffer);
-  }
-
-  if (trace_flag)
-  {
-    puts("Key replacement table");
-
-    for (k = 0; k < MAXCHRS; k++)
-    {
-      if (replacement[k] != NULL)
-        printf("%d\t%s\n", k, replacement[k]);
-    }
-  }
-}
-
-/* Following used both to read xchr[] file and key replacement file */
-/* the flag is 0 for -x=... and the flag is 1 for -k=... */
-int read_xchr_file (char *filename, int flag, char *argv[])
-{
-  FILE *xchr_input;
-  char infile[file_name_size];
-  char *s;
-
-  if (filename == NULL)
-    return -1;
-
-  if (trace_flag)
-    printf("Reading xchr/repl %s\n", filename);
-
-  /* first try using file as specified */
-  strcpy(infile, filename);
-
-  if (trace_flag)
-    printf("Trying %s\n", infile);
-
-  xchr_input = fopen (infile, "r");
-
-  if (xchr_input == NULL)
-  {
-    if (strrchr(infile, '.') == NULL)
-    {
-      if (flag == 0)
-        strcat(infile, ".map");
-      else
-        strcat(infile, ".key");
-
-      if (trace_flag)
-        printf("Trying %s\n", infile);
-      
-      xchr_input = fopen(infile, "r");
-    }
-  }
-
-  if (xchr_input == NULL)
-  {
-    strcpy(infile, argv[0]);     /* try TeX program path */
-
-    if ((s = strrchr (infile, '\\')) != NULL)
-      *(s+1) = '\0';
-    else if ((s = strrchr (infile, '/')) != NULL)
-      *(s+1) = '\0';
-    else if ((s = strrchr (infile, ':')) != NULL)
-      *(s+1) = '\0';
-
-    strcat (infile, filename);
-
-    if (trace_flag)
-      printf("Trying %s\n", infile);
-
-    xchr_input = fopen (infile, "r");
-
-    if (xchr_input == NULL)
-    {
-      if (strchr(infile, '.') == NULL)
-      {
-        if (flag == 0)
-          strcat(infile, ".map");
-        else
-          strcat(infile, ".key");
-
-        if (trace_flag)
-          printf("Trying %s\n", infile);
-
-        xchr_input = fopen (infile, "r");
-      }
-    }
-  }
-
-  if (xchr_input == NULL)
-  {
-    strcpy(infile, argv[0]);     /* try TeX program path */
-
-    if ((s = strrchr (infile, '\\')) != NULL)
-      *(s + 1) = '\0';
-    else if ((s = strrchr (infile, '/')) != NULL)
-      *(s + 1) = '\0';
-    else if ((s = strrchr (infile, ':')) != NULL)
-      *(s + 1) = '\0';
-
-    strcat(infile, "keyboard\\");
-    strcat(infile, filename);
-
-    if (trace_flag)
-      printf("Trying %s\n", infile);
-
-    xchr_input = fopen (infile, "r");
-
-    if (xchr_input == NULL)
-    {
-      if (strchr(infile, '.') == NULL)
-      {
-        if (flag == 0)
-          strcat(infile, ".map");
-        else
-          strcat(infile, ".key");
-
-        if (trace_flag)
-          printf("Trying %s\n", infile);
-
-        xchr_input = fopen (infile, "r");
-      }
-    }
-  }
-
-  /* Note: can't look in TeX source file dir, since that is not known yet */
-  if (xchr_input == NULL)
-  {
-    printf("ERROR: Sorry, cannot find %s file %s",
-        flag ? " xchr[]" : "key mapping", filename);
-    perrormod (filename);
-    return 0;
-  }
-
-  if (flag == 0)
-    read_xchr_sub(xchr_input);
-  else
-    read_repl_sub(xchr_input);
-
-  (void) fclose(xchr_input);
-
-  return 1;
-}
-
-/* need to also set `key_replace' here based on command line */
-/* need to also allocate `buffercopy' here and free at end */
-/* need to call `readreplace' in appropriate place */
-
-#define MAXSPLITS 3
-
-/* ad hoc default minimum growth in memory realloc is 62% */
-/* golden ratio (1 + \sqrt{5}) / 2 = 1.618033989... */
-int percent_grow    = 62; /* default minimum growth in memory realloc is 62% */
-int total_allocated = 0;  /* total memory allocated so far */
-int ini_max_address = 0;  /* maximum address when starting */
-int max_address     = 0;  /* maximum address seen in allocated memory */
-
-
-void show_maximums (FILE * output)
-{
-  sprintf(log_line, "Max allocated %d --- max address %d\n", total_allocated, max_address);
-  fputs(log_line, output);
-}
-
-/* our own version of realloc --- avoid supposed MicroSoft version bug */
-/* also tries _expand first, which can avoid address growth ... */
-
-#ifdef USEOUREALLOC 
-void * ourrealloc (void * old, size_t new_size)
-{
-  void * mnew;
-  size_t old_size, overlap;
-  
-  /* round up to nearest multiple of four bytes */
-  /* avoid unlikely alignment */
-  if ((new_size % 4) != 0)
-    new_size = ((new_size / 4) + 1) * 4;
-
-  if (old == NULL)
-    return malloc (new_size);  /* no old block - use malloc */
-
-#ifdef _WIN32
-  old_size = _msize (old);
-#else
-  old_size = malloc_usable_size (old);
-#endif
-
-  if (old_size >= new_size && old_size < new_size + 4)
-    return old;
-
-#ifdef _WIN32
-  mnew = _expand (old, new_size); /* first try and expand in place MSVC */
-#else
-  mnew = realloc (old, new_size);
-#endif
-
-  if (mnew != NULL)
-  {
-    if (trace_flag)
-      printf("EXPANDED! %p (%ld) == %p (%ld)\n",
-          mnew, new_size, old, old_size);
-
-    return mnew;
-  }
-
-  /* do this if you want to call the real realloc next -  */
-  mnew = realloc (old, new_size);
-
-  if (mnew != NULL)
-    return mnew;
-
-  /*  we are screwed typically if we ever drop through here - no more space */
-  mnew = malloc (new_size); /* otherwise find new space */
-
-  if (mnew == NULL)
-    return mnew;        /* if unable to allocate */
-
-  if (old_size < new_size)
-    overlap = old_size;
-  else
-    overlap = new_size;
-
-  memcpy (mnew, old, overlap); /* copy old data to new area */
-  free(old); /* free the old area */
-
-  return mnew;
-}
-#endif
-
-void memory_error (const char * s, int n)
-{
-  if (log_opened)
-  {
-    fprintf(log_file, "\n! Unable to allocate %d bytes for %s\n", n, s);
-    show_maximums(log_file);
-  }
-
-  printf("\n! Unable to allocate %d bytes for %s\n", n, s);
-  show_maximums(stderr);
-}
-
-void trace_memory (const char * s, int n)
-{
-  printf("Allocating %d bytes for %s\n", n, s);
-}
-
-void update_statistics (long address, int size, int old_size)
-{
-  if (address + size > max_address)
-    max_address = address + size;
-
-  total_allocated =  total_allocated + size - old_size;
-}
-
-void probe_memory (void)
-{
-  char * s = (char *) malloc(sizeof(void *));
-  free(s);
-  update_statistics ((long) s, 0, 0);
-}
-
-void probe_show (void)
-{
-  probe_memory();
-  show_maximums(stdout);
-}
-
-size_t roundup (size_t n)
-{
-  if ((n % sizeof(void *)) == 0)
-    return n;
-  else
-    return ((n / sizeof(void *)) + 1) * sizeof(void *);
-}
-
-#ifdef ALLOCATETRIES
-/* returns -1 if it fails */
-
-int allocate_tries (int trie_max)
-{
-  int n, nl, no, nc;
-
-  if (trie_max > 1000000)
-    trie_max = 1000000;
-
-  nl = (trie_max + 1) * sizeof(halfword);
-  no = (trie_max + 1) * sizeof(halfword);
-  nc = (trie_max + 1) * sizeof(quarterword);
-  n = nl + no + nc;
-
-  if (trace_flag)
-    trace_memory("hyphen trie", n);
-
-  trie_trl = (halfword *) malloc(roundup(nl));
-  trie_tro = (halfword *) malloc(roundup(no));
-  trie_trc = (quarterword *) malloc(roundup(nc));
-
-  if (trie_trl == NULL || trie_tro == NULL || trie_trc == NULL)
-  {
-    memory_error("hyphen trie", n);
-    return -1;
-  }
-
-  if (trace_flag)
-    printf("Addresses trie_trl %p trie_tro %p trie_trc %p\n", trie_trl, trie_tro, trie_trc);
-
-  update_statistics((long) trie_trl, nl, 0);
-  update_statistics((long) trie_tro, no, 0);
-  update_statistics((long) trie_trc, nc, 0);
-
-  trie_size = trie_max;
-
-  if (trace_flag)
-    probe_show();
-
-  return 0; // success
-}
-#endif
-
-#ifdef ALLOCATEHYPHEN
-int current_prime = 0; /* remember in case reallocated later */
-
-/* we don't return an address here, since TWO memory regions allocated */
-/* plus, we don't really reallocate, we FLUSH the old information totally */
-/* returns -1 if it fails */
-
-int realloc_hyphen (int hyphen_prime)
-{
-  int n, nw, nl;
-
-  if (!prime(hyphen_prime))
-  {
-    printf("ERROR: non-prime hyphen exception number (%d)\n", hyphen_prime);
-    return -1;
-  }
-
-/*  need not/cannot preserve old contents when hyphen prime is changed */
-/*  if (hyph_list != NULL) free(hyph_list); */
-/*  if (hyph_word != NULL) free(hyph_word); */
-  nw = (hyphen_prime + 1) * sizeof(str_number);
-  nl = (hyphen_prime + 1) * sizeof(halfword);
-  n = nw + nl;
-
-  if (trace_flag)
-    trace_memory("hyphen exception", n);
-
-  hyph_word = (str_number *) REALLOC (hyph_word, nw);
-  hyph_list = (halfword *) REALLOC (hyph_list, nl);
-
-  if (hyph_word == NULL || hyph_list == NULL)
-  {
-    memory_error("hyphen exception", n);
-    return -1;
-  }
-
-  if (trace_flag)
-    printf("Addresses hyph_word %p hyph_list %p\n", hyph_word, hyph_list);
-
-/*  cannot preserve old contents when hyphen prime is changed */
-#ifdef USEMEMSET
-  memset(hyph_word, 0, (hyphen_prime + 1) * sizeof (hyph_word[0]));
-#else
-  for (k = 0; k <= hyphen_prime; k++)
-    hyph_word[k]= 0;
-#endif
-
-#ifdef USEMEMSET
-  memset(hyph_list, 0, (hyphen_prime + 1) * sizeof (hyph_list[0]));
-#else
-  for (k = 0; k <= hyphen_prime; k++)
-    hyph_list[k]= 0;
-#endif
-
-  hyph_count = 0;
-
-  if (current_prime != 0)
-  {
-    update_statistics((long) hyph_word, nw, (current_prime + 1) * sizeof(str_number));
-    update_statistics((long) hyph_list, nl, (current_prime + 1) * sizeof(halfword));
-  }
-  else
-  {
-    update_statistics((long) hyph_word, nw, 0);
-    update_statistics((long) hyph_list, nl, 0);
-  }
-
-  current_prime = hyphen_prime;
-
-  if (trace_flag)
-    probe_show();
-
-  return 0; // success
-}
-#endif
-
-int current_mem_size = 0;   /* current total words in main mem allocated -1 */
-
-/* this gets called from itex.c when it figures out what mem_top is */
-/* or gets called from here when in ini_TeX mode */ /* and nowhere else */
-/* initial allocation only, may get expanded later */
-/* NOTE: we DON't use ALLOCATEHIGH & ALLOCATELOW anymore */
-/* returns NULL if it fails */
-
-#ifdef ALLOCATEMAIN   
-/* initial main memory alloc - mem_top */
-memory_word * allocate_main_memory (int size)
-{
-  int n;
-
-  if (main_memory != NULL)
-  {
-    if (trace_flag)
-      puts("Reallocating initial memory allocation");
-  }
-
-  mem_top = mem_bot + size;
-  mem_max = mem_top;
-  mem_start = 0;     /* bottom of memory allocated by system */
-  mem_min = 0;       /* bottom of area made available to TeX */
-  n = (mem_max - mem_start + 1) * sizeof (memory_word);
-
-  if (trace_flag)
-    trace_memory("main memory", n);
-
-  main_memory = (memory_word *) REALLOC (main_memory, n);
-
-  if (main_memory == NULL)
-  {
-    memory_error("initial main memory", n);
-    return NULL;
-  }
-
-  if (trace_flag)
-    printf("Address main memory == %p\n", main_memory);
-
-  mem = main_memory;
-
-  if (mem_start != 0 && !is_initex)
-    mem = main_memory - mem_start;
-
-  if (trace_flag)
-    printf("Offset address main memory == %p\n", mem);
-
-  update_statistics((long) main_memory, n, (current_mem_size + 1) * sizeof (memory_word));
-/*  current_mem_size = (mem_max - mem_start + 1); */
-  current_mem_size = mem_max - mem_start;   /* total number of words - 1 */
-
-  if (trace_flag)
-    probe_show();
-
-  return mem;
-}
-#endif
-
-#ifdef ALLOCATEMAIN
-/* int firstallocation = 1; */
-
-/* increase main memory allocation at low end and high end */
-/* called only from tex0.c *//* called with one of lo_size or hi_size == 0 */
-/* returns NULL if it fails */
-
-memory_word * realloc_main (int lo_size, int hi_size)
-{  
-  int k, min_size;
-  int new_size = 0;
-  int n = 0;
-  memory_word * new_memory = NULL;
-
-  if (trace_flag)
-    printf("WARNING: Entering realloc_main lo %d hi %d\n", lo_size, hi_size);
-
-  if (is_initex)
-  {
-    puts("ERROR: Cannot extent main memory in initex");
-
-    if (!knuth_flag)
-      puts("Please use `-m=...' on command line");
-
-    return NULL;
-  }
-
-  if (trace_flag)
-    printf("Old Address %s == %p\n", "main memory", main_memory);
-
-  /* if we REALLY run up to limit ! */
-  if (current_mem_size + 1 == max_mem_size)
-  {
-    memory_error("main memory", (max_mem_size + 1) * sizeof(memory_word));
-    return NULL;
-  }
-
-/*  first allocation should expand *both* lo and hi */
-  if (hi_size == 0 && mem_end == mem_max)
-    hi_size = lo_size;
-
-  if (lo_size == 0 && mem_start == mem_min)
-    lo_size = hi_size;
-
-/*  try and prevent excessive frequent reallocations */
-/*  while avoiding over allocation by too much */
-  min_size = current_mem_size / 100 * percent_grow;
-
-  if (lo_size + hi_size < min_size)
-  {
-    if (lo_size > 0 && hi_size > 0)
-    {
-      lo_size = min_size / 2;
-      hi_size = min_size / 2;
-    }
-    else if (lo_size > 0)
-      lo_size = min_size;
-    else if (hi_size > 0)
-      hi_size = min_size;
-  }
-
-  if (lo_size > 0 && lo_size < mem_top / 2)
-    lo_size = mem_top / 2;
-
-  if (hi_size > 0 && hi_size < mem_top / 2)
-    hi_size = mem_top / 2;
-
-  for (k = 0; k < MAXSPLITS; k++)
-  {
-    new_size = current_mem_size + lo_size + hi_size;
-
-    if (new_size >= max_mem_size) /* bump against limit - ha ha ha */
-    {
-      while (new_size >= max_mem_size)
-      {
-        lo_size = lo_size / 2;
-        hi_size = hi_size / 2;
-        new_size = current_mem_size + lo_size + hi_size;
-      }
-    }
-
-    n = (new_size + 1) * sizeof (memory_word);
-
-    if (trace_flag)
-      trace_memory("main memory", n);
-
-    new_memory = (memory_word *) REALLOC (main_memory, n);
-
-    if (new_memory != NULL)
-      break; /* did we get it ? */
-
-    if (current_mem_size == 0)
-      break; /* in case we ever use for initial */
-
-    lo_size = lo_size / 2; hi_size = hi_size / 2;
-  }
-
-  if (new_memory == NULL)
-  {
-    memory_error("main memory", n);
-    return mem;
-  }
-
-  if (trace_flag)
-    printf("New Address %s == %p\n", "main memory", new_memory);
-
-  if (lo_size > 0)
-  {
-/*  shift everything upward to make space for new low area */
-    if (trace_flag)
-      printf("memmove %p %p %ld \n", new_memory + lo_size,
-          new_memory, (current_mem_size + 1) * sizeof(memory_word));
-
-    memmove (new_memory + lo_size, new_memory,
-      (current_mem_size + 1) * sizeof(memory_word));
-/*  could reduce words moved by (mem_max - mem_end) */
-  }
-
-  main_memory = new_memory;       /* remember for free later */
-
-  if (lo_size > 0)
-    mem_start = mem_start - lo_size; /* update lower limit */
-
-  if (hi_size > 0)
-    mem_max = mem_max + hi_size;   /* update upper limit */
-
-  update_statistics ((long) main_memory, n,
-    (current_mem_size + 1) * sizeof (memory_word));
-  current_mem_size = new_size;
-
-  if (current_mem_size != mem_max - mem_start)
-    puts("ERROR: Impossible Memory Error");
-
-  if (mem_start != 0)
-    mem = main_memory - mem_start;
-  else
-    mem = main_memory;
-
-  if (trace_flag)
-    probe_show();
-
-  return mem;
-}
-#endif
-
-#ifdef ALLOCATEFONT
-int current_font_mem_size = 0;
-
-memory_word * realloc_font_info (int size)
-{
-  memory_word * new_font_info = NULL;
-  int k, min_size;
-  int new_size = 0;
-  int n = 0;
-
-  if (trace_flag)
-    printf("Old Address %s == %p\n", "font_info", font_info);
-
-  /* during initial allocation, font_info == NULL - realloc acts like malloc */
-  /* during initial allocation current_font_mem_size == 0 */
-  if (current_font_mem_size == font_mem_size)  /* if we REALLY run up to limit */
-  {
-    /* memory_error("font", (font_mem_size + 1) * sizeof(memory_word)); */
-    return font_info;    /* pass it back to TeX 99/Fabe/4 */
-  }
-  /* try and prevent excessive frequent reallocations */
-  /* while avoiding over allocation by too much */
-  /* min_size = current_font_mem_size / 2; */
-  min_size = current_font_mem_size / 100 * percent_grow;
-
-  if (size < min_size)
-    size = min_size;
-
-  if (size < initial_font_mem_size)
-    size = initial_font_mem_size;
-
-  for (k=0; k < MAXSPLITS; k++)
-  {
-    new_size = current_font_mem_size + size;
-
-    if (new_size > font_mem_size)
-      new_size = font_mem_size; /* bump against limit */
-
-/*    important + 1 since fmemoryword font_info[font_mem_size + 1]  original */
-    n = (new_size + 1) * sizeof (memory_word);
-
-    if (trace_flag)
-      trace_memory("font_info", n);
-
-    new_font_info = (memory_word *) REALLOC (font_info, n);
-
-    if (new_font_info != NULL)
-      break;   /* did we get it ? */
-
-    if (current_font_mem_size == 0)
-      break; /* initial allocation must work */
-
-    size = size / 2;
-  }
-
-  if (new_font_info == NULL)
-  {
-    memory_error("font", n);
-    return font_info;        /* try and continue !!! */
-  }
-
-  font_info = new_font_info;
-
-  if (trace_flag)
-    printf("New Address %s == %p\n", "font_info", font_info);
-
-  update_statistics ((long) font_info, n, current_font_mem_size * sizeof(memory_word));
-  current_font_mem_size = new_size;
-
-  if (trace_flag)
-    probe_show();
-
-  return font_info;
-}
-#endif
-
-#ifdef ALLOCATESTRING
-int current_pool_size = 0;
-
-packed_ASCII_code * realloc_str_pool (int size)
-{
-  int k, min_size;
-  int new_size = 0;
-  int n = 0;
-  packed_ASCII_code * new_str_pool = NULL;
-
-  if (trace_flag)
-    printf("Old Address %s == %p\n", "string pool", str_pool);
-
-  if (current_pool_size == pool_size)
-  {
-/*    memory_error ("string pool", (pool_size + 1) * sizeof(packed_ASCII_code)); */
-/*    exit (1); */
-    return str_pool;   /* pass it back to TeX 99/Fabe/4 */
-  }
-
-  min_size =  current_pool_size / 100 * percent_grow;
-
-  if (size < min_size)
-    size = min_size;
-
-  if (size < initial_pool_size)
-    size = initial_pool_size;
-
-  for (k = 0; k < MAXSPLITS; k++)
-  {
-    new_size = current_pool_size + size;
-
-    if (new_size > pool_size)
-      new_size = pool_size;
-/* important + 1 since  packed_ASCII_code str_pool[pool_size + 1]; in original */
-    n = (new_size + 1) * sizeof (packed_ASCII_code);
-
-    if (trace_flag)
-      trace_memory("str_pool", n);
-
-    new_str_pool = (packed_ASCII_code *) REALLOC (str_pool, n); /* 95/Sep/24 */
-
-    if (new_str_pool != NULL)
-      break;    /* did we get it ? */
-
-    if (current_pool_size == 0)
-      break;  /* initial allocation must work */
-
-    size = size / 2;          /* else can retry smaller */
-  }
-
-  if (new_str_pool == NULL)
-  {
-    memory_error("string pool", n);
-    return str_pool;           /* try and continue !!! */
-  }
-
-  str_pool = new_str_pool;
-  update_statistics ((long) str_pool, n, current_pool_size);
-  current_pool_size = new_size;
-
-  if (trace_flag)
-    printf("New Address %s == %p\n", "string pool", str_pool);
-  
-  if (trace_flag)
-    probe_show();
-
-  return str_pool;
-}
-#endif
-
-#ifdef ALLOCATESTRING
-int current_max_strings = 0;
-
-pool_pointer * realloc_str_start (int size)
-{
-  int k, min_size;
-  int n = 0;
-  int new_size = 0;
-  pool_pointer * new_str_start = NULL;
-
-  if (trace_flag)
-    printf("Old Address %s == %p\n", "string start", str_start);
-
-  if (current_max_strings == max_strings)
-  {
-/*    memory_error ("string pointer", (max_strings + 1) * sizeof(pool_pointer)); */
-/*    exit (1); */
-    return str_start;    /* pass it back to TeX 99/Fabe/4 */
-  }
-
-  min_size = current_max_strings / 100 * percent_grow;
-
-  if (size < min_size)
-    size = min_size;
-
-  if (size < initial_max_strings)
-    size = initial_max_strings;
-
-  for (k = 0; k < MAXSPLITS; k++)
-  {
-    new_size = current_max_strings + size;
-
-    if (new_size > max_strings)
-      new_size = max_strings;
-/*    important + 1 since str_start[maxstring + 1] originally */
-    n = (new_size + 1) * sizeof (pool_pointer);
-
-    if (trace_flag)
-      trace_memory("str_start", n);
-
-    new_str_start = (pool_pointer *) REALLOC (str_start, n);
-
-    if (new_str_start != NULL)
-      break;   /* did we get it ? */
-
-    if (current_max_strings == 0)
-      break;  /* initial allocation must work */
-
-    size = size / 2;          /* otherwise can try smaller */
-  }
-
-  if (new_str_start == NULL)
-  {
-    memory_error("string pointer", n);
-    return str_start;          /* try and continue */
-  }
-
-  str_start = new_str_start;
-  update_statistics((long) str_start, n, current_max_strings * sizeof (pool_pointer));
-  current_max_strings = new_size;
-
-  if (trace_flag)
-    printf("New Address %s == %p\n", "string start", str_start);
-
-  if (trace_flag)
-    probe_show();
-
-  return str_start;
-}
-#endif
-
-#ifdef ALLOCATEINI
-/* returns -1 if it fails */
-/* size == trie_size */
-int allocate_ini (int size)
-{
-  int n, nl, no, nc, nr, nh, nt;
-
-  nh = (size + 1) * sizeof(trie_pointer);
-  nr = (size + 1) * sizeof(trie_pointer);
-  nl = (size + 1) * sizeof(trie_pointer);
-  no = (size + 1) * sizeof(trie_op_code);
-  nc = (size + 1) * sizeof(packed_ASCII_code);
-  nt = (size + 1) * sizeof(char);
-  n = nl + no + nc + nr + nh + nt;
-
-  if (trace_flag)
-    trace_memory ("initex hyphen trie", n);
-
-  trie_l = (trie_pointer *) malloc (roundup(nl));
-  trie_o = (trie_op_code *) malloc (roundup(no));
-  trie_c = (packed_ASCII_code *) malloc (roundup(nc));
-  trie_r = (trie_pointer *) malloc (roundup(nr));
-  trie_hash = (trie_pointer *) malloc (roundup(nh));
-  trie_taken = (char *) malloc (roundup(nt));
-  
-  if (trie_c == NULL || trie_o == NULL || trie_l == NULL || trie_r == NULL ||
-      trie_hash == NULL || trie_taken == NULL)
-  {
-    memory_error("initex hyphen trie", n);
-    return -1;
-  }
-  
-  if (trace_flag)
-  {
-    printf("Addresses: trie_l %p trie_o %p trie_c %p\n", trie_l, trie_o, trie_c);
-    printf("Addresses: trie_r %p trie_hash %p trie_taken %p\n", trie_r, trie_hash, trie_taken);
-  }
-
-  update_statistics ((long) trie_l, nl, 0);
-  update_statistics ((long) trie_o, no, 0);
-  update_statistics ((long) trie_c, nc, 0);
-  update_statistics ((long) trie_r, nr, 0);
-  update_statistics ((long) trie_hash, nh, 0);
-  update_statistics ((long) trie_taken, nt, 0);
-
-  if (trace_flag)
-    probe_show();
-
-  return 0; // success
-}
-#endif
-
-#ifdef ALLOCATESAVESTACK
-int current_save_size = 0;
-
-memory_word * realloc_save_stack (int size)
-{
-  int k, min_size;
-  int n = 0, new_size = 0;
-  memory_word * new_save_stack = NULL;
-
-  if (trace_flag)
-    printf("Old Address %s == %p\n", "save stack", save_stack);
-
-  if (current_save_size == save_size)
-  {
-    return save_stack; /* let TeX handle the error */
-  }
-
-  min_size =  current_save_size / 100 * percent_grow;
-
-  if (size < min_size)
-    size = min_size;
-
-  if (size < initial_save_size)
-    size = initial_save_size;
-
-  for (k = 0; k < MAXSPLITS; k++)
-  {
-    new_size = current_save_size + size;
-
-    if (new_size > save_size)
-      new_size = save_size;
-
-    n = (new_size + 1) * sizeof (memory_word);
-
-    if (trace_flag)
-      trace_memory("save_stack", n);
-
-    new_save_stack = (memory_word *) REALLOC (save_stack, n);
-
-    if (new_save_stack != NULL)
-      break;    /* did we get it ? */
-
-    if (current_save_size == 0)
-      break;  /* initial allocation must work */
-
-    size = size / 2;          /* else can retry smaller */
-  }
-
-  if (new_save_stack == NULL)
-  {
-    memory_error("save_stack", n);
-    return save_stack;           /* try and continue !!! */
-  }
-
-  save_stack = new_save_stack;
-  update_statistics ((long) save_stack, n, current_save_size);
-  current_save_size = new_size;
-
-  if (trace_flag)
-  {
-    printf("Current %s %d\n", "save_size", current_save_size);
-    printf("New Address %s == %p\n", "save stack", save_stack);
-  }
-
-  if (trace_flag)
-    probe_show();
-
-  return save_stack;
-}
-#endif
-
-#ifdef ALLOCATEINPUTSTACK
-int current_stack_size = 0;       /* input stack size */
-
-in_state_record * realloc_input_stack (int size)
-{
-  int k, min_size;
-  int n = 0, new_size = 0;
-  in_state_record * new_input_stack = NULL;
-
-  if (trace_flag)
-    printf("Old Address %s == %p\n", "input stack", input_stack);
-
-  if (current_stack_size == stack_size)
-  {
-    return input_stack;
-  }
-
-  min_size =  current_stack_size / 100 * percent_grow;
-
-  if (size < min_size)
-    size = min_size;
-
-  if (size < initial_stack_size)
-    size = initial_stack_size;
-
-  for (k = 0; k < MAXSPLITS; k++)
-  {
-    new_size = current_stack_size + size;
-
-    if (new_size > stack_size)
-      new_size = stack_size;
-
-    n = (new_size + 1) * sizeof(in_state_record);
-
-    if (trace_flag)
-      trace_memory("input_stack", n);
-
-    new_input_stack = (in_state_record *) REALLOC (input_stack, n);
-
-    if (new_input_stack != NULL)
-      break;   /* did we get it ? */
-
-    if (current_stack_size == 0)
-      break; /* initial allocation must work */
-
-    size = size / 2;          /* else can retry smaller */
-  }
-
-  if (new_input_stack == NULL)
-  {
-    memory_error("input stack", n);
-    return input_stack;            /* try and continue !!! */
-  }
-
-  input_stack = new_input_stack;
-  update_statistics ((long) input_stack, n, current_stack_size);
-  current_stack_size = new_size;
-
-  if (trace_flag)
-  {
-    printf("Current %s %d\n", "stack_size", current_stack_size);
-    printf("New Address %s == %p\n", "input stack", input_stack);
-  }
-
-  if (trace_flag)
-    probe_show();
-
-  return input_stack;
-}
-#endif
-
-#ifdef ALLOCATENESTSTACK
-int current_nest_size = 0;        /* current nest size */
-
-list_state_record * realloc_nest_stack (int size)
-{
-  int k, min_size;
-  int n = 0, new_size = 0;
-  list_state_record * new_nest = NULL;
-
-  if (trace_flag)
-    printf("Old Address %s == %p\n", "nest stack", nest);
-
-  if (current_nest_size == nest_size)
-  {
-    return nest;
-  }
-
-  min_size =  current_nest_size / 100 * percent_grow;
-
-  if (size < min_size)
-    size = min_size;
-
-  if (size < initial_nest_size)
-    size = initial_nest_size;
-
-  for (k = 0; k < MAXSPLITS; k++)
-  {
-    new_size = current_nest_size + size;
-
-    if (new_size > nest_size)
-      new_size = nest_size;
-
-    n = (new_size + 1) * sizeof (list_state_record);
-
-    if (trace_flag)
-      trace_memory("nest stack", n);
-
-    new_nest = (list_state_record *) REALLOC (nest, n);
-
-    if (new_nest != NULL)
-      break;   /* did we get it ? */
-
-    if (current_nest_size == 0)
-      break;  /* initial allocation must work */
-
-    size = size / 2;          /* else can retry smaller */
-  }
-
-  if (new_nest == NULL)
-  {
-    memory_error("nest stack", n);
-    return nest;            /* try and continue !!! */
-  }
-
-  nest = new_nest;
-  update_statistics ((long) nest, n, current_nest_size);
-  current_nest_size = new_size;
-
-  if (trace_flag)
-  {
-    printf("Current %s %d\n", "nest_size", current_nest_size);
-    printf("New Address %s == %p\n", "nest stack", nest);
-  }
-
-  if (trace_flag)
-    probe_show();
-
-  return nest;
-}
-#endif
-
-#ifdef ALLOCATEPARAMSTACK
-int current_param_size = 0;
-
-halfword *realloc_param_stack (int size)
-{
-  int k, min_size;
-  int n = 0, new_size = 0;
-  halfword * new_param = NULL;
-
-  if (trace_flag)
-    printf("Old Address %s == %p\n", "param stack", param_stack);
-
-  if (current_param_size == param_size)
-  {
-    return param_stack;
-  }
-
-  min_size =  current_param_size / 100 * percent_grow;
-
-  if (size < min_size)
-    size = min_size;
-
-  if (size < initial_param_size)
-    size = initial_param_size;
-
-  for (k = 0; k < MAXSPLITS; k++)
-  {
-    new_size = current_param_size + size;
-
-    if (new_size > param_size)
-      new_size = param_size;
-
-    n = (new_size + 1) * sizeof(pointer);
-
-    if (trace_flag)
-      trace_memory("param stack", n);
-
-    new_param = (pointer *) REALLOC (param_stack, n);
-
-    if (new_param != NULL)
-      break;    /* did we get it ? */
-
-    if (current_param_size == 0)
-      break; /* initial allocation must work */
-
-    size = size / 2; /* else can retry smaller */
-  }
-
-  if (new_param == NULL)
-  {
-    memory_error("param stack", n);
-    return param_stack;            /* try and continue !!! */
-  }
-
-  param_stack = new_param;
-  update_statistics((long) param_stack, n, current_param_size);
-  current_param_size = new_size;
-
-  if (trace_flag)
-  {
-    printf("Current %s %d\n", "param_size", current_param_size);
-    printf("New Address %s == %p\n", "param stack", param_stack);
-  }
-
-  if (trace_flag)
-    probe_show();
-
-  return param_stack;
-}
-#endif
-
-#ifdef ALLOCATEBUFFER
-int current_buf_size = 0;
-
-ASCII_code * realloc_buffer (int size)
-{
-  int k, min_size;
-  int n = 0, new_size = 0;
-  ASCII_code * new_buffer = NULL;
-
-  if (trace_flag)
-    printf("Old Address %s == %p\n", "buffer", buffer);
-
-  if (current_buf_size == buf_size)
-  {
-    return buffer;
-  }
-
-  min_size =  current_buf_size / 100 * percent_grow;
-
-  if (size < min_size)
-    size = min_size;
-
-  if (size < initial_buf_size)
-    size = initial_buf_size;
-
-  for (k = 0; k < MAXSPLITS; k++)
-  {
-    new_size = current_buf_size + size;
-
-    if (new_size > buf_size)
-      new_size = buf_size;
-
-    n = (new_size + 1) * sizeof(ASCII_code);
-
-    if (trace_flag)
-      trace_memory("buffer", n);
-
-    new_buffer = (ASCII_code *) REALLOC (buffer, n);
-
-    if (new_buffer != NULL)
-      break;   /* did we get it ? */
-
-    if (current_buf_size == 0)
-      break;   /* initial allocation must work */
-
-    size = size / 2;
-  }
-
-  if (new_buffer == NULL)
-  {
-    memory_error("buffer", n);
-    return buffer;            /* try and continue !!! */
-  }
-
-  buffer = new_buffer;
-  update_statistics ((long) buffer, n, current_buf_size);
-
-#ifdef USEMEMSET
-  memset(buffer + current_buf_size, 0, new_size - current_buf_size);
-#else
-  for (k = current_buf_size; k < new_size; k++)
-    buffer[k] = 0;
-#endif
-
-  current_buf_size = new_size;
-
-  if (trace_flag)
-  {
-    printf("Current %s %d\n", "buffer", current_buf_size);
-    printf("New Address %s == %p\n", "buffer", buffer);
-  }
-
-  if (trace_flag)
-    probe_show();
-
-  return buffer;
-}
-#endif
-
-/* here is the main memory allocation routine -- calls the above */
-/* returns -1 if it fails */
-/* allocate rather than static 93/Nov/26 */
-int allocate_memory (void)
-{
-#ifdef ALLOCATEINPUTSTACK
-  input_stack = NULL;
-  current_stack_size = 0;
-  input_stack = realloc_input_stack(initial_stack_size);
-#endif
-
-#ifdef ALLOCATENESTSTACK
-  nest = NULL;
-  current_nest_size = 0;
-  nest = realloc_nest_stack(initial_nest_size);
-#endif
-
-#ifdef ALLOCATEPARAMSTACK
-  param_stack = NULL;
-  current_param_size = 0;
-  param_stack = realloc_param_stack(initial_param_size);
-#endif
-
-#ifdef ALLOCATESAVESTACK
-  save_stack = NULL;
-  current_save_size = 0;
-  save_stack = realloc_save_stack (initial_save_size);
-#endif
-
-#ifdef IGNORED
-  buffer = NULL;        /* need to do earlier */
-  current_buf_size = 0;
-  buffer = realloc_buffer (initial_buf_size);
-#endif
-
-#ifdef ALLOCATESTRING
-  str_pool = NULL;
-  current_pool_size = 0;
-  str_start = NULL;
-  current_max_strings = 0;
-
-/*  maybe taylor allocations to actual pool file 1300 strings 27000 bytes ? */
-  if (is_initex)
-  {
-    if (trace_flag)
-      puts("ini TeX pool and string allocation");
-
-    str_pool = realloc_str_pool(initial_pool_size);
-    str_start = realloc_str_start(initial_max_strings);
-  }
-#endif
-
-/* the following can save a lot of the usual 800k fixed allocation */
-#ifdef ALLOCATEFONT
-  font_info = NULL;
-  current_font_mem_size = 0;
-/* if not iniTeX, then do initial allocation on fmt file read in itex.c */
-/* if ini-TeX we need to do it here - no format file read later */
-  if (is_initex)
-    font_info = realloc_font_info(initial_font_mem_size);
-#endif
-
-#ifdef ALLOCATEMAIN
-  main_memory = NULL;
-  mem = NULL;
-  mem_min = mem_bot;        /* just to avoid complaints in texbody */
-  mem_top = mem_initex;
-  mem_max = mem_top;
-/* allocate main memory here if this is iniTeX */
-/* otherwise wait for format undumping in itex.c ... */
-  if (is_initex)
-  {
-    /* avoid this if format specified on command line ??? */
-    mem = allocate_main_memory(mem_initex); /* made variable ! */
-
-    if (mem == NULL)
-      return -1;
-  }
-#endif
-
-/* now for the hyphenation exception stuff */
-#ifdef ALLOCATEHYPHEN
-  hyph_word = NULL;
-  hyph_list = NULL;
-/* this will be overridden later by what is in format file */
-  hyphen_prime = default_hyphen_prime;
-/* non ini-TeX use assumes format will be read and that specifies size */
-  if (is_initex)
-  {
-    if (new_hyphen_prime)
-      hyphen_prime = new_hyphen_prime;
-
-    if (realloc_hyphen(hyphen_prime)) /* allocate just in case no format */
-      return -1;
-  }
-#endif
-
-/* now for memory for the part of the hyphenation stuff that always needed */
-/* if iniTeX, need to allocate pre-determined fixed amount - trie_size */
-/* if iniTeX not selected, allocate only enough later - undump in itex.c ! */
-#ifdef ALLOCATETRIES
-  if (is_initex)
-  {
-    if (allocate_tries (trie_size))
-      return -1;
-  }
-#endif
-
-/* now for memory for hyphenation stuff needed only when running iniTeX */
-#ifdef ALLOCATEINI
-  if (is_initex)
-  {
-    if (allocate_ini(trie_size))
-      return -1;
-  }
-  else
-  {
-    trie_l = NULL;
-    trie_r = NULL;
-    trie_o = NULL;
-    trie_hash = NULL;
-    trie_c = NULL;
-    trie_taken = NULL;
-  }
-#endif
-
-  return 0; // success
-}
-
-/* returns non-zero if error - done to test integrity of stack mostly */
-int free_memory (void)
-{
-  unsigned int heap_total = 0;
-
-  if (trace_flag)
-    puts("free_memory ");
-
-  if (verbose_flag || trace_flag)
-    show_maximums(stdout); 
-
-  if (trace_flag)
-  {
-    printf("Heap total: %u bytes --- max address %u\n", 
-        heap_total, max_address);
-    printf("Main Memory: variable node %lld (%lld - %d);\n"
-      "             one word %d (%d - %d)\n",
-      lo_mem_max - mem_min, mem_min, lo_mem_max,
-      mem_end - hi_mem_min, hi_mem_min, mem_end);
-    puts("Freeing memory again");
-  }
-
-/* only free memory if safe ... additional check */
-#ifdef ALLOCATEINI
-  if (is_initex)
-  {
-    if (trie_taken != NULL)
-      free(trie_taken);
-
-    if (trie_hash != NULL)
-      free(trie_hash);
-
-    if (trie_r != NULL)
-      free(trie_r);
-
-    if (trie_c != NULL)
-      free(trie_c);
-
-    if (trie_o != NULL)
-      free(trie_o);
-
-    if (trie_l != NULL)
-      free(trie_l);
-
-    trie_taken = NULL;
-    trie_hash = NULL;
-    trie_l = NULL;
-    trie_r = NULL;
-    trie_c = NULL;
-    trie_o = NULL;
-  }
-#endif
-
-#ifdef ALLOCATETRIES
-  if (trie_trc != NULL)
-    free(trie_trc);
-
-  if (trie_tro != NULL)
-    free(trie_tro);
-
-  if (trie_trl != NULL)
-    free(trie_trl);
-
-  trie_trc = NULL;
-  trie_tro = NULL;
-  trie_trl = NULL;
-#endif
-
-#ifdef ALLOCATEHYPHEN
-  if (hyph_list != NULL)
-    free(hyph_list);
-
-  if (hyph_word != NULL)
-    free(hyph_word);
-
-  hyph_list = NULL;
-  hyph_word = NULL;
-#endif
-
-#ifdef ALLOCATEMAIN
-  if (main_memory != NULL)
-    free(main_memory);
-
-  main_memory = NULL;
-#endif
-
-#ifdef ALLOCATEFONT
-  if (font_info != NULL)
-    free(font_info);
-
-  font_info = NULL;
-#endif
-
-#ifdef ALLOCATESTRING
-  if (str_start != NULL)
-    free(str_start);
-
-  if (str_pool != NULL)
-    free(str_pool);
-
-  str_start = NULL;
-  str_pool = NULL;
-#endif
-
-#ifdef ALLOCATEPARAMSTACK
-  if (param_stack != NULL)
-    free(param_stack);
-
-  param_stack = NULL;
-#endif
-
-#ifdef ALLOCATENESTSTACK
-  if (nest != NULL)
-    free(nest);
-
-  nest = NULL;
-#endif
-
-#ifdef ALLOCATEINPUTSTACK
-  if (input_stack != NULL)
-    free(input_stack);
-
-  input_stack = NULL;
-#endif
-
-#ifdef ALLOCATESAVESTACK
-  if (save_stack != NULL)
-    free(save_stack);
-
-  save_stack = NULL;
-#endif
-
-  if (format_file != NULL)
-    free(format_file);
-
-  if (source_direct != NULL)
-    free(source_direct);
-
-  format_file = NULL;
-  source_direct = NULL;
-
-  if (dvi_file_name != NULL)
-    free(dvi_file_name);
-
-  if (log_file_name != NULL)
-    free(log_file_name);
-
-  if (pdf_file_name != NULL)
-    free(pdf_file_name);
-
-  pdf_file_name = NULL;
-  log_file_name = NULL;
-  dvi_file_name = NULL;
-
-  return 0;
-}
-
-boolean prime (int x)
-{
-  int k;
-  int sum = 1;    /* 1 + 3 + 5 + k = (k + 1) * (k + 1) / 4 */
-
-  if (x % 2 == 0)
-    return false;
-
-  for (k = 3; k < x; k = k + 2)
-  {
-    if (x % k == 0)
-      return false;
-
-    if (sum * 4 > x)
-      return true;
-
-    sum += k;
-  }
-
-  return true;
-}
-
-int quitflag  = 0;
-boolean show_use = false;
-
-void complainarg (int c, char *s)
-{
-  printf("ERROR: Do not understand `%c' argument value `%s'\n", c, s);
-  show_use = true;
-}
-
-/* following is list of allowed command line flags and args */
-
-char *allowedargs = "+bcdfijnpqrstvwyzABCDFGIJKLMNOPQRSTVWXYZ023456789?a=e=g=h=k=l=m=o=u=x=E=H=P=U=";
-
-void reorderargs (int ac, char **av)
-{
-  int n, m;
-  char *s, *t;
-  char takeargs[256];   /* large enough for all command line arg chars */
-
-  if (ac < 3)
-  {
-    return; /* no args ! */
-  }
-
-  s = allowedargs;
-  t = takeargs;   /* list of those that take args */
-
-  while (*s != '\0' && *(s + 1) != '\0')
-  {
-    if (*(s + 1) == '=')
-      *t++ = *s++;   /* copy over --- without the = */
-
-    s++;
-  }
-
-  *t = '\0';
-
-  if (trace_flag)
-  {
-    show_line(takeargs, 0);
-    wterm_cr();
-  }
-  
-  n = 1;
-
-  for (;;)
-  {
-    if (*av[n] != '-')
-      break;
-
-    if (n + 1 < ac && *(av[n] + 2) == '\0' &&
-      strchr(takeargs, *(av[n] + 1)) != NULL)
-      n += 2; /* step over it */
-    else
-      n++;
-
-    if (n == ac)
-      break;
-  }
-
-  for (;;)
-  {
-    if (n == ac)
-      break;
-
-    m = n;
-
-    while (m < ac && *av[m] != '-')
-      m++;  /* first command */
-
-    if (m == ac)
-      break;
-/* does it take an argument ? and is this argument next ? */
-/* check first whether the `-x' is isolated, or arg follows directly */
-/* then check whether this is one of those that takes an argument */
-    if (m+1 < ac && *(av[m] + 2) == '\0' &&
-      strchr(takeargs, *(av[m] + 1)) != NULL)
-    {
-      s = av[m];      /*  move command down before non-command */
-      t = av[m + 1];
-
-      for (; m > n; m--)
-        av[m + 1] = av[m - 1];
-
-      av[n] = s;
-      av[n + 1] = t;
-      n += 2;       /* step over moved args */
-    }
-    else
-    {
-      s = av[m];      /*  move command down before non-command */
-
-      for (; m > n; m--)
-        av[m] = av[m - 1];
-
-      av[n] = s;
-      n++;        /* step over moved args */
-    }
-  }
-}
-
-int test_align (long address, int size, const char *str)
-{
-  int n;
-
-  if (size > sizeof(void *))
-    n = address % sizeof(void *);
-  else
-    n = address % size;
-
-  if (n != 0)
-    printf("OFFSET %d (ELEMENT %d) in %s\n", n, size, str);
-
-  return n;
-}
-
-/* activate detailed checking of alignment when trace_flag is set */
-
-void check_fixed_align (int flag)
-{
-  (void) flag;
-
-  if (test_align ((long) &mem_top, 4, "FIXED ALIGNMENT"))
-  {
-    puts("PLEASE RECOMPILE ME!");
-  }
-
-#ifdef CHECKALIGNMENT
-  if (!flag)
-    return;
-
-  test_align ((long) &mem_top, 4, "mem_top");
-  test_align ((long) &mem_max, 4, "mem_max");
-  test_align ((long) &mem_min, 4, "mem_min");
-  test_align ((long) &bad, 4, "bad");
-  test_align ((long) &trie_size, 4, "trie_size");
-  test_align ((long) &xord, sizeof(xord[0]), "xord");
-  test_align ((long) &xchr, sizeof(xchr[0]), "xchr");
-  test_align ((long) &name_length, 4, "name_length");
-  test_align ((long) &first, 4, "first");
-  test_align ((long) &last, 4, "last");
-  test_align ((long) &max_buf_stack, 4, "max_buf_stack");
-  test_align ((long) &pool_ptr, 4, "pool_ptr");
-  test_align ((long) &str_ptr, 4, "str_ptr");
-  test_align ((long) &init_pool_ptr, 4, "init_pool_ptr");
-  test_align ((long) &init_str_ptr, 4, "init_str_ptr");
-  test_align ((long) &log_file, 4, "log_file");
-  test_align ((long) &tally, 4, "tally");
-  test_align ((long) &term_offset, 4, "term_offset");
-  test_align ((long) &file_offset, 4, "file_offset");
-  test_align ((long) &trick_count, 4, "trick_count");
-  test_align ((long) &first_count, 4, "first_count");
-  test_align ((long) &deletions_allowed, 4, "deletions_allowed");
-  test_align ((long) &set_box_allowed, 4, "set_box_allowed");
-  test_align ((long) &help_line, sizeof(help_line[0]), "help_line");
-  test_align ((long) &use_err_help, 4, "use_err_help");
-  test_align ((long) &interrupt, 4, "interrupt");
-  test_align ((long) &OK_to_interrupt, 4, "OK_to_interrupt");
-  test_align ((long) &arith_error, 4, "arith_error");
-  test_align ((long) &tex_remainder, 4, "tex_remainder");
-  test_align ((long) &temp_ptr, 4, "temp_ptr");
-  test_align ((long) &lo_mem_max, 4, "lo_mem_max");
-  test_align ((long) &hi_mem_min, 4, "hi_mem_min");
-  test_align ((long) &var_used, 4, "var_used");
-  test_align ((long) &dyn_used, 4, "dyn_used");
-  test_align ((long) &avail, 4, "avail");
-  test_align ((long) &mem_end, 4, "mem_end");
-  test_align ((long) &mem_start, 4, "mem_start");
-  test_align ((long) &rover, 4, "rover");
-  test_align ((long) &font_in_short_display, 4, "font_in_short_display");
-  test_align ((long) &depth_threshold, 4, "depth_threshold");
-  test_align ((long) &breadth_max, 4, "breadth_max");
-  test_align ((long) &nest, sizeof(nest[0]), "nest");
-  // test_align ((long) &xeq_level, sizeof(xeq_level[0]), "xeq_level");
-  test_align ((long) &zzzad, sizeof(zzzad[0]), "zzzad");
-  // test_align ((long) &hash, sizeof(hash[0]), "hash");
-  test_align ((long) &zzzae, sizeof(zzzae[0]), "zzzae");
-  test_align ((long) &save_stack, sizeof(save_stack[0]), "save_stack");
-  test_align ((long) &input_stack, sizeof(input_stack[0]), "input_stack");
-  test_align ((long) &input_file, sizeof(input_file[0]), "input_file");
-  test_align ((long) &line_stack, sizeof(line_stack[0]), "line_stack");
-  test_align ((long) &param_stack, sizeof(param_stack[0]), "param_stack");
-  test_align ((long) &cur_mark, sizeof(cur_mark[0]), "cur_mark");
-  test_align ((long) &pstack, sizeof(pstack[0]), "pstack");
-  test_align ((long) &read_file, sizeof(read_file[0]), "read_file");
-  test_align ((long) &font_check, sizeof(font_check[0]), "font_check");
-  test_align ((long) &font_size, sizeof(font_size[0]), "font_size");
-  test_align ((long) &font_dsize, sizeof(font_dsize[0]), "font_dsize");
-  test_align ((long) &font_params, sizeof(font_params[0]), "font_params");
-  test_align ((long) &font_name, sizeof(font_name[0]), "font_name");
-  test_align ((long) &font_area, sizeof(font_area[0]), "font_area");
-  test_align ((long) &font_bc, sizeof(font_bc[0]), "font_bc");
-  test_align ((long) &font_ec, sizeof(font_ec[0]), "font_ec");
-  test_align ((long) &font_glue, sizeof(font_glue[0]), "font_glue");
-  test_align ((long) &font_used, sizeof(font_used[0]), "font_used");
-  test_align ((long) &hyphen_char, sizeof(hyphen_char[0]), "hyphen_char");
-  test_align ((long) &skew_char, sizeof(skew_char[0]), "skew_char");
-  test_align ((long) &bchar_label, sizeof(bchar_label[0]), "bchar_label");
-  test_align ((long) &font_bchar, sizeof(font_bchar[0]), "font_bchar");
-  test_align ((long) &font_false_bchar, sizeof(font_false_bchar[0]), "font_false_bchar");
-  test_align ((long) &char_base, sizeof(char_base[0]), "char_base");
-  test_align ((long) &width_base, sizeof(width_base[0]), "width_base");
-  test_align ((long) &height_base, sizeof(height_base[0]), "height_base");
-  test_align ((long) &depth_base, sizeof(depth_base[0]), "depth_base");
-  test_align ((long) &italic_base, sizeof(italic_base[0]), "italic_base");
-  test_align ((long) &lig_kern_base, sizeof(lig_kern_base[0]), "lig_kern_base");
-  test_align ((long) &kern_base, sizeof(kern_base[0]), "kern_base");
-  test_align ((long) &exten_base, sizeof(exten_base[0]), "exten_base");
-  test_align ((long) &param_base, sizeof(param_base[0]), "param_base");
-  test_align ((long) &total_stretch, sizeof(total_stretch[0]), "total_stretch");
-  test_align ((long) &total_shrink, sizeof(total_shrink[0]), "total_shrink");
-  test_align ((long) &active_width, sizeof(active_width[0]), "active_width");
-  test_align ((long) &cur_active_width, sizeof(cur_active_width[0]), "cur_active_width");
-  test_align ((long) &background, sizeof(background[0]), "background");
-  test_align ((long) &break_width, sizeof(break_width[0]), "break_width");
-  test_align ((long) &minimal_demerits, sizeof(minimal_demerits[0]), "minimal_demerits");
-  test_align ((long) &best_place, sizeof(best_place[0]), "best_place");
-  test_align ((long) &best_pl_line, sizeof(best_pl_line[0]), "best_pl_line");
-  test_align ((long) &hc, sizeof(hc[0]), "hc");
-  test_align ((long) &hu, sizeof(hu[0]), "hu");
-  test_align ((long) &hyf, sizeof(hyf[0]), "hyf");
-  // test_align ((long) &x, sizeof(x[0]), "x");
-  test_align ((long) &hyf_distance, sizeof(hyf_distance[0]), "hyf_distance");
-  test_align ((long) &hyf_num, sizeof(hyf_num[0]), "hyf_num");
-  test_align ((long) &hyf_next, sizeof(hyf_next[0]), "hyf_next");
-  test_align ((long) &op_start, sizeof(op_start[0]), "op_start");
-  // test_align ((long) &trie_op_hash, sizeof(trie_op_hash[0]), "trie_op_hash");
-  test_align ((long) &trie_used, sizeof(trie_used[0]), "trie_used");
-/*  test_align ((long) &trie_op_lang, sizeof(trie_op_lang[0]), "trie_op_lang");*/
-  test_align ((long) &trie_op_val, sizeof(trie_op_val[0]), "trie_op_val");
-  test_align ((long) &trie_min, sizeof(trie_min[0]), "trie_min");
-  test_align ((long) &page_so_far, sizeof(page_so_far[0]), "page_so_far");
-  test_align ((long) &write_file, sizeof(write_file[0]), "write_file");
-  test_align ((long) &write_open, sizeof(write_open[0]), "write_open");
-#endif
-}
-
-void check_alloc_align (int flag)
-{
-  (void) flag;
-
-  if (test_align((long) eqtb, sizeof(eqtb[0]), "ALLOCATED ALIGNMENT"))
-    puts("PLEASE RECOMPILE ME!");
-
-#ifdef CHECKALIGNMENT
-  if (!flag)
-    return;
-
-#ifndef ALLOCZEQTB
-  test_align ((long) eqtb, sizeof(eqtb[0]), "eqtb"); 
-#endif
-
-  test_align ((long) str_pool, sizeof(str_pool[0]), "str_pool"); /* no op */
-  test_align ((long) str_start, sizeof(str_start[0]), "str_start");
-  test_align ((long) mem, sizeof(mem[0]), "main memory");
-  test_align ((long) font_info, sizeof(font_info[0]), "font memory");
-  test_align ((long) trie_trl, sizeof(trie_trl[0]), "trie_trl");
-  test_align ((long) trie_tro, sizeof(trie_tro[0]), "trie_tro");
-  test_align ((long) trie_trc, sizeof(trie_trc[0]), "trie_trc");
-  test_align ((long) hyph_word, sizeof(hyph_word[0]), "hyph_word");
-  test_align ((long) hyph_list, sizeof(hyph_list[0]), "hyph_list");
-/*  test_align ((long) trie_c, sizeof(trie_c[0]), "trie_c"); *//* no op */
-  test_align ((long) trie_o, sizeof(trie_o[0]), "trie_o");
-  test_align ((long) trie_l, sizeof(trie_l[0]), "trie_l");
-  test_align ((long) trie_r, sizeof(trie_r[0]), "trie_r");
-  test_align ((long) trie_hash, sizeof(trie_hash[0]), "trie_hash");
-  test_align ((long) trie_taken, sizeof(trie_taken[0]), "trie_taken");
-#endif
-}
-
-boolean shorten_file_name  = false; /* don't shorten file names to 8+3 for DOS */
-
-/* cache to prevent allocating twice in a row */
-
-char * lastname  = NULL;
-char * lastvalue = NULL;
-
-/* returns allocated string -- these strings are not freed again */
-/* is it safe to do that now ? 98/Jan/31 */
-char * grabenv (const char * varname)
-{
-  char * s;
-
-  if (varname == NULL)
-    return NULL;
-
-  if (*varname == '\0')
-    return NULL;
-
-  if (lastname != NULL && strcasecmp(lastname, varname) == 0)
-  {
-    if (trace_flag)
-      printf("Cache hit: %s=%s\n", lastname, lastvalue);
-
-    return xstrdup(lastvalue);
-  }
-
-  s = getenv(varname);
-
-  if (s != NULL)
-  {
-    if (lastname != NULL)
-      free(lastname);
-
-    lastname = xstrdup(varname);
-
-    if (lastvalue != NULL)
-      free(lastvalue);
-
-    lastvalue = xstrdup(s);
-
-    return xstrdup(s);
-  }
-  else
-    return NULL;
-}
-
-void flush_trailing_slash (char * directory)
-{
-  char * s;
-
-  if (strcmp(directory, "") != 0)
-  {
-    s = directory + strlen(directory) - 1;
-
-    if (*s == '\\' || *s == '/')
-      *s = '\0';
-  }
-}
-
-void knuthify (void)
-{
-  restrict_to_ascii     = false; /* don't complain non ASCII */
-  allow_patterns        = false; /* don't allow pattern redefinition */
-  show_in_hex           = true;  /* show character code in hex */
-  show_in_dos           = false; /* redundant with previous */
-  show_numeric          = false; /* don't show character code decimal */
-  show_missing          = false; /* don't show missing characters */
-  civilize_flag         = false; /* don't reorder date fields */
-  c_style_flag          = false; /* don't add file name to error msg */
-  show_fmt_flag         = false; /* don't show format file in log */
-  show_tfm_flag         = false; /* don't show metric file in log */
-  tab_step              = 0;
-  show_line_break_stats = false; /* do not show line break stats */
-  show_fonts_used       = false;
-  default_rule          = 26214; /* revert to default rule thickness */
-  pseudo_tilde          = false;
-  pseudo_space          = false;
-  truncate_long_lines   = false;
-  allow_quoted_names    = false;
-  show_cs_names         = false;
-  ignore_frozen         = false;
-  suppress_f_ligs       = false;
-  full_file_name_flag   = false;
-  knuth_flag            = true;  /* so other code can know about this */
-}
-
-/* following made global so analyze_flag can be made separate procedure */
-
-char * xchr_file = NULL;
-char * repl_file = NULL;
-
-const char * short_options = "m:e:h:0:H:g:P:o:l:a:r:kwvpiKLZMd2t?u";
-
-static struct option long_options[] =
-{
-  {"main-memory",   required_argument, NULL, 'm'},
-  {"hyph-size",     required_argument, NULL, 'e'},
-  {"trie-size",     required_argument, NULL, 'h'},
-  {"backend",       required_argument, NULL, '0'},
-  {"tab-step",      required_argument, NULL, 'H'},
-  {"percent-grow",  required_argument, NULL, 'g'},
-  {"default-rule",  required_argument, NULL, 'P'},
-  {"dvi-dir",       required_argument, NULL, 'o'},
-  {"log-dir",       required_argument, NULL, 'l'},
-  {"aux-dir",       required_argument, NULL, 'a'},
-  {"key-file",      required_argument, NULL, 'k'},
-  {"jobname",       required_argument, NULL, 'r'},
-  {"showhex",       no_argument,       NULL, 'w'},
-  {"verbose",       no_argument,       NULL, 'v'},
-  {"patterns",      no_argument,       NULL, 'p'},
-  {"initex",        no_argument,       NULL, 'i'},
-  {"knuthify",      no_argument,       NULL, 'K'},
-  {"cstyle",        no_argument,       NULL, 'L'},
-  {"showtfm",       no_argument,       NULL, 'Z'},
-  {"showmissing",   no_argument,       NULL, 'M'},
-  {"deslash",       no_argument,       NULL, 'd'},
-  {"suppressflig",  no_argument,       NULL, '2'},
-  {"trace",         no_argument,       NULL, 't'},
-  {"help",          no_argument,       NULL, '?'},
-  {"usage",         no_argument,       NULL, 'u'},
-  {NULL,            0, 0, 0}
-};
-
-int analyze_flag (int c, char * optarg)
-{
-  switch (c)
-  {
-    case 'r':
-      c_job_name = optarg;
-      break;
-    case 'v':
-      verbose_flag = true;
-      break;
-    case 'i':
-      is_initex = true;
-      break;
-    case 'Q':
-      interaction = batch_mode;
-      break;
-    case 'R':
-      interaction = nonstop_mode;
-      break;
-    case 'S':
-      interaction = scroll_mode;
-      break;
-    case 'T':
-      interaction = error_stop_mode;
-      break;
-    case 'K':
-      knuthify();
-      break;
-    case 'L':
-      c_style_flag = true;
-      break;
-    case 'Z':
-      show_tfm_flag = true;
-      break;
-    case 'M':
-      show_missing = false;
-      break;
-    case 'd':
-      deslash = false;
-      break;
-    case 'p':
-      allow_patterns = true;
-      break;
-    case 'w':
-      show_in_hex = true;
-      break;
-    case 'j':
-      show_in_dos = true;
-      break;
-    case 'n':
-      restrict_to_ascii = true; /* 0 - 127 1994/Jan/21 */
-      break;
-    case 'f':
-      show_fonts_used = false;
-      break;
-    case '8':
-      shorten_file_name = true;
-      break;
-    case '9':
-      show_cs_names = true;
-      break;
-    case '4':
-      ignore_frozen = true;
-      break;
-    case 'J':
-      show_line_break_stats = false; /* 96/Feb/8 */
-      break;
-    case 'O':
-      show_fmt_flag = false; /* 94/Jun/21 */
-      break;
-    case '2':
-      suppress_f_ligs = true; /* 99/Jan/5 f-lig */
-      break;
-    case 'z':
-      full_file_name_flag = false; // 00 Jun 18
-      break;
-    case 't':
-      trace_flag = true;
-      break;
-    case 'q':
-      quitflag++; /* 93/Dec/16 */
-      break;
-/* The following are really obscure and should not be advertized */
-    case 's':
-      show_current = false;
-      break;
-    case 'N':
-      show_numeric = false;
-      break;
-    case 'A':
-      civilize_flag = false;
-      break; 
-    case 'B':
-      open_trace_flag = true;
-      break;
-    case 'Y':
-      reorder_arg_flag = false; /* local */
-      break;
-
-    case 'm':
-      if (optarg == 0)
-        mem_initex = mem_top;
-      else
-        mem_initex = atoi(optarg) * 1024;
-
-      if (mem_initex == 0)
-        complainarg(c, optarg);
-
-      mem_spec_flag = true;
-      break;
-
-#ifdef VARIABLETRIESIZE
-    case 'h':
-      if (optarg == 0)
-      {
-        //trie_size = atoi(kpse_var_value("trie_size"));
-        trie_size = default_trie_size;
-      }
-      else
-        trie_size = atoi(optarg);
-
-      if (trie_size == 0)
-        complainarg(c, optarg);
-      break;
-#endif
-
-#ifdef ALLOCATEHYPHEN
-    case 'e':
-      if (optarg == 0)
-        new_hyphen_prime = hyphen_prime * 2;
-      else
-        new_hyphen_prime = atoi(optarg);
-
-      if (new_hyphen_prime == 0)
-        complainarg(c, optarg);
-
-      break;
-#endif
-    case 'g':
-      if (optarg == 0)
-        percent_grow = 62;
-      else
-        percent_grow = atoi(optarg);
-
-      if (percent_grow == 0)
-        complainarg(c, optarg);
-
-      break;
-
-    case 'U':
-      if (optarg == 0)
-        pseudo_tilde = 0;
-      else
-        pseudo_tilde = atoi(optarg);
-
-      if (pseudo_tilde > 255)
-        pseudo_tilde = 255;
-      else if (pseudo_tilde < 128)
-        pseudo_tilde = 128;
-
-      break;
-
-    case 'H':
-      if (optarg == 0)
-        tab_step = 8;
-      else
-        tab_step = atoi(optarg);
-      if (tab_step == 0)
-        complainarg(c, optarg);
-      break;
-
-    case 'x':
-      if (optarg == 0)
-        xchr_file = xstrdup("xchr.map");
-      else
-        xchr_file = xstrdup(optarg);
-
-      if (xchr_file == NULL || *xchr_file == '\0')
-        complainarg(c, optarg);
-      break;
-
-    case 'k':
-      if (optarg == 0)
-        repl_file = xstrdup("repl.key");
-      else
-        repl_file = xstrdup(optarg);
-
-      if (repl_file == NULL || *repl_file == '\0')
-        complainarg(c, optarg);
-      break;
-
-    case 'P':
-      if (optarg == 0)
-        default_rule = 26214;
-      else
-        default_rule = atoi(optarg);
-
-      if (default_rule == 0)
-        complainarg(c, optarg);
-      break;
-
-    case 'E':
-      if (optarg != 0)
-        putenv(optarg);
-      else
-        complainarg(c, optarg);
-      break;
-
-    case 'o':
-      if (optarg == 0)
-        dvi_directory = "";
-      else
-        dvi_directory = xstrdup(optarg);
-
-      if (strcmp(dvi_directory, "") == 0)
-        complainarg(c, optarg);
-
-      break;
-
-    case 'l':
-      if (optarg == 0)
-        log_directory = "";
-      else
-        log_directory = xstrdup(optarg);
-
-      if (strcmp(log_directory, "") == 0)
-        complainarg(c, optarg);
-
-      break;
-
-    case 'a':
-      if (optarg == 0)
-        aux_directory = "";
-      else
-        aux_directory = xstrdup(optarg);
-
-      if (strcmp(aux_directory, "") == 0)
-        complainarg(c, optarg);
-
-      break;
-
-    case '?':
-    default:
-      show_use = true;
-      return -1;
-      break;
-  }
-
-  return 0;
-}
-
-void strip_name (char *pathname)
-{
-  char *s;
-
-  if ((s = strrchr(pathname, '\\')) != NULL)
-    ;
-  else if ((s = strrchr(pathname, '/')) != NULL)
-    ;
-  else if ((s = strrchr(pathname, ':')) != NULL)
-    s++;
-  else
-    s = pathname;
-
-  *s = '\0';
-}
-
-int read_command_line (int ac, char **av)
-{ 
-  int c;
-  char *optargnew;
-  int option_idx = 0;
-
-  if (ac < 2)
-    return 0;
-
-  while ((c = getopt_long_only(ac, av, short_options, long_options, &option_idx)) != EOF)
-  {
-    if (optarg != 0 && *optarg == '=')
-      optargnew = optarg + 1;
-    else
-      optargnew = optarg;
-
-    analyze_flag(c, optargnew);
-  }
-
-  if (show_use || quitflag == 3)
-  {
-    stamp_it(log_line);
-    strcat(log_line, "\n");
-    show_line(log_line, 0);
-
-    if (show_use)
-      show_usage();
-    else if (quitflag == 3)
-    {
-      strcat(log_line, "\n");
-      show_line(log_line, 0);
-    }
-
-    return -1; // failure
-  } 
-
-  if (repl_file != NULL && *repl_file != '\0')
-  {
-    if (read_xchr_file(repl_file, 1, av))
-    {
-      if (trace_flag)
-        puts("KEY REPLACE ON");
-
-      key_replace = true;
-    }
-  } 
-
-  if (xchr_file != NULL && *xchr_file != '\0')
-  {
-    if (read_xchr_file(xchr_file, 0, av))
-    {
-      if (trace_flag)
-        puts("NON ASCII ON");
-
-      non_ascii = true;
-    }
-  } 
-
-  return 0;
-}
-
-int init_commands (int ac, char **av)
-{
-  shipout_flag          = out_dvi_flag;
-  is_initex             = false; 
-  allow_patterns        = false;
-  reset_exceptions      = false;
-  non_ascii             = false;
-  key_replace           = false;
-  open_trace_flag       = false;
-  trace_flag            = false;
-  verbose_flag          = false;
-  restrict_to_ascii     = false;
-  show_in_hex           = false; /* default is not to show as hex code ^^ 00/Jun/18 */
-  show_in_dos           = false; /* default is not to translate to DOS 850 */ 
-  return_flag           = true;  // hard wired now
-  trimeof               = true;  // hard wired now
-  deslash               = true;
-  pseudo_tilde          = 254;   /* default '~' replace 95/Sep/26 filledbox DOS 850 */
-  pseudo_space          = 255;   /* default ' ' replace 97/June/5 nbspace DOS 850 */
-  default_rule          = 26214;
-  show_current          = true;
-  civilize_flag         = true;
-  show_numeric          = true;
-  show_missing          = true;
-  c_style_flag          = false;
-  show_fmt_flag         = true;
-  show_tfm_flag         = false; /* don't show metric file in log */
-  shorten_file_name     = false; /* don't shorten file names to 8+3 */
-  truncate_long_lines   = true;  /* truncate long lines */
-  tab_step              = 0;     /* do not replace tabs with spaces */
-  show_line_break_stats = true;  /* show line break statistics 96/Feb/8 */
-  show_fonts_used       = true;  /* show fonts used in LOG file 97/Dec/24 */
-  allow_quoted_names    = true;  /* allow quoted names with spaces 98/Mar/15 */
-  show_cs_names         = false;
-  knuth_flag            = false;
-  full_file_name_flag   = true;  /* new default 2000 June 18 */
-  errout                = stdout; /* as opposed to stderr say --- used ??? */
-  new_hyphen_prime      = 0;
-
-#ifdef VARIABLETRIESIZE
-  // trie_size = default_trie_size;
-  trie_size = 0;
-#endif
-
-  mem_extra_high = 0;
-  mem_extra_low  = 0;
-  mem_initex     = 0;
-  format_name    = "plain";
-
-  if (read_command_line(ac, av) < 0)
-    return -1;
-
-  if (optind == 0)
-    optind = ac;
-
-  return 0;
-}
-
-void initial_memory (void)
-{
-  /* set initial memory allocations */
-  if (mem_extra_high < 0)
-    mem_extra_high = 0;
-
-  if (mem_extra_low < 0)
-    mem_extra_low = 0;
-
-  if (mem_initex < 0)
-    mem_initex = 0;
-
-  if (is_initex)
-  {
- #if defined(ALLOCATEHIGH) || defined(ALLOCATELOW)
-    if (mem_extra_high != 0 || mem_extra_low != 0)
-    {
-      puts("ERROR: Cannot extend main memory in initex");
-      mem_extra_high = 0;
-      mem_extra_low = 0;
-    }
-#endif
-  }
-  else
-  {
-    if (mem_initex != 0)
-    {
-      puts("ERROR: Can only set initial main memory size in initex");
-      mem_initex = 0;
-    }
-
-    if (trie_size != 0)
-    {
-      puts("ERROR: Need only set hyphenation trie size in initex");
-/* trie_size = 0; */
-    }
-  }
-  if (mem_initex == 0)
-    mem_initex = default_mem_top;
-
-  if (trie_size == 0)
-    trie_size = default_trie_size;
-
-/* Just in case user mistakenly specified words instead of kilo words */
-  if (mem_extra_high > 10000L * 1024L)
-    mem_extra_high = mem_extra_high / 1024;
-
-  if (mem_extra_low > 10000L * 1024L)
-    mem_extra_low = mem_extra_low / 1024;
-
-  if (mem_initex > 10000L * 1024L)
-    mem_initex = mem_initex / 1024;
-
-  if (mem_initex > 2048L * 1024L) /* extend main memory by 16 mega byte! */
-  {
-    puts("WARNING: There may be no benefit to asking for so much memory");
-/* mem_initex = 2048 * 1024; */
-  }
-
-  if (new_hyphen_prime < 0)
-    new_hyphen_prime = 0;
-
-  if (new_hyphen_prime > 0)
-  {
-    if (! is_initex)
-      puts("ERROR: Can only set hyphen prime in initex");
-    else
-    {
-      if (new_hyphen_prime % 2 == 0)
-        new_hyphen_prime++;
-
-      while (!prime(new_hyphen_prime))
-        new_hyphen_prime = new_hyphen_prime + 2;
-
-      if (trace_flag)
-        printf("Using %d as hyphen prime\n", new_hyphen_prime);
-    }
-  }
-
-  if (percent_grow > 100)
-    percent_grow = percent_grow - 100;
-
-  if (percent_grow > 100)
-    percent_grow = 100;   /* upper limit - double */
-
-  if (percent_grow < 10)
-    percent_grow = 10;   /* lower limit - 10% */
-}
-
-void perrormod (const char * s)
-{
-  printf("`%s': %s\n", s, strerror(errno));
-}
-
-/* convert tilde to pseudo_tilde to hide it from TeX --- 95/Sep/26 */
-/* convert space to pseudo_space to hide it from TeX --- 97/Jun/5 */
-/* called only if pseudo_tilde != 0 or pseudo_space != 0 */
-/* this is then undone in tex3.c both for fopen input and output */
-/* not ideal, since pseudo name appears in log and in error messages ... */
-
-void hidetwiddle (char *tname)
-{
-  char *s = tname;
-
-#ifdef DEBUGTWIDDLE
-  if (trace_flag)
-    printf("Hidetwiddle %s", tname);
-#endif
-
-  while (*s != '\0')
-  {
-    if (*s == '~' && pseudo_tilde != 0)
-      *s = (char) pseudo_tilde;  /* typically 254 */
-    else if (*s == ' ' && pseudo_space != 0)
-      *s = (char) pseudo_space;  /* typically 255 */
-    s++;
-  }
-
-#ifdef DEBUGTWIDDLE
-  if (trace_flag)
-    printf("=> %s\n", tname);
-#endif
-}
-
-void deslash_all (int ac, char **av)
-{
-  char buffer[file_name_size];  
-  char *s;
-
-  if ((s = grabenv("TEXDVI")) != NULL)
-    dvi_directory = s;
-
-  if ((s = grabenv("TEXLOG")) != NULL)
-    log_directory = s;
-
-  if ((s = grabenv("TEXAUX")) != NULL)
-    aux_directory = s;
-
-  if ((s = grabenv("TEXFMT")) != NULL)
-    fmt_directory = s;
-
-  if ((s = grabenv("TEXPDF")) != NULL)
-    pdf_directory = s;
-
-  strcpy(buffer, av[0]);
-
-  if ((s = strrchr(buffer, '\\')) != NULL)
-    *(s + 1) = '\0';
-  else if ((s = strrchr(buffer, '/')) != NULL)
-    *(s + 1) = '\0';
-  else if ((s = strrchr(buffer, ':')) != NULL)
-    *(s + 1) = '\0';
-
-  s = buffer + strlen(buffer) - 1;
-
-  if (*s == '\\' || *s == '/')
-    *s = '\0';
-
-  if (strcmp(dvi_directory, "") != 0)
-    flush_trailing_slash(dvi_directory);
-
-  if (strcmp(log_directory, "") != 0)
-    flush_trailing_slash(log_directory);
-
-  if (strcmp(aux_directory, "") != 0)
-    flush_trailing_slash(aux_directory);
-
-  if (strcmp(fmt_directory, "") != 0)
-    flush_trailing_slash(fmt_directory);
-
-  if (strcmp(pdf_directory, "") != 0)
-    flush_trailing_slash(pdf_directory);
-
-  if (deslash)
-  {
-    if (strcmp(dvi_directory, "") != 0)
-      unixify(dvi_directory);
-    
-    if (strcmp(log_directory, "") != 0)
-      unixify(log_directory);
-
-    if (strcmp(aux_directory, "") != 0)
-      unixify(aux_directory);
-
-    if (strcmp(fmt_directory, "") != 0)
-      unixify(fmt_directory);
-
-    if (strcmp(pdf_directory, "") != 0)
-      unixify(pdf_directory);
-  }
-
-  format_spec = false;
-
-  if (optind < ac && optind > 0)
-  {
-    if (deslash)
-    {
-      if (trace_flag)
-        printf("deslash: k %d argv[k] %s (argc %d)\n", optind, av[optind], ac);
-
-      unixify(av[optind]);
-    }
-
-    if (pseudo_tilde != 0 || pseudo_space != 0)
-      hidetwiddle(av[optind]);
-
-    if (*av[optind] == '&' || *av[optind] == '+')
-    {
-      format_spec = true;
-      format_name = xstrdup(av[optind] + 1);
-
-      if (optind + 1 < ac)
-      {
-        if (deslash)
-        {
-          if (trace_flag)
-            printf("deslash: k %d argv[k] %s (argc %d)\n", optind + 1, av[optind + 1], ac);
-
-          unixify(av[optind + 1]);
-        }
-
-        if (pseudo_tilde != 0 || pseudo_space != 0)
-          hidetwiddle(av[optind + 1]);
-      }
-    }         
-  }
-}
-
-int main_init (int ac, char ** av)
-{
-  kpse_set_program_name(av[0], "dvipdfmx");
-  xputenv("engine", "yandytex");
-
-  if (sizeof(memory_word) != sizeof(halfword) * 2)
-    printf("ERROR: Bad word size %ld!\n", sizeof(memory_word));
-
-  start_time = clock();
-  main_time  = start_time;
-
-/* reset all allocatable memory pointers to NULL - in case we drop out */
-  main_memory = NULL;
-  font_info   = NULL;
-  str_pool    = NULL;
-  str_start   = NULL;
-
-#ifdef ALLOCATESAVESTACK
-  save_stack = NULL; 
-#endif
-
-#ifdef ALLOCATEBUFFER
-  buffer           = NULL;
-  current_buf_size = 0;
-  buffer           = realloc_buffer(initial_buf_size);
-#endif
-
-  hyph_list  = NULL;
-  hyph_word  = NULL;
-  trie_taken = NULL;
-  trie_hash  = NULL;
-  trie_r     = NULL;
-  trie_c     = NULL;
-  trie_o     = NULL;
-  trie_l     = NULL;
-  trie_trc   = NULL;
-  trie_tro   = NULL;
-  trie_trl   = NULL;
-
-  log_opened          = false;  /* so can tell whether opened */
-  interaction         = -1;     /* default state => 3 */
-  missing_characters  = 0;      /* none yet! */
-  ignore_frozen       = false;  /* default is not to ignore 98/Oct/5 */
-  suppress_f_ligs     = false;  /* default is not to ignore f-ligs */
-
-  if (ac > 1 && !strncmp(av[1], "-Y", 2))
-    reorder_arg_flag = false;
-
-  if (reorder_arg_flag)
-    reorderargs(ac, av);  
-
-  if (init_commands(ac, av))
-    return -1;
-
-  check_fixed_align(trace_flag);
-
-  format_file   = NULL;
-  source_direct = NULL;
-  dvi_file_name = NULL;
-  log_file_name = NULL;
-  pdf_file_name = NULL;
-
-  first_pass_count  = 0;
-  second_pass_count = 0;
-  final_pass_count  = 0;
-  paragraph_failed  = 0;
-  single_line       = 0;
-  overfull_hbox     = 0;
-  underfull_hbox    = 0;
-  overfull_vbox     = 0;
-  underfull_vbox    = 0;
-
-  if (trace_flag)
-    puts("Entering main_init() (local.c).");
-
-  probe_memory();
-  ini_max_address = max_address;
-
-  if (trace_flag)
-    show_maximums(stdout);
-
-  initial_memory();
-  deslash_all(ac, av);
-
-  if (format_spec && mem_spec_flag)
-    puts("WARNING: Cannot change initial main_memory size when format specified");
-
-  if (allocate_memory() != 0)
-    return -1;
-
-  check_alloc_align(trace_flag);
-
-  if (trace_flag)
-    puts("Leaving main_init() (local.c).");
-
-  return 0;
-}
-
-#define CLK_TCK CLOCKS_PER_SEC
-
-void show_inter_val (clock_t inter_val)
-{
-  int seconds, tenths, hundredth, thousands;
-
-  if (inter_val >= CLK_TCK * 10)
-  {
-    tenths = (inter_val * 10 + CLK_TCK / 2) / CLK_TCK; 
-    seconds = tenths / 10; 
-    tenths = tenths % 10;
-    printf("%d.%d", seconds, tenths);
-  }
-  else if (inter_val >= CLK_TCK)
-  {
-    hundredth = (inter_val * 100 + CLK_TCK / 2) / CLK_TCK;
-    seconds = hundredth / 100;
-    hundredth = hundredth % 100;
-    printf("%d.%02d", seconds, hundredth);
-  }
-  else if (inter_val > 0)
-  {
-    thousands = (inter_val * 1000 + CLK_TCK / 2) / CLK_TCK;
-    seconds = thousands / 1000;
-    thousands = thousands % 1000;
-    printf("%d.%03d", seconds, thousands);
-  }
-  else
-    show_line("0", 0);
-}
-
-int endit(int flag)
-{
-  finish_time = clock();
-
-  if (missing_characters != 0)
-    flag = 1;
-
-  if (missing_characters)
-    printf("! There %s %d missing character%s --- see log file\n",
-      (missing_characters == 1) ? "was" : "were", missing_characters,
-      (missing_characters == 1) ? "" : "s");
-
-  if (free_memory() != 0)
-    flag++;
-
-  if (verbose_flag)
-  {
-    printf("Total ");
-    show_inter_val(finish_time - start_time);
-    printf(" sec (");
-    show_inter_val(main_time - start_time);
-    printf(" format load + ");
-    show_inter_val(finish_time - main_time);
-    printf(" processing) ");
-
-    if (total_pages > 0)
-    {
-      show_inter_val((finish_time - main_time) / total_pages);
-      printf(" sec per page.\n");
-    }
-  }
-
-  return flag;
-}
-// printf control sequences' name
-void print_cs_name (FILE * output, int h)
-{
-  int c, textof, n;
-
-  memset(log_line, 0, sizeof(log_line));
-
-  textof = hash[h].rh;
-
-  if (textof == 0)
-    return;
-
-  c = sprintf(log_line, "(%d), ", h);
-  n = length(textof);
-
-  memmove(log_line + c, str_pool + str_start[textof], n);
-  memmove(log_line + c + n, "\n", 2);
-
-  if (output == stderr)
-    show_line(log_line, 1);
-  else if (output == stdout)
-    show_line(log_line, 0);
-  else
-    fprintf(output, "%s", log_line);
-}
-// prototype
-int compare_strn (int, int, int, int);
-/* compare two csnames in qsort */
-int compare_cs (const void *cp1, const void *cp2)
-{
-  int c1, c2, l1, l2, k1, k2, textof1, textof2;
-
-  c1 = *(int *)cp1;
-  c2 = *(int *)cp2;
-  textof1 = hash[c1].rh;
-  textof2 = hash[c2].rh;
-  l1 = length(textof1);
-  l2 = length(textof2);
-  k1 = str_start[textof1];
-  k2 = str_start[textof2];
-
-  return compare_strn(k1, l1, k2, l2);
-}
-
-char * csused = NULL;
-
-/* Allocate table of indeces to allow sorting on csname */
-/* Allocate flags to remember which ones already listed at start */
-/* pass = 0 --> fmt   */
-/* pass = 1 --> after */
-void print_cs_names (FILE *output, int pass)
-{
-  int h, k, ccount, repeatflag;
-  int *cnumtable;
-  int nfcs = frozen_control_sequence;
-
-  if (pass == 0 && csused == NULL)
-  {
-    csused = (char *) malloc (nfcs);
-
-    if (csused == NULL)
-      return;
-
-#ifdef USEMEMSET
-    memset(csused, 0, nfcs);
-#else
-    for (h = 0; h < (hash_size + 780); h++)
-      csused[h] = 0;
-#endif
-  }
-
-  ccount = 0;
-
-  for (h = hash_base + 1; h < nfcs; h++)
-  {
-    if (pass == 1 && csused[h])
-      continue;
-
-    if (text(h) != 0)
-    {
-      if (pass == 0)
-        csused[h] = 1;
-
-      ccount++;
-    }
-  }
-
-  sprintf(log_line, "\n%d %s multiletter control sequences:\n",
-      ccount, (pass == 1) ? "new" : "");
-
-  if (output == stderr)
-    show_line(log_line, 1);
-  else if (output == stdout)
-    show_line(log_line, 0);
-  else
-    fprintf(output, "%s", log_line);
-
-  if (ccount > 0)
-  {
-    cnumtable = (int *) malloc (ccount * sizeof(int));
-
-    if (cnumtable == NULL)
-      return;
-
-    ccount = 0;
-
-    for (h = hash_base + 1; h < nfcs; h++)
-    {
-      if (pass == 1 && csused[h])
-        continue;
-
-      if (hash[h].rh != 0)
-        cnumtable[ccount++] = h;
-    }
-
-    //qsort ((void *)cnumtable, ccount, sizeof (int), &compare_cs);
-
-    repeatflag = 0;
-
-    for (k = 0; k < ccount; k++)
-    {
-      h = cnumtable[k];
-
-      if (pass == 1 && csused[h])
-        continue;
-
-      print_cs_name(output, h);
-    }
-
-    sprintf(log_line, "\n");
-
-    if (output == stderr)
-      show_line(log_line, 1);
-    else if (output == stdout)
-      show_line(log_line, 0);
-    else
-      fprintf(output, "%s", log_line);
-
-    free((void *)cnumtable);
-  }
-
-  if (pass == 1 && csused != NULL)
-  {
-    free(csused);
-    csused = NULL;
-  }
-}
-
-/* k1 and k2 are positions in string pool */
-/* l1 and l2 are lengths of strings */
-int compare_strn (int k1, int l1, int k2, int l2)
-{
-  int c1, c2;
-
-  while (l1 > 0 && l2 > 0)
-  {
-    c1 = str_pool[k1];
-    c2 = str_pool[k2];
-
-    if (c1 > c2)
-      return 1;
-    else if (c2 > c1)
-      return -1;
-
-    l1--; l2--;
-    k1++; k2++;
-  }
-
-  if (l1 > 0)
-    return 1;   /* first string longer */
-  else if (l2 > 0)
-    return -1; /* second string longer */
-
-  return 0;         /* strings match */
-}
-/* compare two font names and their at sizes in qsort */
-int compare_fnt (const void * fp1, const void * fp2)
-{
-  int f1, f2, l1, l2, k1, k2, s;
-
-  f1 = *(short *)fp1;
-  f2 = *(short *)fp2;
-  l1 = length(font_name[f1]);
-  l2 = length(font_name[f2]);
-  k1 = str_start[font_name[f1]]; 
-  k2 = str_start[font_name[f2]]; 
-
-  s = compare_strn (k1, l1, k2, l2);
-
-  if (s != 0)
-    return s;
-
-  if (font_size[f1] > font_size[f2])
-    return 1;
-  else if (font_size[f1] < font_size[f2])
-    return -1;
-
-  return 0;         /* should not ever get here */
-}
-/* compare two font names */
-int compare_fnt_name (int f1, int f2)
-{
-  int l1, l2, k1, k2, s;
-
-  l1 = length(font_name[f1]);
-  l2 = length(font_name[f2]); 
-  k1 = str_start[font_name[f1]]; 
-  k2 = str_start[font_name[f2]]; 
-
-  s = compare_strn (k1, l1, k2, l2);
-
-  return s;
-}
-/* decode checksum information */
-const unsigned long checkdefault = 0x59265920;
-int decode_fourty (unsigned long checksum, char *codingvector)
-{
-  int c;
-  int k;
-
-  if (checksum == 0)
-  {
-    strcpy(codingvector, "unknwn");
-    return 1;
-  }
-  else if ((checksum >> 8) == (checkdefault >> 8))
-  {
-    strcpy (codingvector, "fixed ");
-    return 1;
-  }
-  else
-  {
-    for (k = 0; k < 6; k++)
-    {
-      c = (int) (checksum % 40);
-      checksum = checksum / 40;
-      
-      if (c <= 'z' - 'a')
-        c = c + 'a';
-      else if (c < 36)
-        c = (c + '0') - ('z' - 'a') - 1;
-      else if (c == 36)
-        c = '-';
-      else if (c == 37)
-        c = '&';
-      else if (c == 38)
-        c = '_';
-      else
-        c = '.';
-      
-      codingvector[5-k] = (char) c;
-    }
-
-    codingvector[6] = '\0';
-  }
-
-  return 0;
-}
-
-double sclpnt (long x)
-{
-  double pt;
-
-  pt = (double) x / 65536.0;
-  pt = (double) ((int) (pt * 1000.0 + 0.5)) / 1000.0;
-
-  return (pt);
-}
-
-void dvi_font_show (internal_font_number f, int suppressname)
-{
-  int a, l, k, n;
-  unsigned long checksum;
-  char checksumvector[8];
-  char buffer[32];
-
-  putc(' ', log_file);
-
-  if (suppressname == 0)
-  {
-    a = length(font_area[f]);
-    l = length(font_name[f]);
-
-    k = str_start[font_area[f]];
-
-    memcpy(buffer, str_pool + k, length(font_area[f]));
-    fwrite(buffer, sizeof(char), length(font_area[f]), log_file);
-
-    k = str_start[font_name[f]];
-
-    memcpy(buffer, str_pool + k, length(font_name[f]));
-    fwrite(buffer, sizeof(char), length(font_name[f]), log_file);
-  }
-  else a = l = 0;
-
-  for (k = a + l; k < 16; k++)
-    putc(' ', log_file);
-
-  sprintf(buffer, "at %lgpt ", sclpnt(font_size[f]));
-  fputs(buffer, log_file);
-
-  if (suppressname == 0)
-  {
-    n = strlen(buffer);
-
-    for (k = n; k < 16; k++)
-      putc(' ', log_file);
-
-    checksum = (((font_check[f].b0) << 8 | font_check[f].b1) << 8 | font_check[f].b2) << 8 | font_check[f].b3;
-    decode_fourty(checksum, checksumvector);
-    fprintf(log_file, "encoding: %s..", checksumvector);
-  }
-
-  putc('\n', log_file);
-}
-/* Allocate table of indeces to allow sorting on font name */
-void show_font_info (void)
-{
-  int k, m, fcount, repeatflag;
-  short *fnumtable;
-
-  fcount = 0;
-
-  for (k = 1; k <= font_ptr; k++)
-    if (font_used[k])
-      fcount++;
-
-  if (fcount == 0)
-    return;
-
-  fnumtable = (short *) malloc(fcount * sizeof(short));
-
-  fprintf(log_file, "\nUsed %d font%s:\n", fcount, (fcount == 1) ? "" : "s");
-
-  fcount = 0;
-
-  for (k = 1; k <= font_ptr; k++) 
-    if (font_used[k])
-      fnumtable[fcount++] = (short) k;
-
-  qsort ((void *)fnumtable, fcount, sizeof(short), &compare_fnt);
-
-  repeatflag = 0;
-
-  for (m = 0; m < fcount; m++)
-  {
-    if (m > 0)
-    {
-      if (compare_fnt_name(fnumtable[m - 1], fnumtable[m]) == 0)
-        repeatflag = 1;
-      else
-        repeatflag = 0;
-    }
-
-    dvi_font_show(fnumtable[m], repeatflag);
-  }
-
-  free((void *)fnumtable);
-}
+/* Copyright 2007 TeX Users Group\r
+   Copyright 2014 Clerk Ma   \r
+\r
+   This program is free software; you can redistribute it and/or modify\r
+   it under the terms of the GNU General Public License as published by\r
+   the Free Software Foundation; either version 2 of the License, or\r
+   (at your option) any later version.\r
+\r
+   This program is distributed in the hope that it will be useful, but\r
+   WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+   General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with this program; if not, write to the Free Software\r
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA\r
+   02110-1301 USA.  */\r
+\r
+#define EXTERN extern\r
+\r
+#include "yandytex.h"\r
+\r
+#define USEOUREALLOC\r
+#define USEMEMSET\r
+\r
+#ifdef USEOUREALLOC\r
+  #define REALLOC ourrealloc\r
+#else\r
+  #define REALLOC realloc\r
+#endif\r
+\r
+#if   defined (__ANDROID__)\r
+  #define malloc_usable_size dlmalloc_usable_size\r
+#elif defined (__APPLE__)\r
+  #define malloc_usable_size malloc_size\r
+#endif\r
+\r
+#if   defined (__clang__)\r
+const char * compiler = "Clang/LLVM";\r
+#elif defined (__GNUC__) || defined(__GNUG__)\r
+const char * compiler = "GCC";\r
+#elif defined (_MSC_VER)\r
+const char * compiler = "MSVC";\r
+#endif\r
+\r
+#if   defined (_WIN64)\r
+const char * dist = "Win64";\r
+#elif defined (_WIN32)\r
+const char * dist = "Win32";\r
+#elif defined (__ANDROID__)\r
+const char * dist = "Android";\r
+#elif defined (__APPLE__)\r
+const char * dist = "Darwin";\r
+#elif defined (__gnu_linux__)\r
+const char * dist = "Linux";\r
+#else\r
+const char * dist = "Unknown";\r
+#endif\r
+\r
+const char * compiletime  = __TIME__;\r
+const char * compiledate  = __DATE__;\r
+const char * yandyversion = "2.3.0";\r
+const char * application  = "Y&Y TeX";\r
+const char * banner       = "This is TeX, Version 3.14159265";\r
+\r
+void print_banner (void)\r
+{\r
+  char dist_ver[256];\r
+  memset(dist_ver, 0, sizeof(dist_ver));\r
+  sprintf(dist_ver, "%s (%s %s/%s)", banner, application, yandyversion, dist);\r
+  prints(dist_ver);\r
+}\r
+\r
+clock_t start_time, main_time, finish_time;\r
+\r
+char * dvi_directory = "";\r
+char * log_directory = "";\r
+char * aux_directory = "";\r
+char * fmt_directory = "";\r
+char * pdf_directory = "";\r
+\r
+char log_line[256];\r
+\r
+boolean mem_spec_flag     = false;\r
+boolean format_spec       = false;\r
+boolean reorder_arg_flag  = true;  /* put command line flags/arguments first */\r
+\r
+/* Mapping from Windows ANSI to DOS code page 850 96/Jan/20 */\r
+\r
+unsigned char wintodos[128] =\r
+{\r
+    0,   0,   0, 159,   0,   0,   0,   0,\r
+   94,   0,   0,   0,   0,   0,   0,   0,\r
+    0,  96,  39,   0,   0,   7,   0,   0,\r
+  126,   0,   0,   0,   0,   0,   0,   0,\r
+   32, 173, 189, 156, 207, 190, 221,  21,\r
+    0, 184, 166, 174, 170,  45, 169,   0,\r
+  248, 241, 253, 252,   0, 230,  20, 250,\r
+    0, 251, 167, 175, 172, 171, 243, 168,\r
+  183, 181, 182, 199, 142, 143, 146, 128,\r
+  212, 144, 210, 211, 222, 214, 215, 216,\r
+  209, 165, 227, 224, 226, 229, 153, 158,\r
+  157, 235, 233, 234, 154, 237, 232, 225,\r
+  133, 160, 131, 198, 132, 134, 145, 135,\r
+  138, 130, 136, 137, 141, 161, 140, 139,\r
+  208, 164, 149, 162, 147, 228, 148, 246,\r
+  155, 151, 163, 150, 129, 236, 231, 152\r
+};\r
+\r
+void show_usage (void)\r
+{\r
+  printf("\n"\r
+      "Useage: yandytex [OPTION]... [+format_file] [tex_file]\n\n"\r
+      "--help       -?  show this usage summary\n"\r
+      "--initex     -i  start up as initex (create format file)\n"\r
+      "--verbose    -v  be verbose (show implementation version number)\n"\r
+      "--ascii      -n  do not allow `non ASCII' characters in input files\n"\r
+      "                    (complain instead)\n"\r
+      "--showhex    -w  do not show `non ASCII' characters in hexadecimal\n"\r
+      "                    (show as is)\n"\r
+      "--nodos      -d  do not allow DOS style file names - i.e. do not convert\n"\r
+      "                    \\ to /\n"\r
+      "--nomac      -r  do not allow Mac style termination - i.e. do not convert\n"\r
+      "                    \\r to \\n\n"\r
+      "--patterns   -p  allow use of \\patterns after loading format (initex only)\n"\r
+      "--knuthify   -K  disable all extensions to basic TeX\n"\r
+      "--main-mem   -m  initial main memory size in kilo words (initex only)\n"\r
+      "--hyph-size  -e  hyphenation exception dictionary size (initex only)\n"\r
+      "--trie-size  -h  hyphenation pattern trie size (initex only)\n"\r
+      "--xchr-file  -x  use `non ASCII' character mapping (xchr[]) defined in file\n"\r
+      "--key-file   -k  use `key replacement' defined in file\n"\r
+      "--dvi-dir    -o  write DVI file in specified directory (default '.')\n"\r
+      "--log-dir    -l  write LOG file in specified directory (default '.')\n"\r
+      "--aux-dir    -a  write AUX file in specified directory (default '.')\n");\r
+  uexit(EXIT_FAILURE);\r
+}\r
+\r
+// Sep 27 1990 => 1990 Sep 27\r
+// 0123456789     0123456789\r
+void scivilize (char * date)\r
+{\r
+  int k;\r
+  char pyear[6];\r
+\r
+  strcpy(pyear, date + 7);\r
+\r
+  for (k = 5; k >= 0; k--)\r
+    date[k + 5] = date[k];\r
+\r
+  for (k = 0; k < 4; k++)\r
+    date[k] = pyear[k];\r
+\r
+  date[4] = ' ';\r
+\r
+  if (date[9] == ' ')\r
+    date[9] = '0';\r
+}\r
+\r
+// Thu Sep 27 06:26:35 1990 => 1990 Sep 27 06:26:35\r
+void lcivilize (char * date)\r
+{\r
+  int k;\r
+  char pyear[6];\r
+\r
+  strcpy(pyear, date + 20);\r
+\r
+  for (k = 18; k >= 0; k--)\r
+    date[k + 1] = date[k];\r
+\r
+  date[20] = '\0';\r
+\r
+  for (k = 0; k < 4; k++)\r
+    date[k] = pyear[k];\r
+\r
+  date[4] = ' ';\r
+}\r
+\r
+void stamp_it (char * s)\r
+{\r
+  char date[11 + 1];\r
+\r
+  strcpy(date, compiledate);\r
+  scivilize(date);\r
+  sprintf(s, "%s %s (compiled time: %s %s with %s)",\r
+    application, yandyversion, date, compiletime, compiler);\r
+  s += strlen(s);\r
+}\r
+\r
+#define MAXCHRS 256\r
+#define NOTDEF  127\r
+\r
+void read_xchr_sub (FILE * xchr_input)\r
+{\r
+  char buffer[file_name_size];\r
+  int k, from, to, count = 0;\r
+  char * s;\r
+\r
+  memset(xchr, NOTDEF, MAXCHRS);\r
+  memset(xord, NOTDEF, MAXCHRS);\r
+\r
+#ifdef ALLOCATEBUFFER\r
+  while (fgets(buffer, current_buf_size, xchr_input) != NULL)\r
+#else\r
+  while (fgets(buffer, sizeof(buffer), xchr_input) != NULL)\r
+#endif\r
+  {\r
+    if (*buffer == '%' || *buffer == ';' || *buffer == '\n')\r
+      continue;\r
+\r
+    from = (int) strtol (buffer, &s, 0);\r
+    to = (int) strtol (s, NULL, 0);\r
+\r
+    if (from >= 0 && from < MAXCHRS && to >= 0 && to < MAXCHRS)\r
+    {\r
+      if (xchr[from] == NOTDEF)\r
+        xchr[from] = (unsigned char) to;\r
+      else\r
+        printf("NOTE: %s collision: %d => %d, %d\n", "xchr", from, xchr[from], to);\r
+\r
+      if (xord[to] == NOTDEF)\r
+        xord[to] = (unsigned char) from;\r
+      else\r
+        printf("NOTE: %s collision: %d => %d, %d\n", "xord", to, xord[to], from);\r
+\r
+      count++;\r
+    }\r
+  }\r
+\r
+  for (k = 0; k < MAXCHRS; k++)\r
+  {\r
+    if (xchr[k] == NOTDEF)   /* if it has not been filled */\r
+    {\r
+      if (xord[k] == NOTDEF) /* see whether used already */\r
+      {\r
+        xchr[k] = (unsigned char) k; /* no, so make identity */\r
+        xord[k] = (unsigned char) k; /* no, so make identity */\r
+      }\r
+    }\r
+  }\r
+\r
+  xchr[NOTDEF] = NOTDEF;         /* fixed point of mapping */\r
+\r
+  if (trace_flag)\r
+  {\r
+    printf("Read %d xchr[] pairs:\n", count);\r
+\r
+    for (k = 0; k < MAXCHRS; k++)\r
+    {\r
+      if (xchr[k] != NOTDEF)\r
+        printf("%d => %d\n", k, xchr[k]);\r
+    }\r
+  }\r
+}\r
+\r
+char * replacement[MAXCHRS];     /* pointers to replacement strings */\r
+\r
+void read_repl_sub (FILE * repl_input)\r
+{\r
+  int k, n, m, chrs;\r
+  char buffer[file_name_size];\r
+  char charname[128];\r
+  int charnum[10];\r
+  char * s, * t;\r
+  \r
+  memset(replacement, 0, MAXCHRS * sizeof(replacement[0]));\r
+\r
+  while (fgets(buffer, file_name_size, repl_input) != NULL)\r
+  {\r
+    if (*buffer == '%' || *buffer == ';' || *buffer == '\n')\r
+      continue;\r
+\r
+    if ((m = sscanf(buffer, "%d%n %s", &chrs, &n, (char *)&charname)) == 0)\r
+      continue;\r
+    else if (m == 2)\r
+    {\r
+      if (*charname == '"')   /* deal with quoted string "..." */\r
+      {\r
+        s = buffer + n;\r
+        t = charname;\r
+\r
+        while (*s != '"' && *s != '\0')\r
+          s++;  /* step up to " */\r
+\r
+        if (*s++ == '\0')\r
+          continue;       /* sanity check */\r
+\r
+        while (*s != '\0')\r
+        {\r
+          if (*s == '"')\r
+          {\r
+            s++;            /* is it "" perhaps ? */\r
+\r
+            if (*s != '"')\r
+              break;   /* no, end of string */\r
+          }\r
+\r
+          *t++ = *s++;          /* copy over */\r
+        }\r
+\r
+        *t = '\0';              /* and terminate */\r
+      }\r
+\r
+      if (chrs >= 0 && chrs < MAXCHRS)\r
+        replacement[chrs] = xstrdup(charname);\r
+    }\r
+/*    presently the following can never get triggered */\r
+/*    which is good, because it is perhaps not right ... */\r
+    else if ((m = sscanf (buffer, "%d %d %d %d %d %d %d %d %d %d %d",\r
+      &chrs, charnum, charnum+1, charnum+2, charnum+3, charnum+4,\r
+        charnum+5, charnum+6, charnum+7, charnum+8, charnum+9)) > 1) {\r
+/*      for (k = 0; k < n-1; k++) charname[k] = (char) charnum; */\r
+      for (k = 0; k < n-1; k++) charname[k] = (char) charnum[k];\r
+      charname[m] = '\0';\r
+      if (chrs >= 0 && chrs < MAXCHRS)\r
+        replacement[chrs] = xstrdup(charname);      \r
+    }\r
+    else\r
+      printf("ERROR: don't understand %s", buffer);\r
+  }\r
+\r
+  if (trace_flag)\r
+  {\r
+    puts("Key replacement table");\r
+\r
+    for (k = 0; k < MAXCHRS; k++)\r
+    {\r
+      if (replacement[k] != NULL)\r
+        printf("%d\t%s\n", k, replacement[k]);\r
+    }\r
+  }\r
+}\r
+\r
+/* Following used both to read xchr[] file and key replacement file */\r
+/* the flag is 0 for -x=... and the flag is 1 for -k=... */\r
+int read_xchr_file (char *filename, int flag, char *argv[])\r
+{\r
+  FILE *xchr_input;\r
+  char infile[file_name_size];\r
+  char *s;\r
+\r
+  if (filename == NULL)\r
+    return -1;\r
+\r
+  if (trace_flag)\r
+    printf("Reading xchr/repl %s\n", filename);\r
+\r
+  /* first try using file as specified */\r
+  strcpy(infile, filename);\r
+\r
+  if (trace_flag)\r
+    printf("Trying %s\n", infile);\r
+\r
+  xchr_input = fopen (infile, "r");\r
+\r
+  if (xchr_input == NULL)\r
+  {\r
+    if (strrchr(infile, '.') == NULL)\r
+    {\r
+      if (flag == 0)\r
+        strcat(infile, ".map");\r
+      else\r
+        strcat(infile, ".key");\r
+\r
+      if (trace_flag)\r
+        printf("Trying %s\n", infile);\r
+      \r
+      xchr_input = fopen(infile, "r");\r
+    }\r
+  }\r
+\r
+  if (xchr_input == NULL)\r
+  {\r
+    strcpy(infile, argv[0]);     /* try TeX program path */\r
+\r
+    if ((s = strrchr (infile, '\\')) != NULL)\r
+      *(s+1) = '\0';\r
+    else if ((s = strrchr (infile, '/')) != NULL)\r
+      *(s+1) = '\0';\r
+    else if ((s = strrchr (infile, ':')) != NULL)\r
+      *(s+1) = '\0';\r
+\r
+    strcat (infile, filename);\r
+\r
+    if (trace_flag)\r
+      printf("Trying %s\n", infile);\r
+\r
+    xchr_input = fopen (infile, "r");\r
+\r
+    if (xchr_input == NULL)\r
+    {\r
+      if (strchr(infile, '.') == NULL)\r
+      {\r
+        if (flag == 0)\r
+          strcat(infile, ".map");\r
+        else\r
+          strcat(infile, ".key");\r
+\r
+        if (trace_flag)\r
+          printf("Trying %s\n", infile);\r
+\r
+        xchr_input = fopen (infile, "r");\r
+      }\r
+    }\r
+  }\r
+\r
+  if (xchr_input == NULL)\r
+  {\r
+    strcpy(infile, argv[0]);     /* try TeX program path */\r
+\r
+    if ((s = strrchr (infile, '\\')) != NULL)\r
+      *(s + 1) = '\0';\r
+    else if ((s = strrchr (infile, '/')) != NULL)\r
+      *(s + 1) = '\0';\r
+    else if ((s = strrchr (infile, ':')) != NULL)\r
+      *(s + 1) = '\0';\r
+\r
+    strcat(infile, "keyboard\\");\r
+    strcat(infile, filename);\r
+\r
+    if (trace_flag)\r
+      printf("Trying %s\n", infile);\r
+\r
+    xchr_input = fopen (infile, "r");\r
+\r
+    if (xchr_input == NULL)\r
+    {\r
+      if (strchr(infile, '.') == NULL)\r
+      {\r
+        if (flag == 0)\r
+          strcat(infile, ".map");\r
+        else\r
+          strcat(infile, ".key");\r
+\r
+        if (trace_flag)\r
+          printf("Trying %s\n", infile);\r
+\r
+        xchr_input = fopen (infile, "r");\r
+      }\r
+    }\r
+  }\r
+\r
+  /* Note: can't look in TeX source file dir, since that is not known yet */\r
+  if (xchr_input == NULL)\r
+  {\r
+    printf("ERROR: Sorry, cannot find %s file %s",\r
+        flag ? " xchr[]" : "key mapping", filename);\r
+    perrormod (filename);\r
+    return 0;\r
+  }\r
+\r
+  if (flag == 0)\r
+    read_xchr_sub(xchr_input);\r
+  else\r
+    read_repl_sub(xchr_input);\r
+\r
+  (void) fclose(xchr_input);\r
+\r
+  return 1;\r
+}\r
+\r
+/* need to also set `key_replace' here based on command line */\r
+/* need to also allocate `buffercopy' here and free at end */\r
+/* need to call `readreplace' in appropriate place */\r
+\r
+#define MAXSPLITS 3\r
+\r
+/* ad hoc default minimum growth in memory realloc is 62% */\r
+/* golden ratio (1 + \sqrt{5}) / 2 = 1.618033989... */\r
+int percent_grow    = 62; /* default minimum growth in memory realloc is 62% */\r
+int total_allocated = 0;  /* total memory allocated so far */\r
+int ini_max_address = 0;  /* maximum address when starting */\r
+int max_address     = 0;  /* maximum address seen in allocated memory */\r
+\r
+\r
+void show_maximums (FILE * output)\r
+{\r
+  sprintf(log_line, "Max allocated %d --- max address %d\n", total_allocated, max_address);\r
+  fputs(log_line, output);\r
+}\r
+\r
+/* our own version of realloc --- avoid supposed MicroSoft version bug */\r
+/* also tries _expand first, which can avoid address growth ... */\r
+\r
+#ifdef USEOUREALLOC \r
+void * ourrealloc (void * old, size_t new_size)\r
+{\r
+  void * mnew;\r
+  size_t old_size, overlap;\r
+  \r
+  /* round up to nearest multiple of four bytes */\r
+  /* avoid unlikely alignment */\r
+  if ((new_size % 4) != 0)\r
+    new_size = ((new_size / 4) + 1) * 4;\r
+\r
+  if (old == NULL)\r
+    return malloc (new_size);  /* no old block - use malloc */\r
+\r
+#ifdef _WIN32\r
+  old_size = _msize (old);\r
+#else\r
+  old_size = malloc_usable_size (old);\r
+#endif\r
+\r
+  if (old_size >= new_size && old_size < new_size + 4)\r
+    return old;\r
+\r
+#ifdef _WIN32\r
+  mnew = _expand (old, new_size); /* first try and expand in place MSVC */\r
+#else\r
+  mnew = realloc (old, new_size);\r
+#endif\r
+\r
+  if (mnew != NULL)\r
+  {\r
+    if (trace_flag)\r
+      printf("EXPANDED! %p (%ld) == %p (%ld)\n",\r
+          mnew, new_size, old, old_size);\r
+\r
+    return mnew;\r
+  }\r
+\r
+  /* do this if you want to call the real realloc next -  */\r
+  mnew = realloc (old, new_size);\r
+\r
+  if (mnew != NULL)\r
+    return mnew;\r
+\r
+  /*  we are screwed typically if we ever drop through here - no more space */\r
+  mnew = malloc (new_size); /* otherwise find new space */\r
+\r
+  if (mnew == NULL)\r
+    return mnew;        /* if unable to allocate */\r
+\r
+  if (old_size < new_size)\r
+    overlap = old_size;\r
+  else\r
+    overlap = new_size;\r
+\r
+  memcpy (mnew, old, overlap); /* copy old data to new area */\r
+  free(old); /* free the old area */\r
+\r
+  return mnew;\r
+}\r
+#endif\r
+\r
+void memory_error (const char * s, int n)\r
+{\r
+  if (log_opened)\r
+  {\r
+    fprintf(log_file, "\n! Unable to allocate %d bytes for %s\n", n, s);\r
+    show_maximums(log_file);\r
+  }\r
+\r
+  printf("\n! Unable to allocate %d bytes for %s\n", n, s);\r
+  show_maximums(stderr);\r
+}\r
+\r
+void trace_memory (const char * s, int n)\r
+{\r
+  printf("Allocating %d bytes for %s\n", n, s);\r
+}\r
+\r
+void update_statistics (long address, int size, int old_size)\r
+{\r
+  if (address + size > max_address)\r
+    max_address = address + size;\r
+\r
+  total_allocated =  total_allocated + size - old_size;\r
+}\r
+\r
+void probe_memory (void)\r
+{\r
+  char * s = (char *) malloc(sizeof(void *));\r
+  free(s);\r
+  update_statistics ((long) s, 0, 0);\r
+}\r
+\r
+void probe_show (void)\r
+{\r
+  probe_memory();\r
+  show_maximums(stdout);\r
+}\r
+\r
+size_t roundup (size_t n)\r
+{\r
+  if ((n % sizeof(void *)) == 0)\r
+    return n;\r
+  else\r
+    return ((n / sizeof(void *)) + 1) * sizeof(void *);\r
+}\r
+\r
+#ifdef ALLOCATETRIES\r
+/* returns -1 if it fails */\r
+\r
+int allocate_tries (int trie_max)\r
+{\r
+  int n, nl, no, nc;\r
+\r
+  if (trie_max > 1000000)\r
+    trie_max = 1000000;\r
+\r
+  nl = (trie_max + 1) * sizeof(halfword);\r
+  no = (trie_max + 1) * sizeof(halfword);\r
+  nc = (trie_max + 1) * sizeof(quarterword);\r
+  n = nl + no + nc;\r
+\r
+  if (trace_flag)\r
+    trace_memory("hyphen trie", n);\r
+\r
+  trie_trl = (halfword *) malloc(roundup(nl));\r
+  trie_tro = (halfword *) malloc(roundup(no));\r
+  trie_trc = (quarterword *) malloc(roundup(nc));\r
+\r
+  if (trie_trl == NULL || trie_tro == NULL || trie_trc == NULL)\r
+  {\r
+    memory_error("hyphen trie", n);\r
+    return -1;\r
+  }\r
+\r
+  if (trace_flag)\r
+    printf("Addresses trie_trl %p trie_tro %p trie_trc %p\n", trie_trl, trie_tro, trie_trc);\r
+\r
+  update_statistics((long) trie_trl, nl, 0);\r
+  update_statistics((long) trie_tro, no, 0);\r
+  update_statistics((long) trie_trc, nc, 0);\r
+\r
+  trie_size = trie_max;\r
+\r
+  if (trace_flag)\r
+    probe_show();\r
+\r
+  return 0; // success\r
+}\r
+#endif\r
+\r
+#ifdef ALLOCATEHYPHEN\r
+int current_prime = 0; /* remember in case reallocated later */\r
+\r
+/* we don't return an address here, since TWO memory regions allocated */\r
+/* plus, we don't really reallocate, we FLUSH the old information totally */\r
+/* returns -1 if it fails */\r
+\r
+int realloc_hyphen (int hyphen_prime)\r
+{\r
+  int n, nw, nl;\r
+\r
+  if (!prime(hyphen_prime))\r
+  {\r
+    printf("ERROR: non-prime hyphen exception number (%d)\n", hyphen_prime);\r
+    return -1;\r
+  }\r
+\r
+/*  need not/cannot preserve old contents when hyphen prime is changed */\r
+/*  if (hyph_list != NULL) free(hyph_list); */\r
+/*  if (hyph_word != NULL) free(hyph_word); */\r
+  nw = (hyphen_prime + 1) * sizeof(str_number);\r
+  nl = (hyphen_prime + 1) * sizeof(halfword);\r
+  n = nw + nl;\r
+\r
+  if (trace_flag)\r
+    trace_memory("hyphen exception", n);\r
+\r
+  hyph_word = (str_number *) REALLOC (hyph_word, nw);\r
+  hyph_list = (halfword *) REALLOC (hyph_list, nl);\r
+\r
+  if (hyph_word == NULL || hyph_list == NULL)\r
+  {\r
+    memory_error("hyphen exception", n);\r
+    return -1;\r
+  }\r
+\r
+  if (trace_flag)\r
+    printf("Addresses hyph_word %p hyph_list %p\n", hyph_word, hyph_list);\r
+\r
+/*  cannot preserve old contents when hyphen prime is changed */\r
+#ifdef USEMEMSET\r
+  memset(hyph_word, 0, (hyphen_prime + 1) * sizeof (hyph_word[0]));\r
+#else\r
+  for (k = 0; k <= hyphen_prime; k++)\r
+    hyph_word[k]= 0;\r
+#endif\r
+\r
+#ifdef USEMEMSET\r
+  memset(hyph_list, 0, (hyphen_prime + 1) * sizeof (hyph_list[0]));\r
+#else\r
+  for (k = 0; k <= hyphen_prime; k++)\r
+    hyph_list[k]= 0;\r
+#endif\r
+\r
+  hyph_count = 0;\r
+\r
+  if (current_prime != 0)\r
+  {\r
+    update_statistics((long) hyph_word, nw, (current_prime + 1) * sizeof(str_number));\r
+    update_statistics((long) hyph_list, nl, (current_prime + 1) * sizeof(halfword));\r
+  }\r
+  else\r
+  {\r
+    update_statistics((long) hyph_word, nw, 0);\r
+    update_statistics((long) hyph_list, nl, 0);\r
+  }\r
+\r
+  current_prime = hyphen_prime;\r
+\r
+  if (trace_flag)\r
+    probe_show();\r
+\r
+  return 0; // success\r
+}\r
+#endif\r
+\r
+int current_mem_size = 0;   /* current total words in main mem allocated -1 */\r
+\r
+/* this gets called from itex.c when it figures out what mem_top is */\r
+/* or gets called from here when in ini_TeX mode */ /* and nowhere else */\r
+/* initial allocation only, may get expanded later */\r
+/* NOTE: we DON't use ALLOCATEHIGH & ALLOCATELOW anymore */\r
+/* returns NULL if it fails */\r
+\r
+#ifdef ALLOCATEMAIN   \r
+/* initial main memory alloc - mem_top */\r
+memory_word * allocate_main_memory (int size)\r
+{\r
+  int n;\r
+\r
+  if (main_memory != NULL)\r
+  {\r
+    if (trace_flag)\r
+      puts("Reallocating initial memory allocation");\r
+  }\r
+\r
+  mem_top = mem_bot + size;\r
+  mem_max = mem_top;\r
+  mem_start = 0;     /* bottom of memory allocated by system */\r
+  mem_min = 0;       /* bottom of area made available to TeX */\r
+  n = (mem_max - mem_start + 1) * sizeof (memory_word);\r
+\r
+  if (trace_flag)\r
+    trace_memory("main memory", n);\r
+\r
+  main_memory = (memory_word *) REALLOC (main_memory, n);\r
+\r
+  if (main_memory == NULL)\r
+  {\r
+    memory_error("initial main memory", n);\r
+    return NULL;\r
+  }\r
+\r
+  if (trace_flag)\r
+    printf("Address main memory == %p\n", main_memory);\r
+\r
+  mem = main_memory;\r
+\r
+  if (mem_start != 0 && !is_initex)\r
+    mem = main_memory - mem_start;\r
+\r
+  if (trace_flag)\r
+    printf("Offset address main memory == %p\n", mem);\r
+\r
+  update_statistics((long) main_memory, n, (current_mem_size + 1) * sizeof (memory_word));\r
+/*  current_mem_size = (mem_max - mem_start + 1); */\r
+  current_mem_size = mem_max - mem_start;   /* total number of words - 1 */\r
+\r
+  if (trace_flag)\r
+    probe_show();\r
+\r
+  return mem;\r
+}\r
+#endif\r
+\r
+#ifdef ALLOCATEMAIN\r
+/* int firstallocation = 1; */\r
+\r
+/* increase main memory allocation at low end and high end */\r
+/* called only from tex0.c *//* called with one of lo_size or hi_size == 0 */\r
+/* returns NULL if it fails */\r
+\r
+memory_word * realloc_main (int lo_size, int hi_size)\r
+{  \r
+  int k, min_size;\r
+  int new_size = 0;\r
+  int n = 0;\r
+  memory_word * new_memory = NULL;\r
+\r
+  if (trace_flag)\r
+    printf("WARNING: Entering realloc_main lo %d hi %d\n", lo_size, hi_size);\r
+\r
+  if (is_initex)\r
+  {\r
+    puts("ERROR: Cannot extent main memory in initex");\r
+\r
+    if (!knuth_flag)\r
+      puts("Please use `-m=...' on command line");\r
+\r
+    return NULL;\r
+  }\r
+\r
+  if (trace_flag)\r
+    printf("Old Address %s == %p\n", "main memory", main_memory);\r
+\r
+  /* if we REALLY run up to limit ! */\r
+  if (current_mem_size + 1 == max_mem_size)\r
+  {\r
+    memory_error("main memory", (max_mem_size + 1) * sizeof(memory_word));\r
+    return NULL;\r
+  }\r
+\r
+/*  first allocation should expand *both* lo and hi */\r
+  if (hi_size == 0 && mem_end == mem_max)\r
+    hi_size = lo_size;\r
+\r
+  if (lo_size == 0 && mem_start == mem_min)\r
+    lo_size = hi_size;\r
+\r
+/*  try and prevent excessive frequent reallocations */\r
+/*  while avoiding over allocation by too much */\r
+  min_size = current_mem_size / 100 * percent_grow;\r
+\r
+  if (lo_size + hi_size < min_size)\r
+  {\r
+    if (lo_size > 0 && hi_size > 0)\r
+    {\r
+      lo_size = min_size / 2;\r
+      hi_size = min_size / 2;\r
+    }\r
+    else if (lo_size > 0)\r
+      lo_size = min_size;\r
+    else if (hi_size > 0)\r
+      hi_size = min_size;\r
+  }\r
+\r
+  if (lo_size > 0 && lo_size < mem_top / 2)\r
+    lo_size = mem_top / 2;\r
+\r
+  if (hi_size > 0 && hi_size < mem_top / 2)\r
+    hi_size = mem_top / 2;\r
+\r
+  for (k = 0; k < MAXSPLITS; k++)\r
+  {\r
+    new_size = current_mem_size + lo_size + hi_size;\r
+\r
+    if (new_size >= max_mem_size) /* bump against limit - ha ha ha */\r
+    {\r
+      while (new_size >= max_mem_size)\r
+      {\r
+        lo_size = lo_size / 2;\r
+        hi_size = hi_size / 2;\r
+        new_size = current_mem_size + lo_size + hi_size;\r
+      }\r
+    }\r
+\r
+    n = (new_size + 1) * sizeof (memory_word);\r
+\r
+    if (trace_flag)\r
+      trace_memory("main memory", n);\r
+\r
+    new_memory = (memory_word *) REALLOC (main_memory, n);\r
+\r
+    if (new_memory != NULL)\r
+      break; /* did we get it ? */\r
+\r
+    if (current_mem_size == 0)\r
+      break; /* in case we ever use for initial */\r
+\r
+    lo_size = lo_size / 2; hi_size = hi_size / 2;\r
+  }\r
+\r
+  if (new_memory == NULL)\r
+  {\r
+    memory_error("main memory", n);\r
+    return mem;\r
+  }\r
+\r
+  if (trace_flag)\r
+    printf("New Address %s == %p\n", "main memory", new_memory);\r
+\r
+  if (lo_size > 0)\r
+  {\r
+/*  shift everything upward to make space for new low area */\r
+    if (trace_flag)\r
+      printf("memmove %p %p %ld \n", new_memory + lo_size,\r
+          new_memory, (current_mem_size + 1) * sizeof(memory_word));\r
+\r
+    memmove (new_memory + lo_size, new_memory,\r
+      (current_mem_size + 1) * sizeof(memory_word));\r
+/*  could reduce words moved by (mem_max - mem_end) */\r
+  }\r
+\r
+  main_memory = new_memory;       /* remember for free later */\r
+\r
+  if (lo_size > 0)\r
+    mem_start = mem_start - lo_size; /* update lower limit */\r
+\r
+  if (hi_size > 0)\r
+    mem_max = mem_max + hi_size;   /* update upper limit */\r
+\r
+  update_statistics ((long) main_memory, n,\r
+    (current_mem_size + 1) * sizeof (memory_word));\r
+  current_mem_size = new_size;\r
+\r
+  if (current_mem_size != mem_max - mem_start)\r
+    puts("ERROR: Impossible Memory Error");\r
+\r
+  if (mem_start != 0)\r
+    mem = main_memory - mem_start;\r
+  else\r
+    mem = main_memory;\r
+\r
+  if (trace_flag)\r
+    probe_show();\r
+\r
+  return mem;\r
+}\r
+#endif\r
+\r
+#ifdef ALLOCATEFONT\r
+int current_font_mem_size = 0;\r
+\r
+memory_word * realloc_font_info (int size)\r
+{\r
+  memory_word * new_font_info = NULL;\r
+  int k, min_size;\r
+  int new_size = 0;\r
+  int n = 0;\r
+\r
+  if (trace_flag)\r
+    printf("Old Address %s == %p\n", "font_info", font_info);\r
+\r
+  /* during initial allocation, font_info == NULL - realloc acts like malloc */\r
+  /* during initial allocation current_font_mem_size == 0 */\r
+  if (current_font_mem_size == font_mem_size)  /* if we REALLY run up to limit */\r
+  {\r
+    /* memory_error("font", (font_mem_size + 1) * sizeof(memory_word)); */\r
+    return font_info;    /* pass it back to TeX 99/Fabe/4 */\r
+  }\r
+  /* try and prevent excessive frequent reallocations */\r
+  /* while avoiding over allocation by too much */\r
+  /* min_size = current_font_mem_size / 2; */\r
+  min_size = current_font_mem_size / 100 * percent_grow;\r
+\r
+  if (size < min_size)\r
+    size = min_size;\r
+\r
+  if (size < initial_font_mem_size)\r
+    size = initial_font_mem_size;\r
+\r
+  for (k=0; k < MAXSPLITS; k++)\r
+  {\r
+    new_size = current_font_mem_size + size;\r
+\r
+    if (new_size > font_mem_size)\r
+      new_size = font_mem_size; /* bump against limit */\r
+\r
+/*    important + 1 since fmemoryword font_info[font_mem_size + 1]  original */\r
+    n = (new_size + 1) * sizeof (memory_word);\r
+\r
+    if (trace_flag)\r
+      trace_memory("font_info", n);\r
+\r
+    new_font_info = (memory_word *) REALLOC (font_info, n);\r
+\r
+    if (new_font_info != NULL)\r
+      break;   /* did we get it ? */\r
+\r
+    if (current_font_mem_size == 0)\r
+      break; /* initial allocation must work */\r
+\r
+    size = size / 2;\r
+  }\r
+\r
+  if (new_font_info == NULL)\r
+  {\r
+    memory_error("font", n);\r
+    return font_info;        /* try and continue !!! */\r
+  }\r
+\r
+  font_info = new_font_info;\r
+\r
+  if (trace_flag)\r
+    printf("New Address %s == %p\n", "font_info", font_info);\r
+\r
+  update_statistics ((long) font_info, n, current_font_mem_size * sizeof(memory_word));\r
+  current_font_mem_size = new_size;\r
+\r
+  if (trace_flag)\r
+    probe_show();\r
+\r
+  return font_info;\r
+}\r
+#endif\r
+\r
+#ifdef ALLOCATESTRING\r
+int current_pool_size = 0;\r
+\r
+packed_ASCII_code * realloc_str_pool (int size)\r
+{\r
+  int k, min_size;\r
+  int new_size = 0;\r
+  int n = 0;\r
+  packed_ASCII_code * new_str_pool = NULL;\r
+\r
+  if (trace_flag)\r
+    printf("Old Address %s == %p\n", "string pool", str_pool);\r
+\r
+  if (current_pool_size == pool_size)\r
+  {\r
+/*    memory_error ("string pool", (pool_size + 1) * sizeof(packed_ASCII_code)); */\r
+/*    exit (1); */\r
+    return str_pool;   /* pass it back to TeX 99/Fabe/4 */\r
+  }\r
+\r
+  min_size =  current_pool_size / 100 * percent_grow;\r
+\r
+  if (size < min_size)\r
+    size = min_size;\r
+\r
+  if (size < initial_pool_size)\r
+    size = initial_pool_size;\r
+\r
+  for (k = 0; k < MAXSPLITS; k++)\r
+  {\r
+    new_size = current_pool_size + size;\r
+\r
+    if (new_size > pool_size)\r
+      new_size = pool_size;\r
+/* important + 1 since  packed_ASCII_code str_pool[pool_size + 1]; in original */\r
+    n = (new_size + 1) * sizeof (packed_ASCII_code);\r
+\r
+    if (trace_flag)\r
+      trace_memory("str_pool", n);\r
+\r
+    new_str_pool = (packed_ASCII_code *) REALLOC (str_pool, n); /* 95/Sep/24 */\r
+\r
+    if (new_str_pool != NULL)\r
+      break;    /* did we get it ? */\r
+\r
+    if (current_pool_size == 0)\r
+      break;  /* initial allocation must work */\r
+\r
+    size = size / 2;          /* else can retry smaller */\r
+  }\r
+\r
+  if (new_str_pool == NULL)\r
+  {\r
+    memory_error("string pool", n);\r
+    return str_pool;           /* try and continue !!! */\r
+  }\r
+\r
+  str_pool = new_str_pool;\r
+  update_statistics ((long) str_pool, n, current_pool_size);\r
+  current_pool_size = new_size;\r
+\r
+  if (trace_flag)\r
+    printf("New Address %s == %p\n", "string pool", str_pool);\r
+  \r
+  if (trace_flag)\r
+    probe_show();\r
+\r
+  return str_pool;\r
+}\r
+#endif\r
+\r
+#ifdef ALLOCATESTRING\r
+int current_max_strings = 0;\r
+\r
+pool_pointer * realloc_str_start (int size)\r
+{\r
+  int k, min_size;\r
+  int n = 0;\r
+  int new_size = 0;\r
+  pool_pointer * new_str_start = NULL;\r
+\r
+  if (trace_flag)\r
+    printf("Old Address %s == %p\n", "string start", str_start);\r
+\r
+  if (current_max_strings == max_strings)\r
+  {\r
+/*    memory_error ("string pointer", (max_strings + 1) * sizeof(pool_pointer)); */\r
+/*    exit (1); */\r
+    return str_start;    /* pass it back to TeX 99/Fabe/4 */\r
+  }\r
+\r
+  min_size = current_max_strings / 100 * percent_grow;\r
+\r
+  if (size < min_size)\r
+    size = min_size;\r
+\r
+  if (size < initial_max_strings)\r
+    size = initial_max_strings;\r
+\r
+  for (k = 0; k < MAXSPLITS; k++)\r
+  {\r
+    new_size = current_max_strings + size;\r
+\r
+    if (new_size > max_strings)\r
+      new_size = max_strings;\r
+/*    important + 1 since str_start[maxstring + 1] originally */\r
+    n = (new_size + 1) * sizeof (pool_pointer);\r
+\r
+    if (trace_flag)\r
+      trace_memory("str_start", n);\r
+\r
+    new_str_start = (pool_pointer *) REALLOC (str_start, n);\r
+\r
+    if (new_str_start != NULL)\r
+      break;   /* did we get it ? */\r
+\r
+    if (current_max_strings == 0)\r
+      break;  /* initial allocation must work */\r
+\r
+    size = size / 2;          /* otherwise can try smaller */\r
+  }\r
+\r
+  if (new_str_start == NULL)\r
+  {\r
+    memory_error("string pointer", n);\r
+    return str_start;          /* try and continue */\r
+  }\r
+\r
+  str_start = new_str_start;\r
+  update_statistics((long) str_start, n, current_max_strings * sizeof (pool_pointer));\r
+  current_max_strings = new_size;\r
+\r
+  if (trace_flag)\r
+    printf("New Address %s == %p\n", "string start", str_start);\r
+\r
+  if (trace_flag)\r
+    probe_show();\r
+\r
+  return str_start;\r
+}\r
+#endif\r
+\r
+#ifdef ALLOCATEINI\r
+/* returns -1 if it fails */\r
+/* size == trie_size */\r
+int allocate_ini (int size)\r
+{\r
+  int n, nl, no, nc, nr, nh, nt;\r
+\r
+  nh = (size + 1) * sizeof(trie_pointer);\r
+  nr = (size + 1) * sizeof(trie_pointer);\r
+  nl = (size + 1) * sizeof(trie_pointer);\r
+  no = (size + 1) * sizeof(trie_op_code);\r
+  nc = (size + 1) * sizeof(packed_ASCII_code);\r
+  nt = (size + 1) * sizeof(char);\r
+  n = nl + no + nc + nr + nh + nt;\r
+\r
+  if (trace_flag)\r
+    trace_memory ("initex hyphen trie", n);\r
+\r
+  trie_l = (trie_pointer *) malloc (roundup(nl));\r
+  trie_o = (trie_op_code *) malloc (roundup(no));\r
+  trie_c = (packed_ASCII_code *) malloc (roundup(nc));\r
+  trie_r = (trie_pointer *) malloc (roundup(nr));\r
+  trie_hash = (trie_pointer *) malloc (roundup(nh));\r
+  trie_taken = (char *) malloc (roundup(nt));\r
+  \r
+  if (trie_c == NULL || trie_o == NULL || trie_l == NULL || trie_r == NULL ||\r
+      trie_hash == NULL || trie_taken == NULL)\r
+  {\r
+    memory_error("initex hyphen trie", n);\r
+    return -1;\r
+  }\r
+  \r
+  if (trace_flag)\r
+  {\r
+    printf("Addresses: trie_l %p trie_o %p trie_c %p\n", trie_l, trie_o, trie_c);\r
+    printf("Addresses: trie_r %p trie_hash %p trie_taken %p\n", trie_r, trie_hash, trie_taken);\r
+  }\r
+\r
+  update_statistics ((long) trie_l, nl, 0);\r
+  update_statistics ((long) trie_o, no, 0);\r
+  update_statistics ((long) trie_c, nc, 0);\r
+  update_statistics ((long) trie_r, nr, 0);\r
+  update_statistics ((long) trie_hash, nh, 0);\r
+  update_statistics ((long) trie_taken, nt, 0);\r
+\r
+  if (trace_flag)\r
+    probe_show();\r
+\r
+  return 0; // success\r
+}\r
+#endif\r
+\r
+#ifdef ALLOCATESAVESTACK\r
+int current_save_size = 0;\r
+\r
+memory_word * realloc_save_stack (int size)\r
+{\r
+  int k, min_size;\r
+  int n = 0, new_size = 0;\r
+  memory_word * new_save_stack = NULL;\r
+\r
+  if (trace_flag)\r
+    printf("Old Address %s == %p\n", "save stack", save_stack);\r
+\r
+  if (current_save_size == save_size)\r
+  {\r
+    return save_stack; /* let TeX handle the error */\r
+  }\r
+\r
+  min_size =  current_save_size / 100 * percent_grow;\r
+\r
+  if (size < min_size)\r
+    size = min_size;\r
+\r
+  if (size < initial_save_size)\r
+    size = initial_save_size;\r
+\r
+  for (k = 0; k < MAXSPLITS; k++)\r
+  {\r
+    new_size = current_save_size + size;\r
+\r
+    if (new_size > save_size)\r
+      new_size = save_size;\r
+\r
+    n = (new_size + 1) * sizeof (memory_word);\r
+\r
+    if (trace_flag)\r
+      trace_memory("save_stack", n);\r
+\r
+    new_save_stack = (memory_word *) REALLOC (save_stack, n);\r
+\r
+    if (new_save_stack != NULL)\r
+      break;    /* did we get it ? */\r
+\r
+    if (current_save_size == 0)\r
+      break;  /* initial allocation must work */\r
+\r
+    size = size / 2;          /* else can retry smaller */\r
+  }\r
+\r
+  if (new_save_stack == NULL)\r
+  {\r
+    memory_error("save_stack", n);\r
+    return save_stack;           /* try and continue !!! */\r
+  }\r
+\r
+  save_stack = new_save_stack;\r
+  update_statistics ((long) save_stack, n, current_save_size);\r
+  current_save_size = new_size;\r
+\r
+  if (trace_flag)\r
+  {\r
+    printf("Current %s %d\n", "save_size", current_save_size);\r
+    printf("New Address %s == %p\n", "save stack", save_stack);\r
+  }\r
+\r
+  if (trace_flag)\r
+    probe_show();\r
+\r
+  return save_stack;\r
+}\r
+#endif\r
+\r
+#ifdef ALLOCATEINPUTSTACK\r
+int current_stack_size = 0;       /* input stack size */\r
+\r
+in_state_record * realloc_input_stack (int size)\r
+{\r
+  int k, min_size;\r
+  int n = 0, new_size = 0;\r
+  in_state_record * new_input_stack = NULL;\r
+\r
+  if (trace_flag)\r
+    printf("Old Address %s == %p\n", "input stack", input_stack);\r
+\r
+  if (current_stack_size == stack_size)\r
+  {\r
+    return input_stack;\r
+  }\r
+\r
+  min_size =  current_stack_size / 100 * percent_grow;\r
+\r
+  if (size < min_size)\r
+    size = min_size;\r
+\r
+  if (size < initial_stack_size)\r
+    size = initial_stack_size;\r
+\r
+  for (k = 0; k < MAXSPLITS; k++)\r
+  {\r
+    new_size = current_stack_size + size;\r
+\r
+    if (new_size > stack_size)\r
+      new_size = stack_size;\r
+\r
+    n = (new_size + 1) * sizeof(in_state_record);\r
+\r
+    if (trace_flag)\r
+      trace_memory("input_stack", n);\r
+\r
+    new_input_stack = (in_state_record *) REALLOC (input_stack, n);\r
+\r
+    if (new_input_stack != NULL)\r
+      break;   /* did we get it ? */\r
+\r
+    if (current_stack_size == 0)\r
+      break; /* initial allocation must work */\r
+\r
+    size = size / 2;          /* else can retry smaller */\r
+  }\r
+\r
+  if (new_input_stack == NULL)\r
+  {\r
+    memory_error("input stack", n);\r
+    return input_stack;            /* try and continue !!! */\r
+  }\r
+\r
+  input_stack = new_input_stack;\r
+  update_statistics ((long) input_stack, n, current_stack_size);\r
+  current_stack_size = new_size;\r
+\r
+  if (trace_flag)\r
+  {\r
+    printf("Current %s %d\n", "stack_size", current_stack_size);\r
+    printf("New Address %s == %p\n", "input stack", input_stack);\r
+  }\r
+\r
+  if (trace_flag)\r
+    probe_show();\r
+\r
+  return input_stack;\r
+}\r
+#endif\r
+\r
+#ifdef ALLOCATENESTSTACK\r
+int current_nest_size = 0;        /* current nest size */\r
+\r
+list_state_record * realloc_nest_stack (int size)\r
+{\r
+  int k, min_size;\r
+  int n = 0, new_size = 0;\r
+  list_state_record * new_nest = NULL;\r
+\r
+  if (trace_flag)\r
+    printf("Old Address %s == %p\n", "nest stack", nest);\r
+\r
+  if (current_nest_size == nest_size)\r
+  {\r
+    return nest;\r
+  }\r
+\r
+  min_size =  current_nest_size / 100 * percent_grow;\r
+\r
+  if (size < min_size)\r
+    size = min_size;\r
+\r
+  if (size < initial_nest_size)\r
+    size = initial_nest_size;\r
+\r
+  for (k = 0; k < MAXSPLITS; k++)\r
+  {\r
+    new_size = current_nest_size + size;\r
+\r
+    if (new_size > nest_size)\r
+      new_size = nest_size;\r
+\r
+    n = (new_size + 1) * sizeof (list_state_record);\r
+\r
+    if (trace_flag)\r
+      trace_memory("nest stack", n);\r
+\r
+    new_nest = (list_state_record *) REALLOC (nest, n);\r
+\r
+    if (new_nest != NULL)\r
+      break;   /* did we get it ? */\r
+\r
+    if (current_nest_size == 0)\r
+      break;  /* initial allocation must work */\r
+\r
+    size = size / 2;          /* else can retry smaller */\r
+  }\r
+\r
+  if (new_nest == NULL)\r
+  {\r
+    memory_error("nest stack", n);\r
+    return nest;            /* try and continue !!! */\r
+  }\r
+\r
+  nest = new_nest;\r
+  update_statistics ((long) nest, n, current_nest_size);\r
+  current_nest_size = new_size;\r
+\r
+  if (trace_flag)\r
+  {\r
+    printf("Current %s %d\n", "nest_size", current_nest_size);\r
+    printf("New Address %s == %p\n", "nest stack", nest);\r
+  }\r
+\r
+  if (trace_flag)\r
+    probe_show();\r
+\r
+  return nest;\r
+}\r
+#endif\r
+\r
+#ifdef ALLOCATEPARAMSTACK\r
+int current_param_size = 0;\r
+\r
+halfword *realloc_param_stack (int size)\r
+{\r
+  int k, min_size;\r
+  int n = 0, new_size = 0;\r
+  halfword * new_param = NULL;\r
+\r
+  if (trace_flag)\r
+    printf("Old Address %s == %p\n", "param stack", param_stack);\r
+\r
+  if (current_param_size == param_size)\r
+  {\r
+    return param_stack;\r
+  }\r
+\r
+  min_size =  current_param_size / 100 * percent_grow;\r
+\r
+  if (size < min_size)\r
+    size = min_size;\r
+\r
+  if (size < initial_param_size)\r
+    size = initial_param_size;\r
+\r
+  for (k = 0; k < MAXSPLITS; k++)\r
+  {\r
+    new_size = current_param_size + size;\r
+\r
+    if (new_size > param_size)\r
+      new_size = param_size;\r
+\r
+    n = (new_size + 1) * sizeof(pointer);\r
+\r
+    if (trace_flag)\r
+      trace_memory("param stack", n);\r
+\r
+    new_param = (pointer *) REALLOC (param_stack, n);\r
+\r
+    if (new_param != NULL)\r
+      break;    /* did we get it ? */\r
+\r
+    if (current_param_size == 0)\r
+      break; /* initial allocation must work */\r
+\r
+    size = size / 2; /* else can retry smaller */\r
+  }\r
+\r
+  if (new_param == NULL)\r
+  {\r
+    memory_error("param stack", n);\r
+    return param_stack;            /* try and continue !!! */\r
+  }\r
+\r
+  param_stack = new_param;\r
+  update_statistics((long) param_stack, n, current_param_size);\r
+  current_param_size = new_size;\r
+\r
+  if (trace_flag)\r
+  {\r
+    printf("Current %s %d\n", "param_size", current_param_size);\r
+    printf("New Address %s == %p\n", "param stack", param_stack);\r
+  }\r
+\r
+  if (trace_flag)\r
+    probe_show();\r
+\r
+  return param_stack;\r
+}\r
+#endif\r
+\r
+#ifdef ALLOCATEBUFFER\r
+int current_buf_size = 0;\r
+\r
+ASCII_code * realloc_buffer (int size)\r
+{\r
+  int k, min_size;\r
+  int n = 0, new_size = 0;\r
+  ASCII_code * new_buffer = NULL;\r
+\r
+  if (trace_flag)\r
+    printf("Old Address %s == %p\n", "buffer", buffer);\r
+\r
+  if (current_buf_size == buf_size)\r
+  {\r
+    return buffer;\r
+  }\r
+\r
+  min_size =  current_buf_size / 100 * percent_grow;\r
+\r
+  if (size < min_size)\r
+    size = min_size;\r
+\r
+  if (size < initial_buf_size)\r
+    size = initial_buf_size;\r
+\r
+  for (k = 0; k < MAXSPLITS; k++)\r
+  {\r
+    new_size = current_buf_size + size;\r
+\r
+    if (new_size > buf_size)\r
+      new_size = buf_size;\r
+\r
+    n = (new_size + 1) * sizeof(ASCII_code);\r
+\r
+    if (trace_flag)\r
+      trace_memory("buffer", n);\r
+\r
+    new_buffer = (ASCII_code *) REALLOC (buffer, n);\r
+\r
+    if (new_buffer != NULL)\r
+      break;   /* did we get it ? */\r
+\r
+    if (current_buf_size == 0)\r
+      break;   /* initial allocation must work */\r
+\r
+    size = size / 2;\r
+  }\r
+\r
+  if (new_buffer == NULL)\r
+  {\r
+    memory_error("buffer", n);\r
+    return buffer;            /* try and continue !!! */\r
+  }\r
+\r
+  buffer = new_buffer;\r
+  update_statistics ((long) buffer, n, current_buf_size);\r
+\r
+#ifdef USEMEMSET\r
+  memset(buffer + current_buf_size, 0, new_size - current_buf_size);\r
+#else\r
+  for (k = current_buf_size; k < new_size; k++)\r
+    buffer[k] = 0;\r
+#endif\r
+\r
+  current_buf_size = new_size;\r
+\r
+  if (trace_flag)\r
+  {\r
+    printf("Current %s %d\n", "buffer", current_buf_size);\r
+    printf("New Address %s == %p\n", "buffer", buffer);\r
+  }\r
+\r
+  if (trace_flag)\r
+    probe_show();\r
+\r
+  return buffer;\r
+}\r
+#endif\r
+\r
+/* here is the main memory allocation routine -- calls the above */\r
+/* returns -1 if it fails */\r
+/* allocate rather than static 93/Nov/26 */\r
+int allocate_memory (void)\r
+{\r
+#ifdef ALLOCATEINPUTSTACK\r
+  input_stack = NULL;\r
+  current_stack_size = 0;\r
+  input_stack = realloc_input_stack(initial_stack_size);\r
+#endif\r
+\r
+#ifdef ALLOCATENESTSTACK\r
+  nest = NULL;\r
+  current_nest_size = 0;\r
+  nest = realloc_nest_stack(initial_nest_size);\r
+#endif\r
+\r
+#ifdef ALLOCATEPARAMSTACK\r
+  param_stack = NULL;\r
+  current_param_size = 0;\r
+  param_stack = realloc_param_stack(initial_param_size);\r
+#endif\r
+\r
+#ifdef ALLOCATESAVESTACK\r
+  save_stack = NULL;\r
+  current_save_size = 0;\r
+  save_stack = realloc_save_stack (initial_save_size);\r
+#endif\r
+\r
+#ifdef IGNORED\r
+  buffer = NULL;        /* need to do earlier */\r
+  current_buf_size = 0;\r
+  buffer = realloc_buffer (initial_buf_size);\r
+#endif\r
+\r
+#ifdef ALLOCATESTRING\r
+  str_pool = NULL;\r
+  current_pool_size = 0;\r
+  str_start = NULL;\r
+  current_max_strings = 0;\r
+\r
+/*  maybe taylor allocations to actual pool file 1300 strings 27000 bytes ? */\r
+  if (is_initex)\r
+  {\r
+    if (trace_flag)\r
+      puts("ini TeX pool and string allocation");\r
+\r
+    str_pool = realloc_str_pool(initial_pool_size);\r
+    str_start = realloc_str_start(initial_max_strings);\r
+  }\r
+#endif\r
+\r
+/* the following can save a lot of the usual 800k fixed allocation */\r
+#ifdef ALLOCATEFONT\r
+  font_info = NULL;\r
+  current_font_mem_size = 0;\r
+/* if not iniTeX, then do initial allocation on fmt file read in itex.c */\r
+/* if ini-TeX we need to do it here - no format file read later */\r
+  if (is_initex)\r
+    font_info = realloc_font_info(initial_font_mem_size);\r
+#endif\r
+\r
+#ifdef ALLOCATEMAIN\r
+  main_memory = NULL;\r
+  mem = NULL;\r
+  mem_min = mem_bot;        /* just to avoid complaints in texbody */\r
+  mem_top = mem_initex;\r
+  mem_max = mem_top;\r
+/* allocate main memory here if this is iniTeX */\r
+/* otherwise wait for format undumping in itex.c ... */\r
+  if (is_initex)\r
+  {\r
+    /* avoid this if format specified on command line ??? */\r
+    mem = allocate_main_memory(mem_initex); /* made variable ! */\r
+\r
+    if (mem == NULL)\r
+      return -1;\r
+  }\r
+#endif\r
+\r
+/* now for the hyphenation exception stuff */\r
+#ifdef ALLOCATEHYPHEN\r
+  hyph_word = NULL;\r
+  hyph_list = NULL;\r
+/* this will be overridden later by what is in format file */\r
+  hyphen_prime = default_hyphen_prime;\r
+/* non ini-TeX use assumes format will be read and that specifies size */\r
+  if (is_initex)\r
+  {\r
+    if (new_hyphen_prime)\r
+      hyphen_prime = new_hyphen_prime;\r
+\r
+    if (realloc_hyphen(hyphen_prime)) /* allocate just in case no format */\r
+      return -1;\r
+  }\r
+#endif\r
+\r
+/* now for memory for the part of the hyphenation stuff that always needed */\r
+/* if iniTeX, need to allocate pre-determined fixed amount - trie_size */\r
+/* if iniTeX not selected, allocate only enough later - undump in itex.c ! */\r
+#ifdef ALLOCATETRIES\r
+  if (is_initex)\r
+  {\r
+    if (allocate_tries (trie_size))\r
+      return -1;\r
+  }\r
+#endif\r
+\r
+/* now for memory for hyphenation stuff needed only when running iniTeX */\r
+#ifdef ALLOCATEINI\r
+  if (is_initex)\r
+  {\r
+    if (allocate_ini(trie_size))\r
+      return -1;\r
+  }\r
+  else\r
+  {\r
+    trie_l = NULL;\r
+    trie_r = NULL;\r
+    trie_o = NULL;\r
+    trie_hash = NULL;\r
+    trie_c = NULL;\r
+    trie_taken = NULL;\r
+  }\r
+#endif\r
+\r
+  return 0; // success\r
+}\r
+\r
+/* returns non-zero if error - done to test integrity of stack mostly */\r
+int free_memory (void)\r
+{\r
+  unsigned int heap_total = 0;\r
+\r
+  if (trace_flag)\r
+    puts("free_memory ");\r
+\r
+  if (verbose_flag || trace_flag)\r
+    show_maximums(stdout); \r
+\r
+  if (trace_flag)\r
+  {\r
+    printf("Heap total: %u bytes --- max address %u\n", \r
+        heap_total, max_address);\r
+    printf("Main Memory: variable node %lld (%lld - %d);\n"\r
+      "             one word %d (%d - %d)\n",\r
+      lo_mem_max - mem_min, mem_min, lo_mem_max,\r
+      mem_end - hi_mem_min, hi_mem_min, mem_end);\r
+    puts("Freeing memory again");\r
+  }\r
+\r
+/* only free memory if safe ... additional check */\r
+#ifdef ALLOCATEINI\r
+  if (is_initex)\r
+  {\r
+    if (trie_taken != NULL)\r
+      free(trie_taken);\r
+\r
+    if (trie_hash != NULL)\r
+      free(trie_hash);\r
+\r
+    if (trie_r != NULL)\r
+      free(trie_r);\r
+\r
+    if (trie_c != NULL)\r
+      free(trie_c);\r
+\r
+    if (trie_o != NULL)\r
+      free(trie_o);\r
+\r
+    if (trie_l != NULL)\r
+      free(trie_l);\r
+\r
+    trie_taken = NULL;\r
+    trie_hash = NULL;\r
+    trie_l = NULL;\r
+    trie_r = NULL;\r
+    trie_c = NULL;\r
+    trie_o = NULL;\r
+  }\r
+#endif\r
+\r
+#ifdef ALLOCATETRIES\r
+  if (trie_trc != NULL)\r
+    free(trie_trc);\r
+\r
+  if (trie_tro != NULL)\r
+    free(trie_tro);\r
+\r
+  if (trie_trl != NULL)\r
+    free(trie_trl);\r
+\r
+  trie_trc = NULL;\r
+  trie_tro = NULL;\r
+  trie_trl = NULL;\r
+#endif\r
+\r
+#ifdef ALLOCATEHYPHEN\r
+  if (hyph_list != NULL)\r
+    free(hyph_list);\r
+\r
+  if (hyph_word != NULL)\r
+    free(hyph_word);\r
+\r
+  hyph_list = NULL;\r
+  hyph_word = NULL;\r
+#endif\r
+\r
+#ifdef ALLOCATEMAIN\r
+  if (main_memory != NULL)\r
+    free(main_memory);\r
+\r
+  main_memory = NULL;\r
+#endif\r
+\r
+#ifdef ALLOCATEFONT\r
+  if (font_info != NULL)\r
+    free(font_info);\r
+\r
+  font_info = NULL;\r
+#endif\r
+\r
+#ifdef ALLOCATESTRING\r
+  if (str_start != NULL)\r
+    free(str_start);\r
+\r
+  if (str_pool != NULL)\r
+    free(str_pool);\r
+\r
+  str_start = NULL;\r
+  str_pool = NULL;\r
+#endif\r
+\r
+#ifdef ALLOCATEPARAMSTACK\r
+  if (param_stack != NULL)\r
+    free(param_stack);\r
+\r
+  param_stack = NULL;\r
+#endif\r
+\r
+#ifdef ALLOCATENESTSTACK\r
+  if (nest != NULL)\r
+    free(nest);\r
+\r
+  nest = NULL;\r
+#endif\r
+\r
+#ifdef ALLOCATEINPUTSTACK\r
+  if (input_stack != NULL)\r
+    free(input_stack);\r
+\r
+  input_stack = NULL;\r
+#endif\r
+\r
+#ifdef ALLOCATESAVESTACK\r
+  if (save_stack != NULL)\r
+    free(save_stack);\r
+\r
+  save_stack = NULL;\r
+#endif\r
+\r
+  if (format_file != NULL)\r
+    free(format_file);\r
+\r
+  if (source_direct != NULL)\r
+    free(source_direct);\r
+\r
+  format_file = NULL;\r
+  source_direct = NULL;\r
+\r
+  if (dvi_file_name != NULL)\r
+    free(dvi_file_name);\r
+\r
+  if (log_file_name != NULL)\r
+    free(log_file_name);\r
+\r
+  if (pdf_file_name != NULL)\r
+    free(pdf_file_name);\r
+\r
+  pdf_file_name = NULL;\r
+  log_file_name = NULL;\r
+  dvi_file_name = NULL;\r
+\r
+  return 0;\r
+}\r
+\r
+boolean prime (int x)\r
+{\r
+  int k;\r
+  int sum = 1;    /* 1 + 3 + 5 + k = (k + 1) * (k + 1) / 4 */\r
+\r
+  if (x % 2 == 0)\r
+    return false;\r
+\r
+  for (k = 3; k < x; k = k + 2)\r
+  {\r
+    if (x % k == 0)\r
+      return false;\r
+\r
+    if (sum * 4 > x)\r
+      return true;\r
+\r
+    sum += k;\r
+  }\r
+\r
+  return true;\r
+}\r
+\r
+int quitflag  = 0;\r
+boolean show_use = false;\r
+\r
+void complainarg (int c, char *s)\r
+{\r
+  printf("ERROR: Do not understand `%c' argument value `%s'\n", c, s);\r
+  show_use = true;\r
+}\r
+\r
+/* following is list of allowed command line flags and args */\r
+\r
+char *allowedargs = "+bcdfijnpqrstvwyzABCDFGIJKLMNOPQRSTVWXYZ023456789?a=e=g=h=k=l=m=o=u=x=E=H=P=U=";\r
+\r
+void reorderargs (int ac, char **av)\r
+{\r
+  int n, m;\r
+  char *s, *t;\r
+  char takeargs[256];   /* large enough for all command line arg chars */\r
+\r
+  if (ac < 3)\r
+  {\r
+    return; /* no args ! */\r
+  }\r
+\r
+  s = allowedargs;\r
+  t = takeargs;   /* list of those that take args */\r
+\r
+  while (*s != '\0' && *(s + 1) != '\0')\r
+  {\r
+    if (*(s + 1) == '=')\r
+      *t++ = *s++;   /* copy over --- without the = */\r
+\r
+    s++;\r
+  }\r
+\r
+  *t = '\0';\r
+\r
+  if (trace_flag)\r
+  {\r
+    show_line(takeargs, 0);\r
+    wterm_cr();\r
+  }\r
+  \r
+  n = 1;\r
+\r
+  for (;;)\r
+  {\r
+    if (*av[n] != '-')\r
+      break;\r
+\r
+    if (n + 1 < ac && *(av[n] + 2) == '\0' &&\r
+      strchr(takeargs, *(av[n] + 1)) != NULL)\r
+      n += 2; /* step over it */\r
+    else\r
+      n++;\r
+\r
+    if (n == ac)\r
+      break;\r
+  }\r
+\r
+  for (;;)\r
+  {\r
+    if (n == ac)\r
+      break;\r
+\r
+    m = n;\r
+\r
+    while (m < ac && *av[m] != '-')\r
+      m++;  /* first command */\r
+\r
+    if (m == ac)\r
+      break;\r
+/* does it take an argument ? and is this argument next ? */\r
+/* check first whether the `-x' is isolated, or arg follows directly */\r
+/* then check whether this is one of those that takes an argument */\r
+    if (m+1 < ac && *(av[m] + 2) == '\0' &&\r
+      strchr(takeargs, *(av[m] + 1)) != NULL)\r
+    {\r
+      s = av[m];      /*  move command down before non-command */\r
+      t = av[m + 1];\r
+\r
+      for (; m > n; m--)\r
+        av[m + 1] = av[m - 1];\r
+\r
+      av[n] = s;\r
+      av[n + 1] = t;\r
+      n += 2;       /* step over moved args */\r
+    }\r
+    else\r
+    {\r
+      s = av[m];      /*  move command down before non-command */\r
+\r
+      for (; m > n; m--)\r
+        av[m] = av[m - 1];\r
+\r
+      av[n] = s;\r
+      n++;        /* step over moved args */\r
+    }\r
+  }\r
+}\r
+\r
+int test_align (long address, int size, const char *str)\r
+{\r
+  int n;\r
+\r
+  if (size > sizeof(void *))\r
+    n = address % sizeof(void *);\r
+  else\r
+    n = address % size;\r
+\r
+  if (n != 0)\r
+    printf("OFFSET %d (ELEMENT %d) in %s\n", n, size, str);\r
+\r
+  return n;\r
+}\r
+\r
+/* activate detailed checking of alignment when trace_flag is set */\r
+\r
+void check_fixed_align (int flag)\r
+{\r
+  (void) flag;\r
+\r
+  if (test_align ((long) &mem_top, 4, "FIXED ALIGNMENT"))\r
+  {\r
+    puts("PLEASE RECOMPILE ME!");\r
+  }\r
+\r
+#ifdef CHECKALIGNMENT\r
+  if (!flag)\r
+    return;\r
+\r
+  test_align ((long) &mem_top, 4, "mem_top");\r
+  test_align ((long) &mem_max, 4, "mem_max");\r
+  test_align ((long) &mem_min, 4, "mem_min");\r
+  test_align ((long) &bad, 4, "bad");\r
+  test_align ((long) &trie_size, 4, "trie_size");\r
+  test_align ((long) &xord, sizeof(xord[0]), "xord");\r
+  test_align ((long) &xchr, sizeof(xchr[0]), "xchr");\r
+  test_align ((long) &name_length, 4, "name_length");\r
+  test_align ((long) &first, 4, "first");\r
+  test_align ((long) &last, 4, "last");\r
+  test_align ((long) &max_buf_stack, 4, "max_buf_stack");\r
+  test_align ((long) &pool_ptr, 4, "pool_ptr");\r
+  test_align ((long) &str_ptr, 4, "str_ptr");\r
+  test_align ((long) &init_pool_ptr, 4, "init_pool_ptr");\r
+  test_align ((long) &init_str_ptr, 4, "init_str_ptr");\r
+  test_align ((long) &log_file, 4, "log_file");\r
+  test_align ((long) &tally, 4, "tally");\r
+  test_align ((long) &term_offset, 4, "term_offset");\r
+  test_align ((long) &file_offset, 4, "file_offset");\r
+  test_align ((long) &trick_count, 4, "trick_count");\r
+  test_align ((long) &first_count, 4, "first_count");\r
+  test_align ((long) &deletions_allowed, 4, "deletions_allowed");\r
+  test_align ((long) &set_box_allowed, 4, "set_box_allowed");\r
+  test_align ((long) &help_line, sizeof(help_line[0]), "help_line");\r
+  test_align ((long) &use_err_help, 4, "use_err_help");\r
+  test_align ((long) &interrupt, 4, "interrupt");\r
+  test_align ((long) &OK_to_interrupt, 4, "OK_to_interrupt");\r
+  test_align ((long) &arith_error, 4, "arith_error");\r
+  test_align ((long) &tex_remainder, 4, "tex_remainder");\r
+  test_align ((long) &temp_ptr, 4, "temp_ptr");\r
+  test_align ((long) &lo_mem_max, 4, "lo_mem_max");\r
+  test_align ((long) &hi_mem_min, 4, "hi_mem_min");\r
+  test_align ((long) &var_used, 4, "var_used");\r
+  test_align ((long) &dyn_used, 4, "dyn_used");\r
+  test_align ((long) &avail, 4, "avail");\r
+  test_align ((long) &mem_end, 4, "mem_end");\r
+  test_align ((long) &mem_start, 4, "mem_start");\r
+  test_align ((long) &rover, 4, "rover");\r
+  test_align ((long) &font_in_short_display, 4, "font_in_short_display");\r
+  test_align ((long) &depth_threshold, 4, "depth_threshold");\r
+  test_align ((long) &breadth_max, 4, "breadth_max");\r
+  test_align ((long) &nest, sizeof(nest[0]), "nest");\r
+  // test_align ((long) &xeq_level, sizeof(xeq_level[0]), "xeq_level");\r
+  test_align ((long) &zzzad, sizeof(zzzad[0]), "zzzad");\r
+  // test_align ((long) &hash, sizeof(hash[0]), "hash");\r
+  test_align ((long) &zzzae, sizeof(zzzae[0]), "zzzae");\r
+  test_align ((long) &save_stack, sizeof(save_stack[0]), "save_stack");\r
+  test_align ((long) &input_stack, sizeof(input_stack[0]), "input_stack");\r
+  test_align ((long) &input_file, sizeof(input_file[0]), "input_file");\r
+  test_align ((long) &line_stack, sizeof(line_stack[0]), "line_stack");\r
+  test_align ((long) &param_stack, sizeof(param_stack[0]), "param_stack");\r
+  test_align ((long) &cur_mark, sizeof(cur_mark[0]), "cur_mark");\r
+  test_align ((long) &pstack, sizeof(pstack[0]), "pstack");\r
+  test_align ((long) &read_file, sizeof(read_file[0]), "read_file");\r
+  test_align ((long) &font_check, sizeof(font_check[0]), "font_check");\r
+  test_align ((long) &font_size, sizeof(font_size[0]), "font_size");\r
+  test_align ((long) &font_dsize, sizeof(font_dsize[0]), "font_dsize");\r
+  test_align ((long) &font_params, sizeof(font_params[0]), "font_params");\r
+  test_align ((long) &font_name, sizeof(font_name[0]), "font_name");\r
+  test_align ((long) &font_area, sizeof(font_area[0]), "font_area");\r
+  test_align ((long) &font_bc, sizeof(font_bc[0]), "font_bc");\r
+  test_align ((long) &font_ec, sizeof(font_ec[0]), "font_ec");\r
+  test_align ((long) &font_glue, sizeof(font_glue[0]), "font_glue");\r
+  test_align ((long) &font_used, sizeof(font_used[0]), "font_used");\r
+  test_align ((long) &hyphen_char, sizeof(hyphen_char[0]), "hyphen_char");\r
+  test_align ((long) &skew_char, sizeof(skew_char[0]), "skew_char");\r
+  test_align ((long) &bchar_label, sizeof(bchar_label[0]), "bchar_label");\r
+  test_align ((long) &font_bchar, sizeof(font_bchar[0]), "font_bchar");\r
+  test_align ((long) &font_false_bchar, sizeof(font_false_bchar[0]), "font_false_bchar");\r
+  test_align ((long) &char_base, sizeof(char_base[0]), "char_base");\r
+  test_align ((long) &width_base, sizeof(width_base[0]), "width_base");\r
+  test_align ((long) &height_base, sizeof(height_base[0]), "height_base");\r
+  test_align ((long) &depth_base, sizeof(depth_base[0]), "depth_base");\r
+  test_align ((long) &italic_base, sizeof(italic_base[0]), "italic_base");\r
+  test_align ((long) &lig_kern_base, sizeof(lig_kern_base[0]), "lig_kern_base");\r
+  test_align ((long) &kern_base, sizeof(kern_base[0]), "kern_base");\r
+  test_align ((long) &exten_base, sizeof(exten_base[0]), "exten_base");\r
+  test_align ((long) &param_base, sizeof(param_base[0]), "param_base");\r
+  test_align ((long) &total_stretch, sizeof(total_stretch[0]), "total_stretch");\r
+  test_align ((long) &total_shrink, sizeof(total_shrink[0]), "total_shrink");\r
+  test_align ((long) &active_width, sizeof(active_width[0]), "active_width");\r
+  test_align ((long) &cur_active_width, sizeof(cur_active_width[0]), "cur_active_width");\r
+  test_align ((long) &background, sizeof(background[0]), "background");\r
+  test_align ((long) &break_width, sizeof(break_width[0]), "break_width");\r
+  test_align ((long) &minimal_demerits, sizeof(minimal_demerits[0]), "minimal_demerits");\r
+  test_align ((long) &best_place, sizeof(best_place[0]), "best_place");\r
+  test_align ((long) &best_pl_line, sizeof(best_pl_line[0]), "best_pl_line");\r
+  test_align ((long) &hc, sizeof(hc[0]), "hc");\r
+  test_align ((long) &hu, sizeof(hu[0]), "hu");\r
+  test_align ((long) &hyf, sizeof(hyf[0]), "hyf");\r
+  // test_align ((long) &x, sizeof(x[0]), "x");\r
+  test_align ((long) &hyf_distance, sizeof(hyf_distance[0]), "hyf_distance");\r
+  test_align ((long) &hyf_num, sizeof(hyf_num[0]), "hyf_num");\r
+  test_align ((long) &hyf_next, sizeof(hyf_next[0]), "hyf_next");\r
+  test_align ((long) &op_start, sizeof(op_start[0]), "op_start");\r
+  // test_align ((long) &trie_op_hash, sizeof(trie_op_hash[0]), "trie_op_hash");\r
+  test_align ((long) &trie_used, sizeof(trie_used[0]), "trie_used");\r
+/*  test_align ((long) &trie_op_lang, sizeof(trie_op_lang[0]), "trie_op_lang");*/\r
+  test_align ((long) &trie_op_val, sizeof(trie_op_val[0]), "trie_op_val");\r
+  test_align ((long) &trie_min, sizeof(trie_min[0]), "trie_min");\r
+  test_align ((long) &page_so_far, sizeof(page_so_far[0]), "page_so_far");\r
+  test_align ((long) &write_file, sizeof(write_file[0]), "write_file");\r
+  test_align ((long) &write_open, sizeof(write_open[0]), "write_open");\r
+#endif\r
+}\r
+\r
+void check_alloc_align (int flag)\r
+{\r
+  (void) flag;\r
+\r
+  if (test_align((long) eqtb, sizeof(eqtb[0]), "ALLOCATED ALIGNMENT"))\r
+    puts("PLEASE RECOMPILE ME!");\r
+\r
+#ifdef CHECKALIGNMENT\r
+  if (!flag)\r
+    return;\r
+\r
+#ifndef ALLOCZEQTB\r
+  test_align ((long) eqtb, sizeof(eqtb[0]), "eqtb"); \r
+#endif\r
+\r
+  test_align ((long) str_pool, sizeof(str_pool[0]), "str_pool"); /* no op */\r
+  test_align ((long) str_start, sizeof(str_start[0]), "str_start");\r
+  test_align ((long) mem, sizeof(mem[0]), "main memory");\r
+  test_align ((long) font_info, sizeof(font_info[0]), "font memory");\r
+  test_align ((long) trie_trl, sizeof(trie_trl[0]), "trie_trl");\r
+  test_align ((long) trie_tro, sizeof(trie_tro[0]), "trie_tro");\r
+  test_align ((long) trie_trc, sizeof(trie_trc[0]), "trie_trc");\r
+  test_align ((long) hyph_word, sizeof(hyph_word[0]), "hyph_word");\r
+  test_align ((long) hyph_list, sizeof(hyph_list[0]), "hyph_list");\r
+/*  test_align ((long) trie_c, sizeof(trie_c[0]), "trie_c"); *//* no op */\r
+  test_align ((long) trie_o, sizeof(trie_o[0]), "trie_o");\r
+  test_align ((long) trie_l, sizeof(trie_l[0]), "trie_l");\r
+  test_align ((long) trie_r, sizeof(trie_r[0]), "trie_r");\r
+  test_align ((long) trie_hash, sizeof(trie_hash[0]), "trie_hash");\r
+  test_align ((long) trie_taken, sizeof(trie_taken[0]), "trie_taken");\r
+#endif\r
+}\r
+\r
+boolean shorten_file_name  = false; /* don't shorten file names to 8+3 for DOS */\r
+\r
+/* cache to prevent allocating twice in a row */\r
+\r
+char * lastname  = NULL;\r
+char * lastvalue = NULL;\r
+\r
+/* returns allocated string -- these strings are not freed again */\r
+/* is it safe to do that now ? 98/Jan/31 */\r
+char * grabenv (const char * varname)\r
+{\r
+  char * s;\r
+\r
+  if (varname == NULL)\r
+    return NULL;\r
+\r
+  if (*varname == '\0')\r
+    return NULL;\r
+\r
+  if (lastname != NULL && strcasecmp(lastname, varname) == 0)\r
+  {\r
+    if (trace_flag)\r
+      printf("Cache hit: %s=%s\n", lastname, lastvalue);\r
+\r
+    return xstrdup(lastvalue);\r
+  }\r
+\r
+  s = getenv(varname);\r
+\r
+  if (s != NULL)\r
+  {\r
+    if (lastname != NULL)\r
+      free(lastname);\r
+\r
+    lastname = xstrdup(varname);\r
+\r
+    if (lastvalue != NULL)\r
+      free(lastvalue);\r
+\r
+    lastvalue = xstrdup(s);\r
+\r
+    return xstrdup(s);\r
+  }\r
+  else\r
+    return NULL;\r
+}\r
+\r
+void flush_trailing_slash (char * directory)\r
+{\r
+  char * s;\r
+\r
+  if (strcmp(directory, "") != 0)\r
+  {\r
+    s = directory + strlen(directory) - 1;\r
+\r
+    if (*s == '\\' || *s == '/')\r
+      *s = '\0';\r
+  }\r
+}\r
+\r
+void knuthify (void)\r
+{\r
+  restrict_to_ascii     = false; /* don't complain non ASCII */\r
+  allow_patterns        = false; /* don't allow pattern redefinition */\r
+  show_in_hex           = true;  /* show character code in hex */\r
+  show_in_dos           = false; /* redundant with previous */\r
+  show_numeric          = false; /* don't show character code decimal */\r
+  show_missing          = false; /* don't show missing characters */\r
+  civilize_flag         = false; /* don't reorder date fields */\r
+  c_style_flag          = false; /* don't add file name to error msg */\r
+  show_fmt_flag         = false; /* don't show format file in log */\r
+  show_tfm_flag         = false; /* don't show metric file in log */\r
+  tab_step              = 0;\r
+  show_line_break_stats = false; /* do not show line break stats */\r
+  show_fonts_used       = false;\r
+  default_rule          = 26214; /* revert to default rule thickness */\r
+  pseudo_tilde          = false;\r
+  pseudo_space          = false;\r
+  truncate_long_lines   = false;\r
+  allow_quoted_names    = false;\r
+  show_cs_names         = false;\r
+  ignore_frozen         = false;\r
+  suppress_f_ligs       = false;\r
+  full_file_name_flag   = false;\r
+  knuth_flag            = true;  /* so other code can know about this */\r
+}\r
+\r
+/* following made global so analyze_flag can be made separate procedure */\r
+\r
+char * xchr_file = NULL;\r
+char * repl_file = NULL;\r
+\r
+const char * short_options = "m:e:h:0:H:g:P:o:l:a:r:kwvpiKLZMd2t?u";\r
+\r
+static struct option long_options[] =\r
+{\r
+  {"main-memory",   required_argument, NULL, 'm'},\r
+  {"hyph-size",     required_argument, NULL, 'e'},\r
+  {"trie-size",     required_argument, NULL, 'h'},\r
+  {"backend",       required_argument, NULL, '0'},\r
+  {"tab-step",      required_argument, NULL, 'H'},\r
+  {"percent-grow",  required_argument, NULL, 'g'},\r
+  {"default-rule",  required_argument, NULL, 'P'},\r
+  {"dvi-dir",       required_argument, NULL, 'o'},\r
+  {"log-dir",       required_argument, NULL, 'l'},\r
+  {"aux-dir",       required_argument, NULL, 'a'},\r
+  {"key-file",      required_argument, NULL, 'k'},\r
+  {"jobname",       required_argument, NULL, 'r'},\r
+  {"showhex",       no_argument,       NULL, 'w'},\r
+  {"verbose",       no_argument,       NULL, 'v'},\r
+  {"patterns",      no_argument,       NULL, 'p'},\r
+  {"initex",        no_argument,       NULL, 'i'},\r
+  {"knuthify",      no_argument,       NULL, 'K'},\r
+  {"cstyle",        no_argument,       NULL, 'L'},\r
+  {"showtfm",       no_argument,       NULL, 'Z'},\r
+  {"showmissing",   no_argument,       NULL, 'M'},\r
+  {"deslash",       no_argument,       NULL, 'd'},\r
+  {"suppressflig",  no_argument,       NULL, '2'},\r
+  {"trace",         no_argument,       NULL, 't'},\r
+  {"help",          no_argument,       NULL, '?'},\r
+  {"usage",         no_argument,       NULL, 'u'},\r
+  {NULL,            0, 0, 0}\r
+};\r
+\r
+int analyze_flag (int c, char * optarg)\r
+{\r
+  switch (c)\r
+  {\r
+    case 'r':\r
+      c_job_name = optarg;\r
+      break;\r
+    case 'v':\r
+      verbose_flag = true;\r
+      break;\r
+    case 'i':\r
+      is_initex = true;\r
+      break;\r
+    case 'Q':\r
+      interaction = batch_mode;\r
+      break;\r
+    case 'R':\r
+      interaction = nonstop_mode;\r
+      break;\r
+    case 'S':\r
+      interaction = scroll_mode;\r
+      break;\r
+    case 'T':\r
+      interaction = error_stop_mode;\r
+      break;\r
+    case 'K':\r
+      knuthify();\r
+      break;\r
+    case 'L':\r
+      c_style_flag = true;\r
+      break;\r
+    case 'Z':\r
+      show_tfm_flag = true;\r
+      break;\r
+    case 'M':\r
+      show_missing = false;\r
+      break;\r
+    case 'd':\r
+      deslash = false;\r
+      break;\r
+    case 'p':\r
+      allow_patterns = true;\r
+      break;\r
+    case 'w':\r
+      show_in_hex = true;\r
+      break;\r
+    case 'j':\r
+      show_in_dos = true;\r
+      break;\r
+    case 'n':\r
+      restrict_to_ascii = true; /* 0 - 127 1994/Jan/21 */\r
+      break;\r
+    case 'f':\r
+      show_fonts_used = false;\r
+      break;\r
+    case '8':\r
+      shorten_file_name = true;\r
+      break;\r
+    case '9':\r
+      show_cs_names = true;\r
+      break;\r
+    case '4':\r
+      ignore_frozen = true;\r
+      break;\r
+    case 'J':\r
+      show_line_break_stats = false; /* 96/Feb/8 */\r
+      break;\r
+    case 'O':\r
+      show_fmt_flag = false; /* 94/Jun/21 */\r
+      break;\r
+    case '2':\r
+      suppress_f_ligs = true; /* 99/Jan/5 f-lig */\r
+      break;\r
+    case 'z':\r
+      full_file_name_flag = false; // 00 Jun 18\r
+      break;\r
+    case 't':\r
+      trace_flag = true;\r
+      break;\r
+    case 'q':\r
+      quitflag++; /* 93/Dec/16 */\r
+      break;\r
+/* The following are really obscure and should not be advertized */\r
+    case 's':\r
+      show_current = false;\r
+      break;\r
+    case 'N':\r
+      show_numeric = false;\r
+      break;\r
+    case 'A':\r
+      civilize_flag = false;\r
+      break; \r
+    case 'B':\r
+      open_trace_flag = true;\r
+      break;\r
+    case 'Y':\r
+      reorder_arg_flag = false; /* local */\r
+      break;\r
+\r
+    case 'm':\r
+      if (optarg == 0)\r
+        mem_initex = mem_top;\r
+      else\r
+        mem_initex = atoi(optarg) * 1024;\r
+\r
+      if (mem_initex == 0)\r
+        complainarg(c, optarg);\r
+\r
+      mem_spec_flag = true;\r
+      break;\r
+\r
+#ifdef VARIABLETRIESIZE\r
+    case 'h':\r
+      if (optarg == 0)\r
+      {\r
+        //trie_size = atoi(kpse_var_value("trie_size"));\r
+        trie_size = default_trie_size;\r
+      }\r
+      else\r
+        trie_size = atoi(optarg);\r
+\r
+      if (trie_size == 0)\r
+        complainarg(c, optarg);\r
+      break;\r
+#endif\r
+\r
+#ifdef ALLOCATEHYPHEN\r
+    case 'e':\r
+      if (optarg == 0)\r
+        new_hyphen_prime = hyphen_prime * 2;\r
+      else\r
+        new_hyphen_prime = atoi(optarg);\r
+\r
+      if (new_hyphen_prime == 0)\r
+        complainarg(c, optarg);\r
+\r
+      break;\r
+#endif\r
+    case 'g':\r
+      if (optarg == 0)\r
+        percent_grow = 62;\r
+      else\r
+        percent_grow = atoi(optarg);\r
+\r
+      if (percent_grow == 0)\r
+        complainarg(c, optarg);\r
+\r
+      break;\r
+\r
+    case 'U':\r
+      if (optarg == 0)\r
+        pseudo_tilde = 0;\r
+      else\r
+        pseudo_tilde = atoi(optarg);\r
+\r
+      if (pseudo_tilde > 255)\r
+        pseudo_tilde = 255;\r
+      else if (pseudo_tilde < 128)\r
+        pseudo_tilde = 128;\r
+\r
+      break;\r
+\r
+    case 'H':\r
+      if (optarg == 0)\r
+        tab_step = 8;\r
+      else\r
+        tab_step = atoi(optarg);\r
+      if (tab_step == 0)\r
+        complainarg(c, optarg);\r
+      break;\r
+\r
+    case 'x':\r
+      if (optarg == 0)\r
+        xchr_file = xstrdup("xchr.map");\r
+      else\r
+        xchr_file = xstrdup(optarg);\r
+\r
+      if (xchr_file == NULL || *xchr_file == '\0')\r
+        complainarg(c, optarg);\r
+      break;\r
+\r
+    case 'k':\r
+      if (optarg == 0)\r
+        repl_file = xstrdup("repl.key");\r
+      else\r
+        repl_file = xstrdup(optarg);\r
+\r
+      if (repl_file == NULL || *repl_file == '\0')\r
+        complainarg(c, optarg);\r
+      break;\r
+\r
+    case 'P':\r
+      if (optarg == 0)\r
+        default_rule = 26214;\r
+      else\r
+        default_rule = atoi(optarg);\r
+\r
+      if (default_rule == 0)\r
+        complainarg(c, optarg);\r
+      break;\r
+\r
+    case 'E':\r
+      if (optarg != 0)\r
+        putenv(optarg);\r
+      else\r
+        complainarg(c, optarg);\r
+      break;\r
+\r
+    case 'o':\r
+      if (optarg == 0)\r
+        dvi_directory = "";\r
+      else\r
+        dvi_directory = xstrdup(optarg);\r
+\r
+      if (strcmp(dvi_directory, "") == 0)\r
+        complainarg(c, optarg);\r
+\r
+      break;\r
+\r
+    case 'l':\r
+      if (optarg == 0)\r
+        log_directory = "";\r
+      else\r
+        log_directory = xstrdup(optarg);\r
+\r
+      if (strcmp(log_directory, "") == 0)\r
+        complainarg(c, optarg);\r
+\r
+      break;\r
+\r
+    case 'a':\r
+      if (optarg == 0)\r
+        aux_directory = "";\r
+      else\r
+        aux_directory = xstrdup(optarg);\r
+\r
+      if (strcmp(aux_directory, "") == 0)\r
+        complainarg(c, optarg);\r
+\r
+      break;\r
+\r
+    case '?':\r
+    default:\r
+      show_use = true;\r
+      return -1;\r
+      break;\r
+  }\r
+\r
+  return 0;\r
+}\r
+\r
+void strip_name (char *pathname)\r
+{\r
+  char *s;\r
+\r
+  if ((s = strrchr(pathname, '\\')) != NULL)\r
+    ;\r
+  else if ((s = strrchr(pathname, '/')) != NULL)\r
+    ;\r
+  else if ((s = strrchr(pathname, ':')) != NULL)\r
+    s++;\r
+  else\r
+    s = pathname;\r
+\r
+  *s = '\0';\r
+}\r
+\r
+int read_command_line (int ac, char **av)\r
+{ \r
+  int c;\r
+  char *optargnew;\r
+  int option_idx = 0;\r
+\r
+  if (ac < 2)\r
+    return 0;\r
+\r
+  while ((c = getopt_long_only(ac, av, short_options, long_options, &option_idx)) != EOF)\r
+  {\r
+    if (optarg != 0 && *optarg == '=')\r
+      optargnew = optarg + 1;\r
+    else\r
+      optargnew = optarg;\r
+\r
+    analyze_flag(c, optargnew);\r
+  }\r
+\r
+  if (show_use || quitflag == 3)\r
+  {\r
+    stamp_it(log_line);\r
+    strcat(log_line, "\n");\r
+    show_line(log_line, 0);\r
+\r
+    if (show_use)\r
+      show_usage();\r
+    else if (quitflag == 3)\r
+    {\r
+      strcat(log_line, "\n");\r
+      show_line(log_line, 0);\r
+    }\r
+\r
+    return -1; // failure\r
+  } \r
+\r
+  if (repl_file != NULL && *repl_file != '\0')\r
+  {\r
+    if (read_xchr_file(repl_file, 1, av))\r
+    {\r
+      if (trace_flag)\r
+        puts("KEY REPLACE ON");\r
+\r
+      key_replace = true;\r
+    }\r
+  } \r
+\r
+  if (xchr_file != NULL && *xchr_file != '\0')\r
+  {\r
+    if (read_xchr_file(xchr_file, 0, av))\r
+    {\r
+      if (trace_flag)\r
+        puts("NON ASCII ON");\r
+\r
+      non_ascii = true;\r
+    }\r
+  } \r
+\r
+  return 0;\r
+}\r
+\r
+int init_commands (int ac, char **av)\r
+{\r
+  shipout_flag          = out_dvi_flag;\r
+  is_initex             = false; \r
+  allow_patterns        = false;\r
+  reset_exceptions      = false;\r
+  non_ascii             = false;\r
+  key_replace           = false;\r
+  open_trace_flag       = false;\r
+  trace_flag            = false;\r
+  verbose_flag          = false;\r
+  restrict_to_ascii     = false;\r
+  show_in_hex           = false; /* default is not to show as hex code ^^ 00/Jun/18 */\r
+  show_in_dos           = false; /* default is not to translate to DOS 850 */ \r
+  return_flag           = true;  // hard wired now\r
+  trimeof               = true;  // hard wired now\r
+  deslash               = true;\r
+  pseudo_tilde          = 254;   /* default '~' replace 95/Sep/26 filledbox DOS 850 */\r
+  pseudo_space          = 255;   /* default ' ' replace 97/June/5 nbspace DOS 850 */\r
+  default_rule          = 26214;\r
+  show_current          = true;\r
+  civilize_flag         = true;\r
+  show_numeric          = true;\r
+  show_missing          = true;\r
+  c_style_flag          = false;\r
+  show_fmt_flag         = true;\r
+  show_tfm_flag         = false; /* don't show metric file in log */\r
+  shorten_file_name     = false; /* don't shorten file names to 8+3 */\r
+  truncate_long_lines   = true;  /* truncate long lines */\r
+  tab_step              = 0;     /* do not replace tabs with spaces */\r
+  show_line_break_stats = true;  /* show line break statistics 96/Feb/8 */\r
+  show_fonts_used       = true;  /* show fonts used in LOG file 97/Dec/24 */\r
+  allow_quoted_names    = true;  /* allow quoted names with spaces 98/Mar/15 */\r
+  show_cs_names         = false;\r
+  knuth_flag            = false;\r
+  full_file_name_flag   = true;  /* new default 2000 June 18 */\r
+  errout                = stdout; /* as opposed to stderr say --- used ??? */\r
+  new_hyphen_prime      = 0;\r
+\r
+#ifdef VARIABLETRIESIZE\r
+  // trie_size = default_trie_size;\r
+  trie_size = 0;\r
+#endif\r
+\r
+  mem_extra_high = 0;\r
+  mem_extra_low  = 0;\r
+  mem_initex     = 0;\r
+  format_name    = "plain";\r
+\r
+  if (read_command_line(ac, av) < 0)\r
+    return -1;\r
+\r
+  if (optind == 0)\r
+    optind = ac;\r
+\r
+  return 0;\r
+}\r
+\r
+void initial_memory (void)\r
+{\r
+  /* set initial memory allocations */\r
+  if (mem_extra_high < 0)\r
+    mem_extra_high = 0;\r
+\r
+  if (mem_extra_low < 0)\r
+    mem_extra_low = 0;\r
+\r
+  if (mem_initex < 0)\r
+    mem_initex = 0;\r
+\r
+  if (is_initex)\r
+  {\r
+ #if defined(ALLOCATEHIGH) || defined(ALLOCATELOW)\r
+    if (mem_extra_high != 0 || mem_extra_low != 0)\r
+    {\r
+      puts("ERROR: Cannot extend main memory in initex");\r
+      mem_extra_high = 0;\r
+      mem_extra_low = 0;\r
+    }\r
+#endif\r
+  }\r
+  else\r
+  {\r
+    if (mem_initex != 0)\r
+    {\r
+      puts("ERROR: Can only set initial main memory size in initex");\r
+      mem_initex = 0;\r
+    }\r
+\r
+    if (trie_size != 0)\r
+    {\r
+      puts("ERROR: Need only set hyphenation trie size in initex");\r
+/* trie_size = 0; */\r
+    }\r
+  }\r
+  if (mem_initex == 0)\r
+    mem_initex = default_mem_top;\r
+\r
+  if (trie_size == 0)\r
+    trie_size = default_trie_size;\r
+\r
+/* Just in case user mistakenly specified words instead of kilo words */\r
+  if (mem_extra_high > 10000L * 1024L)\r
+    mem_extra_high = mem_extra_high / 1024;\r
+\r
+  if (mem_extra_low > 10000L * 1024L)\r
+    mem_extra_low = mem_extra_low / 1024;\r
+\r
+  if (mem_initex > 10000L * 1024L)\r
+    mem_initex = mem_initex / 1024;\r
+\r
+  if (mem_initex > 2048L * 1024L) /* extend main memory by 16 mega byte! */\r
+  {\r
+    puts("WARNING: There may be no benefit to asking for so much memory");\r
+/* mem_initex = 2048 * 1024; */\r
+  }\r
+\r
+  if (new_hyphen_prime < 0)\r
+    new_hyphen_prime = 0;\r
+\r
+  if (new_hyphen_prime > 0)\r
+  {\r
+    if (! is_initex)\r
+      puts("ERROR: Can only set hyphen prime in initex");\r
+    else\r
+    {\r
+      if (new_hyphen_prime % 2 == 0)\r
+        new_hyphen_prime++;\r
+\r
+      while (!prime(new_hyphen_prime))\r
+        new_hyphen_prime = new_hyphen_prime + 2;\r
+\r
+      if (trace_flag)\r
+        printf("Using %d as hyphen prime\n", new_hyphen_prime);\r
+    }\r
+  }\r
+\r
+  if (percent_grow > 100)\r
+    percent_grow = percent_grow - 100;\r
+\r
+  if (percent_grow > 100)\r
+    percent_grow = 100;   /* upper limit - double */\r
+\r
+  if (percent_grow < 10)\r
+    percent_grow = 10;   /* lower limit - 10% */\r
+}\r
+\r
+void perrormod (const char * s)\r
+{\r
+  printf("`%s': %s\n", s, strerror(errno));\r
+}\r
+\r
+/* convert tilde to pseudo_tilde to hide it from TeX --- 95/Sep/26 */\r
+/* convert space to pseudo_space to hide it from TeX --- 97/Jun/5 */\r
+/* called only if pseudo_tilde != 0 or pseudo_space != 0 */\r
+/* this is then undone in tex3.c both for fopen input and output */\r
+/* not ideal, since pseudo name appears in log and in error messages ... */\r
+\r
+void hidetwiddle (char *tname)\r
+{\r
+  char *s = tname;\r
+\r
+#ifdef DEBUGTWIDDLE\r
+  if (trace_flag)\r
+    printf("Hidetwiddle %s", tname);\r
+#endif\r
+\r
+  while (*s != '\0')\r
+  {\r
+    if (*s == '~' && pseudo_tilde != 0)\r
+      *s = (char) pseudo_tilde;  /* typically 254 */\r
+    else if (*s == ' ' && pseudo_space != 0)\r
+      *s = (char) pseudo_space;  /* typically 255 */\r
+    s++;\r
+  }\r
+\r
+#ifdef DEBUGTWIDDLE\r
+  if (trace_flag)\r
+    printf("=> %s\n", tname);\r
+#endif\r
+}\r
+\r
+void deslash_all (int ac, char **av)\r
+{\r
+  char buffer[file_name_size];  \r
+  char *s;\r
+\r
+  if ((s = grabenv("TEXDVI")) != NULL)\r
+    dvi_directory = s;\r
+\r
+  if ((s = grabenv("TEXLOG")) != NULL)\r
+    log_directory = s;\r
+\r
+  if ((s = grabenv("TEXAUX")) != NULL)\r
+    aux_directory = s;\r
+\r
+  if ((s = grabenv("TEXFMT")) != NULL)\r
+    fmt_directory = s;\r
+\r
+  if ((s = grabenv("TEXPDF")) != NULL)\r
+    pdf_directory = s;\r
+\r
+  strcpy(buffer, av[0]);\r
+\r
+  if ((s = strrchr(buffer, '\\')) != NULL)\r
+    *(s + 1) = '\0';\r
+  else if ((s = strrchr(buffer, '/')) != NULL)\r
+    *(s + 1) = '\0';\r
+  else if ((s = strrchr(buffer, ':')) != NULL)\r
+    *(s + 1) = '\0';\r
+\r
+  s = buffer + strlen(buffer) - 1;\r
+\r
+  if (*s == '\\' || *s == '/')\r
+    *s = '\0';\r
+\r
+  if (strcmp(dvi_directory, "") != 0)\r
+    flush_trailing_slash(dvi_directory);\r
+\r
+  if (strcmp(log_directory, "") != 0)\r
+    flush_trailing_slash(log_directory);\r
+\r
+  if (strcmp(aux_directory, "") != 0)\r
+    flush_trailing_slash(aux_directory);\r
+\r
+  if (strcmp(fmt_directory, "") != 0)\r
+    flush_trailing_slash(fmt_directory);\r
+\r
+  if (strcmp(pdf_directory, "") != 0)\r
+    flush_trailing_slash(pdf_directory);\r
+\r
+  if (deslash)\r
+  {\r
+    if (strcmp(dvi_directory, "") != 0)\r
+      unixify(dvi_directory);\r
+    \r
+    if (strcmp(log_directory, "") != 0)\r
+      unixify(log_directory);\r
+\r
+    if (strcmp(aux_directory, "") != 0)\r
+      unixify(aux_directory);\r
+\r
+    if (strcmp(fmt_directory, "") != 0)\r
+      unixify(fmt_directory);\r
+\r
+    if (strcmp(pdf_directory, "") != 0)\r
+      unixify(pdf_directory);\r
+  }\r
+\r
+  format_spec = false;\r
+\r
+  if (optind < ac && optind > 0)\r
+  {\r
+    if (deslash)\r
+    {\r
+      if (trace_flag)\r
+        printf("deslash: k %d argv[k] %s (argc %d)\n", optind, av[optind], ac);\r
+\r
+      unixify(av[optind]);\r
+    }\r
+\r
+    if (pseudo_tilde != 0 || pseudo_space != 0)\r
+      hidetwiddle(av[optind]);\r
+\r
+    if (*av[optind] == '&' || *av[optind] == '+')\r
+    {\r
+      format_spec = true;\r
+      format_name = xstrdup(av[optind] + 1);\r
+\r
+      if (optind + 1 < ac)\r
+      {\r
+        if (deslash)\r
+        {\r
+          if (trace_flag)\r
+            printf("deslash: k %d argv[k] %s (argc %d)\n", optind + 1, av[optind + 1], ac);\r
+\r
+          unixify(av[optind + 1]);\r
+        }\r
+\r
+        if (pseudo_tilde != 0 || pseudo_space != 0)\r
+          hidetwiddle(av[optind + 1]);\r
+      }\r
+    }         \r
+  }\r
+}\r
+\r
+int main_init (int ac, char ** av)\r
+{\r
+  kpse_set_program_name(av[0], "dvipdfmx");\r
+  xputenv("engine", "yandytex");\r
+\r
+  if (sizeof(memory_word) != sizeof(halfword) * 2)\r
+    printf("ERROR: Bad word size %ld!\n", sizeof(memory_word));\r
+\r
+  start_time = clock();\r
+  main_time  = start_time;\r
+\r
+/* reset all allocatable memory pointers to NULL - in case we drop out */\r
+  main_memory = NULL;\r
+  font_info   = NULL;\r
+  str_pool    = NULL;\r
+  str_start   = NULL;\r
+\r
+#ifdef ALLOCATESAVESTACK\r
+  save_stack = NULL; \r
+#endif\r
+\r
+#ifdef ALLOCATEBUFFER\r
+  buffer           = NULL;\r
+  current_buf_size = 0;\r
+  buffer           = realloc_buffer(initial_buf_size);\r
+#endif\r
+\r
+  hyph_list  = NULL;\r
+  hyph_word  = NULL;\r
+  trie_taken = NULL;\r
+  trie_hash  = NULL;\r
+  trie_r     = NULL;\r
+  trie_c     = NULL;\r
+  trie_o     = NULL;\r
+  trie_l     = NULL;\r
+  trie_trc   = NULL;\r
+  trie_tro   = NULL;\r
+  trie_trl   = NULL;\r
+\r
+  log_opened          = false;  /* so can tell whether opened */\r
+  interaction         = -1;     /* default state => 3 */\r
+  missing_characters  = 0;      /* none yet! */\r
+  ignore_frozen       = false;  /* default is not to ignore 98/Oct/5 */\r
+  suppress_f_ligs     = false;  /* default is not to ignore f-ligs */\r
+\r
+  if (ac > 1 && !strncmp(av[1], "-Y", 2))\r
+    reorder_arg_flag = false;\r
+\r
+  if (reorder_arg_flag)\r
+    reorderargs(ac, av);  \r
+\r
+  if (init_commands(ac, av))\r
+    return -1;\r
+\r
+  check_fixed_align(trace_flag);\r
+\r
+  format_file   = NULL;\r
+  source_direct = NULL;\r
+  dvi_file_name = NULL;\r
+  log_file_name = NULL;\r
+  pdf_file_name = NULL;\r
+\r
+  first_pass_count  = 0;\r
+  second_pass_count = 0;\r
+  final_pass_count  = 0;\r
+  paragraph_failed  = 0;\r
+  single_line       = 0;\r
+  overfull_hbox     = 0;\r
+  underfull_hbox    = 0;\r
+  overfull_vbox     = 0;\r
+  underfull_vbox    = 0;\r
+\r
+  if (trace_flag)\r
+    puts("Entering main_init() (local.c).");\r
+\r
+  probe_memory();\r
+  ini_max_address = max_address;\r
+\r
+  if (trace_flag)\r
+    show_maximums(stdout);\r
+\r
+  initial_memory();\r
+  deslash_all(ac, av);\r
+\r
+  if (format_spec && mem_spec_flag)\r
+    puts("WARNING: Cannot change initial main_memory size when format specified");\r
+\r
+  if (allocate_memory() != 0)\r
+    return -1;\r
+\r
+  check_alloc_align(trace_flag);\r
+\r
+  if (trace_flag)\r
+    puts("Leaving main_init() (local.c).");\r
+\r
+  return 0;\r
+}\r
+\r
+#define CLK_TCK CLOCKS_PER_SEC\r
+\r
+void show_inter_val (clock_t inter_val)\r
+{\r
+  int seconds, tenths, hundredth, thousands;\r
+\r
+  if (inter_val >= CLK_TCK * 10)\r
+  {\r
+    tenths = (inter_val * 10 + CLK_TCK / 2) / CLK_TCK; \r
+    seconds = tenths / 10; \r
+    tenths = tenths % 10;\r
+    printf("%d.%d", seconds, tenths);\r
+  }\r
+  else if (inter_val >= CLK_TCK)\r
+  {\r
+    hundredth = (inter_val * 100 + CLK_TCK / 2) / CLK_TCK;\r
+    seconds = hundredth / 100;\r
+    hundredth = hundredth % 100;\r
+    printf("%d.%02d", seconds, hundredth);\r
+  }\r
+  else if (inter_val > 0)\r
+  {\r
+    thousands = (inter_val * 1000 + CLK_TCK / 2) / CLK_TCK;\r
+    seconds = thousands / 1000;\r
+    thousands = thousands % 1000;\r
+    printf("%d.%03d", seconds, thousands);\r
+  }\r
+  else\r
+    show_line("0", 0);\r
+}\r
+\r
+int endit(int flag)\r
+{\r
+  finish_time = clock();\r
+\r
+  if (missing_characters != 0)\r
+    flag = 1;\r
+\r
+  if (missing_characters)\r
+    printf("! There %s %d missing character%s --- see log file\n",\r
+      (missing_characters == 1) ? "was" : "were", missing_characters,\r
+      (missing_characters == 1) ? "" : "s");\r
+\r
+  if (free_memory() != 0)\r
+    flag++;\r
+\r
+  if (verbose_flag)\r
+  {\r
+    printf("Total ");\r
+    show_inter_val(finish_time - start_time);\r
+    printf(" sec (");\r
+    show_inter_val(main_time - start_time);\r
+    printf(" format load + ");\r
+    show_inter_val(finish_time - main_time);\r
+    printf(" processing) ");\r
+\r
+    if (total_pages > 0)\r
+    {\r
+      show_inter_val((finish_time - main_time) / total_pages);\r
+      printf(" sec per page.\n");\r
+    }\r
+  }\r
+\r
+  return flag;\r
+}\r
+// printf control sequences' name\r
+void print_cs_name (FILE * output, int h)\r
+{\r
+  int c, textof, n;\r
+\r
+  memset(log_line, 0, sizeof(log_line));\r
+\r
+  textof = hash[h].rh;\r
+\r
+  if (textof == 0)\r
+    return;\r
+\r
+  c = sprintf(log_line, "(%d), ", h);\r
+  n = length(textof);\r
+\r
+  memmove(log_line + c, str_pool + str_start[textof], n);\r
+  memmove(log_line + c + n, "\n", 2);\r
+\r
+  if (output == stderr)\r
+    show_line(log_line, 1);\r
+  else if (output == stdout)\r
+    show_line(log_line, 0);\r
+  else\r
+    fprintf(output, "%s", log_line);\r
+}\r
+// prototype\r
+int compare_strn (int, int, int, int);\r
+/* compare two csnames in qsort */\r
+int compare_cs (const void *cp1, const void *cp2)\r
+{\r
+  int c1, c2, l1, l2, k1, k2, textof1, textof2;\r
+\r
+  c1 = *(int *)cp1;\r
+  c2 = *(int *)cp2;\r
+  textof1 = hash[c1].rh;\r
+  textof2 = hash[c2].rh;\r
+  l1 = length(textof1);\r
+  l2 = length(textof2);\r
+  k1 = str_start[textof1];\r
+  k2 = str_start[textof2];\r
+\r
+  return compare_strn(k1, l1, k2, l2);\r
+}\r
+\r
+char * csused = NULL;\r
+\r
+/* Allocate table of indeces to allow sorting on csname */\r
+/* Allocate flags to remember which ones already listed at start */\r
+/* pass = 0 --> fmt   */\r
+/* pass = 1 --> after */\r
+void print_cs_names (FILE *output, int pass)\r
+{\r
+  int h, k, ccount, repeatflag;\r
+  int *cnumtable;\r
+  int nfcs = frozen_control_sequence;\r
+\r
+  if (pass == 0 && csused == NULL)\r
+  {\r
+    csused = (char *) malloc (nfcs);\r
+\r
+    if (csused == NULL)\r
+      return;\r
+\r
+#ifdef USEMEMSET\r
+    memset(csused, 0, nfcs);\r
+#else\r
+    for (h = 0; h < (hash_size + 780); h++)\r
+      csused[h] = 0;\r
+#endif\r
+  }\r
+\r
+  ccount = 0;\r
+\r
+  for (h = hash_base + 1; h < nfcs; h++)\r
+  {\r
+    if (pass == 1 && csused[h])\r
+      continue;\r
+\r
+    if (text(h) != 0)\r
+    {\r
+      if (pass == 0)\r
+        csused[h] = 1;\r
+\r
+      ccount++;\r
+    }\r
+  }\r
+\r
+  sprintf(log_line, "\n%d %s multiletter control sequences:\n",\r
+      ccount, (pass == 1) ? "new" : "");\r
+\r
+  if (output == stderr)\r
+    show_line(log_line, 1);\r
+  else if (output == stdout)\r
+    show_line(log_line, 0);\r
+  else\r
+    fprintf(output, "%s", log_line);\r
+\r
+  if (ccount > 0)\r
+  {\r
+    cnumtable = (int *) malloc (ccount * sizeof(int));\r
+\r
+    if (cnumtable == NULL)\r
+      return;\r
+\r
+    ccount = 0;\r
+\r
+    for (h = hash_base + 1; h < nfcs; h++)\r
+    {\r
+      if (pass == 1 && csused[h])\r
+        continue;\r
+\r
+      if (hash[h].rh != 0)\r
+        cnumtable[ccount++] = h;\r
+    }\r
+\r
+    //qsort ((void *)cnumtable, ccount, sizeof (int), &compare_cs);\r
+\r
+    repeatflag = 0;\r
+\r
+    for (k = 0; k < ccount; k++)\r
+    {\r
+      h = cnumtable[k];\r
+\r
+      if (pass == 1 && csused[h])\r
+        continue;\r
+\r
+      print_cs_name(output, h);\r
+    }\r
+\r
+    sprintf(log_line, "\n");\r
+\r
+    if (output == stderr)\r
+      show_line(log_line, 1);\r
+    else if (output == stdout)\r
+      show_line(log_line, 0);\r
+    else\r
+      fprintf(output, "%s", log_line);\r
+\r
+    free((void *)cnumtable);\r
+  }\r
+\r
+  if (pass == 1 && csused != NULL)\r
+  {\r
+    free(csused);\r
+    csused = NULL;\r
+  }\r
+}\r
+\r
+/* k1 and k2 are positions in string pool */\r
+/* l1 and l2 are lengths of strings */\r
+int compare_strn (int k1, int l1, int k2, int l2)\r
+{\r
+  int c1, c2;\r
+\r
+  while (l1 > 0 && l2 > 0)\r
+  {\r
+    c1 = str_pool[k1];\r
+    c2 = str_pool[k2];\r
+\r
+    if (c1 > c2)\r
+      return 1;\r
+    else if (c2 > c1)\r
+      return -1;\r
+\r
+    l1--; l2--;\r
+    k1++; k2++;\r
+  }\r
+\r
+  if (l1 > 0)\r
+    return 1;   /* first string longer */\r
+  else if (l2 > 0)\r
+    return -1; /* second string longer */\r
+\r
+  return 0;         /* strings match */\r
+}\r
+/* compare two font names and their at sizes in qsort */\r
+int compare_fnt (const void * fp1, const void * fp2)\r
+{\r
+  int f1, f2, l1, l2, k1, k2, s;\r
+\r
+  f1 = *(short *)fp1;\r
+  f2 = *(short *)fp2;\r
+  l1 = length(font_name[f1]);\r
+  l2 = length(font_name[f2]);\r
+  k1 = str_start[font_name[f1]]; \r
+  k2 = str_start[font_name[f2]]; \r
+\r
+  s = compare_strn (k1, l1, k2, l2);\r
+\r
+  if (s != 0)\r
+    return s;\r
+\r
+  if (font_size[f1] > font_size[f2])\r
+    return 1;\r
+  else if (font_size[f1] < font_size[f2])\r
+    return -1;\r
+\r
+  return 0;         /* should not ever get here */\r
+}\r
+/* compare two font names */\r
+int compare_fnt_name (int f1, int f2)\r
+{\r
+  int l1, l2, k1, k2, s;\r
+\r
+  l1 = length(font_name[f1]);\r
+  l2 = length(font_name[f2]); \r
+  k1 = str_start[font_name[f1]]; \r
+  k2 = str_start[font_name[f2]]; \r
+\r
+  s = compare_strn (k1, l1, k2, l2);\r
+\r
+  return s;\r
+}\r
+/* decode checksum information */\r
+const unsigned long checkdefault = 0x59265920;\r
+int decode_fourty (unsigned long checksum, char *codingvector)\r
+{\r
+  int c;\r
+  int k;\r
+\r
+  if (checksum == 0)\r
+  {\r
+    strcpy(codingvector, "unknwn");\r
+    return 1;\r
+  }\r
+  else if ((checksum >> 8) == (checkdefault >> 8))\r
+  {\r
+    strcpy (codingvector, "fixed ");\r
+    return 1;\r
+  }\r
+  else\r
+  {\r
+    for (k = 0; k < 6; k++)\r
+    {\r
+      c = (int) (checksum % 40);\r
+      checksum = checksum / 40;\r
+      \r
+      if (c <= 'z' - 'a')\r
+        c = c + 'a';\r
+      else if (c < 36)\r
+        c = (c + '0') - ('z' - 'a') - 1;\r
+      else if (c == 36)\r
+        c = '-';\r
+      else if (c == 37)\r
+        c = '&';\r
+      else if (c == 38)\r
+        c = '_';\r
+      else\r
+        c = '.';\r
+      \r
+      codingvector[5-k] = (char) c;\r
+    }\r
+\r
+    codingvector[6] = '\0';\r
+  }\r
+\r
+  return 0;\r
+}\r
+\r
+double sclpnt (long x)\r
+{\r
+  double pt;\r
+\r
+  pt = (double) x / 65536.0;\r
+  pt = (double) ((int) (pt * 1000.0 + 0.5)) / 1000.0;\r
+\r
+  return (pt);\r
+}\r
+\r
+void dvi_font_show (internal_font_number f, int suppressname)\r
+{\r
+  int a, l, k, n;\r
+  unsigned long checksum;\r
+  char checksumvector[8];\r
+  char buffer[32];\r
+\r
+  putc(' ', log_file);\r
+\r
+  if (suppressname == 0)\r
+  {\r
+    a = length(font_area[f]);\r
+    l = length(font_name[f]);\r
+\r
+    k = str_start[font_area[f]];\r
+\r
+    memcpy(buffer, str_pool + k, length(font_area[f]));\r
+    fwrite(buffer, sizeof(char), length(font_area[f]), log_file);\r
+\r
+    k = str_start[font_name[f]];\r
+\r
+    memcpy(buffer, str_pool + k, length(font_name[f]));\r
+    fwrite(buffer, sizeof(char), length(font_name[f]), log_file);\r
+  }\r
+  else a = l = 0;\r
+\r
+  for (k = a + l; k < 16; k++)\r
+    putc(' ', log_file);\r
+\r
+  sprintf(buffer, "at %lgpt ", sclpnt(font_size[f]));\r
+  fputs(buffer, log_file);\r
+\r
+  if (suppressname == 0)\r
+  {\r
+    n = strlen(buffer);\r
+\r
+    for (k = n; k < 16; k++)\r
+      putc(' ', log_file);\r
+\r
+    checksum = (((font_check[f].b0) << 8 | font_check[f].b1) << 8 | font_check[f].b2) << 8 | font_check[f].b3;\r
+    decode_fourty(checksum, checksumvector);\r
+    fprintf(log_file, "encoding: %s..", checksumvector);\r
+  }\r
+\r
+  putc('\n', log_file);\r
+}\r
+/* Allocate table of indeces to allow sorting on font name */\r
+void show_font_info (void)\r
+{\r
+  int k, m, fcount, repeatflag;\r
+  short *fnumtable;\r
+\r
+  fcount = 0;\r
+\r
+  for (k = 1; k <= font_ptr; k++)\r
+    if (font_used[k])\r
+      fcount++;\r
+\r
+  if (fcount == 0)\r
+    return;\r
+\r
+  fnumtable = (short *) malloc(fcount * sizeof(short));\r
+\r
+  fprintf(log_file, "\nUsed %d font%s:\n", fcount, (fcount == 1) ? "" : "s");\r
+\r
+  fcount = 0;\r
+\r
+  for (k = 1; k <= font_ptr; k++) \r
+    if (font_used[k])\r
+      fnumtable[fcount++] = (short) k;\r
+\r
+  qsort ((void *)fnumtable, fcount, sizeof(short), &compare_fnt);\r
+\r
+  repeatflag = 0;\r
+\r
+  for (m = 0; m < fcount; m++)\r
+  {\r
+    if (m > 0)\r
+    {\r
+      if (compare_fnt_name(fnumtable[m - 1], fnumtable[m]) == 0)\r
+        repeatflag = 1;\r
+      else\r
+        repeatflag = 0;\r
+    }\r
+\r
+    dvi_font_show(fnumtable[m], repeatflag);\r
+  }\r
+\r
+  free((void *)fnumtable);\r
+}\r
index 3823bc9..b10dd3f 100644 (file)
-/* Copyright 2014 Clerk Ma
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301 USA.  */
-#ifndef _YANDYTEX_MACROS_H
-#define _YANDYTEX_MACROS_H
-
-#define font_base 0
-/* sec 0022 */
-#define null_code       0     // 0
-#define carriage_return 015   // 13
-#define invalid_code    0177  // 127
-/* sec 0036 */
-#define loc cur_input.loc_field
-/* sec 0040 */
-#define length(s) (str_start[(s) + 1] - str_start[(s)])
-/* sec 0041 */
-#define cur_length (pool_ptr - str_start[str_ptr])
-/* sec 0054 */
-enum 
-{
-  no_print     = 16,
-  term_only    = 17,
-  log_only     = 18,
-  term_and_log = 19,
-  pseudo       = 20,
-  new_string   = 21,
-  max_selector = 21,
-};
-/* sec 0073 */
-enum
-{
-  batch_mode      = 0,
-  nonstop_mode    = 1,
-  scroll_mode     = 2,
-  error_stop_mode = 3,
-};
-/* sec 0076 */
-enum
-{
-  spotless             = 0,
-  warning_issued       = 1,
-  error_message_issued = 2,
-  fatal_error_stop     = 3,
-};
-/* sec 0096 */
-#define check_interrupt()     \
-do                            \
-{                             \
-  if (interrupt != 0)         \
-    pause_for_instructions(); \
-}                             \
-while (0)
-/* sec 0101 */
-#define unity 0200000
-#define two   0400000
-/* sec 0105 */
-#define nx_plus_y(a, b, c)  mult_and_add(a, b, c, 07777777777L)
-#define mult_integers(a, b) mult_and_add(a, b, 0, 017777777777L)
-/* sec 0108 */
-#define inf_bad 10000L
-/* sec 0109 */
-#define set_glue_ratio_zero(a) (a) = 0.0
-#define set_glue_ratio_one(a)  (a) = 1.0
-#define tex_float(a)           (a)
-#define unfloat(a)             (a)
-#define float_constant(a)      (float) (a)
-/* sec 0115 */
-//#define pointer halfword
-#define null    min_halfword
-/* sec 0118 */
-#define link(p) mem[p].hh.rh
-#define info(p) mem[p].hh.lh
-/* sec 0122 */
-#ifdef STAT
-#define fast_get_avail(a) \
-  do                      \
-    {                     \
-      a = avail;          \
-                          \
-      if (a == 0)         \
-        a = get_avail();  \
-      else                \
-      {                   \
-        avail = link(a);  \
-        link(a) = 0;      \
-        incr(dyn_used);   \
-      }                   \
-    }                     \
-  while (0)
-#else
-#define fast_get_avail(a) \
-  do                      \
-    {                     \
-      a = avail;          \
-                          \
-      if (a == 0)         \
-        a = get_avail();  \
-      else                \
-      {                   \
-        avail = link(a);  \
-        link(a) = 0;      \
-      }                   \
-    }                     \
-  while (0)
-#endif
-/* sec 0124 */
-#define empty_flag  max_halfword
-#define is_empty(a) (link(a) == empty_flag)
-#define node_size   info
-#define llink(a)    info(a+1)
-#define rlink(a)    link(a+1)
-/* sec 0133 */
-#define type(a)    mem[a].hh.b0
-#define subtype(a) mem[a].hh.b1
-/* sec 0134 */
-#define is_char_node(a) (a >= hi_mem_min)
-#define font            type
-#define character       subtype
-/* sec 0135 */
-#define hlist_node      0
-#define box_node_size   7
-#define width_offset    1
-#define depth_offset    2
-#define height_offset   3
-#define width(a)        mem[a + width_offset].cint
-#define depth(a)        mem[a + depth_offset].cint
-#define height(a)       mem[a + height_offset].cint
-#define shift_amount(a) mem[a + 4].cint
-#define list_offset     5
-#define list_ptr(a)     link(a + list_offset)
-#define glue_order(a)   subtype(a + list_offset)
-#define glue_sign(a)    type(a + list_offset)
-#define normal          0
-#define stretching      1
-#define shrinking       2
-#define glue_offset     6
-#define glue_set(a)     mem[a + glue_offset].gr
-/* sec 0137 */
-#define vlist_node 1
-/* sec 0138 */
-#define rule_node      2
-#define rule_node_size 4
-#define null_flag      -010000000000L
-#define is_running(a)  (a == null_flag)
-/* sec 0140 */
-#define ins_node         3
-#define ins_node_size    5
-#define float_cost(a)    mem[a + 1].cint
-#define ins_ptr(a)       info(a + 4)
-#define split_top_ptr(a) link(a + 4)
-/* sec 0141 */
-#define mark_node       4
-#define small_node_size 2
-#define mark_ptr(a)     mem[a + 1].cint
-/* sec 0142 */
-#define adjust_node 5
-#define adjust_ptr  mark_ptr
-/* sec 0143 */
-#define ligature_node 6
-#define lig_char(a)   (a + 1)
-#define lig_ptr(a)    link(lig_char(a))
-/* sec 0145 */
-#define disc_node     7
-#define replace_count subtype
-#define pre_break     llink
-#define post_break    rlink
-/* sec 0146 */
-#define whatsit_node 8
-/* sec 0147 */
-#define math_node 9
-#define before    0
-#define after     1
-/* sec 0148 */
-#define precedes_break(a)  (type(a) < math_node)
-#define non_discardable(a) (type(a) < math_node)
-/* sec 0149 */
-#define glue_node      10
-#define cond_math_glue 98
-#define mu_glue        99
-#define a_leaders      100
-#define c_leaders      101
-#define x_leaders      102
-#define glue_ptr       llink
-#define leader_ptr     rlink
-/* sec 0150 */
-#define glue_spec_size    4
-#define glue_ref_count(a) link(a)
-#define stretch(a)        mem[a + 2].cint
-#define shrink(a)         mem[a + 3].cint
-#define stretch_order     type
-#define shrink_order      subtype
-#define fil               1
-#define fill              2
-#define filll             3
-/* sec 0155 */
-#define kern_node 11
-#define explicit  1
-#define acc_kern  2
-/* sec 0157 */
-#define penalty_node  12
-#define inf_penalty   inf_bad
-#define eject_penalty -inf_bad
-#define penalty(a)    mem[a + 1].cint
-/* sec 0159 */
-#define unset_node      13
-#define glue_stretch(a) mem[a + glue_offset].cint
-#define glue_shrink     shift_amount
-#define span_count      subtype
-/* sec 0162 */
-#define zero_glue         mem_bot // 0
-#define fil_glue          (zero_glue + glue_spec_size) // 4
-#define fill_glue         (fil_glue + glue_spec_size) // 8
-#define ss_glue           (fill_glue + glue_spec_size) // 12
-#define fil_neg_glue      (ss_glue + glue_spec_size) // 16
-#define lo_mem_stat_max   (fil_neg_glue + glue_spec_size - 1) // 19
-#define page_ins_head     mem_top
-#define contrib_head      (mem_top - 1)
-#define page_head         (mem_top - 2)
-#define temp_head         (mem_top - 3)
-#define hold_head         (mem_top - 4)
-#define adjust_head       (mem_top - 5)
-#define active            (mem_top - 7)
-#define align_head        (mem_top - 8)
-#define end_span          (mem_top - 9)
-#define omit_template     (mem_top - 10)
-#define null_list         (mem_top - 11)
-#define lig_trick         (mem_top - 12)
-#define garbage           (mem_top - 12)
-#define backup_head       (mem_top - 13)
-#define hi_mem_stat_min   (mem_top - 13)
-#define hi_mem_stat_usage 14
-/* sec 0200 */
-#define token_ref_count(a) info(a)
-/* sec 0203 */
-#define add_token_ref(a) incr(token_ref_count(a))
-#define add_glue_ref(a)  incr(glue_ref_count(a))
-/* sec 0207 */
-#define escape        0
-#define relax         0
-#define left_brace    1
-#define right_brace   2
-#define math_shift    3
-#define tab_mark      4
-#define car_ret       5
-#define out_param     5
-#define mac_param     6
-#define sup_mark      7
-#define sub_mark      8
-#define ignore        9
-#define endv          9
-#define spacer        10
-#define letter        11
-#define other_char    12
-#define active_char   13
-#define par_end       13
-#define match         13
-#define comment       14
-#define end_match     14
-#define stop          14
-#define invalid_char  15
-#define delim_num     15
-#define max_char_code 15
-/* sec 0208 */
-#define char_num      16
-#define math_char_num 17
-#define mark          18
-#define xray          19
-#define make_box      20
-#define hmove         21
-#define vmove         22
-#define un_hbox       23
-#define un_vbox       24
-#define remove_item   25
-#define hskip         26
-#define vskip         27
-#define mskip         28
-#define kern          29
-#define mkern         30
-#define leader_ship   31
-#define halign        32
-#define valign        33
-#define no_align      34
-#define vrule         35
-#define hrule         36
-#define insert        37
-#define vadjust       38
-#define ignore_spaces 39
-#define after_assignment 40
-#define after_group      41
-#define break_penalty    42
-#define start_par        43
-#define ital_corr        44
-#define accent           45
-#define math_accent      46
-#define discretionary    47
-#define eq_no            48
-#define left_right       49
-#define math_comp        50
-#define limit_switch     51
-#define above            52
-#define math_style       53
-#define math_choice      54
-#define non_script       55
-#define vcenter          56
-#define case_shift       57
-#define message          58
-#define extension        59
-#define in_stream        60
-#define begin_group      61
-#define end_group        62
-#define omit             63
-#define ex_space         64
-#define no_boundary      65
-#define radical          66
-#define end_cs_name      67
-#define min_internal     68
-#define char_given       68
-#define math_given       69
-#define last_item        70
-#define max_non_prefixed_command 70
-/* sec 0209 */
-#define toks_register     71
-#define assign_toks       72
-#define assign_int        73
-#define assign_dimen      74
-#define assign_glue       75
-#define assign_mu_glue    76
-#define assign_font_dimen 77
-#define assign_font_int   78
-#define set_aux           79
-#define set_prev_graf     80
-#define set_page_dimen    81
-#define set_page_int      82
-#define set_box_dimen     83
-#define set_shape         84
-#define def_code          85
-#define def_family        86
-#define set_font          87
-#define def_font          88
-#define tex_register      89
-#define max_internal      89
-#define advance           90
-#define multiply          91
-#define divide            92
-#define prefix            93
-#define let               94
-#define shorthand_def     95
-#define read_to_cs        96
-#define def               97
-#define set_box           98
-#define hyph_data         99
-#define set_interaction   100
-#define max_command       100
-/* sec 0210 */
-#define undefined_cs    (max_command + 1 )
-#define expand_after    (max_command + 2 )
-#define no_expand       (max_command + 3 )
-#define input           (max_command + 4 )
-#define if_test         (max_command + 5 )
-#define fi_or_else      (max_command + 6 )
-#define cs_name         (max_command + 7 )
-#define convert         (max_command + 8 )
-#define the             (max_command + 9 )
-#define top_bot_mark    (max_command + 10)
-#define call            (max_command + 11)
-#define long_call       (max_command + 12)
-#define outer_call      (max_command + 13)
-#define long_outer_call (max_command + 14)
-#define end_template    (max_command + 15)
-#define dont_expand     (max_command + 16)
-#define glue_ref        (max_command + 17)
-#define shape_ref       (max_command + 18)
-#define box_ref         (max_command + 19) 
-#define data            (max_command + 20)
-/* sec 0211 */
-#define vmode 1
-#define hmode (vmode + max_command + 1)
-#define mmode (hmode + max_command + 1)
-/* sec 0212 */
-#define ignore_depth -65536000L
-/* sec 0213 */
-#define mode            cur_list.mode_field
-#define head            cur_list.head_field
-#define tail            cur_list.tail_field
-#define aux             cur_list.aux_field
-#define prev_depth      aux.cint
-#define space_factor    aux.hh.lh
-#define clang           aux.hh.rh
-#define incompleat_noad aux.cint
-#define prev_graf       cur_list.pg_field
-#define mode_line       cur_list.ml_field
-/* sec 0221 */
-#define eq_level_field(a) a.hh.b1
-#define eq_type_field(a)  a.hh.b0
-#define equiv_field(a)    a.hh.rh
-#define eq_level(a)       eq_level_field(eqtb[a])
-#define eq_type(a)        eq_type_field(eqtb[a])
-#define equiv(a)          equiv_field(eqtb[a])
-#define level_zero        min_quarterword
-#define level_one         level_zero + 1
-/* sec 0222 */
-#define active_base                   1                                    // 1
-#define single_base                   (active_base + 256)                  // 257
-#define null_cs                       (single_base + 256)                  // 513
-#define hash_base                     (null_cs + 1)                        // 514
-#define frozen_control_sequence       (hash_base + hash_size + hash_extra) // (hash_size + hash_extra + 514)
-#define frozen_protection             frozen_control_sequence              // (hash_size + hash_extra + 514)
-#define frozen_cr                     (frozen_control_sequence + 1)        // (hash_size + hash_extra + 515)
-#define frozen_end_group              (frozen_control_sequence + 2)        // (hash_size + hash_extra + 516)
-#define frozen_right                  (frozen_control_sequence + 3)        // (hash_size + hash_extra + 517)
-#define frozen_fi                     (frozen_control_sequence + 4)        // (hash_size + hash_extra + 518)
-#define frozen_end_template           (frozen_control_sequence + 5)        // (hash_size + hash_extra + 519)
-#define frozen_endv                   (frozen_control_sequence + 6)        // (hash_size + hash_extra + 520)
-#define frozen_relax                  (frozen_control_sequence + 7)        // (hash_size + hash_extra + 521)
-#define end_write                     (frozen_control_sequence + 8)        // (hash_size + hash_extra + 522)
-#define frozen_dont_expand            (frozen_control_sequence + 9)        // (hash_size + hash_extra + 523)
-#define frozen_null_font              (frozen_control_sequence + 10)       // (hash_size + hash_extra + 524)
-#define font_id_base                  (frozen_null_font - font_base)       // (hash_size + hash_extra + 524)
-#define undefined_control_sequence    (frozen_null_font + font_max + 2)    // (hash_size + 781)
-#define glue_base                     (undefined_control_sequence + 1)     // (hash_size + 782)
-/* sec 0224 */
-#define line_skip_code                0  // 782
-#define baseline_skip_code            1  // 783
-#define par_skip_code                 2  // 784
-#define above_display_skip_code       3  // 785
-#define below_display_skip_code       4  // 786
-#define above_display_short_skip_code 5  // 787
-#define below_display_short_skip_code 6  // 788
-#define left_skip_code                7  // 789
-#define right_skip_code               8  // 790
-#define top_skip_code                 9  // 791
-#define split_top_skip_code           10 // 792
-#define tab_skip_code                 11 // 793
-#define space_skip_code               12 // 794
-#define xspace_skip_code              13 // 795
-#define par_fill_skip_code            14 // 796
-#define thin_mu_skip_code             15 // 797
-#define med_mu_skip_code              16 // 798
-#define thick_mu_skip_code            17 // 799
-#define glue_pars                     18 // 800
-#define skip_base                     (glue_base + glue_pars) // 800
-#define mu_skip_base                  (skip_base + 256) // 1056
-#define local_base                    (mu_skip_base + 256) // 1312
-// #
-#define skip(a)                       equiv(skip_base + a)
-#define mu_skip(a)                    equiv(mu_skip_base + a)
-#define glue_par(a)                   equiv(glue_base + a)
-#define line_skip                     glue_par(line_skip_code)
-#define baseline_skip                 glue_par(baseline_skip_code)
-#define par_skip                      glue_par(par_skip_code)
-#define above_display_skip            glue_par(above_display_skip_code)
-#define below_display_skip            glue_par(below_display_skip_code)
-#define above_display_short_skip      glue_par(above_display_short_skip_code)
-#define below_display_short_skip      glue_par(below_display_short_skip_code)
-#define left_skip                     glue_par(left_skip_code)
-#define right_skip                    glue_par(right_skip_code)
-#define top_skip                      glue_par(top_skip_code)
-#define split_top_skip                glue_par(split_top_skip_code)
-#define tab_skip                      glue_par(tab_skip_code)
-#define space_skip                    glue_par(space_skip_code)
-#define xspace_skip                   glue_par(xspace_skip_code)
-#define par_fill_skip                 glue_par(par_fill_skip_code)
-#define thin_mu_skip                  glue_par(thin_mu_skip_code)
-#define med_mu_skip                   glue_par(med_mu_skip_code)
-#define thick_mu_skip                 glue_par(thick_mu_skip_code)
-/* sec 0230 */
-#define par_shape_loc                 local_base             // 1312
-#define output_routine_loc            (local_base + 1)       // 1313
-#define every_par_loc                 (local_base + 2)       // 1314
-#define every_math_loc                (local_base + 3)       // 1315
-#define every_display_loc             (local_base + 4)       // 1316
-#define every_hbox_loc                (local_base + 5)       // 1317
-#define every_vbox_loc                (local_base + 6)       // 1318
-#define every_job_loc                 (local_base + 7)       // 1319
-#define every_cr_loc                  (local_base + 8)       // 1320
-#define err_help_loc                  (local_base + 9)       // 1321
-#define toks_base                     (local_base + 10)      // 1322
-#define box_base                      (toks_base + 256)      // 1578
-#define cur_font_loc                  (box_base + 256)       // 1834
-#define math_font_base                (cur_font_loc + 1)     // 1835
-#define cat_code_base                 (math_font_base + 48)  // 1883
-#define lc_code_base                  (cat_code_base + 256)  // 2139
-#define uc_code_base                  (lc_code_base + 256)   // 2395
-#define sf_code_base                  (uc_code_base + 256)   // 2651
-#define math_code_base                (sf_code_base + 256)   // 2907
-#define int_base                      (math_code_base + 256) // 3163
-// #
-#define par_shape_ptr                 equiv(par_shape_loc)
-#define output_routine                equiv(output_routine_loc)
-#define every_par                     equiv(every_par_loc)
-#define every_math                    equiv(every_math_loc)
-#define every_display                 equiv(every_display_loc)
-#define every_hbox                    equiv(every_hbox_loc)
-#define every_vbox                    equiv(every_vbox_loc)
-#define every_job                     equiv(every_job_loc)
-#define every_cr                      equiv(every_cr_loc)
-#define err_help                      equiv(err_help_loc)
-#define toks(a)                       equiv(toks_base + a)
-#define box(a)                        equiv(box_base + a)
-#define cur_font                      equiv(cur_font_loc)
-#define fam_fnt(a)                    equiv(math_font_base + a)
-#define cat_code(a)                   equiv(cat_code_base + a)
-#define lc_code(a)                    equiv(lc_code_base + a)
-#define uc_code(a)                    equiv(uc_code_base + a)
-#define sf_code(a)                    equiv(sf_code_base + a)
-#define math_code(a)                  equiv(math_code_base + a)
-/* sec 0232 */
-#define null_font font_base
-#define var_code 070000
-/* sec 0236 */
-#define pretolerance_code             0  // 3163
-#define tolerance_code                1  // 3164
-#define line_penalty_code             2  // 3165
-#define hyphen_penalty_code           3  // 3166
-#define ex_hyphen_penalty_code        4  // 3167
-#define club_penalty_code             5  // 3168
-#define widow_penalty_code            6  // 3169
-#define display_widow_penalty_code    7  // 3170
-#define broken_penalty_code           8  // 3171
-#define bin_op_penalty_code           9  // 3172
-#define rel_penalty_code              10 // 3173
-#define pre_display_penalty_code      11 // 3174
-#define post_display_penalty_code     12 // 3175
-#define inter_line_penalty_code       13 // 3176
-#define double_hyphen_demerits_code   14 // 3177
-#define final_hyphen_demerits_code    15 // 3178
-#define adj_demerits_code             16 // 3179
-#define mag_code                      17 // 3180
-#define delimiter_factor_code         18 // 3181
-#define looseness_code                19 // 3182
-#define time_code                     20 // 3183
-#define day_code                      21 // 3184
-#define month_code                    22 // 3185
-#define year_code                     23 // 3186
-#define show_box_breadth_code         24 // 3187
-#define show_box_depth_code           25 // 3188
-#define hbadness_code                 26 // 3189
-#define vbadness_code                 27 // 3190
-#define pausing_code                  28 // 3191
-#define tracing_online_code           29 // 3192
-#define tracing_macros_code           30 // 3193
-#define tracing_stats_code            31 // 3194
-#define tracing_paragraphs_code       32 // 3195
-#define tracing_pages_code            33 // 3196
-#define tracing_output_code           34 // 3197
-#define tracing_lost_chars_code       35 // 3198
-#define tracing_commands_code         36 // 3199 
-#define tracing_restores_code         37 // 3200
-#define uc_hyph_code                  38 // 3201
-#define output_penalty_code           39 // 3202
-#define max_dead_cycles_code          40 // 3203
-#define hang_after_code               41 // 3204
-#define floating_penalty_code         42 // 3205
-#define global_defs_code              43 // 3206
-#define cur_fam_code                  44 // 3207
-#define escape_char_code              45 // 3208
-#define default_hyphen_char_code      46 // 3209
-#define default_skew_char_code        47 // 3210
-#define end_line_char_code            48 // 3211
-#define new_line_char_code            49 // 3212
-#define language_code                 50 // 3213
-#define left_hyphen_min_code          51 // 3214
-#define right_hyphen_min_code         52 // 3215
-#define holding_inserts_code          53 // 3216
-#define error_context_lines_code      54 // 3217
-#define int_pars                      55
-#define count_base                    (int_base + int_pars) // 3218
-#define del_code_base                 (count_base + 256)    // 3474
-#define dimen_base                    (del_code_base + 256) // 3730
-// #
-#define del_code(a)                   eqtb[del_code_base + a].cint
-#define count(a)                      eqtb[count_base + a].cint
-#define int_par(a)                    eqtb[int_base + a].cint
-#define pretolerance                  int_par(pretolerance_code)
-#define tolerance                     int_par(tolerance_code)
-#define line_penalty                  int_par(line_penalty_code)
-#define hyphen_penalty                int_par(hyphen_penalty_code)
-#define ex_hyphen_penalty             int_par(ex_hyphen_penalty_code)
-#define club_penalty                  int_par(club_penalty_code)
-#define widow_penalty                 int_par(widow_penalty_code)
-#define display_widow_penalty         int_par(display_widow_penalty_code)
-#define broken_penalty                int_par(broken_penalty_code)
-#define bin_op_penalty                int_par(bin_op_penalty_code)
-#define rel_penalty                   int_par(rel_penalty_code)
-#define pre_display_penalty           int_par(pre_display_penalty_code)
-#define post_display_penalty          int_par(post_display_penalty_code)
-#define inter_line_penalty            int_par(inter_line_penalty_code)
-#define double_hyphen_demerits        int_par(double_hyphen_demerits_code)
-#define final_hyphen_demerits         int_par(final_hyphen_demerits_code)
-#define adj_demerits                  int_par(adj_demerits_code)
-#define mag                           int_par(mag_code)
-#define delimiter_factor              int_par(delimiter_factor_code)
-#define looseness                     int_par(looseness_code)
-#define tex_time                      int_par(time_code)
-#define day                           int_par(day_code)
-#define month                         int_par(month_code)
-#define year                          int_par(year_code)
-#define show_box_breadth              int_par(show_box_breadth_code)
-#define show_box_depth                int_par(show_box_depth_code)
-#define hbadness                      int_par(hbadness_code)
-#define vbadness                      int_par(vbadness_code)
-#define pausing                       int_par(pausing_code)
-#define tracing_online                int_par(tracing_online_code)
-#define tracing_macros                int_par(tracing_macros_code)
-#define tracing_stats                 int_par(tracing_stats_code)
-#define tracing_paragraphs            int_par(tracing_paragraphs_code)
-#define tracing_pages                 int_par(tracing_pages_code)
-#define tracing_output                int_par(tracing_output_code)
-#define tracing_lost_chars            int_par(tracing_lost_chars_code)
-#define tracing_commands              int_par(tracing_commands_code)
-#define tracing_restores              int_par(tracing_restores_code)
-#define uc_hyph                       int_par(uc_hyph_code)
-#define output_penalty                int_par(output_penalty_code)
-#define max_dead_cycles               int_par(max_dead_cycles_code)
-#define hang_after                    int_par(hang_after_code)
-#define floating_penalty              int_par(floating_penalty_code)
-#define global_defs                   int_par(global_defs_code)
-#define cur_fam                       int_par(cur_fam_code)
-#define escape_char                   int_par(escape_char_code)
-#define default_hyphen_char           int_par(default_hyphen_char_code)
-#define default_skew_char             int_par(default_skew_char_code)
-#define end_line_char                 int_par(end_line_char_code)
-#define new_line_char                 int_par(new_line_char_code)
-#define language                      int_par(language_code)
-#define left_hyphen_min               int_par(left_hyphen_min_code)
-#define right_hyphen_min              int_par(right_hyphen_min_code)
-#define holding_inserts               int_par(holding_inserts_code)
-#define error_context_lines           int_par(error_context_lines_code)
-/* sec 0247 */
-#define par_indent_code               0  // 3730
-#define math_surround_code            1  // 3731
-#define line_skip_limit_code          2  // 3732
-#define hsize_code                    3  // 3733
-#define vsize_code                    4  // 3734
-#define max_depth_code                5  // 3735
-#define split_max_depth_code          6  // 3736
-#define box_max_depth_code            7  // 3737
-#define hfuzz_code                    8  // 3738
-#define vfuzz_code                    9  // 3739
-#define delimiter_shortfall_code      10 // 3740
-#define null_delimiter_space_code     11 // 3741
-#define script_space_code             12 // 3742
-#define pre_display_size_code         13 // 3743
-#define display_width_code            14 // 3744
-#define display_indent_code           15 // 3745
-#define overfull_rule_code            16 // 3746
-#define hang_indent_code              17 // 3747
-#define h_offset_code                 18 // 3748
-#define v_offset_code                 19 // 3749
-#define emergency_stretch_code        20 // 3750
-#define dimen_pars                    21
-#define scaled_base                   (dimen_base + dimen_pars) // 3751
-#define eqtb_size                     (scaled_base + 255) // 4006
-// #
-#define dimen(a)                      eqtb[scaled_base + a].cint
-#define dimen_par(a)                  eqtb[dimen_base + a].cint
-#define par_indent                    dimen_par(par_indent_code)
-#define math_surround                 dimen_par(math_surround_code)
-#define line_skip_limit               dimen_par(line_skip_limit_code)
-#define hsize                         dimen_par(hsize_code)
-#define vsize                         dimen_par(vsize_code)
-#define max_depth                     dimen_par(max_depth_code)
-#define split_max_depth               dimen_par(split_max_depth_code)
-#define box_max_depth                 dimen_par(box_max_depth_code)
-#define hfuzz                         dimen_par(hfuzz_code)
-#define vfuzz                         dimen_par(vfuzz_code)
-#define delimiter_shortfall           dimen_par(delimiter_shortfall_code)
-#define null_delimiter_space          dimen_par(null_delimiter_space_code)
-#define script_space                  dimen_par(script_space_code)
-#define pre_display_size              dimen_par(pre_display_size_code)
-#define display_width                 dimen_par(display_width_code)
-#define display_indent                dimen_par(display_indent_code)
-#define overfull_rule                 dimen_par(overfull_rule_code)
-#define hang_indent                   dimen_par(hang_indent_code)
-#define h_offset                      dimen_par(h_offset_code)
-#define v_offset                      dimen_par(v_offset_code)
-#define emergency_stretch             dimen_par(emergency_stretch_code)
-/* sec 0256 */
-#define text(a)         hash[a].rh
-#define next(a)         hash[a].lh
-#define hash_is_full    (hash_used == hash_base)
-#define font_id_text(a) text(font_id_base + a)
-/* sec 0268 */
-#define save_type(a)      save_stack[a].hh.b0
-#define save_level(a)     save_stack[a].hh.b1
-#define save_index(a)     save_stack[a].hh.rh
-#define restore_old_value 0
-#define restore_zero      1
-#define insert_token      2
-#define level_boundary    3
-/* sec 0269 */
-#define bottom_level      0
-#define simple_group      1
-#define hbox_group        2
-#define adjust_hbox_group 3
-#define vbox_group        4
-#define vtop_group        5
-#define align_group       6
-#define no_align_group    7
-#define output_group      8
-#define math_group        9
-#define disc_group        10
-#define insert_group      11
-#define vcenter_group     12
-#define math_choice_group 13
-#define semi_simple_group 14
-#define math_shift_group  15
-#define math_left_group   16
-#define max_group_code    16
-/* sec 0274 */
-#define saved(a) save_stack[save_ptr + (a)].cint
-/* sec 0289 */
-#define cs_token_flag     07777 // 4095
-#define left_brace_token  0400  // 256  = 2^8 * left_brace
-#define left_brace_limit  01000 // 512  = 2^8 * (left_brace + 1)
-#define right_brace_token 01000 // 512  = 2^8 * right_brace
-#define right_brace_limit 01400 // 768  = 2^8 * (right_brace + 1)
-#define math_shift_token  01400 // 768  = 2^8 * math_shift
-#define tab_token         02000 // 1024 = 2^8 * tab_mark
-#define out_param_token   02400 // 1280 = 2^8 * out_param
-#define space_token       05040 // 2592 = 2^8 * spacer + ' '
-#define letter_token      05400 // 2816 = 2^8 * letter
-#define other_token       06000 // 3072 = 2^8 * other_char
-#define match_token       06400 // 3328 = 2^8 * match
-#define end_match_token   07000 // 3584 = 2^8 * end_match
-/* sec 0298 */
-#define chr_cmd(s)  \
-do                  \
-{                   \
-  prints(s);        \
-  print(chr_code);  \
-}                   \
-while (0)
-/* sec 0302 */
-#define state cur_input.state_field
-#define index cur_input.index_field
-#define start cur_input.start_field
-#define limit cur_input.limit_field
-#define name  cur_input.name_field
-/* sec 0303 */
-#define mid_line    1
-#define skip_blanks 2 + max_char_code // 17
-#define new_line    3 + max_char_code + max_char_code // 33
-/* sec 0304 */
-#define cur_file input_file[index]
-/* sec 0305 */
-#define skipping  1
-#define defining  2
-#define matching  3
-#define aligning  4
-#define absorbing 5
-/* sec 0307 */
-#define token_list         0
-#define token_type         index
-#define param_start        limit
-#define parameter          0
-#define u_template         1
-#define v_template         2
-#define backed_up          3
-#define inserted           4
-#define macro              5
-#define output_text        6
-#define every_par_text     7
-#define every_math_text    8
-#define every_display_text 9
-#define every_hbox_text    10
-#define every_vbox_text    11
-#define every_job_text     12
-#define every_cr_text      13
-#define mark_text          14
-#define write_text         15
-/* sec 0316 */
-#define begin_pseudoprint() \
-do                          \
-{                           \
-  l = tally;                \
-  tally = 0;                \
-  selector = pseudo;        \
-  trick_count = 1000000L;   \
-}                           \
-while (0)
-#define set_trick_count()                                 \
-do                                                        \
-{                                                         \
-  first_count = tally;                                    \
-  trick_count = tally + 1 + error_line - half_error_line; \
-                                                          \
-  if (trick_count < error_line)                           \
-    trick_count = error_line;                             \
-}                                                         \
-while (0)
-/* sec 0322 */
-/* sec 0323 */
-#define back_list(a) begin_token_list(a, backed_up)
-#define ins_list(a)  begin_token_list(a, inserted)
-/* sec 0344 */
-#define any_state_plus(a) mid_line + (a): case skip_blanks + (a): case new_line + (a)
-/* sec 0347 */
-#define add_delims_to(a) \
-  (a) + math_shift:      \
-  case (a) + tab_mark:   \
-  case (a) + mac_param:  \
-  case (a) + sub_mark:   \
-  case (a) + letter:     \
-  case (a) + other_char
-/* sec 0352 */
-#define is_hex(a) \
-  (((a >= '0') && (a <= '9')) || ((a >= 'a') && (a <= 'f')))
-#define hex_to_cur_chr()                    \
-do                                          \
-{                                           \
-  if (c <= '9')                             \
-    cur_chr = c - '0';                      \
-  else                                      \
-    cur_chr = c - 'a' + 10;                 \
-                                            \
-  if (cc <= '9')                            \
-    cur_chr = 16 * cur_chr + cc - '0';      \
-  else                                      \
-    cur_chr = 16 * cur_chr + cc - 'a' + 10; \
-}                                           \
-while (0)
-/* sec 0360 */
-#define end_line_char_inactive()  \
-  (end_line_char < 0) || (end_line_char > 255)
-/* sec 0358 */
-/* sec 0371 */
-#define store_new_token(a)  \
-  do                        \
-    {                       \
-      q = get_avail();      \
-      link(p) = q;          \
-      info(q) = a;          \
-      p = q;                \
-    }                       \
-  while (0)
-#define fast_store_new_token(a) \
-  do                            \
-    {                           \
-      fast_get_avail(q);        \
-      link(p) = q;              \
-      info(q) = a;              \
-      p = q;                    \
-    }                           \
-  while (0)
-#define no_expand_flag 257
-/* sec 0382 */
-#define top_mark_code         0
-#define first_mark_code       1
-#define bot_mark_code         2
-#define split_first_mark_code 3
-#define split_bot_mark_code   4
-#define top_mark              cur_mark[top_mark_code]
-#define first_mark            cur_mark[first_mark_code]
-#define bot_mark              cur_mark[bot_mark_code]
-#define split_first_mark      cur_mark[split_first_mark_code]
-#define split_bot_mark        cur_mark[split_bot_mark_code]
-/* sec 0400 */
-#define int_val   0
-#define dimen_val 1
-#define glue_val  2
-#define mu_val    3
-#define ident_val 4
-#define tok_val   5
-/* sec 0413 */
-#define scanned_result(va, vb) \
-do                            \
-  {                           \
-    cur_val = va;             \
-    cur_val_level = vb;       \
-  }                           \
-while (0)
-/* sec 0416 */
-#define input_line_no_code (glue_val + 1)
-#define badness_code       (glue_val + 2)
-/* sec 0421 */
-#define max_dimen 07777777777
-/* sec 0438 */
-#define octal_token             (other_token + '\'') // 3111
-#define hex_token               (other_token + '"' ) // 3106
-#define alpha_token             (other_token + '`' ) // 3168
-#define point_token             (other_token + '.' ) // 3118
-#define continental_point_token (other_token + ',' ) // 3116
-/* sec 0445 */
-#define zero_token    (other_token  + '0') // 3120
-#define A_token       (letter_token + 'A') // 2881
-#define other_A_token (other_token  + 'A') // 3137
-/* sec 0458 */
-#define set_conversion(a, b)  \
-  do                          \
-  {                           \
-    num = a;                  \
-    denom = b;                \
-  } while (0)
-/* sec 0468 */
-#define number_code        0
-#define roman_numeral_code 1
-#define string_code        2
-#define meaning_code       3
-#define font_name_code     4
-#define job_name_code      5
-/* sec 0480 */
-#define closed    2
-#define just_open 1
-/* sec 0487 */
-#define if_char_code   0
-#define if_cat_code    1
-#define if_int_code    2
-#define if_dim_code    3
-#define if_odd_code    4
-#define if_vmode_code  5
-#define if_hmode_code  6
-#define if_mmode_code  7
-#define if_inner_code  8
-#define if_void_code   9
-#define if_hbox_code   10
-#define if_vbox_code   11
-#define ifx_code       12
-#define if_eof_code    13
-#define if_true_code   14
-#define if_false_code  15
-#define if_case_code   16
-/* sec 0489 */
-#define if_node_size     2
-#define if_line_field(a) mem[(a) + 1].cint
-#define if_code          1
-#define fi_code          2
-#define else_code        3
-#define or_code          4
-/* sec 0506 */
-#define get_x_token_or_active_char()                    \
-do                                                      \
-{                                                       \
-  get_x_token();                                        \
-                                                        \
-  if (cur_cmd == relax)                                 \
-    if (cur_chr == no_expand_flag)                      \
-    {                                                   \
-      cur_cmd = active_char;                            \
-      cur_chr = cur_tok - cs_token_flag - active_base;  \
-    }                                                   \
-}                                                       \
-while (0)
-/* sec 0519 */
-#define append_to_name(a)       \
-do                              \
-{                               \
-  c = a; incr(k);               \
-                                \
-  if (k < file_name_size)       \
-    name_of_file[k] = xchr[c];  \
-}                               \
-while (0)
-/* sec 0544 */
-#define no_tag   0
-#define lig_tag  1
-#define list_tag 2
-#define ext_tag  3
-/* sec 0545 */
-#define stop_flag    128
-#define kern_flag    128
-#define skip_byte(a) a.b0
-#define next_char(a) a.b1
-#define op_byte(a)   a.b2
-#define rem_byte(a)  a.b3
-/* sec 0546 */
-#define ext_top(a) a.b0
-#define ext_mid(a) a.b1
-#define ext_bot(a) a.b2
-#define ext_rep(a) a.b3
-/* sec 0547 */
-#define slant_code         1
-#define space_code         2
-#define space_stretch_code 3
-#define space_shrink_code  4
-#define x_height_code      5
-#define quad_code          6
-#define extra_space_code   7
-/* sec 0549 */
-#define non_char    256
-#define non_address 0
-/* sec 0554 */
-#define char_info(a, b)   font_info[char_base[a] + b].qqqq
-#define char_width(a, b)  font_info[width_base[a] + b.b0].cint
-#define char_exists(a)    (a.b0 > min_quarterword)
-#define char_italic(a, b) font_info[italic_base[a] + (b.b2) / 4].cint
-#define height_depth(a)   (a.b1)
-#define char_height(a, b) font_info[height_base[a] + (b) / 16].cint
-#define char_depth(a, b)  font_info[depth_base[a] + (b) % 16].cint
-#define char_tag(a)       (a.b2 % 4)
-/* sec 0557 */
-#define char_kern(a, b)        font_info[kern_base[a] + 256 * op_byte(b) + rem_byte(b)].cint
-#define kern_base_offset       (256 * (128 + min_quarterword))
-#define lig_kern_start(a, b)   lig_kern_base[a] + rem_byte(b)
-#define lig_kern_restart(a, b) lig_kern_base[a] + 256 * op_byte(b) + rem_byte(b) + 32768 - kern_base_offset
-/* sec 0558 */
-#define param(a, b)      font_info[a + param_base[b]].cint
-#define slant(f)         param(slant_code, f)
-#define space(f)         param(space_code, f)
-#define space_stretch(f) param(space_stretch_code, f)
-#define space_shrink(f)  param(space_shrink_code, f)
-#define x_height(f)      param(x_height_code, f)
-#define quad(f)          param(quad_code, f)
-#define extra_space(f)   param(extra_space_code, f)
-/* sec 0561 */
-#define start_font_error_message()  \
-do                                  \
-{                                   \
-  print_err("Font ");               \
-  sprint_cs(u);                     \
-  print_char('=');                  \
-  print_file_name(nom, aire, 335);  \
-                                    \
-  if (s >= 0)                       \
-  {                                 \
-    prints(" at ");                 \
-    print_scaled(s);                \
-    prints("pt");                   \
-  }                                 \
-  else if (s != -1000)              \
-  {                                 \
-    prints(" scaled ");             \
-    print_int(-(integer)s);         \
-  }                                 \
-}                                   \
-while (0)
-/* sec 0564 */
-#define read_sixteen(a) \
-do                      \
-  {                     \
-    a = fbyte;          \
-                        \
-    if (a > 127)        \
-      goto bad_tfm;     \
-                        \
-    fget();             \
-    a = a * 256 + fbyte;\
-  }                     \
-while (0)
-#define store_four_quarters(val)  \
-do                                \
-  {                               \
-    fget(); a = fbyte; qw.b0 = a; \
-    fget(); b = fbyte; qw.b1 = b; \
-    fget(); c = fbyte; qw.b2 = c; \
-    fget(); d = fbyte; qw.b3 = d; \
-    val = qw;                     \
-  }                               \
-while (0)
-/* sec 0570 */
-#define check_byte_range(a) \
-do                          \
-{                           \
-  if ((a < bc) || (a > ec)) \
-    goto bad_tfm;           \
-}                           \
-  while (0)
-/* sec 0571 */
-#define store_scaled(a)                                       \
-do                                                            \
-{                                                             \
-  fget(); a = fbyte; fget(); b = fbyte;                       \
-  fget(); c = fbyte; fget(); d = fbyte;                       \
-  sw = (((((d * z) / 256) + (c * z)) / 256) + (b * z)) / beta;\
-                                                              \
-  if (a == 0)                                                 \
-    a = sw;                                                   \
-  else if (a == 255)                                          \
-    a = sw - alpha;                                           \
-  else                                                        \
-    goto bad_tfm;                                             \
-}                                                             \
-while (0)
-/* sec 0573 */
-#define check_existence(a)  \
-do                          \
-{                           \
-  check_byte_range(a);      \
-                            \
-  qw = char_info(f, a);     \
-                            \
-  if (!char_exists(qw))     \
-    goto bad_tfm;           \
-}                           \
-while (0)
-/* sec 0576 */
-#define adjust(a) a[f] = a[f]
-/* sec 0585 */
-#define set1      128 // c[1]
-#define set2      129 // c[2]
-#define set3      130 // c[3]
-#define set4      131 // c[4]
-#define set_rule  132 // a[4] b[4]
-#define put1      133 // c[1]
-#define put2      134 // c[2]
-#define put3      135 // c[3]
-#define put4      136 // c[4]
-#define put_rule  137 // a[4] b[4]
-#define nop       138 // NULL
-#define bop       139 // c0[4] c1[4] ... c9[4] p[4]
-#define eop       140 // NULL
-#define push      141
-#define pop       142
-#define right1    143 // b[1]
-#define right2    144 // b[2]
-#define right3    145 // b[3]
-#define right4    146 // b[4]
-#define w0        147 //
-#define w1        148 // b[1]
-#define w2        149 // b[2]
-#define w3        150 // b[3]
-#define w4        151 // b[4]
-#define x0        152 //
-#define x1        153 // b[1]
-#define x2        154 // b[2]
-#define x3        155 // b[3]
-#define x4        156 // b[4]
-#define down1     157 // a[1]
-#define down2     158 // a[2]
-#define down3     159 // a[3]
-#define down4     160 // a[4]
-#define y0        161 //
-#define y1        162 // a[1]
-#define y2        163 // a[2]
-#define y3        164 // a[3]
-#define y4        165 // a[4]
-#define z0        166 //
-#define z1        167 // a[1]
-#define z2        168 // a[2]
-#define z3        169 // a[3]
-#define z4        170 // a[4]
-#define fnt_num_0 171 //
-#define fnt1      235 // k[1]
-#define fnt2      236 // k[2]
-#define fnt3      237 // k[3]
-#define fnt4      238 // k[4]
-#define xxx1      239 // k[1] x[k]
-#define xxx2      240 // k[2] x[k]
-#define xxx3      241 // k[3] x[k]
-#define xxx4      242 // k[4] x[k]
-#define fnt_def1  243 // k[1] c[4] s[4] d[4] a[1] l[1] n[a + l]
-#define fnt_def2  244 // k[2] c[4] s[4] d[4] a[1] l[1] n[a + l]
-#define fnt_def3  245 // k[3] c[4] s[4] d[4] a[1] l[1] n[a + l]
-#define fnt_def4  246 // k[4] c[4] s[4] d[4] a[1] l[1] n[a + l]
-#define pre       247 // i[1] num[4] den[4] mag[4] k[1] x[k]
-#define post      248 //
-#define post_post 249 //
-/* sec 0587 */
-#define id_byte 2
-/* sec 0605 */
-#define movement_node_size 3
-#define location(a) mem[a + 2].cint
-/* sec 0608 */
-#define y_here  1
-#define z_here  2
-#define yz_OK   3
-#define y_OK    4
-#define z_OK    5
-#define d_fixed 6
-/* sec 0611 */
-#define none_seen 0
-#define y_seen    6
-#define z_seen    12
-/* sec 0625 */
-#define billion 1000000000.0
-#define vet_glue(a)             \
-do                              \
-{                               \
-  glue_temp = a;                \
-  if (glue_temp > billion)      \
-    glue_temp = billion;        \
-  else if (glue_temp < -billion)\
-    glue_temp = -billion;       \
-}                               \
-while (0)
-/* sec 0644 */
-#define exactly    0
-#define additional 1
-#define natural 0, additional
-/* sec 0769 */
-#define u_part(a)     mem[(a) + height_offset].cint
-#define v_part(a)     mem[(a) + depth_offset].cint
-#define extra_info(a) info((a) + list_offset)
-/* sec 0681 */
-#define noad_size      4
-#define nucleus(a)     ((a) + 1)
-#define supscr(a)      ((a) + 2)
-#define subscr(a)      ((a) + 3)
-#define math_type      link
-#define fam            font
-#define math_char      1
-#define sub_box        2
-#define sub_mlist      3
-#define math_text_char 4
-/* sec 0682 */
-#define ord_noad   (unset_node + 3) // 16
-#define op_noad    (ord_noad + 1  ) // 17
-#define bin_noad   (ord_noad + 2  ) // 18
-#define rel_noad   (ord_noad + 3  ) // 19
-#define open_noad  (ord_noad + 4  ) // 20
-#define close_noad (ord_noad + 5  ) // 21
-#define punct_noad (ord_noad + 6  ) // 22
-#define inner_noad (ord_noad + 7  ) // 23
-#define limits    1
-#define no_limits 2
-/* sec 0683 */
-#define left_delimiter(a)  ((a) + 4)
-#define right_delimiter(a) ((a) + 5)
-#define radical_noad       (inner_noad + 1) // 24
-#define radical_noad_size  5
-#define fraction_noad      (radical_noad + 1) // 25
-#define fraction_noad_size 6
-#define small_fam(a)       mem[(a)].qqqq.b0
-#define small_char(a)      mem[(a)].qqqq.b1
-#define large_fam(a)       mem[(a)].qqqq.b2
-#define large_char(a)      mem[(a)].qqqq.b3
-#define thickness          width
-#define default_code       010000000000L
-#define numerator          supscr
-#define denominator        subscr
-/* sec 0687 */
-#define under_noad        (fraction_noad + 1) // 26
-#define over_noad         (under_noad + 1   ) // 27
-#define accent_noad       (over_noad + 1    ) // 28
-#define accent_noad_size  5
-#define accent_chr(a)     (a) + 4
-#define vcenter_noad      (accent_noad + 1  ) // 29
-#define left_noad         (vcenter_noad + 1 ) // 30
-#define right_noad        (left_noad + 1    ) // 31
-#define delimiter         nucleus
-#define script_allowed(a) ((type(a) >= ord_noad) && (type(a) < left_noad))
-/* sec 0688 */
-#define style_node          (unset_node + 1)
-#define style_node_size     3
-#define display_style       0
-#define text_style          2
-#define script_style        4
-#define script_script_style 6
-#define cramped             1
-/* sec 0689 */
-#define choice_node            (unset_node + 2)
-#define display_mlist(a)       info(a + 1)
-#define text_mlist(a)          link(a + 1)
-#define script_mlist(a)        info(a + 2)
-#define script_script_mlist(a) link(a + 2)
-/* sec 0699 */
-#define text_size          0
-#define script_size        16
-#define script_script_size 32
-/* sec 0700 */
-#define mathsy(a, b)        font_info[a + param_base[fam_fnt(2 + b)]].cint
-#define math_x_height(a)    mathsy(5, a)
-#define math_quad(a)        mathsy(6, a)
-#define num1(a)             mathsy(8, a)
-#define num2(a)             mathsy(9, a)
-#define num3(a)             mathsy(10, a)
-#define denom1(a)           mathsy(11, a)
-#define denom2(a)           mathsy(12, a)
-#define sup1(a)             mathsy(13, a)
-#define sup2(a)             mathsy(14, a)
-#define sup3(a)             mathsy(15, a)
-#define sub1(a)             mathsy(16, a)
-#define sub2(a)             mathsy(17, a)
-#define sup_drop(a)         mathsy(18, a)
-#define sub_drop(a)         mathsy(19, a)
-#define delim1(a)           mathsy(20, a)
-#define delim2(a)           mathsy(21, a)
-#define axis_height(a)      mathsy(22, a)
-#define total_mathsy_params 22
-/* sec 0701 */
-#define mathex(a)              font_info[(a) + param_base[fam_fnt(3 + cur_size)]].cint
-#define default_rule_thickness mathex(8)
-#define big_op_spacing1        mathex(9)
-#define big_op_spacing2        mathex(10)
-#define big_op_spacing3        mathex(11)
-#define big_op_spacing4        mathex(12)
-#define big_op_spacing5        mathex(13)
-#define total_mathex_params    13
-/* sec 0702 */
-#define cramped_style(a) (2 * ((a) / 2) + cramped)
-#define sub_style(a)     (2 * ((a) / 4) + script_style + cramped)
-#define sup_style(a)     (2 * ((a) / 4) + script_style + ((a) % 2))
-#define num_style(a)     ((a) + 2 - 2 * ((a) / 6))
-#define denom_style(a)   (2 * ((a) / 2) + cramped + 2 - 2 * ((a) / 6))
-/* sec 0716 */
-#define mu_mult(a) nx_plus_y(n, a, xn_over_d(a, f, 0200000))
-/* sec 0725 */
-#define new_hlist(a) mem[nucleus(a)].cint
-/* sec 0731 */
-#define choose_mlist(a) \
-do                      \
-{                       \
-  p = a(q);             \
-  a(q) = 0;             \
-}                       \
-while (0)
-/* sec 0770 */
-#define preamble              link(align_head)
-#define align_stack_node_size 5
-/* sec 0780 */
-#define span_code          256
-#define cr_code            257
-#define cr_cr_code         (cr_code + 1)
-#define end_template_token (cs_token_flag + frozen_end_template)
-/* sec 0797 */
-#define span_node_size 2
-/* sec 0817 */
-#define tight_fit      3
-#define loose_fit      1
-#define very_loose_fit 0
-#define decent_fit     2
-/* sec 0819 */
-#define active_node_size  3
-#define fitness           subtype
-#define break_node        rlink
-#define line_number       llink
-#define total_demerits(a) mem[a + 2].cint
-#define unhyphenated      0
-#define hyphenated        1
-#define last_active       active
-/* sec 0821 */
-#define passive_node_size 2
-#define cur_break         rlink
-#define prev_break        llink
-#define serial            info
-/* sec 0822 */
-#define delta_node_size 7
-#define delta_node      2
-/* sec 0823 */
-#define do_all_six(a) \
-do                    \
-{                     \
-  a(1); a(2); a(3);   \
-  a(4); a(5); a(6);   \
-}                     \
-while (0)
-/* sec 0825 */
-#define check_shrinkage(s)                            \
-do                                                    \
-{                                                     \
-  if ((shrink_order(s) != normal) && (shrink(s) != 0))\
-    s = finite_shrink(s);                             \
-}                                                     \
-while (0)
-/* sec 0829 */
-#define copy_to_cur_active(a) cur_active_width[a] = active_width[a]
-/* sec 0832 */
-#define update_width(a) cur_active_width[a] = cur_active_width[a] + mem[r + (a)].cint
-/* sec 0833 */
-#define awful_bad 07777777777
-/* sec 0837 */
-#define set_break_width_to_background(a) break_width[a] = background[a]
-/* sec 0843 */
-#define convert_to_break_width(a)   mem[prev_r + (a)].cint = mem[prev_r + (a)].cint - cur_active_width[a] + break_width[a]
-#define store_break_width(a)        active_width[a] = break_width[a]
-#define new_delta_to_break_width(a) mem[q + (a)].cint = break_width[(a)] - cur_active_width[(a)]
-/* sec 0844 */
-#define new_delta_from_break_width(a) mem[q + (a)].cint = cur_active_width[(a)] - break_width[(a)]
-/* sec 0860 */
-#define combine_two_deltas(a) mem[prev_r + (a)].cint = mem[prev_r + (a)].cint + mem[r + (a)].cint
-#define downdate_width(a)     cur_active_width[(a)] = cur_active_width[(a)] - mem[prev_r + (a)].cint
-/* sec 0861 */
-#define update_active(a) active_width[(a)] = active_width[(a)] + mem[r + (a)].cint
-/* sec 0864 */
-#define store_background(a) active_width[a] = background[a]
-/* sec 0866 */
-#define act_width active_width[1]
-#define kern_break()                                \
-do                                                  \
-{                                                   \
-  if (!is_char_node(link(cur_p)) && auto_breaking)  \
-    if (type(link(cur_p)) == glue_node)             \
-      try_break(0, unhyphenated);                   \
-                                                    \
-  act_width = act_width + width(cur_p);             \
-}                                                   \
-while (0)
-/* sec 0877 */
-#define next_break prev_break
-/* sec 0908 */
-#define append_charnode_to_t(a) \
-do                              \
-  {                             \
-    link(t) = get_avail();      \
-    t = link(t);                \
-    font(t) = hf;               \
-    character(t) = (a);         \
-  }                             \
-while (0)
-#define set_cur_r()      \
-do                       \
-  {                      \
-    if (j < n)           \
-      cur_r = hu[j + 1]; \
-    else                 \
-      cur_r = bchar;     \
-                         \
-    if (odd(hyf[j]))     \
-      cur_rh = hchar;    \
-    else                 \
-      cur_rh = non_char; \
-  }                      \
-while (0)
-/* sec 0910 */
-#define wrap_lig(a)                           \
-do                                            \
-{                                             \
-  if (ligature_present)                       \
-  {                                           \
-    p = new_ligature(hf, cur_l, link(cur_q)); \
-                                              \
-    if (lft_hit)                              \
-    {                                         \
-      subtype(p) = 2;                         \
-      lft_hit = false;                        \
-    }                                         \
-                                              \
-    if ((a))                                  \
-      if (lig_stack == 0)                     \
-      {                                       \
-        incr(subtype(p));                     \
-        rt_hit = false;                       \
-      }                                       \
-                                              \
-    link(cur_q) = p;                          \
-    t = p;                                    \
-    ligature_present = false;                 \
-  }                                           \
-}                                             \
-while (0)
-#define pop_lig_stack()                       \
-do                                            \
-  {                                           \
-    if (lig_ptr(lig_stack) != 0)              \
-    {                                         \
-      link(t) = lig_ptr(lig_stack);           \
-      t = link(t);                            \
-      incr(j);                                \
-    }                                         \
-                                              \
-    p = lig_stack;                            \
-    lig_stack = link(p);                      \
-    free_node(p, small_node_size);            \
-                                              \
-    if (lig_stack == 0)                       \
-    {                                         \
-      set_cur_r();                            \
-    }                                         \
-    else                                      \
-      cur_r = character(lig_stack);           \
-  }                                           \
-while (0)
-/* sec 0914 */
-#define advance_major_tail()       \
-do                                 \
-  {                                \
-    major_tail = link(major_tail); \
-    incr(r_count);                 \
-  }                                \
-while (0)
-/* sec 0970 */
-#define active_height      active_width
-#define cur_height         active_height[1]
-#define set_height_zero(a) active_width[(a)] = 0
-/* sec 0974 */
-#define deplorable 100000L
-/* sec 0980 */
-#define inserts_only 1
-#define box_there    2
-/* sec 0981 */
-#define page_ins_node_size 4
-#define inserting          0
-#define split_up           1
-#define broken_ptr(a)      link(a + 1)
-#define broken_ins(a)      info(a + 1)
-#define last_ins_ptr(a)    link(a + 2)
-#define best_ins_ptr(a)    info(a + 2)
-/* sec 0982 */
-#define page_goal   page_so_far[0]
-#define page_total  page_so_far[1]
-#define page_shrink page_so_far[6]
-#define page_depth  page_so_far[7]
-/* sec 0987 */
-#define set_page_so_far_zero(a) page_so_far[(a)] = 0
-/* sec 1034 */
-#define adjust_space_factor()   \
-do                              \
-{                               \
-  main_s = sf_code(cur_chr);    \
-  if (main_s == 1000)           \
-    space_factor = 1000;        \
-  else if (main_s < 1000)       \
-  {                             \
-    if (main_s > 0)             \
-      space_factor = main_s;    \
-  }                             \
-  else if (space_factor < 1000) \
-    space_factor = 1000;        \
-  else                          \
-    space_factor = main_s;      \
-}                               \
-while (0)
-/* sec 1035 */
-/* -> false */
-#define wrapup(a)                                         \
-do                                                        \
-{                                                         \
-  if (cur_l < non_char)                                   \
-  {                                                       \
-    if (link(cur_q) != 0)                                 \
-      if (character(tail) == hyphen_char[main_f])         \
-        ins_disc = true;                                  \
-                                                          \
-    if (ligature_present)                                 \
-    {                                                     \
-      main_p = new_ligature(main_f, cur_l, link(cur_q));  \
-                                                          \
-      if (lft_hit)                                        \
-      {                                                   \
-        subtype(main_p) = 2;                              \
-        lft_hit = false;                                  \
-      }                                                   \
-                                                          \
-      if (a)                                              \
-        if (lig_stack == 0)                               \
-        {                                                 \
-          incr(subtype(main_p));                          \
-          rt_hit = false;                                 \
-        }                                                 \
-                                                          \
-      link(cur_q) = main_p;                               \
-      tail = main_p;                                      \
-      ligature_present = false;                           \
-    }                                                     \
-                                                          \
-    if (ins_disc)                                         \
-    {                                                     \
-      ins_disc = false;                                   \
-                                                          \
-      if (mode > 0)                                       \
-      {                                                   \
-        tail_append(new_disc());                          \
-      }                                                   \
-    }                                                     \
-  }                                                       \
-}                                                         \
-while (0)
-/* sec 1045 */
-#define any_mode(a) vmode + a: case hmode + a: case mmode + a
-/* sec 1046 */
-#define non_math(a) vmode + a: case hmode + a
-/* sec 1058 */
-#define fil_code     0
-#define fill_code    1
-#define ss_code      2
-#define fil_neg_code 3
-#define skip_code    4
-#define mskip_code   5
-/* sec 1071 */
-#define box_flag      010000000000
-#define ship_out_flag (box_flag + 512)
-#define leader_flag   (box_flag + 513)
-#define box_code      0
-#define copy_code     1
-#define last_box_code 2
-#define vsplit_code   3
-#define vtop_code     4
-/* sec 1178 */
-#define above_code     0
-#define over_code      1
-#define atop_code      2
-#define delimited_code 3
-/* sec 1214 */
-#define define(p, t, e) \
-do                      \
-{                       \
-  if (a >= 4)           \
-    geq_define(p, t, e);\
-  else                  \
-    eq_define(p, t, e); \
-}                       \
-while (0)
-#define word_define(p, w) \
-do                        \
-{                         \
-  if (a >= 4)             \
-    geq_word_define(p, w);\
-  else                    \
-    eq_word_define(p, w); \
-}                         \
-while (0)
-/* sec 1222 */
-#define char_def_code      0
-#define math_char_def_code 1
-#define count_def_code     2
-#define dimen_def_code     3
-#define skip_def_code      4
-#define mu_skip_def_code   5
-#define toks_def_code      6
-/* sec 1290 */
-#define show_code     0
-#define show_box_code 1
-#define show_the_code 2
-#define show_lists    3
-/* sec 1306 */
-#define undump(va, vb, vc)        \
-do                                \
-  {                               \
-    undump_int(x);                \
-                                  \
-    if ((x < (va)) || (x > (vb))) \
-      goto bad_fmt;               \
-    else                          \
-      vc = x;                     \
-  }                               \
-while (0)
-/* sec 1342 */
-#define write_node_size 2
-#define open_node_size  3
-#define open_node       0
-#define write_node      1
-#define close_node      2
-#define special_node    3
-#define language_node   4
-#define what_lang(s)    link(s+1)
-#define what_lhm(s)     type(s+1)
-#define what_rhm(s)     subtype(s+1)
-#define write_tokens(s) link(s+1)
-#define write_stream(s) info(s+1)
-#define open_name(s)    link(s+1)
-#define open_area(s)    info(s+2)
-#define open_ext(s)     link(s+2)
-/* sec 1344 */
-#define immediate_code    4
-#define set_language_code 5
-/* sec 1371 */
-#define end_write_token (cs_token_flag + end_write)
-
+/* Copyright 2014 Clerk Ma\r
+\r
+   This program is free software; you can redistribute it and/or modify\r
+   it under the terms of the GNU General Public License as published by\r
+   the Free Software Foundation; either version 2 of the License, or\r
+   (at your option) any later version.\r
+\r
+   This program is distributed in the hope that it will be useful, but\r
+   WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+   General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with this program; if not, write to the Free Software\r
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA\r
+   02110-1301 USA.  */\r
+#ifndef _YANDYTEX_MACROS_H\r
+#define _YANDYTEX_MACROS_H\r
+\r
+#define font_base 0\r
+/* sec 0022 */\r
+#define null_code       0     // 0\r
+#define carriage_return 015   // 13\r
+#define invalid_code    0177  // 127\r
+/* sec 0036 */\r
+#define loc cur_input.loc_field\r
+/* sec 0040 */\r
+#define length(s) (str_start[(s) + 1] - str_start[(s)])\r
+/* sec 0041 */\r
+#define cur_length (pool_ptr - str_start[str_ptr])\r
+/* sec 0054 */\r
+enum \r
+{\r
+  no_print     = 16,\r
+  term_only    = 17,\r
+  log_only     = 18,\r
+  term_and_log = 19,\r
+  pseudo       = 20,\r
+  new_string   = 21,\r
+  max_selector = 21,\r
+};\r
+/* sec 0073 */\r
+enum\r
+{\r
+  batch_mode      = 0,\r
+  nonstop_mode    = 1,\r
+  scroll_mode     = 2,\r
+  error_stop_mode = 3,\r
+};\r
+/* sec 0076 */\r
+enum\r
+{\r
+  spotless             = 0,\r
+  warning_issued       = 1,\r
+  error_message_issued = 2,\r
+  fatal_error_stop     = 3,\r
+};\r
+/* sec 0096 */\r
+#define check_interrupt()     \\r
+do                            \\r
+{                             \\r
+  if (interrupt != 0)         \\r
+    pause_for_instructions(); \\r
+}                             \\r
+while (0)\r
+/* sec 0101 */\r
+#define unity 0200000\r
+#define two   0400000\r
+/* sec 0105 */\r
+#define nx_plus_y(a, b, c)  mult_and_add(a, b, c, 07777777777L)\r
+#define mult_integers(a, b) mult_and_add(a, b, 0, 017777777777L)\r
+/* sec 0108 */\r
+#define inf_bad 10000L\r
+/* sec 0109 */\r
+#define set_glue_ratio_zero(a) (a) = 0.0\r
+#define set_glue_ratio_one(a)  (a) = 1.0\r
+#define tex_float(a)           (a)\r
+#define unfloat(a)             (a)\r
+#define float_constant(a)      (float) (a)\r
+/* sec 0115 */\r
+//#define pointer halfword\r
+#define null    min_halfword\r
+/* sec 0118 */\r
+#define link(p) mem[p].hh.rh\r
+#define info(p) mem[p].hh.lh\r
+/* sec 0122 */\r
+#ifdef STAT\r
+#define fast_get_avail(a) \\r
+  do                      \\r
+    {                     \\r
+      a = avail;          \\r
+                          \\r
+      if (a == 0)         \\r
+        a = get_avail();  \\r
+      else                \\r
+      {                   \\r
+        avail = link(a);  \\r
+        link(a) = 0;      \\r
+        incr(dyn_used);   \\r
+      }                   \\r
+    }                     \\r
+  while (0)\r
+#else\r
+#define fast_get_avail(a) \\r
+  do                      \\r
+    {                     \\r
+      a = avail;          \\r
+                          \\r
+      if (a == 0)         \\r
+        a = get_avail();  \\r
+      else                \\r
+      {                   \\r
+        avail = link(a);  \\r
+        link(a) = 0;      \\r
+      }                   \\r
+    }                     \\r
+  while (0)\r
+#endif\r
+/* sec 0124 */\r
+#define empty_flag  max_halfword\r
+#define is_empty(a) (link(a) == empty_flag)\r
+#define node_size   info\r
+#define llink(a)    info(a+1)\r
+#define rlink(a)    link(a+1)\r
+/* sec 0133 */\r
+#define type(a)    mem[a].hh.b0\r
+#define subtype(a) mem[a].hh.b1\r
+/* sec 0134 */\r
+#define is_char_node(a) (a >= hi_mem_min)\r
+#define font            type\r
+#define character       subtype\r
+/* sec 0135 */\r
+#define hlist_node      0\r
+#define box_node_size   7\r
+#define width_offset    1\r
+#define depth_offset    2\r
+#define height_offset   3\r
+#define width(a)        mem[a + width_offset].cint\r
+#define depth(a)        mem[a + depth_offset].cint\r
+#define height(a)       mem[a + height_offset].cint\r
+#define shift_amount(a) mem[a + 4].cint\r
+#define list_offset     5\r
+#define list_ptr(a)     link(a + list_offset)\r
+#define glue_order(a)   subtype(a + list_offset)\r
+#define glue_sign(a)    type(a + list_offset)\r
+#define normal          0\r
+#define stretching      1\r
+#define shrinking       2\r
+#define glue_offset     6\r
+#define glue_set(a)     mem[a + glue_offset].gr\r
+/* sec 0137 */\r
+#define vlist_node 1\r
+/* sec 0138 */\r
+#define rule_node      2\r
+#define rule_node_size 4\r
+#define null_flag      -010000000000L\r
+#define is_running(a)  (a == null_flag)\r
+/* sec 0140 */\r
+#define ins_node         3\r
+#define ins_node_size    5\r
+#define float_cost(a)    mem[a + 1].cint\r
+#define ins_ptr(a)       info(a + 4)\r
+#define split_top_ptr(a) link(a + 4)\r
+/* sec 0141 */\r
+#define mark_node       4\r
+#define small_node_size 2\r
+#define mark_ptr(a)     mem[a + 1].cint\r
+/* sec 0142 */\r
+#define adjust_node 5\r
+#define adjust_ptr  mark_ptr\r
+/* sec 0143 */\r
+#define ligature_node 6\r
+#define lig_char(a)   (a + 1)\r
+#define lig_ptr(a)    link(lig_char(a))\r
+/* sec 0145 */\r
+#define disc_node     7\r
+#define replace_count subtype\r
+#define pre_break     llink\r
+#define post_break    rlink\r
+/* sec 0146 */\r
+#define whatsit_node 8\r
+/* sec 0147 */\r
+#define math_node 9\r
+#define before    0\r
+#define after     1\r
+/* sec 0148 */\r
+#define precedes_break(a)  (type(a) < math_node)\r
+#define non_discardable(a) (type(a) < math_node)\r
+/* sec 0149 */\r
+#define glue_node      10\r
+#define cond_math_glue 98\r
+#define mu_glue        99\r
+#define a_leaders      100\r
+#define c_leaders      101\r
+#define x_leaders      102\r
+#define glue_ptr       llink\r
+#define leader_ptr     rlink\r
+/* sec 0150 */\r
+#define glue_spec_size    4\r
+#define glue_ref_count(a) link(a)\r
+#define stretch(a)        mem[a + 2].cint\r
+#define shrink(a)         mem[a + 3].cint\r
+#define stretch_order     type\r
+#define shrink_order      subtype\r
+#define fil               1\r
+#define fill              2\r
+#define filll             3\r
+/* sec 0155 */\r
+#define kern_node 11\r
+#define explicit  1\r
+#define acc_kern  2\r
+/* sec 0157 */\r
+#define penalty_node  12\r
+#define inf_penalty   inf_bad\r
+#define eject_penalty -inf_bad\r
+#define penalty(a)    mem[a + 1].cint\r
+/* sec 0159 */\r
+#define unset_node      13\r
+#define glue_stretch(a) mem[a + glue_offset].cint\r
+#define glue_shrink     shift_amount\r
+#define span_count      subtype\r
+/* sec 0162 */\r
+#define zero_glue         mem_bot // 0\r
+#define fil_glue          (zero_glue + glue_spec_size) // 4\r
+#define fill_glue         (fil_glue + glue_spec_size) // 8\r
+#define ss_glue           (fill_glue + glue_spec_size) // 12\r
+#define fil_neg_glue      (ss_glue + glue_spec_size) // 16\r
+#define lo_mem_stat_max   (fil_neg_glue + glue_spec_size - 1) // 19\r
+#define page_ins_head     mem_top\r
+#define contrib_head      (mem_top - 1)\r
+#define page_head         (mem_top - 2)\r
+#define temp_head         (mem_top - 3)\r
+#define hold_head         (mem_top - 4)\r
+#define adjust_head       (mem_top - 5)\r
+#define active            (mem_top - 7)\r
+#define align_head        (mem_top - 8)\r
+#define end_span          (mem_top - 9)\r
+#define omit_template     (mem_top - 10)\r
+#define null_list         (mem_top - 11)\r
+#define lig_trick         (mem_top - 12)\r
+#define garbage           (mem_top - 12)\r
+#define backup_head       (mem_top - 13)\r
+#define hi_mem_stat_min   (mem_top - 13)\r
+#define hi_mem_stat_usage 14\r
+/* sec 0200 */\r
+#define token_ref_count(a) info(a)\r
+/* sec 0203 */\r
+#define add_token_ref(a) incr(token_ref_count(a))\r
+#define add_glue_ref(a)  incr(glue_ref_count(a))\r
+/* sec 0207 */\r
+#define escape        0\r
+#define relax         0\r
+#define left_brace    1\r
+#define right_brace   2\r
+#define math_shift    3\r
+#define tab_mark      4\r
+#define car_ret       5\r
+#define out_param     5\r
+#define mac_param     6\r
+#define sup_mark      7\r
+#define sub_mark      8\r
+#define ignore        9\r
+#define endv          9\r
+#define spacer        10\r
+#define letter        11\r
+#define other_char    12\r
+#define active_char   13\r
+#define par_end       13\r
+#define match         13\r
+#define comment       14\r
+#define end_match     14\r
+#define stop          14\r
+#define invalid_char  15\r
+#define delim_num     15\r
+#define max_char_code 15\r
+/* sec 0208 */\r
+#define char_num      16\r
+#define math_char_num 17\r
+#define mark          18\r
+#define xray          19\r
+#define make_box      20\r
+#define hmove         21\r
+#define vmove         22\r
+#define un_hbox       23\r
+#define un_vbox       24\r
+#define remove_item   25\r
+#define hskip         26\r
+#define vskip         27\r
+#define mskip         28\r
+#define kern          29\r
+#define mkern         30\r
+#define leader_ship   31\r
+#define halign        32\r
+#define valign        33\r
+#define no_align      34\r
+#define vrule         35\r
+#define hrule         36\r
+#define insert        37\r
+#define vadjust       38\r
+#define ignore_spaces 39\r
+#define after_assignment 40\r
+#define after_group      41\r
+#define break_penalty    42\r
+#define start_par        43\r
+#define ital_corr        44\r
+#define accent           45\r
+#define math_accent      46\r
+#define discretionary    47\r
+#define eq_no            48\r
+#define left_right       49\r
+#define math_comp        50\r
+#define limit_switch     51\r
+#define above            52\r
+#define math_style       53\r
+#define math_choice      54\r
+#define non_script       55\r
+#define vcenter          56\r
+#define case_shift       57\r
+#define message          58\r
+#define extension        59\r
+#define in_stream        60\r
+#define begin_group      61\r
+#define end_group        62\r
+#define omit             63\r
+#define ex_space         64\r
+#define no_boundary      65\r
+#define radical          66\r
+#define end_cs_name      67\r
+#define min_internal     68\r
+#define char_given       68\r
+#define math_given       69\r
+#define last_item        70\r
+#define max_non_prefixed_command 70\r
+/* sec 0209 */\r
+#define toks_register     71\r
+#define assign_toks       72\r
+#define assign_int        73\r
+#define assign_dimen      74\r
+#define assign_glue       75\r
+#define assign_mu_glue    76\r
+#define assign_font_dimen 77\r
+#define assign_font_int   78\r
+#define set_aux           79\r
+#define set_prev_graf     80\r
+#define set_page_dimen    81\r
+#define set_page_int      82\r
+#define set_box_dimen     83\r
+#define set_shape         84\r
+#define def_code          85\r
+#define def_family        86\r
+#define set_font          87\r
+#define def_font          88\r
+#define tex_register      89\r
+#define max_internal      89\r
+#define advance           90\r
+#define multiply          91\r
+#define divide            92\r
+#define prefix            93\r
+#define let               94\r
+#define shorthand_def     95\r
+#define read_to_cs        96\r
+#define def               97\r
+#define set_box           98\r
+#define hyph_data         99\r
+#define set_interaction   100\r
+#define max_command       100\r
+/* sec 0210 */\r
+#define undefined_cs    (max_command + 1 )\r
+#define expand_after    (max_command + 2 )\r
+#define no_expand       (max_command + 3 )\r
+#define input           (max_command + 4 )\r
+#define if_test         (max_command + 5 )\r
+#define fi_or_else      (max_command + 6 )\r
+#define cs_name         (max_command + 7 )\r
+#define convert         (max_command + 8 )\r
+#define the             (max_command + 9 )\r
+#define top_bot_mark    (max_command + 10)\r
+#define call            (max_command + 11)\r
+#define long_call       (max_command + 12)\r
+#define outer_call      (max_command + 13)\r
+#define long_outer_call (max_command + 14)\r
+#define end_template    (max_command + 15)\r
+#define dont_expand     (max_command + 16)\r
+#define glue_ref        (max_command + 17)\r
+#define shape_ref       (max_command + 18)\r
+#define box_ref         (max_command + 19) \r
+#define data            (max_command + 20)\r
+/* sec 0211 */\r
+#define vmode 1\r
+#define hmode (vmode + max_command + 1)\r
+#define mmode (hmode + max_command + 1)\r
+/* sec 0212 */\r
+#define ignore_depth -65536000L\r
+/* sec 0213 */\r
+#define mode            cur_list.mode_field\r
+#define head            cur_list.head_field\r
+#define tail            cur_list.tail_field\r
+#define aux             cur_list.aux_field\r
+#define prev_depth      aux.cint\r
+#define space_factor    aux.hh.lh\r
+#define clang           aux.hh.rh\r
+#define incompleat_noad aux.cint\r
+#define prev_graf       cur_list.pg_field\r
+#define mode_line       cur_list.ml_field\r
+/* sec 0221 */\r
+#define eq_level_field(a) a.hh.b1\r
+#define eq_type_field(a)  a.hh.b0\r
+#define equiv_field(a)    a.hh.rh\r
+#define eq_level(a)       eq_level_field(eqtb[a])\r
+#define eq_type(a)        eq_type_field(eqtb[a])\r
+#define equiv(a)          equiv_field(eqtb[a])\r
+#define level_zero        min_quarterword\r
+#define level_one         level_zero + 1\r
+/* sec 0222 */\r
+#define active_base                   1                                    // 1\r
+#define single_base                   (active_base + 256)                  // 257\r
+#define null_cs                       (single_base + 256)                  // 513\r
+#define hash_base                     (null_cs + 1)                        // 514\r
+#define frozen_control_sequence       (hash_base + hash_size + hash_extra) // (hash_size + hash_extra + 514)\r
+#define frozen_protection             frozen_control_sequence              // (hash_size + hash_extra + 514)\r
+#define frozen_cr                     (frozen_control_sequence + 1)        // (hash_size + hash_extra + 515)\r
+#define frozen_end_group              (frozen_control_sequence + 2)        // (hash_size + hash_extra + 516)\r
+#define frozen_right                  (frozen_control_sequence + 3)        // (hash_size + hash_extra + 517)\r
+#define frozen_fi                     (frozen_control_sequence + 4)        // (hash_size + hash_extra + 518)\r
+#define frozen_end_template           (frozen_control_sequence + 5)        // (hash_size + hash_extra + 519)\r
+#define frozen_endv                   (frozen_control_sequence + 6)        // (hash_size + hash_extra + 520)\r
+#define frozen_relax                  (frozen_control_sequence + 7)        // (hash_size + hash_extra + 521)\r
+#define end_write                     (frozen_control_sequence + 8)        // (hash_size + hash_extra + 522)\r
+#define frozen_dont_expand            (frozen_control_sequence + 9)        // (hash_size + hash_extra + 523)\r
+#define frozen_null_font              (frozen_control_sequence + 10)       // (hash_size + hash_extra + 524)\r
+#define font_id_base                  (frozen_null_font - font_base)       // (hash_size + hash_extra + 524)\r
+#define undefined_control_sequence    (frozen_null_font + font_max + 2)    // (hash_size + 781)\r
+#define glue_base                     (undefined_control_sequence + 1)     // (hash_size + 782)\r
+/* sec 0224 */\r
+#define line_skip_code                0  // 782\r
+#define baseline_skip_code            1  // 783\r
+#define par_skip_code                 2  // 784\r
+#define above_display_skip_code       3  // 785\r
+#define below_display_skip_code       4  // 786\r
+#define above_display_short_skip_code 5  // 787\r
+#define below_display_short_skip_code 6  // 788\r
+#define left_skip_code                7  // 789\r
+#define right_skip_code               8  // 790\r
+#define top_skip_code                 9  // 791\r
+#define split_top_skip_code           10 // 792\r
+#define tab_skip_code                 11 // 793\r
+#define space_skip_code               12 // 794\r
+#define xspace_skip_code              13 // 795\r
+#define par_fill_skip_code            14 // 796\r
+#define thin_mu_skip_code             15 // 797\r
+#define med_mu_skip_code              16 // 798\r
+#define thick_mu_skip_code            17 // 799\r
+#define glue_pars                     18 // 800\r
+#define skip_base                     (glue_base + glue_pars) // 800\r
+#define mu_skip_base                  (skip_base + 256) // 1056\r
+#define local_base                    (mu_skip_base + 256) // 1312\r
+// #\r
+#define skip(a)                       equiv(skip_base + a)\r
+#define mu_skip(a)                    equiv(mu_skip_base + a)\r
+#define glue_par(a)                   equiv(glue_base + a)\r
+#define line_skip                     glue_par(line_skip_code)\r
+#define baseline_skip                 glue_par(baseline_skip_code)\r
+#define par_skip                      glue_par(par_skip_code)\r
+#define above_display_skip            glue_par(above_display_skip_code)\r
+#define below_display_skip            glue_par(below_display_skip_code)\r
+#define above_display_short_skip      glue_par(above_display_short_skip_code)\r
+#define below_display_short_skip      glue_par(below_display_short_skip_code)\r
+#define left_skip                     glue_par(left_skip_code)\r
+#define right_skip                    glue_par(right_skip_code)\r
+#define top_skip                      glue_par(top_skip_code)\r
+#define split_top_skip                glue_par(split_top_skip_code)\r
+#define tab_skip                      glue_par(tab_skip_code)\r
+#define space_skip                    glue_par(space_skip_code)\r
+#define xspace_skip                   glue_par(xspace_skip_code)\r
+#define par_fill_skip                 glue_par(par_fill_skip_code)\r
+#define thin_mu_skip                  glue_par(thin_mu_skip_code)\r
+#define med_mu_skip                   glue_par(med_mu_skip_code)\r
+#define thick_mu_skip                 glue_par(thick_mu_skip_code)\r
+/* sec 0230 */\r
+#define par_shape_loc                 local_base             // 1312\r
+#define output_routine_loc            (local_base + 1)       // 1313\r
+#define every_par_loc                 (local_base + 2)       // 1314\r
+#define every_math_loc                (local_base + 3)       // 1315\r
+#define every_display_loc             (local_base + 4)       // 1316\r
+#define every_hbox_loc                (local_base + 5)       // 1317\r
+#define every_vbox_loc                (local_base + 6)       // 1318\r
+#define every_job_loc                 (local_base + 7)       // 1319\r
+#define every_cr_loc                  (local_base + 8)       // 1320\r
+#define err_help_loc                  (local_base + 9)       // 1321\r
+#define toks_base                     (local_base + 10)      // 1322\r
+#define box_base                      (toks_base + 256)      // 1578\r
+#define cur_font_loc                  (box_base + 256)       // 1834\r
+#define math_font_base                (cur_font_loc + 1)     // 1835\r
+#define cat_code_base                 (math_font_base + 48)  // 1883\r
+#define lc_code_base                  (cat_code_base + 256)  // 2139\r
+#define uc_code_base                  (lc_code_base + 256)   // 2395\r
+#define sf_code_base                  (uc_code_base + 256)   // 2651\r
+#define math_code_base                (sf_code_base + 256)   // 2907\r
+#define int_base                      (math_code_base + 256) // 3163\r
+// #\r
+#define par_shape_ptr                 equiv(par_shape_loc)\r
+#define output_routine                equiv(output_routine_loc)\r
+#define every_par                     equiv(every_par_loc)\r
+#define every_math                    equiv(every_math_loc)\r
+#define every_display                 equiv(every_display_loc)\r
+#define every_hbox                    equiv(every_hbox_loc)\r
+#define every_vbox                    equiv(every_vbox_loc)\r
+#define every_job                     equiv(every_job_loc)\r
+#define every_cr                      equiv(every_cr_loc)\r
+#define err_help                      equiv(err_help_loc)\r
+#define toks(a)                       equiv(toks_base + a)\r
+#define box(a)                        equiv(box_base + a)\r
+#define cur_font                      equiv(cur_font_loc)\r
+#define fam_fnt(a)                    equiv(math_font_base + a)\r
+#define cat_code(a)                   equiv(cat_code_base + a)\r
+#define lc_code(a)                    equiv(lc_code_base + a)\r
+#define uc_code(a)                    equiv(uc_code_base + a)\r
+#define sf_code(a)                    equiv(sf_code_base + a)\r
+#define math_code(a)                  equiv(math_code_base + a)\r
+/* sec 0232 */\r
+#define null_font font_base\r
+#define var_code 070000\r
+/* sec 0236 */\r
+#define pretolerance_code             0  // 3163\r
+#define tolerance_code                1  // 3164\r
+#define line_penalty_code             2  // 3165\r
+#define hyphen_penalty_code           3  // 3166\r
+#define ex_hyphen_penalty_code        4  // 3167\r
+#define club_penalty_code             5  // 3168\r
+#define widow_penalty_code            6  // 3169\r
+#define display_widow_penalty_code    7  // 3170\r
+#define broken_penalty_code           8  // 3171\r
+#define bin_op_penalty_code           9  // 3172\r
+#define rel_penalty_code              10 // 3173\r
+#define pre_display_penalty_code      11 // 3174\r
+#define post_display_penalty_code     12 // 3175\r
+#define inter_line_penalty_code       13 // 3176\r
+#define double_hyphen_demerits_code   14 // 3177\r
+#define final_hyphen_demerits_code    15 // 3178\r
+#define adj_demerits_code             16 // 3179\r
+#define mag_code                      17 // 3180\r
+#define delimiter_factor_code         18 // 3181\r
+#define looseness_code                19 // 3182\r
+#define time_code                     20 // 3183\r
+#define day_code                      21 // 3184\r
+#define month_code                    22 // 3185\r
+#define year_code                     23 // 3186\r
+#define show_box_breadth_code         24 // 3187\r
+#define show_box_depth_code           25 // 3188\r
+#define hbadness_code                 26 // 3189\r
+#define vbadness_code                 27 // 3190\r
+#define pausing_code                  28 // 3191\r
+#define tracing_online_code           29 // 3192\r
+#define tracing_macros_code           30 // 3193\r
+#define tracing_stats_code            31 // 3194\r
+#define tracing_paragraphs_code       32 // 3195\r
+#define tracing_pages_code            33 // 3196\r
+#define tracing_output_code           34 // 3197\r
+#define tracing_lost_chars_code       35 // 3198\r
+#define tracing_commands_code         36 // 3199 \r
+#define tracing_restores_code         37 // 3200\r
+#define uc_hyph_code                  38 // 3201\r
+#define output_penalty_code           39 // 3202\r
+#define max_dead_cycles_code          40 // 3203\r
+#define hang_after_code               41 // 3204\r
+#define floating_penalty_code         42 // 3205\r
+#define global_defs_code              43 // 3206\r
+#define cur_fam_code                  44 // 3207\r
+#define escape_char_code              45 // 3208\r
+#define default_hyphen_char_code      46 // 3209\r
+#define default_skew_char_code        47 // 3210\r
+#define end_line_char_code            48 // 3211\r
+#define new_line_char_code            49 // 3212\r
+#define language_code                 50 // 3213\r
+#define left_hyphen_min_code          51 // 3214\r
+#define right_hyphen_min_code         52 // 3215\r
+#define holding_inserts_code          53 // 3216\r
+#define error_context_lines_code      54 // 3217\r
+#define int_pars                      55\r
+#define count_base                    (int_base + int_pars) // 3218\r
+#define del_code_base                 (count_base + 256)    // 3474\r
+#define dimen_base                    (del_code_base + 256) // 3730\r
+// #\r
+#define del_code(a)                   eqtb[del_code_base + a].cint\r
+#define count(a)                      eqtb[count_base + a].cint\r
+#define int_par(a)                    eqtb[int_base + a].cint\r
+#define pretolerance                  int_par(pretolerance_code)\r
+#define tolerance                     int_par(tolerance_code)\r
+#define line_penalty                  int_par(line_penalty_code)\r
+#define hyphen_penalty                int_par(hyphen_penalty_code)\r
+#define ex_hyphen_penalty             int_par(ex_hyphen_penalty_code)\r
+#define club_penalty                  int_par(club_penalty_code)\r
+#define widow_penalty                 int_par(widow_penalty_code)\r
+#define display_widow_penalty         int_par(display_widow_penalty_code)\r
+#define broken_penalty                int_par(broken_penalty_code)\r
+#define bin_op_penalty                int_par(bin_op_penalty_code)\r
+#define rel_penalty                   int_par(rel_penalty_code)\r
+#define pre_display_penalty           int_par(pre_display_penalty_code)\r
+#define post_display_penalty          int_par(post_display_penalty_code)\r
+#define inter_line_penalty            int_par(inter_line_penalty_code)\r
+#define double_hyphen_demerits        int_par(double_hyphen_demerits_code)\r
+#define final_hyphen_demerits         int_par(final_hyphen_demerits_code)\r
+#define adj_demerits                  int_par(adj_demerits_code)\r
+#define mag                           int_par(mag_code)\r
+#define delimiter_factor              int_par(delimiter_factor_code)\r
+#define looseness                     int_par(looseness_code)\r
+#define tex_time                      int_par(time_code)\r
+#define day                           int_par(day_code)\r
+#define month                         int_par(month_code)\r
+#define year                          int_par(year_code)\r
+#define show_box_breadth              int_par(show_box_breadth_code)\r
+#define show_box_depth                int_par(show_box_depth_code)\r
+#define hbadness                      int_par(hbadness_code)\r
+#define vbadness                      int_par(vbadness_code)\r
+#define pausing                       int_par(pausing_code)\r
+#define tracing_online                int_par(tracing_online_code)\r
+#define tracing_macros                int_par(tracing_macros_code)\r
+#define tracing_stats                 int_par(tracing_stats_code)\r
+#define tracing_paragraphs            int_par(tracing_paragraphs_code)\r
+#define tracing_pages                 int_par(tracing_pages_code)\r
+#define tracing_output                int_par(tracing_output_code)\r
+#define tracing_lost_chars            int_par(tracing_lost_chars_code)\r
+#define tracing_commands              int_par(tracing_commands_code)\r
+#define tracing_restores              int_par(tracing_restores_code)\r
+#define uc_hyph                       int_par(uc_hyph_code)\r
+#define output_penalty                int_par(output_penalty_code)\r
+#define max_dead_cycles               int_par(max_dead_cycles_code)\r
+#define hang_after                    int_par(hang_after_code)\r
+#define floating_penalty              int_par(floating_penalty_code)\r
+#define global_defs                   int_par(global_defs_code)\r
+#define cur_fam                       int_par(cur_fam_code)\r
+#define escape_char                   int_par(escape_char_code)\r
+#define default_hyphen_char           int_par(default_hyphen_char_code)\r
+#define default_skew_char             int_par(default_skew_char_code)\r
+#define end_line_char                 int_par(end_line_char_code)\r
+#define new_line_char                 int_par(new_line_char_code)\r
+#define language                      int_par(language_code)\r
+#define left_hyphen_min               int_par(left_hyphen_min_code)\r
+#define right_hyphen_min              int_par(right_hyphen_min_code)\r
+#define holding_inserts               int_par(holding_inserts_code)\r
+#define error_context_lines           int_par(error_context_lines_code)\r
+/* sec 0247 */\r
+#define par_indent_code               0  // 3730\r
+#define math_surround_code            1  // 3731\r
+#define line_skip_limit_code          2  // 3732\r
+#define hsize_code                    3  // 3733\r
+#define vsize_code                    4  // 3734\r
+#define max_depth_code                5  // 3735\r
+#define split_max_depth_code          6  // 3736\r
+#define box_max_depth_code            7  // 3737\r
+#define hfuzz_code                    8  // 3738\r
+#define vfuzz_code                    9  // 3739\r
+#define delimiter_shortfall_code      10 // 3740\r
+#define null_delimiter_space_code     11 // 3741\r
+#define script_space_code             12 // 3742\r
+#define pre_display_size_code         13 // 3743\r
+#define display_width_code            14 // 3744\r
+#define display_indent_code           15 // 3745\r
+#define overfull_rule_code            16 // 3746\r
+#define hang_indent_code              17 // 3747\r
+#define h_offset_code                 18 // 3748\r
+#define v_offset_code                 19 // 3749\r
+#define emergency_stretch_code        20 // 3750\r
+#define dimen_pars                    21\r
+#define scaled_base                   (dimen_base + dimen_pars) // 3751\r
+#define eqtb_size                     (scaled_base + 255) // 4006\r
+// #\r
+#define dimen(a)                      eqtb[scaled_base + a].cint\r
+#define dimen_par(a)                  eqtb[dimen_base + a].cint\r
+#define par_indent                    dimen_par(par_indent_code)\r
+#define math_surround                 dimen_par(math_surround_code)\r
+#define line_skip_limit               dimen_par(line_skip_limit_code)\r
+#define hsize                         dimen_par(hsize_code)\r
+#define vsize                         dimen_par(vsize_code)\r
+#define max_depth                     dimen_par(max_depth_code)\r
+#define split_max_depth               dimen_par(split_max_depth_code)\r
+#define box_max_depth                 dimen_par(box_max_depth_code)\r
+#define hfuzz                         dimen_par(hfuzz_code)\r
+#define vfuzz                         dimen_par(vfuzz_code)\r
+#define delimiter_shortfall           dimen_par(delimiter_shortfall_code)\r
+#define null_delimiter_space          dimen_par(null_delimiter_space_code)\r
+#define script_space                  dimen_par(script_space_code)\r
+#define pre_display_size              dimen_par(pre_display_size_code)\r
+#define display_width                 dimen_par(display_width_code)\r
+#define display_indent                dimen_par(display_indent_code)\r
+#define overfull_rule                 dimen_par(overfull_rule_code)\r
+#define hang_indent                   dimen_par(hang_indent_code)\r
+#define h_offset                      dimen_par(h_offset_code)\r
+#define v_offset                      dimen_par(v_offset_code)\r
+#define emergency_stretch             dimen_par(emergency_stretch_code)\r
+/* sec 0256 */\r
+#define text(a)         hash[a].rh\r
+#define next(a)         hash[a].lh\r
+#define hash_is_full    (hash_used == hash_base)\r
+#define font_id_text(a) text(font_id_base + a)\r
+/* sec 0268 */\r
+#define save_type(a)      save_stack[a].hh.b0\r
+#define save_level(a)     save_stack[a].hh.b1\r
+#define save_index(a)     save_stack[a].hh.rh\r
+#define restore_old_value 0\r
+#define restore_zero      1\r
+#define insert_token      2\r
+#define level_boundary    3\r
+/* sec 0269 */\r
+#define bottom_level      0\r
+#define simple_group      1\r
+#define hbox_group        2\r
+#define adjust_hbox_group 3\r
+#define vbox_group        4\r
+#define vtop_group        5\r
+#define align_group       6\r
+#define no_align_group    7\r
+#define output_group      8\r
+#define math_group        9\r
+#define disc_group        10\r
+#define insert_group      11\r
+#define vcenter_group     12\r
+#define math_choice_group 13\r
+#define semi_simple_group 14\r
+#define math_shift_group  15\r
+#define math_left_group   16\r
+#define max_group_code    16\r
+/* sec 0274 */\r
+#define saved(a) save_stack[save_ptr + (a)].cint\r
+/* sec 0289 */\r
+#define cs_token_flag     07777 // 4095\r
+#define left_brace_token  0400  // 256  = 2^8 * left_brace\r
+#define left_brace_limit  01000 // 512  = 2^8 * (left_brace + 1)\r
+#define right_brace_token 01000 // 512  = 2^8 * right_brace\r
+#define right_brace_limit 01400 // 768  = 2^8 * (right_brace + 1)\r
+#define math_shift_token  01400 // 768  = 2^8 * math_shift\r
+#define tab_token         02000 // 1024 = 2^8 * tab_mark\r
+#define out_param_token   02400 // 1280 = 2^8 * out_param\r
+#define space_token       05040 // 2592 = 2^8 * spacer + ' '\r
+#define letter_token      05400 // 2816 = 2^8 * letter\r
+#define other_token       06000 // 3072 = 2^8 * other_char\r
+#define match_token       06400 // 3328 = 2^8 * match\r
+#define end_match_token   07000 // 3584 = 2^8 * end_match\r
+/* sec 0298 */\r
+#define chr_cmd(s)  \\r
+do                  \\r
+{                   \\r
+  prints(s);        \\r
+  print(chr_code);  \\r
+}                   \\r
+while (0)\r
+/* sec 0302 */\r
+#define state cur_input.state_field\r
+#define index cur_input.index_field\r
+#define start cur_input.start_field\r
+#define limit cur_input.limit_field\r
+#define name  cur_input.name_field\r
+/* sec 0303 */\r
+#define mid_line    1\r
+#define skip_blanks 2 + max_char_code // 17\r
+#define new_line    3 + max_char_code + max_char_code // 33\r
+/* sec 0304 */\r
+#define cur_file input_file[index]\r
+/* sec 0305 */\r
+#define skipping  1\r
+#define defining  2\r
+#define matching  3\r
+#define aligning  4\r
+#define absorbing 5\r
+/* sec 0307 */\r
+#define token_list         0\r
+#define token_type         index\r
+#define param_start        limit\r
+#define parameter          0\r
+#define u_template         1\r
+#define v_template         2\r
+#define backed_up          3\r
+#define inserted           4\r
+#define macro              5\r
+#define output_text        6\r
+#define every_par_text     7\r
+#define every_math_text    8\r
+#define every_display_text 9\r
+#define every_hbox_text    10\r
+#define every_vbox_text    11\r
+#define every_job_text     12\r
+#define every_cr_text      13\r
+#define mark_text          14\r
+#define write_text         15\r
+/* sec 0316 */\r
+#define begin_pseudoprint() \\r
+do                          \\r
+{                           \\r
+  l = tally;                \\r
+  tally = 0;                \\r
+  selector = pseudo;        \\r
+  trick_count = 1000000L;   \\r
+}                           \\r
+while (0)\r
+#define set_trick_count()                                 \\r
+do                                                        \\r
+{                                                         \\r
+  first_count = tally;                                    \\r
+  trick_count = tally + 1 + error_line - half_error_line; \\r
+                                                          \\r
+  if (trick_count < error_line)                           \\r
+    trick_count = error_line;                             \\r
+}                                                         \\r
+while (0)\r
+/* sec 0322 */\r
+/* sec 0323 */\r
+#define back_list(a) begin_token_list(a, backed_up)\r
+#define ins_list(a)  begin_token_list(a, inserted)\r
+/* sec 0344 */\r
+#define any_state_plus(a) mid_line + (a): case skip_blanks + (a): case new_line + (a)\r
+/* sec 0347 */\r
+#define add_delims_to(a) \\r
+  (a) + math_shift:      \\r
+  case (a) + tab_mark:   \\r
+  case (a) + mac_param:  \\r
+  case (a) + sub_mark:   \\r
+  case (a) + letter:     \\r
+  case (a) + other_char\r
+/* sec 0352 */\r
+#define is_hex(a) \\r
+  (((a >= '0') && (a <= '9')) || ((a >= 'a') && (a <= 'f')))\r
+#define hex_to_cur_chr()                    \\r
+do                                          \\r
+{                                           \\r
+  if (c <= '9')                             \\r
+    cur_chr = c - '0';                      \\r
+  else                                      \\r
+    cur_chr = c - 'a' + 10;                 \\r
+                                            \\r
+  if (cc <= '9')                            \\r
+    cur_chr = 16 * cur_chr + cc - '0';      \\r
+  else                                      \\r
+    cur_chr = 16 * cur_chr + cc - 'a' + 10; \\r
+}                                           \\r
+while (0)\r
+/* sec 0360 */\r
+#define end_line_char_inactive()  \\r
+  (end_line_char < 0) || (end_line_char > 255)\r
+/* sec 0358 */\r
+/* sec 0371 */\r
+#define store_new_token(a)  \\r
+  do                        \\r
+    {                       \\r
+      q = get_avail();      \\r
+      link(p) = q;          \\r
+      info(q) = a;          \\r
+      p = q;                \\r
+    }                       \\r
+  while (0)\r
+#define fast_store_new_token(a) \\r
+  do                            \\r
+    {                           \\r
+      fast_get_avail(q);        \\r
+      link(p) = q;              \\r
+      info(q) = a;              \\r
+      p = q;                    \\r
+    }                           \\r
+  while (0)\r
+#define no_expand_flag 257\r
+/* sec 0382 */\r
+#define top_mark_code         0\r
+#define first_mark_code       1\r
+#define bot_mark_code         2\r
+#define split_first_mark_code 3\r
+#define split_bot_mark_code   4\r
+#define top_mark              cur_mark[top_mark_code]\r
+#define first_mark            cur_mark[first_mark_code]\r
+#define bot_mark              cur_mark[bot_mark_code]\r
+#define split_first_mark      cur_mark[split_first_mark_code]\r
+#define split_bot_mark        cur_mark[split_bot_mark_code]\r
+/* sec 0400 */\r
+#define int_val   0\r
+#define dimen_val 1\r
+#define glue_val  2\r
+#define mu_val    3\r
+#define ident_val 4\r
+#define tok_val   5\r
+/* sec 0413 */\r
+#define scanned_result(va, vb) \\r
+do                            \\r
+  {                           \\r
+    cur_val = va;             \\r
+    cur_val_level = vb;       \\r
+  }                           \\r
+while (0)\r
+/* sec 0416 */\r
+#define input_line_no_code (glue_val + 1)\r
+#define badness_code       (glue_val + 2)\r
+/* sec 0421 */\r
+#define max_dimen 07777777777\r
+/* sec 0438 */\r
+#define octal_token             (other_token + '\'') // 3111\r
+#define hex_token               (other_token + '"' ) // 3106\r
+#define alpha_token             (other_token + '`' ) // 3168\r
+#define point_token             (other_token + '.' ) // 3118\r
+#define continental_point_token (other_token + ',' ) // 3116\r
+/* sec 0445 */\r
+#define zero_token    (other_token  + '0') // 3120\r
+#define A_token       (letter_token + 'A') // 2881\r
+#define other_A_token (other_token  + 'A') // 3137\r
+/* sec 0458 */\r
+#define set_conversion(a, b)  \\r
+  do                          \\r
+  {                           \\r
+    num = a;                  \\r
+    denom = b;                \\r
+  } while (0)\r
+/* sec 0468 */\r
+#define number_code        0\r
+#define roman_numeral_code 1\r
+#define string_code        2\r
+#define meaning_code       3\r
+#define font_name_code     4\r
+#define job_name_code      5\r
+/* sec 0480 */\r
+#define closed    2\r
+#define just_open 1\r
+/* sec 0487 */\r
+#define if_char_code   0\r
+#define if_cat_code    1\r
+#define if_int_code    2\r
+#define if_dim_code    3\r
+#define if_odd_code    4\r
+#define if_vmode_code  5\r
+#define if_hmode_code  6\r
+#define if_mmode_code  7\r
+#define if_inner_code  8\r
+#define if_void_code   9\r
+#define if_hbox_code   10\r
+#define if_vbox_code   11\r
+#define ifx_code       12\r
+#define if_eof_code    13\r
+#define if_true_code   14\r
+#define if_false_code  15\r
+#define if_case_code   16\r
+/* sec 0489 */\r
+#define if_node_size     2\r
+#define if_line_field(a) mem[(a) + 1].cint\r
+#define if_code          1\r
+#define fi_code          2\r
+#define else_code        3\r
+#define or_code          4\r
+/* sec 0506 */\r
+#define get_x_token_or_active_char()                    \\r
+do                                                      \\r
+{                                                       \\r
+  get_x_token();                                        \\r
+                                                        \\r
+  if (cur_cmd == relax)                                 \\r
+    if (cur_chr == no_expand_flag)                      \\r
+    {                                                   \\r
+      cur_cmd = active_char;                            \\r
+      cur_chr = cur_tok - cs_token_flag - active_base;  \\r
+    }                                                   \\r
+}                                                       \\r
+while (0)\r
+/* sec 0519 */\r
+#define append_to_name(a)       \\r
+do                              \\r
+{                               \\r
+  c = a; incr(k);               \\r
+                                \\r
+  if (k < file_name_size)       \\r
+    name_of_file[k] = xchr[c];  \\r
+}                               \\r
+while (0)\r
+/* sec 0544 */\r
+#define no_tag   0\r
+#define lig_tag  1\r
+#define list_tag 2\r
+#define ext_tag  3\r
+/* sec 0545 */\r
+#define stop_flag    128\r
+#define kern_flag    128\r
+#define skip_byte(a) a.b0\r
+#define next_char(a) a.b1\r
+#define op_byte(a)   a.b2\r
+#define rem_byte(a)  a.b3\r
+/* sec 0546 */\r
+#define ext_top(a) a.b0\r
+#define ext_mid(a) a.b1\r
+#define ext_bot(a) a.b2\r
+#define ext_rep(a) a.b3\r
+/* sec 0547 */\r
+#define slant_code         1\r
+#define space_code         2\r
+#define space_stretch_code 3\r
+#define space_shrink_code  4\r
+#define x_height_code      5\r
+#define quad_code          6\r
+#define extra_space_code   7\r
+/* sec 0549 */\r
+#define non_char    256\r
+#define non_address 0\r
+/* sec 0554 */\r
+#define char_info(a, b)   font_info[char_base[a] + b].qqqq\r
+#define char_width(a, b)  font_info[width_base[a] + b.b0].cint\r
+#define char_exists(a)    (a.b0 > min_quarterword)\r
+#define char_italic(a, b) font_info[italic_base[a] + (b.b2) / 4].cint\r
+#define height_depth(a)   (a.b1)\r
+#define char_height(a, b) font_info[height_base[a] + (b) / 16].cint\r
+#define char_depth(a, b)  font_info[depth_base[a] + (b) % 16].cint\r
+#define char_tag(a)       (a.b2 % 4)\r
+/* sec 0557 */\r
+#define char_kern(a, b)        font_info[kern_base[a] + 256 * op_byte(b) + rem_byte(b)].cint\r
+#define kern_base_offset       (256 * (128 + min_quarterword))\r
+#define lig_kern_start(a, b)   lig_kern_base[a] + rem_byte(b)\r
+#define lig_kern_restart(a, b) lig_kern_base[a] + 256 * op_byte(b) + rem_byte(b) + 32768 - kern_base_offset\r
+/* sec 0558 */\r
+#define param(a, b)      font_info[a + param_base[b]].cint\r
+#define slant(f)         param(slant_code, f)\r
+#define space(f)         param(space_code, f)\r
+#define space_stretch(f) param(space_stretch_code, f)\r
+#define space_shrink(f)  param(space_shrink_code, f)\r
+#define x_height(f)      param(x_height_code, f)\r
+#define quad(f)          param(quad_code, f)\r
+#define extra_space(f)   param(extra_space_code, f)\r
+/* sec 0561 */\r
+#define start_font_error_message()  \\r
+do                                  \\r
+{                                   \\r
+  print_err("Font ");               \\r
+  sprint_cs(u);                     \\r
+  print_char('=');                  \\r
+  print_file_name(nom, aire, 335);  \\r
+                                    \\r
+  if (s >= 0)                       \\r
+  {                                 \\r
+    prints(" at ");                 \\r
+    print_scaled(s);                \\r
+    prints("pt");                   \\r
+  }                                 \\r
+  else if (s != -1000)              \\r
+  {                                 \\r
+    prints(" scaled ");             \\r
+    print_int(-(integer)s);         \\r
+  }                                 \\r
+}                                   \\r
+while (0)\r
+/* sec 0564 */\r
+#define read_sixteen(a) \\r
+do                      \\r
+  {                     \\r
+    a = fbyte;          \\r
+                        \\r
+    if (a > 127)        \\r
+      goto bad_tfm;     \\r
+                        \\r
+    fget();             \\r
+    a = a * 256 + fbyte;\\r
+  }                     \\r
+while (0)\r
+#define store_four_quarters(val)  \\r
+do                                \\r
+  {                               \\r
+    fget(); a = fbyte; qw.b0 = a; \\r
+    fget(); b = fbyte; qw.b1 = b; \\r
+    fget(); c = fbyte; qw.b2 = c; \\r
+    fget(); d = fbyte; qw.b3 = d; \\r
+    val = qw;                     \\r
+  }                               \\r
+while (0)\r
+/* sec 0570 */\r
+#define check_byte_range(a) \\r
+do                          \\r
+{                           \\r
+  if ((a < bc) || (a > ec)) \\r
+    goto bad_tfm;           \\r
+}                           \\r
+  while (0)\r
+/* sec 0571 */\r
+#define store_scaled(a)                                       \\r
+do                                                            \\r
+{                                                             \\r
+  fget(); a = fbyte; fget(); b = fbyte;                       \\r
+  fget(); c = fbyte; fget(); d = fbyte;                       \\r
+  sw = (((((d * z) / 256) + (c * z)) / 256) + (b * z)) / beta;\\r
+                                                              \\r
+  if (a == 0)                                                 \\r
+    a = sw;                                                   \\r
+  else if (a == 255)                                          \\r
+    a = sw - alpha;                                           \\r
+  else                                                        \\r
+    goto bad_tfm;                                             \\r
+}                                                             \\r
+while (0)\r
+/* sec 0573 */\r
+#define check_existence(a)  \\r
+do                          \\r
+{                           \\r
+  check_byte_range(a);      \\r
+                            \\r
+  qw = char_info(f, a);     \\r
+                            \\r
+  if (!char_exists(qw))     \\r
+    goto bad_tfm;           \\r
+}                           \\r
+while (0)\r
+/* sec 0576 */\r
+#define adjust(a) a[f] = a[f]\r
+/* sec 0585 */\r
+#define set1      128 // c[1]\r
+#define set2      129 // c[2]\r
+#define set3      130 // c[3]\r
+#define set4      131 // c[4]\r
+#define set_rule  132 // a[4] b[4]\r
+#define put1      133 // c[1]\r
+#define put2      134 // c[2]\r
+#define put3      135 // c[3]\r
+#define put4      136 // c[4]\r
+#define put_rule  137 // a[4] b[4]\r
+#define nop       138 // NULL\r
+#define bop       139 // c0[4] c1[4] ... c9[4] p[4]\r
+#define eop       140 // NULL\r
+#define push      141\r
+#define pop       142\r
+#define right1    143 // b[1]\r
+#define right2    144 // b[2]\r
+#define right3    145 // b[3]\r
+#define right4    146 // b[4]\r
+#define w0        147 //\r
+#define w1        148 // b[1]\r
+#define w2        149 // b[2]\r
+#define w3        150 // b[3]\r
+#define w4        151 // b[4]\r
+#define x0        152 //\r
+#define x1        153 // b[1]\r
+#define x2        154 // b[2]\r
+#define x3        155 // b[3]\r
+#define x4        156 // b[4]\r
+#define down1     157 // a[1]\r
+#define down2     158 // a[2]\r
+#define down3     159 // a[3]\r
+#define down4     160 // a[4]\r
+#define y0        161 //\r
+#define y1        162 // a[1]\r
+#define y2        163 // a[2]\r
+#define y3        164 // a[3]\r
+#define y4        165 // a[4]\r
+#define z0        166 //\r
+#define z1        167 // a[1]\r
+#define z2        168 // a[2]\r
+#define z3        169 // a[3]\r
+#define z4        170 // a[4]\r
+#define fnt_num_0 171 //\r
+#define fnt1      235 // k[1]\r
+#define fnt2      236 // k[2]\r
+#define fnt3      237 // k[3]\r
+#define fnt4      238 // k[4]\r
+#define xxx1      239 // k[1] x[k]\r
+#define xxx2      240 // k[2] x[k]\r
+#define xxx3      241 // k[3] x[k]\r
+#define xxx4      242 // k[4] x[k]\r
+#define fnt_def1  243 // k[1] c[4] s[4] d[4] a[1] l[1] n[a + l]\r
+#define fnt_def2  244 // k[2] c[4] s[4] d[4] a[1] l[1] n[a + l]\r
+#define fnt_def3  245 // k[3] c[4] s[4] d[4] a[1] l[1] n[a + l]\r
+#define fnt_def4  246 // k[4] c[4] s[4] d[4] a[1] l[1] n[a + l]\r
+#define pre       247 // i[1] num[4] den[4] mag[4] k[1] x[k]\r
+#define post      248 //\r
+#define post_post 249 //\r
+/* sec 0587 */\r
+#define id_byte 2\r
+/* sec 0605 */\r
+#define movement_node_size 3\r
+#define location(a) mem[a + 2].cint\r
+/* sec 0608 */\r
+#define y_here  1\r
+#define z_here  2\r
+#define yz_OK   3\r
+#define y_OK    4\r
+#define z_OK    5\r
+#define d_fixed 6\r
+/* sec 0611 */\r
+#define none_seen 0\r
+#define y_seen    6\r
+#define z_seen    12\r
+/* sec 0625 */\r
+#define billion 1000000000.0\r
+#define vet_glue(a)             \\r
+do                              \\r
+{                               \\r
+  glue_temp = a;                \\r
+  if (glue_temp > billion)      \\r
+    glue_temp = billion;        \\r
+  else if (glue_temp < -billion)\\r
+    glue_temp = -billion;       \\r
+}                               \\r
+while (0)\r
+/* sec 0644 */\r
+#define exactly    0\r
+#define additional 1\r
+#define natural 0, additional\r
+/* sec 0769 */\r
+#define u_part(a)     mem[(a) + height_offset].cint\r
+#define v_part(a)     mem[(a) + depth_offset].cint\r
+#define extra_info(a) info((a) + list_offset)\r
+/* sec 0681 */\r
+#define noad_size      4\r
+#define nucleus(a)     ((a) + 1)\r
+#define supscr(a)      ((a) + 2)\r
+#define subscr(a)      ((a) + 3)\r
+#define math_type      link\r
+#define fam            font\r
+#define math_char      1\r
+#define sub_box        2\r
+#define sub_mlist      3\r
+#define math_text_char 4\r
+/* sec 0682 */\r
+#define ord_noad   (unset_node + 3) // 16\r
+#define op_noad    (ord_noad + 1  ) // 17\r
+#define bin_noad   (ord_noad + 2  ) // 18\r
+#define rel_noad   (ord_noad + 3  ) // 19\r
+#define open_noad  (ord_noad + 4  ) // 20\r
+#define close_noad (ord_noad + 5  ) // 21\r
+#define punct_noad (ord_noad + 6  ) // 22\r
+#define inner_noad (ord_noad + 7  ) // 23\r
+#define limits    1\r
+#define no_limits 2\r
+/* sec 0683 */\r
+#define left_delimiter(a)  ((a) + 4)\r
+#define right_delimiter(a) ((a) + 5)\r
+#define radical_noad       (inner_noad + 1) // 24\r
+#define radical_noad_size  5\r
+#define fraction_noad      (radical_noad + 1) // 25\r
+#define fraction_noad_size 6\r
+#define small_fam(a)       mem[(a)].qqqq.b0\r
+#define small_char(a)      mem[(a)].qqqq.b1\r
+#define large_fam(a)       mem[(a)].qqqq.b2\r
+#define large_char(a)      mem[(a)].qqqq.b3\r
+#define thickness          width\r
+#define default_code       010000000000L\r
+#define numerator          supscr\r
+#define denominator        subscr\r
+/* sec 0687 */\r
+#define under_noad        (fraction_noad + 1) // 26\r
+#define over_noad         (under_noad + 1   ) // 27\r
+#define accent_noad       (over_noad + 1    ) // 28\r
+#define accent_noad_size  5\r
+#define accent_chr(a)     (a) + 4\r
+#define vcenter_noad      (accent_noad + 1  ) // 29\r
+#define left_noad         (vcenter_noad + 1 ) // 30\r
+#define right_noad        (left_noad + 1    ) // 31\r
+#define delimiter         nucleus\r
+#define script_allowed(a) ((type(a) >= ord_noad) && (type(a) < left_noad))\r
+/* sec 0688 */\r
+#define style_node          (unset_node + 1)\r
+#define style_node_size     3\r
+#define display_style       0\r
+#define text_style          2\r
+#define script_style        4\r
+#define script_script_style 6\r
+#define cramped             1\r
+/* sec 0689 */\r
+#define choice_node            (unset_node + 2)\r
+#define display_mlist(a)       info(a + 1)\r
+#define text_mlist(a)          link(a + 1)\r
+#define script_mlist(a)        info(a + 2)\r
+#define script_script_mlist(a) link(a + 2)\r
+/* sec 0699 */\r
+#define text_size          0\r
+#define script_size        16\r
+#define script_script_size 32\r
+/* sec 0700 */\r
+#define mathsy(a, b)        font_info[a + param_base[fam_fnt(2 + b)]].cint\r
+#define math_x_height(a)    mathsy(5, a)\r
+#define math_quad(a)        mathsy(6, a)\r
+#define num1(a)             mathsy(8, a)\r
+#define num2(a)             mathsy(9, a)\r
+#define num3(a)             mathsy(10, a)\r
+#define denom1(a)           mathsy(11, a)\r
+#define denom2(a)           mathsy(12, a)\r
+#define sup1(a)             mathsy(13, a)\r
+#define sup2(a)             mathsy(14, a)\r
+#define sup3(a)             mathsy(15, a)\r
+#define sub1(a)             mathsy(16, a)\r
+#define sub2(a)             mathsy(17, a)\r
+#define sup_drop(a)         mathsy(18, a)\r
+#define sub_drop(a)         mathsy(19, a)\r
+#define delim1(a)           mathsy(20, a)\r
+#define delim2(a)           mathsy(21, a)\r
+#define axis_height(a)      mathsy(22, a)\r
+#define total_mathsy_params 22\r
+/* sec 0701 */\r
+#define mathex(a)              font_info[(a) + param_base[fam_fnt(3 + cur_size)]].cint\r
+#define default_rule_thickness mathex(8)\r
+#define big_op_spacing1        mathex(9)\r
+#define big_op_spacing2        mathex(10)\r
+#define big_op_spacing3        mathex(11)\r
+#define big_op_spacing4        mathex(12)\r
+#define big_op_spacing5        mathex(13)\r
+#define total_mathex_params    13\r
+/* sec 0702 */\r
+#define cramped_style(a) (2 * ((a) / 2) + cramped)\r
+#define sub_style(a)     (2 * ((a) / 4) + script_style + cramped)\r
+#define sup_style(a)     (2 * ((a) / 4) + script_style + ((a) % 2))\r
+#define num_style(a)     ((a) + 2 - 2 * ((a) / 6))\r
+#define denom_style(a)   (2 * ((a) / 2) + cramped + 2 - 2 * ((a) / 6))\r
+/* sec 0716 */\r
+#define mu_mult(a) nx_plus_y(n, a, xn_over_d(a, f, 0200000))\r
+/* sec 0725 */\r
+#define new_hlist(a) mem[nucleus(a)].cint\r
+/* sec 0731 */\r
+#define choose_mlist(a) \\r
+do                      \\r
+{                       \\r
+  p = a(q);             \\r
+  a(q) = 0;             \\r
+}                       \\r
+while (0)\r
+/* sec 0770 */\r
+#define preamble              link(align_head)\r
+#define align_stack_node_size 5\r
+/* sec 0780 */\r
+#define span_code          256\r
+#define cr_code            257\r
+#define cr_cr_code         (cr_code + 1)\r
+#define end_template_token (cs_token_flag + frozen_end_template)\r
+/* sec 0797 */\r
+#define span_node_size 2\r
+/* sec 0817 */\r
+#define tight_fit      3\r
+#define loose_fit      1\r
+#define very_loose_fit 0\r
+#define decent_fit     2\r
+/* sec 0819 */\r
+#define active_node_size  3\r
+#define fitness           subtype\r
+#define break_node        rlink\r
+#define line_number       llink\r
+#define total_demerits(a) mem[a + 2].cint\r
+#define unhyphenated      0\r
+#define hyphenated        1\r
+#define last_active       active\r
+/* sec 0821 */\r
+#define passive_node_size 2\r
+#define cur_break         rlink\r
+#define prev_break        llink\r
+#define serial            info\r
+/* sec 0822 */\r
+#define delta_node_size 7\r
+#define delta_node      2\r
+/* sec 0823 */\r
+#define do_all_six(a) \\r
+do                    \\r
+{                     \\r
+  a(1); a(2); a(3);   \\r
+  a(4); a(5); a(6);   \\r
+}                     \\r
+while (0)\r
+/* sec 0825 */\r
+#define check_shrinkage(s)                            \\r
+do                                                    \\r
+{                                                     \\r
+  if ((shrink_order(s) != normal) && (shrink(s) != 0))\\r
+    s = finite_shrink(s);                             \\r
+}                                                     \\r
+while (0)\r
+/* sec 0829 */\r
+#define copy_to_cur_active(a) cur_active_width[a] = active_width[a]\r
+/* sec 0832 */\r
+#define update_width(a) cur_active_width[a] = cur_active_width[a] + mem[r + (a)].cint\r
+/* sec 0833 */\r
+#define awful_bad 07777777777\r
+/* sec 0837 */\r
+#define set_break_width_to_background(a) break_width[a] = background[a]\r
+/* sec 0843 */\r
+#define convert_to_break_width(a)   mem[prev_r + (a)].cint = mem[prev_r + (a)].cint - cur_active_width[a] + break_width[a]\r
+#define store_break_width(a)        active_width[a] = break_width[a]\r
+#define new_delta_to_break_width(a) mem[q + (a)].cint = break_width[(a)] - cur_active_width[(a)]\r
+/* sec 0844 */\r
+#define new_delta_from_break_width(a) mem[q + (a)].cint = cur_active_width[(a)] - break_width[(a)]\r
+/* sec 0860 */\r
+#define combine_two_deltas(a) mem[prev_r + (a)].cint = mem[prev_r + (a)].cint + mem[r + (a)].cint\r
+#define downdate_width(a)     cur_active_width[(a)] = cur_active_width[(a)] - mem[prev_r + (a)].cint\r
+/* sec 0861 */\r
+#define update_active(a) active_width[(a)] = active_width[(a)] + mem[r + (a)].cint\r
+/* sec 0864 */\r
+#define store_background(a) active_width[a] = background[a]\r
+/* sec 0866 */\r
+#define act_width active_width[1]\r
+#define kern_break()                                \\r
+do                                                  \\r
+{                                                   \\r
+  if (!is_char_node(link(cur_p)) && auto_breaking)  \\r
+    if (type(link(cur_p)) == glue_node)             \\r
+      try_break(0, unhyphenated);                   \\r
+                                                    \\r
+  act_width = act_width + width(cur_p);             \\r
+}                                                   \\r
+while (0)\r
+/* sec 0877 */\r
+#define next_break prev_break\r
+/* sec 0908 */\r
+#define append_charnode_to_t(a) \\r
+do                              \\r
+  {                             \\r
+    link(t) = get_avail();      \\r
+    t = link(t);                \\r
+    font(t) = hf;               \\r
+    character(t) = (a);         \\r
+  }                             \\r
+while (0)\r
+#define set_cur_r()      \\r
+do                       \\r
+  {                      \\r
+    if (j < n)           \\r
+      cur_r = hu[j + 1]; \\r
+    else                 \\r
+      cur_r = bchar;     \\r
+                         \\r
+    if (odd(hyf[j]))     \\r
+      cur_rh = hchar;    \\r
+    else                 \\r
+      cur_rh = non_char; \\r
+  }                      \\r
+while (0)\r
+/* sec 0910 */\r
+#define wrap_lig(a)                           \\r
+do                                            \\r
+{                                             \\r
+  if (ligature_present)                       \\r
+  {                                           \\r
+    p = new_ligature(hf, cur_l, link(cur_q)); \\r
+                                              \\r
+    if (lft_hit)                              \\r
+    {                                         \\r
+      subtype(p) = 2;                         \\r
+      lft_hit = false;                        \\r
+    }                                         \\r
+                                              \\r
+    if ((a))                                  \\r
+      if (lig_stack == 0)                     \\r
+      {                                       \\r
+        incr(subtype(p));                     \\r
+        rt_hit = false;                       \\r
+      }                                       \\r
+                                              \\r
+    link(cur_q) = p;                          \\r
+    t = p;                                    \\r
+    ligature_present = false;                 \\r
+  }                                           \\r
+}                                             \\r
+while (0)\r
+#define pop_lig_stack()                       \\r
+do                                            \\r
+  {                                           \\r
+    if (lig_ptr(lig_stack) != 0)              \\r
+    {                                         \\r
+      link(t) = lig_ptr(lig_stack);           \\r
+      t = link(t);                            \\r
+      incr(j);                                \\r
+    }                                         \\r
+                                              \\r
+    p = lig_stack;                            \\r
+    lig_stack = link(p);                      \\r
+    free_node(p, small_node_size);            \\r
+                                              \\r
+    if (lig_stack == 0)                       \\r
+    {                                         \\r
+      set_cur_r();                            \\r
+    }                                         \\r
+    else                                      \\r
+      cur_r = character(lig_stack);           \\r
+  }                                           \\r
+while (0)\r
+/* sec 0914 */\r
+#define advance_major_tail()       \\r
+do                                 \\r
+  {                                \\r
+    major_tail = link(major_tail); \\r
+    incr(r_count);                 \\r
+  }                                \\r
+while (0)\r
+/* sec 0970 */\r
+#define active_height      active_width\r
+#define cur_height         active_height[1]\r
+#define set_height_zero(a) active_width[(a)] = 0\r
+/* sec 0974 */\r
+#define deplorable 100000L\r
+/* sec 0980 */\r
+#define inserts_only 1\r
+#define box_there    2\r
+/* sec 0981 */\r
+#define page_ins_node_size 4\r
+#define inserting          0\r
+#define split_up           1\r
+#define broken_ptr(a)      link(a + 1)\r
+#define broken_ins(a)      info(a + 1)\r
+#define last_ins_ptr(a)    link(a + 2)\r
+#define best_ins_ptr(a)    info(a + 2)\r
+/* sec 0982 */\r
+#define page_goal   page_so_far[0]\r
+#define page_total  page_so_far[1]\r
+#define page_shrink page_so_far[6]\r
+#define page_depth  page_so_far[7]\r
+/* sec 0987 */\r
+#define set_page_so_far_zero(a) page_so_far[(a)] = 0\r
+/* sec 1034 */\r
+#define adjust_space_factor()   \\r
+do                              \\r
+{                               \\r
+  main_s = sf_code(cur_chr);    \\r
+  if (main_s == 1000)           \\r
+    space_factor = 1000;        \\r
+  else if (main_s < 1000)       \\r
+  {                             \\r
+    if (main_s > 0)             \\r
+      space_factor = main_s;    \\r
+  }                             \\r
+  else if (space_factor < 1000) \\r
+    space_factor = 1000;        \\r
+  else                          \\r
+    space_factor = main_s;      \\r
+}                               \\r
+while (0)\r
+/* sec 1035 */\r
+/* -> false */\r
+#define wrapup(a)                                         \\r
+do                                                        \\r
+{                                                         \\r
+  if (cur_l < non_char)                                   \\r
+  {                                                       \\r
+    if (link(cur_q) != 0)                                 \\r
+      if (character(tail) == hyphen_char[main_f])         \\r
+        ins_disc = true;                                  \\r
+                                                          \\r
+    if (ligature_present)                                 \\r
+    {                                                     \\r
+      main_p = new_ligature(main_f, cur_l, link(cur_q));  \\r
+                                                          \\r
+      if (lft_hit)                                        \\r
+      {                                                   \\r
+        subtype(main_p) = 2;                              \\r
+        lft_hit = false;                                  \\r
+      }                                                   \\r
+                                                          \\r
+      if (a)                                              \\r
+        if (lig_stack == 0)                               \\r
+        {                                                 \\r
+          incr(subtype(main_p));                          \\r
+          rt_hit = false;                                 \\r
+        }                                                 \\r
+                                                          \\r
+      link(cur_q) = main_p;                               \\r
+      tail = main_p;                                      \\r
+      ligature_present = false;                           \\r
+    }                                                     \\r
+                                                          \\r
+    if (ins_disc)                                         \\r
+    {                                                     \\r
+      ins_disc = false;                                   \\r
+                                                          \\r
+      if (mode > 0)                                       \\r
+      {                                                   \\r
+        tail_append(new_disc());                          \\r
+      }                                                   \\r
+    }                                                     \\r
+  }                                                       \\r
+}                                                         \\r
+while (0)\r
+/* sec 1045 */\r
+#define any_mode(a) vmode + a: case hmode + a: case mmode + a\r
+/* sec 1046 */\r
+#define non_math(a) vmode + a: case hmode + a\r
+/* sec 1058 */\r
+#define fil_code     0\r
+#define fill_code    1\r
+#define ss_code      2\r
+#define fil_neg_code 3\r
+#define skip_code    4\r
+#define mskip_code   5\r
+/* sec 1071 */\r
+#define box_flag      010000000000\r
+#define ship_out_flag (box_flag + 512)\r
+#define leader_flag   (box_flag + 513)\r
+#define box_code      0\r
+#define copy_code     1\r
+#define last_box_code 2\r
+#define vsplit_code   3\r
+#define vtop_code     4\r
+/* sec 1178 */\r
+#define above_code     0\r
+#define over_code      1\r
+#define atop_code      2\r
+#define delimited_code 3\r
+/* sec 1214 */\r
+#define define(p, t, e) \\r
+do                      \\r
+{                       \\r
+  if (a >= 4)           \\r
+    geq_define(p, t, e);\\r
+  else                  \\r
+    eq_define(p, t, e); \\r
+}                       \\r
+while (0)\r
+#define word_define(p, w) \\r
+do                        \\r
+{                         \\r
+  if (a >= 4)             \\r
+    geq_word_define(p, w);\\r
+  else                    \\r
+    eq_word_define(p, w); \\r
+}                         \\r
+while (0)\r
+/* sec 1222 */\r
+#define char_def_code      0\r
+#define math_char_def_code 1\r
+#define count_def_code     2\r
+#define dimen_def_code     3\r
+#define skip_def_code      4\r
+#define mu_skip_def_code   5\r
+#define toks_def_code      6\r
+/* sec 1290 */\r
+#define show_code     0\r
+#define show_box_code 1\r
+#define show_the_code 2\r
+#define show_lists    3\r
+/* sec 1306 */\r
+#define undump(va, vb, vc)        \\r
+do                                \\r
+  {                               \\r
+    undump_int(x);                \\r
+                                  \\r
+    if ((x < (va)) || (x > (vb))) \\r
+      goto bad_fmt;               \\r
+    else                          \\r
+      vc = x;                     \\r
+  }                               \\r
+while (0)\r
+/* sec 1342 */\r
+#define write_node_size 2\r
+#define open_node_size  3\r
+#define open_node       0\r
+#define write_node      1\r
+#define close_node      2\r
+#define special_node    3\r
+#define language_node   4\r
+#define what_lang(s)    link(s+1)\r
+#define what_lhm(s)     type(s+1)\r
+#define what_rhm(s)     subtype(s+1)\r
+#define write_tokens(s) link(s+1)\r
+#define write_stream(s) info(s+1)\r
+#define open_name(s)    link(s+1)\r
+#define open_area(s)    info(s+2)\r
+#define open_ext(s)     link(s+2)\r
+/* sec 1344 */\r
+#define immediate_code    4\r
+#define set_language_code 5\r
+/* sec 1371 */\r
+#define end_write_token (cs_token_flag + end_write)\r
+\r
 #endif
\ No newline at end of file
index b06ac29..82b8b63 100644 (file)
@@ -1,17 +1,17 @@
-Copyright 2007 TeX Users Group.
-Copyright 2014 Clerk Ma.
-You may freely use, modify and/or distribute this file.
-
-  makefile         9945   1-09-95   8:20a current selected 
-  makefile.ms      9843   1-09-95   7:42a MS LINK
-  makefile.dbg    10449   1-09-95   8:11a debugging version MS LINK WINICE
-  makefile.tnt     9262   1-08-95   9:49a 386 | LINK
-
-Note: WINICE DBG2MAP only works on NT style PE files
-
-Note: WINICE MSYM needs loads of memory
-
-Note: MS LINK needs /DEBUG and /DEBUGSTYLE{CV|COFF|BOTH} for debugging info
-
-Note: Can't run as NT style because if INT 21h calls (_dos_find...)
-      or maybe other reasons also... (pharlap.h, pldos32.h)
+Copyright 2007 TeX Users Group.\r
+Copyright 2014 Clerk Ma.\r
+You may freely use, modify and/or distribute this file.\r
+\r
+  makefile         9945   1-09-95   8:20a current selected \r
+  makefile.ms      9843   1-09-95   7:42a MS LINK\r
+  makefile.dbg    10449   1-09-95   8:11a debugging version MS LINK WINICE\r
+  makefile.tnt     9262   1-08-95   9:49a 386 | LINK\r
+\r
+Note: WINICE DBG2MAP only works on NT style PE files\r
+\r
+Note: WINICE MSYM needs loads of memory\r
+\r
+Note: MS LINK needs /DEBUG and /DEBUGSTYLE{CV|COFF|BOTH} for debugging info\r
+\r
+Note: Can't run as NT style because if INT 21h calls (_dos_find...)\r
+      or maybe other reasons also... (pharlap.h, pldos32.h)\r
index ead6eff..77cd1ec 100644 (file)
@@ -1,73 +1,73 @@
-/* Copyright 1992 Karl Berry
-   Copyright 2007 TeX Users Group
-   Copyright 2014 Clerk Ma
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301 USA.  */
-
-/*
-  meaning      structure                      TeX                 Y&Y TeX
-               ----------------------------------------------------------------------
-  integer      |            int            || 4: long           | 8: long long      | min_quarterword 0
-               ---------------------------------------------------------------------- max_quarterword FFFF
-  scaled       |            sc             || 4: long           | 8: long long      | min_halfword
-               ----------------------------------------------------------------------
-  glue_ratio   |            gr             || 4: float          | 8: double         |
-               ----------------------------------------------------------------------
-  halfword     |     lh      |     rh      || 2: unsigned short | 4: unsigned long  |
-               ----------------------------------------------------------------------
-  half+quarter |  b0  |  b1  |     rh      ||                                       |
-               ----------------------------------------------------------------------
-  quarter      |  b0  |  b1  |  b2  |  b3  || 1: unsigned char  | 2: unsigned short |
-               ----------------------------------------------------------------------
-*/
-#ifndef _YANDYTEX_MEMORY_H
-#define _YANDYTEX_MEMORY_H
-
-typedef struct
-{
-#ifdef WORDS_BIGENDIAN
-  halfword rh;
-
-  union
-  {
-    halfword lh;
-
-    struct
-    {
-      quarterword b0, b1;
-    };
-  };
-#endif
-} two_halves;
-
-typedef struct
-{
-#ifdef WORDS_BIGENDIAN
-  quarterword b0, b1, b2, b3;
-#else
-  quarterword b3, b2, b1, b0;
-#endif
-} four_quarters;
-
-typedef union
-{
-  glue_ratio gr;
-  two_halves hh;
-  integer cint;
-  four_quarters qqqq;
-} memory_word;
-
+/* Copyright 1992 Karl Berry\r
+   Copyright 2007 TeX Users Group\r
+   Copyright 2014 Clerk Ma\r
+\r
+   This program is free software; you can redistribute it and/or modify\r
+   it under the terms of the GNU General Public License as published by\r
+   the Free Software Foundation; either version 2 of the License, or\r
+   (at your option) any later version.\r
+\r
+   This program is distributed in the hope that it will be useful, but\r
+   WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+   General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with this program; if not, write to the Free Software\r
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA\r
+   02110-1301 USA.  */\r
+\r
+/*\r
+  meaning      structure                      TeX                 Y&Y TeX\r
+               ----------------------------------------------------------------------\r
+  integer      |            int            || 4: long           | 8: long long      | min_quarterword 0\r
+               ---------------------------------------------------------------------- max_quarterword FFFF\r
+  scaled       |            sc             || 4: long           | 8: long long      | min_halfword\r
+               ----------------------------------------------------------------------\r
+  glue_ratio   |            gr             || 4: float          | 8: double         |\r
+               ----------------------------------------------------------------------\r
+  halfword     |     lh      |     rh      || 2: unsigned short | 4: unsigned long  |\r
+               ----------------------------------------------------------------------\r
+  half+quarter |  b0  |  b1  |     rh      ||                                       |\r
+               ----------------------------------------------------------------------\r
+  quarter      |  b0  |  b1  |  b2  |  b3  || 1: unsigned char  | 2: unsigned short |\r
+               ----------------------------------------------------------------------\r
+*/\r
+#ifndef _YANDYTEX_MEMORY_H\r
+#define _YANDYTEX_MEMORY_H\r
+\r
+typedef struct\r
+{\r
+#ifdef WORDS_BIGENDIAN\r
+  halfword rh;\r
+\r
+  union\r
+  {\r
+    halfword lh;\r
+\r
+    struct\r
+    {\r
+      quarterword b0, b1;\r
+    };\r
+  };\r
+#endif\r
+} two_halves;\r
+\r
+typedef struct\r
+{\r
+#ifdef WORDS_BIGENDIAN\r
+  quarterword b0, b1, b2, b3;\r
+#else\r
+  quarterword b3, b2, b1, b0;\r
+#endif\r
+} four_quarters;\r
+\r
+typedef union\r
+{\r
+  glue_ratio gr;\r
+  two_halves hh;\r
+  integer cint;\r
+  four_quarters qqqq;\r
+} memory_word;\r
+\r
 #endif
\ No newline at end of file
index 17d7099..99ef573 100644 (file)
@@ -1,39 +1,39 @@
-Copyright 2007 TeX Users Group.
-Copyright 2014 Clerk Ma.
-You may freely use, modify and/or distribute this file.
-
-use \write18{...} to execute system commmands?
-
-use openany_out to allow opening `special' files that should
-otherwise be prohibited (on Unix, files starting with .)?
-
-**********************************************************************
-
-Notes:  Making adjustable hash-table version:
-
-win web2c twice with different hash_size and hash_prime
-
-collection the *.c and *.h files in each case
-
-run comaptex.exe on these files to mark all uses of hash_size and hash_prime
-
-reconcile difference with existing *.c and *.h files
-
-**********************************************************************
-
-Notes:  there are still a few places where we may be able to 
-go from 256 to (maxquarterword + 1) (or 255 to maxquarterword):
-itex.c (info(end_span) <- null p.797)
-tex1.c (overflow of grouping levels p.274), 
-tex5.c (confusion(256 spans) p.798), 
-tex7.c (replace_count(tail) p.1120)
-
-**********************************************************************
-
-internal_font_number --> true name --> HPDF_Font
-1                     |  cmr10      |  1
-2                     |  cmr10      |  1
-3                     |  cmmi10     |  2
-
-BOX -> BOX -> BOX -> BOX
-BT -> FONT -> CUR_XY -> ET
+Copyright 2007 TeX Users Group.\r
+Copyright 2014 Clerk Ma.\r
+You may freely use, modify and/or distribute this file.\r
+\r
+use \write18{...} to execute system commmands?\r
+\r
+use openany_out to allow opening `special' files that should\r
+otherwise be prohibited (on Unix, files starting with .)?\r
+\r
+**********************************************************************\r
+\r
+Notes:  Making adjustable hash-table version:\r
+\r
+win web2c twice with different hash_size and hash_prime\r
+\r
+collection the *.c and *.h files in each case\r
+\r
+run comaptex.exe on these files to mark all uses of hash_size and hash_prime\r
+\r
+reconcile difference with existing *.c and *.h files\r
+\r
+**********************************************************************\r
+\r
+Notes:  there are still a few places where we may be able to \r
+go from 256 to (maxquarterword + 1) (or 255 to maxquarterword):\r
+itex.c (info(end_span) <- null p.797)\r
+tex1.c (overflow of grouping levels p.274), \r
+tex5.c (confusion(256 spans) p.798), \r
+tex7.c (replace_count(tail) p.1120)\r
+\r
+**********************************************************************\r
+\r
+internal_font_number --> true name --> HPDF_Font\r
+1                     |  cmr10      |  1\r
+2                     |  cmr10      |  1\r
+3                     |  cmmi10     |  2\r
+\r
+BOX -> BOX -> BOX -> BOX\r
+BT -> FONT -> CUR_XY -> ET\r
index 80db414..a8a2227 100644 (file)
-/* Copyright 1992 Karl Berry
-   Copyright 2007 TeX Users Group
-   Copyright 2014 Clerk Ma
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301 USA.  */
-
-#define EXTERN extern
-
-#include "yandytex.h"
-#undef name
-
-#define PATH_SEP        '/'
-#define PATH_SEP_STRING "/"
-
-#define BUILDNAMEDIRECT
-
-extern int shorten_file_name;
-
-#ifdef FUNNY_CORE_DUMP
-  extern void funny_core_dump(void);
-#endif
-
-#ifdef BUILDNAMEDIRECT
-char * xconcat (char * buffer, char * s1, char * s2)
-{
-  int n1 = strlen(s1);
-  int n2 = strlen(s2);
-
-  if (buffer == s2)
-  {
-    memmove(buffer + n1, buffer, n2 + 1);
-    strncpy(buffer, s1, n1);
-  }
-  else
-  {
-    strcpy(buffer, s1);
-    strcat(buffer + n1, s2);
-  }
-
-  return buffer;
-}
-char * xconcat3 (char *buffer, char *s1, char *s2, char *s3)
-{
-  int n1 = strlen(s1);
-  int n2 = strlen(s2);
-  int n3 = strlen(s3);
-
-  if (buffer == s3)
-  {
-    memmove(buffer + n1 + n2, buffer, n3 + 1);
-    strncpy(buffer, s1, n1);
-    strncpy(buffer + n1, s2, n2);
-  }
-  else
-  {
-    strcpy(buffer, s1);
-    strcat(buffer + n1, s2);
-    strcat(buffer + n1 + n2, s3);
-  }
-
-  return buffer;
-}
-#endif
-
-void patch_in_path (ASCII_code * buffer, ASCII_code *name, ASCII_code * path)
-{
-  if (*path == '\0')
-    strcpy((char *) buffer, (char *) name);
-  else
-    xconcat3((char *) buffer, (char *) path, "/", (char *) name);
-}
-
-int qualified (ASCII_code * name)
-{
-  if (strchr((char *) name, '/') != NULL ||
-      strchr((char *) name, '\\') != NULL ||
-      strchr((char *) name, ':') != NULL)
-    return 1;
-  else
-    return 0;
-}
-/* patch path if 
-    (i)   path not empty
-    (ii)  name not qualified
-    (iii) ext match
-*/
-int prepend_path_if(ASCII_code * buffer, ASCII_code * name, const char * ext, char *path)
-{
-  if (path == NULL)
-    return 0;
-
-  if (*path == '\0')
-    return 0;
-
-  if (qualified(name))
-    return 0;
-
-  if (strstr((char *) name, ext) == NULL)
-    return 0;
-
-  patch_in_path(buffer, name, (ASCII_code *)path);
-
-  return 1;
-}
-
-//  Following works on null-terminated strings
-void check_short_name (unsigned char *s)
-{
-  unsigned char *star, *sdot;
-  int n;
-
-  if ((star = (unsigned char *) strrchr((char *) s, '\\')) != NULL)
-    star++;
-  else if ((star = (unsigned char *) strrchr((char *) s, '/')) != NULL)
-    star++;
-  else if ((star = (unsigned char *) strchr((char *) s, ':')) != NULL)
-    star++;
-  else
-    star = s;
-
-  if ((sdot = (unsigned char *) strchr((char *) star, '.')) != NULL)
-    n = sdot - star;
-  else
-    n = strlen((char *) star);
-
-  if (n > 8)
-    strcpy((char *) star + 8, (char *) star + n);
-
-  if ((sdot = (unsigned char *) strchr((char *) star, '.')) != NULL)
-  {
-    star = sdot + 1;
-
-    n = strlen((char *) star);
-
-    if (n > 3)
-      *(star + 3) = '\0';
-  }
-}
-
-/* Following works on both null-terminated names */
-
-void retwiddle (unsigned char *s)
-{
-  while (*s != '\0')
-  {
-    if (*s == (unsigned char) pseudo_tilde)
-      *s = '~';
-    else if (*s == (unsigned char) pseudo_space)
-      *s = ' ';
-
-    s++;
-  }
-}
-
-boolean open_input (FILE ** f, kpse_file_format_type file_fmt, const char * fopen_mode)
-{
-  boolean openable = false;
-  char * file_name = NULL;
-
-#if defined (FUNNY_CORE_DUMP) && !defined (BibTeX)
-  if (file_fmt == kpse_tex_format &&
-    strncmp(name_of_file + 1, "HackyInputFileNameForCoreDump.tex", 33) == 0)
-    funny_core_dump();
-#endif
-
-  if (return_flag)
-  {
-    if (strcmp(fopen_mode, "r") == 0)
-      fopen_mode = "rb";
-  }
-
-  name_of_file[name_length + 1] = '\0';
-
-  /* reinsert '~' and ' ' in file names */  
-  if (pseudo_tilde != 0 || pseudo_space != 0)
-    retwiddle(name_of_file + 1);
-
-  if (shorten_file_name)
-    check_short_name(name_of_file + 1);
-  
-  if (open_trace_flag)
-    printf(" Open `%s' for input ", name_of_file + 1);
-
-  file_name = kpse_find_file((const_string) name_of_file + 1, file_fmt, false);
-
-  if (file_name != NULL)
-  {
-    strcpy ((char *) name_of_file + 1, file_name);
-    *f = xfopen((char *) file_name, fopen_mode);
-
-#ifdef _WIN32
-    if (name_of_file[1] == '.' && (name_of_file[2] == PATH_SEP || name_of_file[2] == '\\'))
-#else
-    if (name_of_file[1] == '.' && name_of_file[2] == PATH_SEP)
-#endif
-    {
-      unsigned i = 1;
-
-      while (name_of_file[i + 2] != '\0')
-      {
-        name_of_file[i] = name_of_file[i + 2];
-        i++;
-      }
-
-      name_of_file[i] = '\0';
-      name_length = i - 1;
-    }
-    else
-      name_length = strlen((char *) name_of_file + 1);
-      
-    if (file_fmt == kpse_tfm_format)
-    {
-      fbyte = getc(*f);
-    } 
-
-    if (strstr((char *) name_of_file + 1, ".fmt") != NULL)
-    {
-      if (format_file == NULL)
-        format_file = xstrdup((char *) name_of_file + 1);
-
-#ifdef COMPACTFORMAT
-      gz_fmt_file = gzdopen(fileno(*f), "rb9");
-#endif
-    }
-    else if (strstr((char *) name_of_file + 1, ".tfm") != NULL)
-    {
-      if (show_tfm_flag && log_opened)
-      {
-        int n; 
-        n = strlen((char *) name_of_file + 1);
-
-        if (file_offset + n > max_print_line)
-        {
-          (void) putc('\n', log_file);
-          file_offset = 0;
-        }
-        else
-          (void) putc(' ', log_file);
-
-        fprintf(log_file, "(%s)", name_of_file + 1);
-        file_offset += n + 3;
-      }
-    }
-    else if (source_direct == NULL)
-    {
-      char *s;
-
-      source_direct = xstrdup((char *) name_of_file + 1);
-
-      if (trace_flag)
-        printf("Methinks the source %s is `%s'\n", "file", source_direct);
-
-      if ((s = strrchr(source_direct, '/')) == NULL)
-        *source_direct = '\0';
-      else
-        *(s + 1) = '\0';
-
-      if (trace_flag)
-        printf("Methinks the source %s is `%s'\n", "directory", source_direct);
-    }
-
-    openable = true;
-  }
-
-  {
-    unsigned temp_length = strlen((char *) name_of_file + 1);
-    name_of_file[temp_length + 1] = ' ';
-  }
-
-  return openable;
-}
-
-/* At least check for I/O error (such as disk full) when closing */
-/* Would be better to check while writing - but this is better than nothing */
-/* This is used for both input and output files, but never mind ... */
-
-/* now a_close returns -1 on error --- which could be used by caller */
-/* probably want to ignore on input files ... */
-
-// check_fclose not used by anything
-int check_fclose (FILE * f)
-{
-  if (f == NULL)
-    return 0;
-
-  if (ferror(f) || fclose (f))
-  {
-    perrormod("\n! I/O Error");
-    uexit(EXIT_FAILURE);
-  }
-
-  return 0;
-}
-
-char * xstrdup_name (void)
-{
-  if (qualified(name_of_file + 1))
-    *log_line = '\0';
-  else
-  {
-    (void) getcwd(log_line, sizeof(log_line));
-    strcat(log_line, PATH_SEP_STRING);
-  }
-
-  strcat(log_line, (char *) name_of_file + 1);
-  unixify(log_line);
-  return xstrdup(log_line);
-}
-
-boolean open_output (FILE ** f, const char * fopen_mode)
-{
-  unsigned temp_length;
-
-  name_of_file[name_length + 1] = '\0';
-
-  if (pseudo_tilde != 0 || pseudo_space !=  0)
-    retwiddle(name_of_file + 1);
-
-  /* 8 + 3 file names on Windows NT 95/Feb/20 */
-  if (shorten_file_name)
-    check_short_name(name_of_file + 1);
-
-  if (prepend_path_if(name_of_file + 1, name_of_file + 1, ".dvi", dvi_directory) ||
-      prepend_path_if(name_of_file + 1, name_of_file + 1, ".log", log_directory) ||
-      prepend_path_if(name_of_file + 1, name_of_file + 1, ".aux", aux_directory) ||
-      prepend_path_if(name_of_file + 1, name_of_file + 1, ".fmt", fmt_directory) ||
-      prepend_path_if(name_of_file + 1, name_of_file + 1, ".pdf", pdf_directory))
-  {
-    if (open_trace_flag)
-      printf("After prepend %s\n", name_of_file + 1);
-  }
-
-  if (open_trace_flag)
-    printf(" Open `%s' for output ", name_of_file + 1);
-
-  *f = fopen((char *) name_of_file + 1, fopen_mode);
-
-  if (*f == NULL)
-  {
-    string temp_dir = kpse_var_value("TEXMFOUTPUT");
-
-    if (temp_dir != NULL)
-    {
-#ifdef BUILDNAMEDIRECT
-      unsigned char temp_name[file_name_size];
-      xconcat3((char *) temp_name, temp_dir, PATH_SEP_STRING, (char *) name_of_file + 1);
-#else
-      string temp_name = concat3(temp_dir, PATH_SEP_STRING, name_of_file + 1);
-#endif
-
-      if (deslash)
-        unixify((char *) temp_name);
-      
-      /* but we can assume this is opening here for *output* */
-      *f = fopen((char *) temp_name, fopen_mode);
-      /* If this succeeded, change name_of_file accordingly. */
-      if (*f)
-        strcpy((char *) name_of_file + 1, (char *) temp_name);
-
-#ifndef BUILDNAMEDIRECT
-      free (temp_name);
-#endif
-    }
-  }
-
-#ifdef COMPACTFORMAT
-  if (strstr((char *) name_of_file + 1, ".fmt") != NULL)
-    gz_fmt_file = gzdopen(fileno(*f), "wb9");
-#endif
-
-  if (strstr((char *) name_of_file + 1, ".dvi") != NULL)
-    dvi_file_name = xstrdup_name();
-  else if (strstr((char *) name_of_file + 1, ".pdf") != NULL)
-    pdf_file_name = xstrdup_name();
-  else if (strstr((char *) name_of_file + 1, ".log") != NULL)
-    log_file_name = xstrdup_name();
-
-  temp_length = strlen((char *) name_of_file + 1);
-  name_of_file[temp_length + 1] = ' ';
-
-  if (*f)
-    name_length = temp_length;
-  
-  return (*f != NULL);
+/* Copyright 1992 Karl Berry\r
+   Copyright 2007 TeX Users Group\r
+   Copyright 2014 Clerk Ma\r
+\r
+   This program is free software; you can redistribute it and/or modify\r
+   it under the terms of the GNU General Public License as published by\r
+   the Free Software Foundation; either version 2 of the License, or\r
+   (at your option) any later version.\r
+\r
+   This program is distributed in the hope that it will be useful, but\r
+   WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+   General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with this program; if not, write to the Free Software\r
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA\r
+   02110-1301 USA.  */\r
+\r
+#define EXTERN extern\r
+\r
+#include "yandytex.h"\r
+#undef name\r
+\r
+#define PATH_SEP        '/'\r
+#define PATH_SEP_STRING "/"\r
+\r
+#define BUILDNAMEDIRECT\r
+\r
+extern int shorten_file_name;\r
+\r
+#ifdef FUNNY_CORE_DUMP\r
+  extern void funny_core_dump(void);\r
+#endif\r
+\r
+#ifdef BUILDNAMEDIRECT\r
+char * xconcat (char * buffer, char * s1, char * s2)\r
+{\r
+  int n1 = strlen(s1);\r
+  int n2 = strlen(s2);\r
+\r
+  if (buffer == s2)\r
+  {\r
+    memmove(buffer + n1, buffer, n2 + 1);\r
+    strncpy(buffer, s1, n1);\r
+  }\r
+  else\r
+  {\r
+    strcpy(buffer, s1);\r
+    strcat(buffer + n1, s2);\r
+  }\r
+\r
+  return buffer;\r
+}\r
+char * xconcat3 (char *buffer, char *s1, char *s2, char *s3)\r
+{\r
+  int n1 = strlen(s1);\r
+  int n2 = strlen(s2);\r
+  int n3 = strlen(s3);\r
+\r
+  if (buffer == s3)\r
+  {\r
+    memmove(buffer + n1 + n2, buffer, n3 + 1);\r
+    strncpy(buffer, s1, n1);\r
+    strncpy(buffer + n1, s2, n2);\r
+  }\r
+  else\r
+  {\r
+    strcpy(buffer, s1);\r
+    strcat(buffer + n1, s2);\r
+    strcat(buffer + n1 + n2, s3);\r
+  }\r
+\r
+  return buffer;\r
+}\r
+#endif\r
+\r
+void patch_in_path (ASCII_code * buffer, ASCII_code *name, ASCII_code * path)\r
+{\r
+  if (*path == '\0')\r
+    strcpy((char *) buffer, (char *) name);\r
+  else\r
+    xconcat3((char *) buffer, (char *) path, "/", (char *) name);\r
+}\r
+\r
+int qualified (ASCII_code * name)\r
+{\r
+  if (strchr((char *) name, '/') != NULL ||\r
+      strchr((char *) name, '\\') != NULL ||\r
+      strchr((char *) name, ':') != NULL)\r
+    return 1;\r
+  else\r
+    return 0;\r
+}\r
+/* patch path if \r
+    (i)   path not empty\r
+    (ii)  name not qualified\r
+    (iii) ext match\r
+*/\r
+int prepend_path_if(ASCII_code * buffer, ASCII_code * name, const char * ext, char *path)\r
+{\r
+  if (path == NULL)\r
+    return 0;\r
+\r
+  if (*path == '\0')\r
+    return 0;\r
+\r
+  if (qualified(name))\r
+    return 0;\r
+\r
+  if (strstr((char *) name, ext) == NULL)\r
+    return 0;\r
+\r
+  patch_in_path(buffer, name, (ASCII_code *)path);\r
+\r
+  return 1;\r
+}\r
+\r
+//  Following works on null-terminated strings\r
+void check_short_name (unsigned char *s)\r
+{\r
+  unsigned char *star, *sdot;\r
+  int n;\r
+\r
+  if ((star = (unsigned char *) strrchr((char *) s, '\\')) != NULL)\r
+    star++;\r
+  else if ((star = (unsigned char *) strrchr((char *) s, '/')) != NULL)\r
+    star++;\r
+  else if ((star = (unsigned char *) strchr((char *) s, ':')) != NULL)\r
+    star++;\r
+  else\r
+    star = s;\r
+\r
+  if ((sdot = (unsigned char *) strchr((char *) star, '.')) != NULL)\r
+    n = sdot - star;\r
+  else\r
+    n = strlen((char *) star);\r
+\r
+  if (n > 8)\r
+    strcpy((char *) star + 8, (char *) star + n);\r
+\r
+  if ((sdot = (unsigned char *) strchr((char *) star, '.')) != NULL)\r
+  {\r
+    star = sdot + 1;\r
+\r
+    n = strlen((char *) star);\r
+\r
+    if (n > 3)\r
+      *(star + 3) = '\0';\r
+  }\r
+}\r
+\r
+/* Following works on both null-terminated names */\r
+\r
+void retwiddle (unsigned char *s)\r
+{\r
+  while (*s != '\0')\r
+  {\r
+    if (*s == (unsigned char) pseudo_tilde)\r
+      *s = '~';\r
+    else if (*s == (unsigned char) pseudo_space)\r
+      *s = ' ';\r
+\r
+    s++;\r
+  }\r
+}\r
+\r
+boolean open_input (FILE ** f, kpse_file_format_type file_fmt, const char * fopen_mode)\r
+{\r
+  boolean openable = false;\r
+  char * file_name = NULL;\r
+\r
+#if defined (FUNNY_CORE_DUMP) && !defined (BibTeX)\r
+  if (file_fmt == kpse_tex_format &&\r
+    strncmp(name_of_file + 1, "HackyInputFileNameForCoreDump.tex", 33) == 0)\r
+    funny_core_dump();\r
+#endif\r
+\r
+  if (return_flag)\r
+  {\r
+    if (strcmp(fopen_mode, "r") == 0)\r
+      fopen_mode = "rb";\r
+  }\r
+\r
+  name_of_file[name_length + 1] = '\0';\r
+\r
+  /* reinsert '~' and ' ' in file names */  \r
+  if (pseudo_tilde != 0 || pseudo_space != 0)\r
+    retwiddle(name_of_file + 1);\r
+\r
+  if (shorten_file_name)\r
+    check_short_name(name_of_file + 1);\r
+  \r
+  if (open_trace_flag)\r
+    printf(" Open `%s' for input ", name_of_file + 1);\r
+\r
+  file_name = kpse_find_file((const_string) name_of_file + 1, file_fmt, false);\r
+\r
+  if (file_name != NULL)\r
+  {\r
+    strcpy ((char *) name_of_file + 1, file_name);\r
+    *f = xfopen((char *) file_name, fopen_mode);\r
+\r
+#ifdef _WIN32\r
+    if (name_of_file[1] == '.' && (name_of_file[2] == PATH_SEP || name_of_file[2] == '\\'))\r
+#else\r
+    if (name_of_file[1] == '.' && name_of_file[2] == PATH_SEP)\r
+#endif\r
+    {\r
+      unsigned i = 1;\r
+\r
+      while (name_of_file[i + 2] != '\0')\r
+      {\r
+        name_of_file[i] = name_of_file[i + 2];\r
+        i++;\r
+      }\r
+\r
+      name_of_file[i] = '\0';\r
+      name_length = i - 1;\r
+    }\r
+    else\r
+      name_length = strlen((char *) name_of_file + 1);\r
+      \r
+    if (file_fmt == kpse_tfm_format)\r
+    {\r
+      fbyte = getc(*f);\r
+    } \r
+\r
+    if (strstr((char *) name_of_file + 1, ".fmt") != NULL)\r
+    {\r
+      if (format_file == NULL)\r
+        format_file = xstrdup((char *) name_of_file + 1);\r
+\r
+#ifdef COMPACTFORMAT\r
+      gz_fmt_file = gzdopen(fileno(*f), "rb9");\r
+#endif\r
+    }\r
+    else if (strstr((char *) name_of_file + 1, ".tfm") != NULL)\r
+    {\r
+      if (show_tfm_flag && log_opened)\r
+      {\r
+        int n; \r
+        n = strlen((char *) name_of_file + 1);\r
+\r
+        if (file_offset + n > max_print_line)\r
+        {\r
+          (void) putc('\n', log_file);\r
+          file_offset = 0;\r
+        }\r
+        else\r
+          (void) putc(' ', log_file);\r
+\r
+        fprintf(log_file, "(%s)", name_of_file + 1);\r
+        file_offset += n + 3;\r
+      }\r
+    }\r
+    else if (source_direct == NULL)\r
+    {\r
+      char *s;\r
+\r
+      source_direct = xstrdup((char *) name_of_file + 1);\r
+\r
+      if (trace_flag)\r
+        printf("Methinks the source %s is `%s'\n", "file", source_direct);\r
+\r
+      if ((s = strrchr(source_direct, '/')) == NULL)\r
+        *source_direct = '\0';\r
+      else\r
+        *(s + 1) = '\0';\r
+\r
+      if (trace_flag)\r
+        printf("Methinks the source %s is `%s'\n", "directory", source_direct);\r
+    }\r
+\r
+    openable = true;\r
+  }\r
+\r
+  {\r
+    unsigned temp_length = strlen((char *) name_of_file + 1);\r
+    name_of_file[temp_length + 1] = ' ';\r
+  }\r
+\r
+  return openable;\r
+}\r
+\r
+/* At least check for I/O error (such as disk full) when closing */\r
+/* Would be better to check while writing - but this is better than nothing */\r
+/* This is used for both input and output files, but never mind ... */\r
+\r
+/* now a_close returns -1 on error --- which could be used by caller */\r
+/* probably want to ignore on input files ... */\r
+\r
+// check_fclose not used by anything\r
+int check_fclose (FILE * f)\r
+{\r
+  if (f == NULL)\r
+    return 0;\r
+\r
+  if (ferror(f) || fclose (f))\r
+  {\r
+    perrormod("\n! I/O Error");\r
+    uexit(EXIT_FAILURE);\r
+  }\r
+\r
+  return 0;\r
+}\r
+\r
+char * xstrdup_name (void)\r
+{\r
+  if (qualified(name_of_file + 1))\r
+    *log_line = '\0';\r
+  else\r
+  {\r
+    (void) getcwd(log_line, sizeof(log_line));\r
+    strcat(log_line, PATH_SEP_STRING);\r
+  }\r
+\r
+  strcat(log_line, (char *) name_of_file + 1);\r
+  unixify(log_line);\r
+  return xstrdup(log_line);\r
+}\r
+\r
+boolean open_output (FILE ** f, const char * fopen_mode)\r
+{\r
+  unsigned temp_length;\r
+\r
+  name_of_file[name_length + 1] = '\0';\r
+\r
+  if (pseudo_tilde != 0 || pseudo_space !=  0)\r
+    retwiddle(name_of_file + 1);\r
+\r
+  /* 8 + 3 file names on Windows NT 95/Feb/20 */\r
+  if (shorten_file_name)\r
+    check_short_name(name_of_file + 1);\r
+\r
+  if (prepend_path_if(name_of_file + 1, name_of_file + 1, ".dvi", dvi_directory) ||\r
+      prepend_path_if(name_of_file + 1, name_of_file + 1, ".log", log_directory) ||\r
+      prepend_path_if(name_of_file + 1, name_of_file + 1, ".aux", aux_directory) ||\r
+      prepend_path_if(name_of_file + 1, name_of_file + 1, ".fmt", fmt_directory) ||\r
+      prepend_path_if(name_of_file + 1, name_of_file + 1, ".pdf", pdf_directory))\r
+  {\r
+    if (open_trace_flag)\r
+      printf("After prepend %s\n", name_of_file + 1);\r
+  }\r
+\r
+  if (open_trace_flag)\r
+    printf(" Open `%s' for output ", name_of_file + 1);\r
+\r
+  *f = fopen((char *) name_of_file + 1, fopen_mode);\r
+\r
+  if (*f == NULL)\r
+  {\r
+    string temp_dir = kpse_var_value("TEXMFOUTPUT");\r
+\r
+    if (temp_dir != NULL)\r
+    {\r
+#ifdef BUILDNAMEDIRECT\r
+      unsigned char temp_name[file_name_size];\r
+      xconcat3((char *) temp_name, temp_dir, PATH_SEP_STRING, (char *) name_of_file + 1);\r
+#else\r
+      string temp_name = concat3(temp_dir, PATH_SEP_STRING, name_of_file + 1);\r
+#endif\r
+\r
+      if (deslash)\r
+        unixify((char *) temp_name);\r
+      \r
+      /* but we can assume this is opening here for *output* */\r
+      *f = fopen((char *) temp_name, fopen_mode);\r
+      /* If this succeeded, change name_of_file accordingly. */\r
+      if (*f)\r
+        strcpy((char *) name_of_file + 1, (char *) temp_name);\r
+\r
+#ifndef BUILDNAMEDIRECT\r
+      free (temp_name);\r
+#endif\r
+    }\r
+  }\r
+\r
+#ifdef COMPACTFORMAT\r
+  if (strstr((char *) name_of_file + 1, ".fmt") != NULL)\r
+    gz_fmt_file = gzdopen(fileno(*f), "wb9");\r
+#endif\r
+\r
+  if (strstr((char *) name_of_file + 1, ".dvi") != NULL)\r
+    dvi_file_name = xstrdup_name();\r
+  else if (strstr((char *) name_of_file + 1, ".pdf") != NULL)\r
+    pdf_file_name = xstrdup_name();\r
+  else if (strstr((char *) name_of_file + 1, ".log") != NULL)\r
+    log_file_name = xstrdup_name();\r
+\r
+  temp_length = strlen((char *) name_of_file + 1);\r
+  name_of_file[temp_length + 1] = ' ';\r
+\r
+  if (*f)\r
+    name_length = temp_length;\r
+  \r
+  return (*f != NULL);\r
 }
\ No newline at end of file
index 980fb76..1248619 100644 (file)
-/* Copyright 2014 Clerk Ma
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301 USA.  */
-
-#define EXTERN extern
-
-#include "yandytex.h"
-
-static const char * pool_file_arr[] =
-{
-/* 0256 */  "", //"buffer size",
-/* 0257 */  "", //"pool size",
-/* 0258 */  "", //"number of strings",
-/* 0259 */  "" "?" "?" "?",
-/* 0260 */  "m2d5c2l5x2v5i",
-/* 0261 */  "", //"End of file on the terminal!",
-/* 0262 */  "", //"! ",
-/* 0263 */  "", //"(That makes 100 errors; please try again.)",
-/* 0264 */  "", // "? ",
-/* 0265 */  "", //"Type <return> to proceed, S to scroll future error messages,",
-/* 0266 */  "", //"R to run without stopping, Q to run quietly,",
-/* 0267 */  "", //"I to insert something, ",
-/* 0268 */  "", //"E to edit your file,",
-/* 0269 */  "", //"1 or ... or 9 to ignore the next 1 to 9 tokens of input,",
-/* 0270 */  "", //"H for help, X to quit.",
-/* 0271 */  "", //"OK, entering ",
-/* 0272 */  "", //"batchmode",
-/* 0273 */  "", //"nonstopmode",
-/* 0274 */  "", //"scrollmode",
-/* 0275 */  "", //"...",
-/* 0276 */  "", //"insert>",
-/* 0277 */  "", //"I have just deleted some text, as you asked.",
-/* 0278 */  "", //"You can now delete more, or insert, or whatever.",
-/* 0279 */  "", //"Sorry, I don't know how to help in this situation.",
-/* 0280 */  "", //"Maybe you should try asking a human" "?",
-/* 0281 */  "", //"Sorry, I already gave what help I could...",
-/* 0282 */  "", //"An error might have occurred before I noticed any problems.",
-/* 0283 */  "", //"``If all else fails, read the instructions.''",
-/* 0284 */  "", //" (",
-/* 0285 */  "", //"Emergency stop",
-/* 0286 */  "", //"TeX capacity exceeded, sorry [",
-/* 0287 */  "", //"If you really absolutely need more capacity,",
-/* 0288 */  "", //"you can ask a wizard to enlarge me.",
-/* 0289 */  "", //"This can't happen (",
-/* 0290 */  "", //"I'm broken. Please show this to someone who can fix can fix",
-/* 0291 */  "", //"I can't go on meeting you like this",
-/* 0292 */  "", //"One of your faux pas seems to have wounded me deeply...",
-/* 0293 */  "", //"in fact, I'm barely conscious. Please fix it and try again.",
-/* 0294 */  "", //"Interruption",
-/* 0295 */  "", //"You rang" "?",
-/* 0296 */  "", //"Try to insert some instructions for me (e.g.,`I\\showlists'),",
-/* 0297 */  "", //"unless you just want to quit by typing `X'.",
-/* 0298 */  "", //"main memory size",
-/* 0299 */  "", //"AVAIL list clobbered at ",
-/* 0300 */  "", //"Double-AVAIL list clobbered at ",
-/* 0301 */  "", //"Doubly free location at ",
-/* 0302 */  "", //"Bad flag at ",
-/* 0303 */  "", //"New busy locs:",
-/* 0304 */  "", //"LINK(",
-/* 0305 */  "", //"INFO(",
-/* 0306 */  "", //"[]",
-/* 0307 */  "", //"CLOBBERED.",
-/* 0308 */  "", //"foul",
-/* 0309 */  "", //"fil",
-/* 0310 */  "", //" plus ",
-/* 0311 */  "", //" minus ",
-/* 0312 */  "", //" []",
-/* 0313 */  "", //"Bad link, display aborted.",
-/* 0314 */  "", //"etc.",
-/* 0315 */  "", //"Unknown node type!",
-/* 0316 */  "", //"unset",
-/* 0317 */  "", //"box(",
-/* 0318 */  "", //")x",
-/* 0319 */  "", //", shifted ",
-/* 0320 */  "", //" columns)",
-/* 0321 */  "", //", stretch ",
-/* 0322 */  "", //", shrink ",
-/* 0323 */  "", //", glue set ",
-/* 0324 */  "", //"- ",
-/* 0325 */  "", //"< -",
-/* 0326 */  "", //"rule(",
-/* 0327 */  "", //"insert",
-/* 0328 */  "", //", natural size ",
-/* 0329 */  "", //"; split(",
-/* 0330 */  "", //"); float cost ",
-/* 0331 */  "", //"glue",
-/* 0332 */  "", //"nonscript",
-/* 0333 */  "", //"mskip",
-/* 0334 */  "", //"mu",
-/* 0335 */  "",
-/* 0336 */  "", //"leaders ",
-/* 0337 */  "", //"kern",
-/* 0338 */  "", //" (for accent)",
-/* 0339 */  "", //"mkern",
-/* 0340 */  "", //"math",
-/* 0341 */  "", //"on",
-/* 0342 */  "", //"off",
-/* 0343 */  "", //", surrounded ",
-/* 0344 */  "", //" (ligature ",
-/* 0345 */  "", //"penalty ",
-/* 0346 */  "", //"discretionary",
-/* 0347 */  "", //" replacing ",
-/* 0348 */  "", //"mark",
-/* 0349 */  "", //"vadjust",
-/* 0350 */  "", //"flushing",
-/* 0351 */  "", //"copying",
-/* 0352 */  "", //"vertical",
-/* 0353 */  "", //"horizontal",
-/* 0354 */  "", //"display math",
-/* 0355 */  "", //"no",
-/* 0356 */  "", //"internal vertical",
-/* 0357 */  "", //"restricted horizontal",
-/* 0358 */  "", //" mode",
-/* 0359 */  "", //"semantic nest size",
-/* 0360 */  "", //"### ",
-/* 0361 */  "", //" entered at line ",
-/* 0362 */  "", //" (language",
-/* 0363 */  "", //":hyphenmin",
-/* 0364 */  "", //" (\\output routine)",
-/* 0365 */  "", //"### recent contributions:",
-/* 0366 */  "", //"prevdepth ",
-/* 0367 */  "", //"ignored",
-/* 0368 */  "", //", prevgraf ",
-/* 0369 */  "", //" line",
-/* 0370 */  "", //"spacefactor ",
-/* 0371 */  "", //", current language ",
-/* 0372 */  "", //"this will be denominator of:",
-/* 0373 */  "", //"lineskip",
-/* 0374 */  "", //"baselineskip",
-/* 0375 */  "", //"parskip",
-/* 0376 */  "", //"abovedisplayskip",
-/* 0377 */  "", //"belowdisplayskip",
-/* 0378 */  "", //"abovedisplayshortskip",
-/* 0379 */  "", //"belowdisplayshortskip",
-/* 0380 */  "", //"leftskip",
-/* 0381 */  "", //"rightskip",
-/* 0382 */  "", //"topskip",
-/* 0383 */  "", //"splittopskip",
-/* 0384 */  "", //"tabskip",
-/* 0385 */  "", //"spaceskip",
-/* 0386 */  "", //"xspaceskip",
-/* 0387 */  "", //"parfillskip",
-/* 0388 */  "", //"thinmuskip",
-/* 0389 */  "", //"medmuskip",
-/* 0390 */  "", //"thickmuskip",
-/* 0391 */  "", //"[unknown glue parameter!]",
-/* 0392 */  "", //"skip",
-/* 0393 */  "", //"muskip",
-/* 0394 */  "", //"pt",
-/* 0395 */  "", //"output",
-/* 0396 */  "", //"everypar",
-/* 0397 */  "", //"everymath",
-/* 0398 */  "", //"everydisplay",
-/* 0399 */  "", //"everyhbox",
-/* 0400 */  "", //"everyvbox",
-/* 0401 */  "", //"everyjob",
-/* 0402 */  "", //"everycr",
-/* 0403 */  "", //"errhelp",
-/* 0404 */  "", //"toks",
-/* 0405 */  "", //"parshape",
-/* 0406 */  "", //"box",
-/* 0407 */  "", //"void",
-/* 0408 */  "", //"current font",
-/* 0409 */  "", //"textfont",
-/* 0410 */  "", //"scriptfont",
-/* 0411 */  "", //"scriptscriptfont",
-/* 0412 */  "", //"catcode",
-/* 0413 */  "", //"lccode",
-/* 0414 */  "", //"uccode",
-/* 0415 */  "", //"sfcode",
-/* 0416 */  "", //"mathcode",
-/* 0417 */  "", //"pretolerance",
-/* 0418 */  "", //"tolerance",
-/* 0419 */  "", //"linepenalty",
-/* 0420 */  "", //"hyphenpenalty",
-/* 0421 */  "", //"exhyphenpenalty",
-/* 0422 */  "", //"clubpenalty",
-/* 0423 */  "", //"widowpenalty",
-/* 0424 */  "", //"displaywidowpenalty",
-/* 0425 */  "", //"brokenpenalty",
-/* 0426 */  "", //"binoppenalty",
-/* 0427 */  "", //"relpenalty",
-/* 0428 */  "", //"predisplaypenalty",
-/* 0429 */  "", //"postdisplaypenalty",
-/* 0430 */  "", //"interlinepenalty",
-/* 0431 */  "", //"doublehyphendemerits",
-/* 0432 */  "", //"finalhyphendemerits",
-/* 0433 */  "", //"adjdemerits",
-/* 0434 */  "", //"mag",
-/* 0435 */  "", //"delimiterfactor",
-/* 0436 */  "", //"looseness",
-/* 0437 */  "", //"time",
-/* 0438 */  "", //"day",
-/* 0439 */  "", //"month",
-/* 0440 */  "", //"year",
-/* 0441 */  "", //"showboxbreadth",
-/* 0442 */  "", //"showboxdepth",
-/* 0443 */  "", //"hbadness",
-/* 0444 */  "", //"vbadness",
-/* 0445 */  "", //"pausing",
-/* 0446 */  "", //"tracingonline",
-/* 0447 */  "", //"tracingmacros",
-/* 0448 */  "", //"tracingstats",
-/* 0449 */  "", //"tracingparagraphs",
-/* 0450 */  "", //"tracingpages",
-/* 0451 */  "", //"tracingoutput",
-/* 0452 */  "", //"tracinglostchars",
-/* 0453 */  "", //"tracingcommands",
-/* 0454 */  "", //"tracingrestores",
-/* 0455 */  "", //"uchyph",
-/* 0456 */  "", //"outputpenalty",
-/* 0457 */  "", //"maxdeadcycles",
-/* 0458 */  "", //"hangafter",
-/* 0459 */  "", //"floatingpenalty",
-/* 0460 */  "", //"globaldefs",
-/* 0461 */  "", //"fam",
-/* 0462 */  "", //"escapechar",
-/* 0463 */  "", //defaulthyphenchar",
-/* 0464 */  "", //"defaultskewchar",
-/* 0465 */  "", //"endlinechar",
-/* 0466 */  "", //"newlinechar",
-/* 0467 */  "", //"language",
-/* 0468 */  "", //"lefthyphenmin",
-/* 0469 */  "", //"righthyphenmin",
-/* 0470 */  "", //"holdinginserts",
-/* 0471 */  "", //"errorcontextlines",
-/* 0472 */  "", //"[unknown integer parameter!]",
-/* 0473 */  "", //"count",
-/* 0474 */  "", //"delcode",
-/* 0475 */  "", //"parindent",
-/* 0476 */  "", //"mathsurround",
-/* 0477 */  "", //"lineskiplimit",
-/* 0478 */  "", //"hsize",
-/* 0479 */  "", //"vsize",
-/* 0480 */  "", //"maxdepth",
-/* 0481 */  "", //"splitmaxdepth",
-/* 0482 */  "", //"boxmaxdepth",
-/* 0483 */  "", //"hfuzz",
-/* 0484 */  "", //"vfuzz",
-/* 0485 */  "", //"delimitershortfall",
-/* 0486 */  "", //"nulldelimiterspace",
-/* 0487 */  "", //"scriptspace",
-/* 0488 */  "", //"predisplaysize",
-/* 0489 */  "", //"displaywidth",
-/* 0490 */  "", //"displayindent",
-/* 0491 */  "", //"overfullrule",
-/* 0492 */  "", //"hangindent",
-/* 0493 */  "", //"hoffset",
-/* 0494 */  "", //"voffset",
-/* 0495 */  "", //"emergencystretch",
-/* 0496 */  "", //"[unknown dimen parameter!]",
-/* 0497 */  "", //"dimen",
-/* 0498 */  "", //"EQUIV(",
-/* 0499 */  "notexpanded:",
-/* 0500 */  "", //"hash size",
-/* 0501 */  "", //"csname",
-/* 0502 */  "", //"endcsname",
-/* 0503 */  "", //"IMPOSSIBLE.",
-/* 0504 */  "", //"NONEXISTENT.",
-/* 0505 */  "", //"accent",
-/* 0506 */  "", //"advance",
-/* 0507 */  "", //"afterassignment",
-/* 0508 */  "", //"aftergroup",
-/* 0509 */  "", //"begingroup",
-/* 0510 */  "", //"char",
-/* 0511 */  "", //"delimiter",
-/* 0512 */  "", //"divide",
-/* 0513 */  "", //"endgroup",
-/* 0514 */  "", //"expandafter",
-/* 0515 */  "", //"font",
-/* 0516 */  "", //"fontdimen",
-/* 0517 */  "", //"halign",
-/* 0518 */  "", //"hrule",
-/* 0519 */  "", //"ignorespaces",
-/* 0520 */  "", //"mathaccent",
-/* 0521 */  "", //"mathchar",
-/* 0522 */  "", //"mathchoice",
-/* 0523 */  "", //"multiply",
-/* 0524 */  "", //"noalign",
-/* 0525 */  "", //"noboundary",
-/* 0526 */  "", //"noexpand",
-/* 0527 */  "", //"omit",
-/* 0528 */  "", //"penalty",
-/* 0529 */  "", //"prevgraf",
-/* 0530 */  "", //"radical",
-/* 0531 */  "", //"read",
-/* 0532 */  "", //"relax",
-/* 0533 */  "", //"setbox",
-/* 0534 */  "", //"the",
-/* 0535 */  "", //"valign",
-/* 0536 */  "", //"vcenter",
-/* 0537 */  "", //"vrule",
-/* 0538 */  "", //"save size",
-/* 0539 */  "", //"grouping levels",
-/* 0540 */  "", //"curlevel",
-/* 0541 */  "", //"retaining",
-/* 0542 */  "", //"restoring",
-/* 0543 */  "", //"SAVE(",
-/* 0544 */  "", //"Incompatible magnification (",
-/* 0545 */  "", //");",
-/* 0546 */  "", //" the previous value will be retained",
-/* 0547 */  "", //"I can handle only one magnification ratio per job. So I've",
-/* 0548 */  "", //"reverted to the magnification you used earlier on this run.",
-/* 0549 */  "", //"Illegal magnification has been changed to 1000",
-/* 0550 */  "", //"The magnification ratio must be between 1 and 32768.",
-/* 0551 */  "", //"ETC.",
-/* 0552 */  "", //"BAD.",
-/* 0553 */  "", //"->",
-/* 0554 */  "", //"begin-group character ",
-/* 0555 */  "", //"end-group character ",
-/* 0556 */  "", //"math shift character ",
-/* 0557 */  "", //"macro parameter character ",
-/* 0558 */  "", //"superscript character ",
-/* 0559 */  "", //"subscript character ",
-/* 0560 */  "", //"end of alignment template",
-/* 0561 */  "", //"blank space ",
-/* 0562 */  "", //"the letter ",
-/* 0563 */  "", //"the character ",
-/* 0564 */  "", //"[unknown command code!]",
-/* 0565 */  "", //": ",
-/* 0566 */  "", //"Runaway ",
-/* 0567 */  "", //"definition",
-/* 0568 */  "", //"argument",
-/* 0569 */  "", //"preamble",
-/* 0570 */  "", //"text",
-/* 0571 */  "", //"<*>",
-/* 0572 */  "", //"<insert> ",
-/* 0573 */  "", //"<read ",
-/* 0574 */  "", //"l.",
-/* 0575 */  "", //"<argument> ",
-/* 0576 */  "", //"<template> ",
-/* 0577 */  "", //"<recently read> ",
-/* 0578 */  "", //"<to be read again> ",
-/* 0579 */  "", //"<inserted text> ",
-/* 0580 */  "", //"<output> ",
-/* 0581 */  "", //"<everypar> ",
-/* 0582 */  "", //"<everymath> ",
-/* 0583 */  "", //"<everydisplay> ",
-/* 0584 */  "", //"<everyhbox> ",
-/* 0585 */  "", //"<everyvbox> ",
-/* 0586 */  "", //"<everyjob> ",
-/* 0587 */  "", //"<everycr> ",
-/* 0588 */  "", //"<mark> ",
-/* 0589 */  "", //"<write> ",
-/* 0590 */  "", //"input stack size",
-/* 0591 */  "", //"write",
-/* 0592 */  "", //"(interwoven alignment preambles are not allowed)",
-/* 0593 */  "", //"text input levels",
-/* 0594 */  "", //"par",
-/* 0595 */  "", //"Incomplete ",
-/* 0596 */  "", //"; all text was ignored after line ",
-/* 0597 */  "", //"A forbidden control sequence occurred in skipped text.",
-/* 0598 */  "", //"This kind of error happens when you say `\\if...' and forget",
-/* 0599 */  "", //"the matching `\\fi'. I've inserted a `\\fi'; this might work.",
-/* 0600 */  "", //"The file ended while I was skipping conditional text.",
-/* 0601 */  "", //"File ended",
-/* 0602 */  "", //"Forbidden control sequence found",
-/* 0603 */  "", //" while scanning ",
-/* 0604 */  "", //" of ",
-/* 0605 */  "", //"I suspect you have forgotten a `}', causing me",
-/* 0606 */  "", //"to read past where you wanted me to stop.",
-/* 0607 */  "", //"I'll try to recover; but if the error is serious,",
-/* 0608 */  "", //"you'd better type `E' or `X' now and fix your file.",
-/* 0609 */  "", //"use",
-/* 0610 */  "", //"Text line contains an invalid character",
-/* 0611 */  "", //"A funny symbol that I can't read has just been input.",
-/* 0612 */  "", //"Continue, and I'll forget that it ever happened.",
-/* 0613 */  "", //"(Please type a command or say `\\end')",
-/* 0614 */  "", //"*** (job aborted, no legal \\end found)",
-/* 0615 */  "", //"=>",
-/* 0616 */  "", //"Undefined control sequence",
-/* 0617 */  "", //"The control sequence at the end of the top line",
-/* 0618 */  "", //"of your error message was never \\def'ed. If you have",
-/* 0619 */  "", //"misspelled it (e.g., `\\hobx'), type `I' and the correct",
-/* 0620 */  "", //"spelling (e.g., `I\\hbox'). Otherwise just continue,",
-/* 0621 */  "", //"and I'll forget about whatever was undefined.",
-/* 0622 */  "", //"Missing ",
-/* 0623 */  "", //" inserted",
-/* 0624 */  "", //"The control sequence marked <to be read again> should",
-/* 0625 */  "", //"not appear between \\csname and \\endcsname.",
-/* 0626 */  "", //"input",
-/* 0627 */  "", //"endinput",
-/* 0628 */  "", //"topmark",
-/* 0629 */  "", //"firstmark",
-/* 0630 */  "", //"botmark",
-/* 0631 */  "", //"splitfirstmark",
-/* 0632 */  "", //"splitbotmark",
-/* 0633 */  "", //"parameter stack size",
-/* 0634 */  "", //"Argument of ",
-/* 0635 */  "", //" has an extra }",
-/* 0636 */  "", //"I've run across a `}' that doesn't seem to match anything.",
-/* 0637 */  "", //"For example, `\\def\\a#1{...}' and `\\a}' would produce",
-/* 0638 */  "", //"this error. If you simply proceed now, the `\\par' that",
-/* 0639 */  "", //"I've just inserted will cause me to report a runaway",
-/* 0640 */  "", //"argument that might be the root of the problem. But if",
-/* 0641 */  "", //"your `}' was spurious, just type `2' and it will go away.",
-/* 0642 */  "", //"Paragraph ended before ",
-/* 0643 */  "", //" was complete",
-/* 0644 */  "", //"I suspect you've forgotten a `}', causing me to apply this",
-/* 0645 */  "", //"control sequence to too much text. How can we recover" "?",
-/* 0646 */  "", //"My plan is to forget the whole thing and hope for the best.",
-/* 0647 */  "", //"Use of ",
-/* 0648 */  "", //" doesn't match its definition",
-/* 0649 */  "", //"If you say, e.g., `\\def\\a1{...}', then you must always",
-/* 0650 */  "", //"put `1' after `\\a', since control sequence names are",
-/* 0651 */  "", //"made up of letters only. The macro here has not been",
-/* 0652 */  "", //"followed by the required stuff, so I'm ignoring it.",
-/* 0653 */  "", //"<-",
-/* 0654 */  "", //"Missing { inserted",
-/* 0655 */  "", //"A left brace was mandatory here, so I've put one in.",
-/* 0656 */  "", //"You might want to delete and/or insert some corrections",
-/* 0657 */  "", //"so that I will find a matching right brace soon.",
-/* 0658 */  "", //"(If you're confused by all this, try typing `I}' now.)",
-/* 0659 */  "", //"Incompatible glue units",
-/* 0660 */  "", //"I'm going to assume that 1mu=1pt when they're mixed.",
-/* 0661 */  "", //"Missing number, treated as zero",
-/* 0662 */  "", //"A number should have been here; I inserted `0'.",
-/* 0663 */  "", //"(If you can't figure out why I needed to see a number,",
-/* 0664 */  "", //"look up `weird error' in the index to The TeXbook.)",
-/* 0665 */  "", //"spacefactor",
-/* 0666 */  "", //"prevdepth",
-/* 0667 */  "", //"deadcycles",
-/* 0668 */  "", //"insertpenalties",
-/* 0669 */  "", //"wd",
-/* 0670 */  "", //"ht",
-/* 0671 */  "", //"dp",
-/* 0672 */  "", //"lastpenalty",
-/* 0673 */  "", //"lastkern",
-/* 0674 */  "", //"lastskip",
-/* 0675 */  "", //"inputlineno",
-/* 0676 */  "", //"badness",
-/* 0677 */  "", //"Improper ",
-/* 0678 */  "", //"You can refer to \\spacefactor only in horizontal mode;",
-/* 0679 */  "", //"you can refer to \\prevdepth only in vertical mode; and",
-/* 0680 */  "", //"neither of these is meaningful inside \\write. So",
-/* 0681 */  "", //"I'm forgetting what you said and using zero instead.",
-/* 0682 */  "", //"You can't use `",
-/* 0683 */  "", //"' after ",
-/* 0684 */  "", //"Bad register code",
-/* 0685 */  "", //"A register number must be between 0 and 255.",
-/* 0686 */  "", //"I changed this one to zero.",
-/* 0687 */  "", //"Bad character code",
-/* 0688 */  "", //"A character number must be between 0 and 255.",
-/* 0689 */  "", //"Bad number",
-/* 0690 */  "", //"Since I expected to read a number between 0 and 15,",
-/* 0691 */  "", //"Bad mathchar",
-/* 0692 */  "", //"A mathchar number must be between 0 and 32767.",
-/* 0693 */  "", //"Bad delimiter code",
-/* 0694 */  "", //"A numeric delimiter code must be between 0 and 2^{27}-1.",
-/* 0695 */  "", //"Improper alphabetic constant",
-/* 0696 */  "", //"A one-character control sequence belongs after a ` mark.",
-/* 0697 */  "", //"So I'm essentially inserting \\0 here.",
-/* 0698 */  "", //"Number too big",
-/* 0699 */  "", //"I can only go up to 2147483647='17777777777=\"7FFFFFFF,",
-/* 0700 */  "", //"so I'm using that number instead of yours.",
-/* 0701 */  "", //"true",
-/* 0702 */  "", //"Illegal unit of measure (",
-/* 0703 */  "", //"replaced by filll)",
-/* 0704 */  "", //"I dddon't go any higher than filll.",
-/* 0705 */  "", //"em",
-/* 0706 */  "", //"ex",
-/* 0707 */  "", //"mu inserted)",
-/* 0708 */  "", //"The unit of measurement in math glue must be mu.",
-/* 0709 */  "", //"To recover gracefully from this error, it's best to",
-/* 0710 */  "", //"delete the erroneous units; e.g., type `2' to delete",
-/* 0711 */  "", //"two letters. (See Chapter 27 of The TeXbook.)",
-/* 0712 */  "", //"in",
-/* 0713 */  "", //"pc",
-/* 0714 */  "", //"cm",
-/* 0715 */  "", //"mm",
-/* 0716 */  "", //"bp",
-/* 0717 */  "", //"dd",
-/* 0718 */  "", //"cc",
-/* 0719 */  "", //"sp",
-/* 0720 */  "", //"pt inserted)",
-/* 0721 */  "", //"Dimensions can be in units of em, ex, in, pt, pc,",
-/* 0722 */  "", //"cm, mm, dd, cc, bp, or sp; but yours is a new one!",
-/* 0723 */  "", //"I'll assume that you meant to say pt, for printer's points.",
-/* 0724 */  "", //"Dimension too large",
-/* 0725 */  "", //"I can't work with sizes bigger than about 19 feet.",
-/* 0726 */  "", //"Continue and I'll use the largest value I can.",
-/* 0727 */  "", //"plus",
-/* 0728 */  "", //"minus",
-/* 0729 */  "", //"width",
-/* 0730 */  "", //"height",
-/* 0731 */  "", //"depth",
-/* 0732 */  "", //"number",
-/* 0733 */  "", //"romannumeral",
-/* 0734 */  "", //"string",
-/* 0735 */  "", //"meaning",
-/* 0736 */  "", //"fontname",
-/* 0737 */  "", //"jobname",
-/* 0738 */  "", //" at ",
-/* 0739 */  "", //"Where was the left brace" "? You said something like `\\def\\a}',",
-/* 0740 */  "", //"which I'm going to interpret as `\\def\\a{}'.",
-/* 0741 */  "", //"You already have nine parameters",
-/* 0742 */  "", //"I'm going to ignore the # sign you just used.",
-/* 0743 */  "", //"Parameters must be numbered consecutively",
-/* 0744 */  "", //"I've inserted the digit you should have used after the #.",
-/* 0745 */  "", //"Type `1' to delete what you did use.",
-/* 0746 */  "", //"Illegal parameter number in definition of ",
-/* 0747 */  "", //"You meant to type ## instead of #, right" "?",
-/* 0748 */  "", //"Or maybe a } was forgotten somewhere earlier, and things",
-/* 0749 */  "", //"are all screwed up" "? I'm going to assume that you meant ##.",
-/* 0750 */  "", //"*** (cannot \\read from terminal in nonstop modes)",
-/* 0751 */  "", //"File ended within ",
-/* 0752 */  "", //"This \\read has unbalanced braces.",
-/* 0753 */  "", //"if",
-/* 0754 */  "", //"ifcat",
-/* 0755 */  "", //"ifnum",
-/* 0756 */  "", //"ifdim",
-/* 0757 */  "", //"ifodd",
-/* 0758 */  "", //"ifvmode",
-/* 0759 */  "", //"ifhmode",
-/* 0760 */  "", //"ifmmode",
-/* 0761 */  "", //"ifinner",
-/* 0762 */  "", //"ifvoid",
-/* 0763 */  "", //"ifhbox",
-/* 0764 */  "", //"ifvbox",
-/* 0765 */  "", //"ifx",
-/* 0766 */  "", //"ifeof",
-/* 0767 */  "", //"iftrue",
-/* 0768 */  "", //"iffalse",
-/* 0769 */  "", //"ifcase",
-/* 0770 */  "", //"fi",
-/* 0771 */  "", //"or",
-/* 0772 */  "", //"else",
-/* 0773 */  "", //"Extra ",
-/* 0774 */  "", //"I'm ignoring this; it doesn't match any \\if.",
-/* 0775 */  "", //"{true}",
-/* 0776 */  "", //"{false}",
-/* 0777 */  "", //"Missing = inserted for ",
-/* 0778 */  "", //"I was expecting to see `<', `=', or `>'. Didn't.",
-/* 0779 */  "", //"{case ",
-/* 0780 */  "", //".fmt",
-/* 0781 */  "", //"input file name",
-/* 0782 */  "", //"I can't find file `",
-/* 0783 */  "", //"I can't write on file `",
-/* 0784 */  "", //"'.",
-/* 0785 */  ".tex",
-/* 0786 */  "", //"Please type another ",
-/* 0787 */  "", //"*** (job aborted, file error in nonstop mode)",
-/* 0788 */  "", //".dvi",
-/* 0789 */  "", //"file name for output",
-/* 0790 */  "texput",
-/* 0791 */  "", //".log",
-/* 0792 */  "", //"**",
-/* 0793 */  "", //"transcript file name",
-/* 0794 */  "  ",
-/* 0795 */  "nullfont",
-/* 0796 */  "", //"Font ",
-/* 0797 */  "", //" scaled ",
-/* 0798 */  "", //" not loadable: Bad metric (TFM) file",
-/* 0799 */  "", //" not loadable: Metric (TFM) file not found",
-/* 0800 */  "", //"I wasn't able to read the size data for this font,",
-/* 0801 */  "", //"so I will ignore the font specification.",
-/* 0802 */  "", //"[Wizards can fix TFM files using TFtoPL/PLtoTF.]",
-/* 0803 */  "", //"You might try inserting a different font spec;",
-/* 0804 */  "", //"e.g., type `I\\font<same font id>=<substitute font name>'.",
-/* 0805 */  ".tfm",
-/* 0806 */  "", //" not loaded: Not enough room left",
-/* 0807 */  "", //"I'm afraid I won't be able to make use of this font,",
-/* 0808 */  "", //"because my memory for character-size data is too small.",
-/* 0809 */  "", //"If you're really stuck, ask a wizard to enlarge me.",
-/* 0810 */  "", //"Or maybe try `I\\font<same font id>=<name of loaded font>'.",
-/* 0811 */  "", //"Missing font identifier",
-/* 0812 */  "", //"I was looking for a control sequence whose",
-/* 0813 */  "", //"current meaning has been defined by \\font.",
-/* 0814 */  "", //" has only ",
-/* 0815 */  "", //" fontdimen parameters",
-/* 0816 */  "", //"To increase the number of font parameters, you must",
-/* 0817 */  "", //"use \\fontdimen immediately after the \\font is loaded.",
-/* 0818 */  "", //"font memory",
-/* 0819 */  "", //"Missing character: There is no ",
-/* 0820 */  "", //" in font ",
-/* 0821 */  "", //" TeX output ",
-/* 0822 */  "", //"vlistout",
-/* 0823 */  "", //"Completed box being shipped out",
-/* 0824 */  "", //"Memory usage before: ",
-/* 0825 */  "", //" after: ",
-/* 0826 */  "", //"; still untouched: ",
-/* 0827 */  "", //"Huge page cannot be shipped out",
-/* 0828 */  "", //"The page just created is more than 18 feet tall or",
-/* 0829 */  "", //"more than 18 feet wide, so I suspect something went wrong.",
-/* 0830 */  "", //"The following box has been deleted:",
-/* 0831 */  "", //"No pages of output.",
-/* 0832 */  "", //"Output written on ",
-/* 0833 */  "", //" page",
-/* 0834 */  "", //", ",
-/* 0835 */  "", //" bytes).",
-/* 0836 */  "", //"to",
-/* 0837 */  "", //"spread",
-/* 0838 */  "", //"Underfull",
-/* 0839 */  "", //"Loose",
-/* 0840 */  "", //" \\hbox (badness ",
-/* 0841 */  "", //") has occurred while \\output is active",
-/* 0842 */  "", //") in paragraph at lines ",
-/* 0843 */  "", //") in alignment at lines ",
-/* 0844 */  "", //"--",
-/* 0845 */  "", //") detected at line ",
-/* 0846 */  "", //"Overfull \\hbox (",
-/* 0847 */  "", //"pt too wide",
-/* 0848 */  "", //"Tight \\hbox (badness ",
-/* 0849 */  "", //"vpack",
-/* 0850 */  "", //" \\vbox (badness ",
-/* 0851 */  "", //"Overfull \\vbox (",
-/* 0852 */  "", //"pt too high",
-/* 0853 */  "", //"Tight \\vbox (badness ",
-/* 0854 */  "", //"{}",
-/* 0855 */  "", //"displaystyle",
-/* 0856 */  "", //"textstyle",
-/* 0857 */  "", //"scriptstyle",
-/* 0858 */  "", //"scriptscriptstyle",
-/* 0859 */  "", //"Unknown style!",
-/* 0860 */  "", //"mathord",
-/* 0861 */  "", //"mathop",
-/* 0862 */  "", //"mathbin",
-/* 0863 */  "", //"mathrel",
-/* 0864 */  "", //"mathopen",
-/* 0865 */  "", //"mathclose",
-/* 0866 */  "", //"mathpunct",
-/* 0867 */  "", //"mathinner",
-/* 0868 */  "", //"overline",
-/* 0869 */  "", //"underline",
-/* 0870 */  "", //"left",
-/* 0871 */  "", //"right",
-/* 0872 */  "", //"limits",
-/* 0873 */  "", //"nolimits",
-/* 0874 */  "", //"fraction, thickness ",
-/* 0875 */  "", //"= default",
-/* 0876 */  "", //", left-delimiter ",
-/* 0877 */  "", //", right-delimiter ",
-/* 0878 */  "", //" is undefined (character ",
-/* 0879 */  "", //"Somewhere in the math formula just ended, you used the",
-/* 0880 */  "", //"stated character from an undefined font family. For example,",
-/* 0881 */  "", //"plain TeX doesn't allow \\it or \\sl in subscripts. Proceed,",
-/* 0882 */  "", //"and I'll try to forget that I needed that character.",
-/* 0883 */  "", //"mlist1",
-/* 0884 */  "", //"mlist2",
-/* 0885 */  "", //"mlist3",
-/* 0886 */  "0234000122*4000133**3**344*0400400*000000234000111*1111112341011",
-/* 0887 */  "", //"mlist4",
-/* 0888 */  "", //" inside $$'s",
-/* 0889 */  "", //"Displays can use special alignments (like \\eqalignno)",
-/* 0890 */  "", //"only if nothing but the alignment itself is between $$'s.",
-/* 0891 */  "", //"So I've deleted the formulas that preceded this alignment.",
-/* 0892 */  "", //"span",
-/* 0893 */  "", //"cr",
-/* 0894 */  "", //"crcr",
-/* 0895 */  "endtemplate",
-/* 0896 */  "", //"alignment tab character ",
-/* 0897 */  "", //"Missing # inserted in alignment preamble",
-/* 0898 */  "", //"There should be exactly one # between &'s, when an",
-/* 0899 */  "", //"\\halign or \\valign is being set up. In this case you had",
-/* 0900 */  "", //"none, so I've put one in; maybe that will work.",
-/* 0901 */  "", //"Only one # is allowed per tab",
-/* 0902 */  "", //"more than one, so I'm ignoring all but the first.",
-/* 0903 */  "", //"endv",
-/* 0904 */  "", //"Extra alignment tab has been changed to ",
-/* 0905 */  "", //"You have given more \\span or & marks than there were",
-/* 0906 */  "", //"in the preamble to the \\halign or \\valign now in progress.",
-/* 0907 */  "", //"So I'll assume that you meant to type \\cr instead.",
-/* 0908 */  "", //"256 spans",
-/* 0909 */  "", //"align1",
-/* 0910 */  "", //"align0",
-/* 0911 */  "", //"Infinite glue shrinkage found in a paragraph",
-/* 0912 */  "", //"The paragraph just ended includes some glue that has",
-/* 0913 */  "", //"infinite shrinkability, e.g., `\\hskip 0pt minus 1fil'.",
-/* 0914 */  "", //"Such glue doesn't belong there---it allows a paragraph",
-/* 0915 */  "", //"of any length to fit on one line. But it's safe to proceed,",
-/* 0916 */  "", //"since the offensive shrinkability has been made finite.",
-/* 0917 */  "", //"disc1",
-/* 0918 */  "", //"disc2",
-/* 0919 */  "", //"@@",
-/* 0920 */  "", //": line ",
-/* 0921 */  "", //" t=",
-/* 0922 */  "", //" -> @@",
-/* 0923 */  "", //" via @@",
-/* 0924 */  "", //" b=",
-/* 0925 */  "", //" p=",
-/* 0926 */  "", //" d=",
-/* 0927 */  "", //"@firstpass",
-/* 0928 */  "", //"@secondpass",
-/* 0929 */  "", //"@emergencypass",
-/* 0930 */  "", //"paragraph",
-/* 0931 */  "", //"disc3",
-/* 0932 */  "", //"disc4",
-/* 0933 */  "", //"line breaking",
-/* 0934 */  "", //"HYPH(",
-/* 0935 */  "", //"hyphenation",
-/* 0936 */  "", //" will be flushed",
-/* 0937 */  "", //"Hyphenation exceptions must contain only letters",
-/* 0938 */  "", //"and hyphens. But continue; I'll forgive and forget.",
-/* 0939 */  "", //"Not a letter",
-/* 0940 */  "", //"Letters in \\hyphenation words must have \\lccode>0.",
-/* 0941 */  "", //"Proceed; I'll ignore the character I just read.",
-/* 0942 */  "", //"exception dictionary",
-/* 0943 */  "", //"pattern memory ops",
-/* 0944 */  "", //"pattern memory ops per language",
-/* 0945 */  "", //"pattern memory",
-/* 0946 */  "", //"Too late for ",
-/* 0947 */  "", //"patterns",
-/* 0948 */  "", //"All patterns must be given before typesetting begins.",
-/* 0949 */  "", //"Bad ",
-/* 0950 */  "", //"(See Appendix H.)",
-/* 0951 */  "", //"Nonletter",
-/* 0952 */  "", //"Duplicate pattern",
-/* 0953 */  "", //"pruning",
-/* 0954 */  "", //"vertbreak",
-/* 0955 */  "", //"Infinite glue shrinkage found in box being split",
-/* 0956 */  "", //"The box you are \\vsplitting contains some infinitely",
-/* 0957 */  "", //"shrinkable glue, e.g., `\\vss' or `\\vskip 0pt minus 1fil'.",
-/* 0958 */  "", //"Such glue doesn't belong there; but you can safely proceed,",
-/* 0959 */  "", //"vsplit",
-/* 0960 */  "", //" needs a ",
-/* 0961 */  "", //"vbox",
-/* 0962 */  "", //"The box you are trying to split is an \\hbox.",
-/* 0963 */  "", //"I can't split such a box, so I'll leave it alone.",
-/* 0964 */  "", //"pagegoal",
-/* 0965 */  "", //"pagetotal",
-/* 0966 */  "", //"pagestretch",
-/* 0967 */  "", //"pagefilstretch",
-/* 0968 */  "", //"pagefillstretch",
-/* 0969 */  "", //"pagefilllstretch",
-/* 0970 */  "", //"pageshrink",
-/* 0971 */  "", //"pagedepth",
-/* 0972 */  "", //"fill",
-/* 0973 */  "", //"filll",
-/* 0974 */  "", //"### current page:",
-/* 0975 */  "", //" (held over for next output)",
-/* 0976 */  "", //"total height ",
-/* 0977 */  "", //" goal height ",
-/* 0978 */  "", //" adds ",
-/* 0979 */  "", //", #",
-/* 0980 */  "", //" might split",
-/* 0981 */  "", //"%% goal height=",
-/* 0982 */  "", //", max depth=",
-/* 0983 */  "", //"Insertions can only be added to a vbox",
-/* 0984 */  "", //"Tut tut: You're trying to \\insert into a",
-/* 0985 */  "", //"\\box register that now contains an \\hbox.",
-/* 0986 */  "", //"Proceed, and I'll discard its present contents.",
-/* 0987 */  "", //"page",
-/* 0988 */  "", //"Infinite glue shrinkage found on current page",
-/* 0989 */  "", //"The page about to be output contains some infinitely",
-/* 0990 */  "", //" g=",
-/* 0991 */  "", //" c=",
-/* 0992 */  "", //"Infinite glue shrinkage inserted from ",
-/* 0993 */  "", //"The correction glue for page breaking with insertions",
-/* 0994 */  "", //"must have finite shrinkability. But you may proceed,",
-/* 0995 */  "", //"% split",
-/* 0996 */  "", //" to ",
-/* 0997 */  "", //"255 is not void",
-/* 0998 */  "", //"You shouldn't use \\box255 except in \\output routines.",
-/* 0999 */  "", //"Output loop---",
-/* 1000 */  "", //" consecutive dead cycles",
-/* 1001 */  "", //"I've concluded that your \\output is awry; it never does a",
-/* 1002 */  "", //"\\shipout, so I'm shipping \\box255 out myself. Next time",
-/* 1003 */  "", //"increase \\maxdeadcycles if you want me to be more patient!",
-/* 1004 */  "", //"Unbalanced output routine",
-/* 1005 */  "", //"Your sneaky output routine has problematic {'s and/or }'s.",
-/* 1006 */  "", //"I can't handle that very well; good luck.",
-/* 1007 */  "", //"Output routine didn't use all of ",
-/* 1008 */  "", //"Your \\output commands should empty \\box255,",
-/* 1009 */  "", //"e.g., by saying `\\shipout\\box255'.",
-/* 1010 */  "", //"Proceed; I'll discard its present contents.",
-/* 1011 */  "", //"Missing $ inserted",
-/* 1012 */  "", //"I've inserted a begin-math/end-math symbol since I think",
-/* 1013 */  "", //"you left one out. Proceed, with fingers crossed.",
-/* 1014 */  "", //"' in ",
-/* 1015 */  "", //"Sorry, but I'm not programmed to handle this case;",
-/* 1016 */  "", //"I'll just pretend that you didn't ask for it.",
-/* 1017 */  "", //"If you're in the wrong mode, you might be able to",
-/* 1018 */  "", //"return to the right one by typing `I}' or `I$' or `I\\par'.",
-/* 1019 */  "", //"end",
-/* 1020 */  "", //"dump",
-/* 1021 */  "", //"hskip",
-/* 1022 */  "", //"hfil",
-/* 1023 */  "", //"hfill",
-/* 1024 */  "", //"hss",
-/* 1025 */  "", //"hfilneg",
-/* 1026 */  "", //"vskip",
-/* 1027 */  "", //"vfil",
-/* 1028 */  "", //"vfill",
-/* 1029 */  "", //"vss",
-/* 1030 */  "", //"vfilneg",
-/* 1031 */  "", //"I've inserted something that you may have forgotten.",
-/* 1032 */  "", //"(See the <inserted text> above.)",
-/* 1033 */  "", //"With luck, this will get me unwedged. But if you",
-/* 1034 */  "", //"really didn't forget anything, try typing `2' now; then",
-/* 1035 */  "", //"my insertion and my current dilemma will both disappear.",
-/* 1036 */  "", //"right.",
-/* 1037 */  "", //"Things are pretty mixed up, but I think the worst is over.",
-/* 1038 */  "", //"Too many }'s",
-/* 1039 */  "", //"You've closed more groups than you opened.",
-/* 1040 */  "", //"Such booboos are generally harmless, so keep going.",
-/* 1041 */  "", //"rightbrace",
-/* 1042 */  "", //"Extra }, or forgotten ",
-/* 1043 */  "", //"I've deleted a group-closing symbol because it seems to be",
-/* 1044 */  "", //"spurious, as in `$x}$'. But perhaps the } is legitimate and",
-/* 1045 */  "", //"you forgot something else, as in `\\hbox{$x}'. In such cases",
-/* 1046 */  "", //"the way to recover is to insert both the forgotten and the",
-/* 1047 */  "", //"deleted material, e.g., by typing `I$}'.",
-/* 1048 */  "", //"moveleft",
-/* 1049 */  "", //"moveright",
-/* 1050 */  "", //"raise",
-/* 1051 */  "", //"lower",
-/* 1052 */  "", //"copy",
-/* 1053 */  "", //"lastbox",
-/* 1054 */  "", //"vtop",
-/* 1055 */  "", //"hbox",
-/* 1056 */  "", //"shipout",
-/* 1057 */  "", //"leaders",
-/* 1058 */  "", //"cleaders",
-/* 1059 */  "", //"xleaders",
-/* 1060 */  "", //"Leaders not followed by proper glue",
-/* 1061 */  "", //"You should say `\\leaders <box or rule><hskip or vskip>'.",
-/* 1062 */  "", //"I found the <box or rule>, but there's no suitable",
-/* 1063 */  "", //"<hskip or vskip>, so I'm ignoring these leaders.",
-/* 1064 */  "", //"Sorry; this \\lastbox will be void.",
-/* 1065 */  "", //"Sorry...I usually can't take things from the current page.",
-/* 1066 */  "", //"This \\lastbox will therefore be void.",
-/* 1067 */  "", //"Missing `to' inserted",
-/* 1068 */  "", //"I'm working on `\\vsplit<box number> to <dimen>';",
-/* 1069 */  "", //"will look for the <dimen> next.",
-/* 1070 */  "", //"A <box> was supposed to be here",
-/* 1071 */  "", //"I was expecting to see \\hbox or \\vbox or \\copy or \\box or",
-/* 1072 */  "", //"something like that. So you might find something missing in",
-/* 1073 */  "", //"your output. But keep trying; you can fix this later.",
-/* 1074 */  "", //"indent",
-/* 1075 */  "", //"noindent",
-/* 1076 */  "", //"' here except with leaders",
-/* 1077 */  "", //"To put a horizontal rule in an hbox or an alignment,",
-/* 1078 */  "", //"you should use \\leaders or \\hrulefill (see The TeXbook).",
-/* 1079 */  "", //"You can't ",
-/* 1080 */  "", //"I'm changing to \\insert0; box 255 is special.",
-/* 1081 */  "", //"Try `I\\vskip-\\lastskip' instead.",
-/* 1082 */  "", //"Try `I\\kern-\\lastkern' instead.",
-/* 1083 */  "", //"Perhaps you can make the output routine do it.",
-/* 1084 */  "", //"unpenalty",
-/* 1085 */  "", //"unkern",
-/* 1086 */  "", //"unskip",
-/* 1087 */  "", //"unhbox",
-/* 1088 */  "", //"unhcopy",
-/* 1089 */  "", //"unvbox",
-/* 1090 */  "", //"unvcopy",
-/* 1091 */  "", //"Incompatible list can't be unboxed",
-/* 1092 */  "", //"Sorry, Pandora. (You sneaky devil.)",
-/* 1093 */  "", //"I refuse to unbox an \\hbox in vertical mode or vice versa.",
-/* 1094 */  "", //"And I can't open any boxes in math mode.",
-/* 1095 */  "", //"Illegal math ",
-/* 1096 */  "", //"Sorry: The third part of a discretionary break must be",
-/* 1097 */  "", //"empty, in math formulas. I had to delete your third part.",
-/* 1098 */  "", //"Discretionary list is too long",
-/* 1099 */  "", //"Wow---I never thought anybody would tweak me here.",
-/* 1100 */  "", //"You can't seriously need such a huge discretionary list" "?",
-/* 1101 */  "", //"Improper discretionary list",
-/* 1102 */  "", //"Discretionary lists must contain only boxes and kerns.",
-/* 1103 */  "", //"The following discretionary sublist has been deleted:",
-/* 1104 */  "", //"Missing } inserted",
-/* 1105 */  "", //"I've put in what seems to be necessary to fix",
-/* 1106 */  "", //"the current column of the current alignment.",
-/* 1107 */  "", //"Try to go on, since this might almost work.",
-/* 1108 */  "", //"Misplaced ",
-/* 1109 */  "", //"I can't figure out why you would want to use a tab mark",
-/* 1110 */  "", //"here. If you just want an ampersand, the remedy is",
-/* 1111 */  "", //"simple: Just type `I\\&' now. But if some right brace",
-/* 1112 */  "", //"up above has ended a previous alignment prematurely,",
-/* 1113 */  "", //"you're probably due for more error messages, and you",
-/* 1114 */  "", //"might try typing `S' now just to see what is salvageable.",
-/* 1115 */  "", //"or \\cr or \\span just now. If something like a right brace",
-/* 1116 */  "", //"I expect to see \\noalign only after the \\cr of",
-/* 1117 */  "", //"an alignment. Proceed, and I'll ignore this case.",
-/* 1118 */  "", //"I expect to see \\omit only after tab marks or the \\cr of",
-/* 1119 */  "", // "I'm guessing that you meant to end an alignment here.",
-/* 1120 */  "", //"I'm ignoring this, since I wasn't doing a \\csname.",
-/* 1121 */  "", //"eqno",
-/* 1122 */  "", //"leqno",
-/* 1123 */  "", //"displaylimits",
-/* 1124 */  "", //"Limit controls must follow a math operator",
-/* 1125 */  "", //"I'm ignoring this misplaced \\limits or \\nolimits command.",
-/* 1126 */  "", //"Missing delimiter (. inserted)",
-/* 1127 */  "", //"I was expecting to see something like `(' or `\\{' or",
-/* 1128 */  "", //"`\\}' here. If you typed, e.g., `{' instead of `\\{', you",
-/* 1129 */  "", //"should probably delete the `{' by typing `1' now, so that",
-/* 1130 */  "", //"braces don't get unbalanced. Otherwise just proceed.",
-/* 1131 */  "", //"Acceptable delimiters are characters whose \\delcode is",
-/* 1132 */  "", //"nonnegative, or you can use `\\delimiter <delimiter code>'.",
-/* 1133 */  "", //"Please use ",
-/* 1134 */  "", //" for accents in math mode",
-/* 1135 */  "", //"I'm changing \\accent to \\mathaccent here; wish me luck.",
-/* 1136 */  "", //"(Accents are not the same in formulas as they are in text.)",
-/* 1137 */  "", //"Double superscript",
-/* 1138 */  "", //"I treat `x^1^2' essentially like `x^1{}^2'.",
-/* 1139 */  "", //"Double subscript",
-/* 1140 */  "", //"I treat `x_1_2' essentially like `x_1{}_2'.",
-/* 1141 */  "", //"above",
-/* 1142 */  "", //"over",
-/* 1143 */  "", //"atop",
-/* 1144 */  "", //"abovewithdelims",
-/* 1145 */  "", //"overwithdelims",
-/* 1146 */  "", //"atopwithdelims",
-/* 1147 */  "", //"Ambiguous; you need another { and }",
-/* 1148 */  "", //"I'm ignoring this fraction specification, since I don't",
-/* 1149 */  "", //"know whether a construction like `x \\over y \\over z'",
-/* 1150 */  "", //"means `{x \\over y} \\over z' or `x \\over {y \\over z}'.",
-/* 1151 */  "", //"I'm ignoring a \\right that had no matching \\left.",
-/* 1152 */  "", //"Math formula deleted: Insufficient symbol fonts",
-/* 1153 */  "", //"Sorry, but I can't typeset math unless \\textfont 2",
-/* 1154 */  "", //"and \\scriptfont 2 and \\scriptscriptfont 2 have all",
-/* 1155 */  "", //"the \\fontdimen values needed in math symbol fonts.",
-/* 1156 */  "", //"Math formula deleted: Insufficient extension fonts",
-/* 1157 */  "", //"Sorry, but I can't typeset math unless \\textfont 3",
-/* 1158 */  "", //"and \\scriptfont 3 and \\scriptscriptfont 3 have all",
-/* 1159 */  "", //"the \\fontdimen values needed in math extension fonts.",
-/* 1160 */  "", //"Display math should end with $$",
-/* 1161 */  "", //"The `$' that I just saw supposedly matches a previous `$$'.",
-/* 1162 */  "", //"So I shall assume that you typed `$$' both times.",
-/* 1163 */  "", //"display",
-/* 1164 */  "", //"Missing $$ inserted",
-/* 1165 */  "", //"long",
-/* 1166 */  "", //"outer",
-/* 1167 */  "", //"global",
-/* 1168 */  "", //"def",
-/* 1169 */  "", //"gdef",
-/* 1170 */  "", //"edef",
-/* 1171 */  "", //"xdef",
-/* 1172 */  "", //"prefix",
-/* 1173 */  "", //"You can't use a prefix with `",
-/* 1174 */  "", //"I'll pretend you didn't say \\long or \\outer or \\global.",
-/* 1175 */  "", //"' or `",
-/* 1176 */  "", //"' with `",
-/* 1177 */  "", //"I'll pretend you didn't say \\long or \\outer here.",
-/* 1178 */  "", //"Missing control sequence inserted",
-/* 1179 */  "", //"Please don't say `\\def cs{...}', say `\\def\\cs{...}'.",
-/* 1180 */  "", //"I've inserted an inaccessible control sequence so that your",
-/* 1181 */  "", //"definition will be completed without mixing me up too badly.",
-/* 1182 */  "", //"You can recover graciously from this error, if you're",
-/* 1183 */  "", //"careful; see exercise 27.2 in The TeXbook.",
-/* 1184 */  "inaccessible",
-/* 1185 */  "", //"let",
-/* 1186 */  "", //"futurelet",
-/* 1187 */  "", //"chardef",
-/* 1188 */  "", //"mathchardef",
-/* 1189 */  "", //"countdef",
-/* 1190 */  "", //"dimendef",
-/* 1191 */  "", //"skipdef",
-/* 1192 */  "", //"muskipdef",
-/* 1193 */  "", //"toksdef",
-/* 1194 */  "", //"You should have said `\\read<number> to \\cs'.",
-/* 1195 */  "", //"I'm going to look for the \\cs now.",
-/* 1196 */  "", //"Invalid code (",
-/* 1197 */  "", //"), should be in the range 0..",
-/* 1198 */  "", //"), should be at most ",
-/* 1199 */  "", //"I'm going to use 0 instead of that illegal code value.",
-/* 1200 */  "", //"by",
-/* 1201 */  "", //"Arithmetic overflow",
-/* 1202 */  "", //"I can't carry out that multiplication or division,",
-/* 1203 */  "", //"since the result is out of range.",
-/* 1204 */  "", //"I'm forgetting what you said and not changing anything.",
-/* 1205 */  "", //"Sorry, \\setbox is not allowed after \\halign in a display,",
-/* 1206 */  "", //"or between \\accent and an accented character.",
-/* 1207 */  "", //"Bad space factor",
-/* 1208 */  "", //"I allow only values in the range 1..32767 here.",
-/* 1209 */  "", //"I allow only nonnegative values here.",
-/* 1210 */  "", //"Patterns can be loaded only by INITEX",
-/* 1211 */  "", //"hyphenchar",
-/* 1212 */  "", //"skewchar",
-/* 1213 */  "FONT",
-/* 1214 */  "", //"at",
-/* 1215 */  "", //"scaled",
-/* 1216 */  "", //"Improper `at' size (",
-/* 1217 */  "", //"pt), replaced by 10pt",
-/* 1218 */  "", //"I can only handle fonts at positive sizes that are",
-/* 1219 */  "", //"less than 2048pt, so I've changed what you said to 10pt.",
-/* 1220 */  "", //"select font ",
-/* 1221 */  "", //"errorstopmode",
-/* 1222 */  "", //"openin",
-/* 1223 */  "", //"closein",
-/* 1224 */  "", //"message",
-/* 1225 */  "", //"errmessage",
-/* 1226 */  "", //"(That was another \\errmessage.)",
-/* 1227 */  "", //"This error message was generated by an \\errmessage",
-/* 1228 */  "", //"command, so I can't give any explicit help.",
-/* 1229 */  "", //"Pretend that you're Hercule Poirot: Examine all clues,",
-/* 1230 */  "", //"and deduce the truth by order and method.",
-/* 1231 */  "", //"lowercase",
-/* 1232 */  "", //"uppercase",
-/* 1233 */  "", //"show",
-/* 1234 */  "", //"showbox",
-/* 1235 */  "", //"showthe",
-/* 1236 */  "", //"showlists",
-/* 1237 */  "", //"This isn't an error message; I'm just \\showing something.",
-/* 1238 */  "", //"Type `I\\show...' to show more (e.g., \\show\\cs,",
-/* 1239 */  "", //"\\showthe\\count10, \\showbox255, \\showlists).",
-/* 1240 */  "", //"And type `I\\tracingonline=1\\show...' to show boxes and",
-/* 1241 */  "", //"lists on your terminal as well as in the transcript file.",
-/* 1242 */  "", //"> ",
-/* 1243 */  "", //"undefined",
-/* 1244 */  "", //"macro",
-/* 1245 */  "", //"long macro",
-/* 1246 */  "", //"outer macro",
-/* 1247 */  "", //"outer endtemplate",
-/* 1248 */  "", //"> \\box",
-/* 1249 */  "", //"OK",
-/* 1250 */  "", //" (see the transcript file)",
-/* 1251 */  " (INITEX)",
-/* 1252 */  "", //"You can't dump inside a group",
-/* 1253 */  "", //"`{...\\dump}' is a no-no.",
-/* 1254 */  "", //" strings of total length ",
-/* 1255 */  "", //" memory locations dumped; current usage is ",
-/* 1256 */  "", //" multiletter control sequences",
-/* 1257 */  "", //" words of font info for ",
-/* 1258 */  "", //" preloaded font",
-/* 1259 */  "", //"\\font",
-/* 1260 */  "", //" hyphenation exception",
-/* 1261 */  "", //"Hyphenation trie of length ",
-/* 1262 */  "", //" has ",
-/* 1263 */  "", //" op",
-/* 1264 */  "", //" out of ",
-/* 1265 */  "", //" for language ",
-/* 1266 */  "", //" (format=",
-/* 1267 */  "", //"format file name",
-/* 1268 */  "", //"Beginning to dump on file ",
-/* 1269 */  "", //"Transcript written on ",
-/* 1270 */  "", //" )",
-/* 1271 */  "", //"end occurred ",
-/* 1272 */  "", //"inside a group at level ",
-/* 1273 */  "", //"when ",
-/* 1274 */  "", //" on line ",
-/* 1275 */  "", //" was incomplete)",
-/* 1276 */  "", //"(see the transcript file for additional information)",
-/* 1277 */  "", //"(\\dump is performed only by INITEX)",
-/* 1278 */  "", //"debug # (-1 to exit):",
-/* 1279 */  "", //"openout",
-/* 1280 */  "", //"closeout",
-/* 1281 */  "", //"special",
-/* 1282 */  "", //"immediate",
-/* 1283 */  "", //"setlanguage",
-/* 1284 */  "", //"[unknown extension!]",
-/* 1285 */  "", //"ext1",
-/* 1286 */  "", //" (hyphenmin ",
-/* 1287 */  "", //"whatsit" "?",
-/* 1288 */  "", //"ext2",
-/* 1289 */  "", //"ext3",
-/* 1290 */  "endwrite",
-/* 1291 */  "", //"Unbalanced write command",
-/* 1292 */  "", //"On this page there's a \\write with fewer real {'s than }'s.",
-/* 1293 */  "", //"ext4",
-/* 1294 */  "", //"output file name",
-};
-
-str_number load_pool_strings (integer spare_size)
-{
-  str_number g;
-  int k, l, i = 0;
-
-  for (k = 0; k < sizeof(pool_file_arr) / sizeof(char *); k++)
-  {
-    l = strlen(pool_file_arr[k]);
-    i += l;
-
-    if (i >= spare_size)
-      return 0;
-
-    memcpy(str_pool + pool_ptr, pool_file_arr[k], l);
-    pool_ptr += l;
-    g = make_string();
-  }
-
-  return g;
-}
-
-str_number make_string_pool (const char * s)
-{
-  int slen = strlen(s);
-
-  if (slen == 1)
-  {
-    return ((str_number)s[0]);
-  }
-  else
-  {
-    memcpy(str_pool + pool_ptr, s, slen);
-    pool_ptr += slen;
-    return (make_string());
-  }
-}
-
-str_number get_job_name (str_number job)
-{
-  str_number ret = job;
-
-  if (c_job_name != NULL)
-    ret = make_string_pool(c_job_name);
-
-  return ret;
+/* Copyright 2014 Clerk Ma\r
+\r
+   This program is free software; you can redistribute it and/or modify\r
+   it under the terms of the GNU General Public License as published by\r
+   the Free Software Foundation; either version 2 of the License, or\r
+   (at your option) any later version.\r
+\r
+   This program is distributed in the hope that it will be useful, but\r
+   WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+   General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with this program; if not, write to the Free Software\r
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA\r
+   02110-1301 USA.  */\r
+\r
+#define EXTERN extern\r
+\r
+#include "yandytex.h"\r
+\r
+static const char * pool_file_arr[] =\r
+{\r
+/* 0256 */  "", //"buffer size",\r
+/* 0257 */  "", //"pool size",\r
+/* 0258 */  "", //"number of strings",\r
+/* 0259 */  "" "?" "?" "?",\r
+/* 0260 */  "m2d5c2l5x2v5i",\r
+/* 0261 */  "", //"End of file on the terminal!",\r
+/* 0262 */  "", //"! ",\r
+/* 0263 */  "", //"(That makes 100 errors; please try again.)",\r
+/* 0264 */  "", // "? ",\r
+/* 0265 */  "", //"Type <return> to proceed, S to scroll future error messages,",\r
+/* 0266 */  "", //"R to run without stopping, Q to run quietly,",\r
+/* 0267 */  "", //"I to insert something, ",\r
+/* 0268 */  "", //"E to edit your file,",\r
+/* 0269 */  "", //"1 or ... or 9 to ignore the next 1 to 9 tokens of input,",\r
+/* 0270 */  "", //"H for help, X to quit.",\r
+/* 0271 */  "", //"OK, entering ",\r
+/* 0272 */  "", //"batchmode",\r
+/* 0273 */  "", //"nonstopmode",\r
+/* 0274 */  "", //"scrollmode",\r
+/* 0275 */  "", //"...",\r
+/* 0276 */  "", //"insert>",\r
+/* 0277 */  "", //"I have just deleted some text, as you asked.",\r
+/* 0278 */  "", //"You can now delete more, or insert, or whatever.",\r
+/* 0279 */  "", //"Sorry, I don't know how to help in this situation.",\r
+/* 0280 */  "", //"Maybe you should try asking a human" "?",\r
+/* 0281 */  "", //"Sorry, I already gave what help I could...",\r
+/* 0282 */  "", //"An error might have occurred before I noticed any problems.",\r
+/* 0283 */  "", //"``If all else fails, read the instructions.''",\r
+/* 0284 */  "", //" (",\r
+/* 0285 */  "", //"Emergency stop",\r
+/* 0286 */  "", //"TeX capacity exceeded, sorry [",\r
+/* 0287 */  "", //"If you really absolutely need more capacity,",\r
+/* 0288 */  "", //"you can ask a wizard to enlarge me.",\r
+/* 0289 */  "", //"This can't happen (",\r
+/* 0290 */  "", //"I'm broken. Please show this to someone who can fix can fix",\r
+/* 0291 */  "", //"I can't go on meeting you like this",\r
+/* 0292 */  "", //"One of your faux pas seems to have wounded me deeply...",\r
+/* 0293 */  "", //"in fact, I'm barely conscious. Please fix it and try again.",\r
+/* 0294 */  "", //"Interruption",\r
+/* 0295 */  "", //"You rang" "?",\r
+/* 0296 */  "", //"Try to insert some instructions for me (e.g.,`I\\showlists'),",\r
+/* 0297 */  "", //"unless you just want to quit by typing `X'.",\r
+/* 0298 */  "", //"main memory size",\r
+/* 0299 */  "", //"AVAIL list clobbered at ",\r
+/* 0300 */  "", //"Double-AVAIL list clobbered at ",\r
+/* 0301 */  "", //"Doubly free location at ",\r
+/* 0302 */  "", //"Bad flag at ",\r
+/* 0303 */  "", //"New busy locs:",\r
+/* 0304 */  "", //"LINK(",\r
+/* 0305 */  "", //"INFO(",\r
+/* 0306 */  "", //"[]",\r
+/* 0307 */  "", //"CLOBBERED.",\r
+/* 0308 */  "", //"foul",\r
+/* 0309 */  "", //"fil",\r
+/* 0310 */  "", //" plus ",\r
+/* 0311 */  "", //" minus ",\r
+/* 0312 */  "", //" []",\r
+/* 0313 */  "", //"Bad link, display aborted.",\r
+/* 0314 */  "", //"etc.",\r
+/* 0315 */  "", //"Unknown node type!",\r
+/* 0316 */  "", //"unset",\r
+/* 0317 */  "", //"box(",\r
+/* 0318 */  "", //")x",\r
+/* 0319 */  "", //", shifted ",\r
+/* 0320 */  "", //" columns)",\r
+/* 0321 */  "", //", stretch ",\r
+/* 0322 */  "", //", shrink ",\r
+/* 0323 */  "", //", glue set ",\r
+/* 0324 */  "", //"- ",\r
+/* 0325 */  "", //"< -",\r
+/* 0326 */  "", //"rule(",\r
+/* 0327 */  "", //"insert",\r
+/* 0328 */  "", //", natural size ",\r
+/* 0329 */  "", //"; split(",\r
+/* 0330 */  "", //"); float cost ",\r
+/* 0331 */  "", //"glue",\r
+/* 0332 */  "", //"nonscript",\r
+/* 0333 */  "", //"mskip",\r
+/* 0334 */  "", //"mu",\r
+/* 0335 */  "",\r
+/* 0336 */  "", //"leaders ",\r
+/* 0337 */  "", //"kern",\r
+/* 0338 */  "", //" (for accent)",\r
+/* 0339 */  "", //"mkern",\r
+/* 0340 */  "", //"math",\r
+/* 0341 */  "", //"on",\r
+/* 0342 */  "", //"off",\r
+/* 0343 */  "", //", surrounded ",\r
+/* 0344 */  "", //" (ligature ",\r
+/* 0345 */  "", //"penalty ",\r
+/* 0346 */  "", //"discretionary",\r
+/* 0347 */  "", //" replacing ",\r
+/* 0348 */  "", //"mark",\r
+/* 0349 */  "", //"vadjust",\r
+/* 0350 */  "", //"flushing",\r
+/* 0351 */  "", //"copying",\r
+/* 0352 */  "", //"vertical",\r
+/* 0353 */  "", //"horizontal",\r
+/* 0354 */  "", //"display math",\r
+/* 0355 */  "", //"no",\r
+/* 0356 */  "", //"internal vertical",\r
+/* 0357 */  "", //"restricted horizontal",\r
+/* 0358 */  "", //" mode",\r
+/* 0359 */  "", //"semantic nest size",\r
+/* 0360 */  "", //"### ",\r
+/* 0361 */  "", //" entered at line ",\r
+/* 0362 */  "", //" (language",\r
+/* 0363 */  "", //":hyphenmin",\r
+/* 0364 */  "", //" (\\output routine)",\r
+/* 0365 */  "", //"### recent contributions:",\r
+/* 0366 */  "", //"prevdepth ",\r
+/* 0367 */  "", //"ignored",\r
+/* 0368 */  "", //", prevgraf ",\r
+/* 0369 */  "", //" line",\r
+/* 0370 */  "", //"spacefactor ",\r
+/* 0371 */  "", //", current language ",\r
+/* 0372 */  "", //"this will be denominator of:",\r
+/* 0373 */  "", //"lineskip",\r
+/* 0374 */  "", //"baselineskip",\r
+/* 0375 */  "", //"parskip",\r
+/* 0376 */  "", //"abovedisplayskip",\r
+/* 0377 */  "", //"belowdisplayskip",\r
+/* 0378 */  "", //"abovedisplayshortskip",\r
+/* 0379 */  "", //"belowdisplayshortskip",\r
+/* 0380 */  "", //"leftskip",\r
+/* 0381 */  "", //"rightskip",\r
+/* 0382 */  "", //"topskip",\r
+/* 0383 */  "", //"splittopskip",\r
+/* 0384 */  "", //"tabskip",\r
+/* 0385 */  "", //"spaceskip",\r
+/* 0386 */  "", //"xspaceskip",\r
+/* 0387 */  "", //"parfillskip",\r
+/* 0388 */  "", //"thinmuskip",\r
+/* 0389 */  "", //"medmuskip",\r
+/* 0390 */  "", //"thickmuskip",\r
+/* 0391 */  "", //"[unknown glue parameter!]",\r
+/* 0392 */  "", //"skip",\r
+/* 0393 */  "", //"muskip",\r
+/* 0394 */  "", //"pt",\r
+/* 0395 */  "", //"output",\r
+/* 0396 */  "", //"everypar",\r
+/* 0397 */  "", //"everymath",\r
+/* 0398 */  "", //"everydisplay",\r
+/* 0399 */  "", //"everyhbox",\r
+/* 0400 */  "", //"everyvbox",\r
+/* 0401 */  "", //"everyjob",\r
+/* 0402 */  "", //"everycr",\r
+/* 0403 */  "", //"errhelp",\r
+/* 0404 */  "", //"toks",\r
+/* 0405 */  "", //"parshape",\r
+/* 0406 */  "", //"box",\r
+/* 0407 */  "", //"void",\r
+/* 0408 */  "", //"current font",\r
+/* 0409 */  "", //"textfont",\r
+/* 0410 */  "", //"scriptfont",\r
+/* 0411 */  "", //"scriptscriptfont",\r
+/* 0412 */  "", //"catcode",\r
+/* 0413 */  "", //"lccode",\r
+/* 0414 */  "", //"uccode",\r
+/* 0415 */  "", //"sfcode",\r
+/* 0416 */  "", //"mathcode",\r
+/* 0417 */  "", //"pretolerance",\r
+/* 0418 */  "", //"tolerance",\r
+/* 0419 */  "", //"linepenalty",\r
+/* 0420 */  "", //"hyphenpenalty",\r
+/* 0421 */  "", //"exhyphenpenalty",\r
+/* 0422 */  "", //"clubpenalty",\r
+/* 0423 */  "", //"widowpenalty",\r
+/* 0424 */  "", //"displaywidowpenalty",\r
+/* 0425 */  "", //"brokenpenalty",\r
+/* 0426 */  "", //"binoppenalty",\r
+/* 0427 */  "", //"relpenalty",\r
+/* 0428 */  "", //"predisplaypenalty",\r
+/* 0429 */  "", //"postdisplaypenalty",\r
+/* 0430 */  "", //"interlinepenalty",\r
+/* 0431 */  "", //"doublehyphendemerits",\r
+/* 0432 */  "", //"finalhyphendemerits",\r
+/* 0433 */  "", //"adjdemerits",\r
+/* 0434 */  "", //"mag",\r
+/* 0435 */  "", //"delimiterfactor",\r
+/* 0436 */  "", //"looseness",\r
+/* 0437 */  "", //"time",\r
+/* 0438 */  "", //"day",\r
+/* 0439 */  "", //"month",\r
+/* 0440 */  "", //"year",\r
+/* 0441 */  "", //"showboxbreadth",\r
+/* 0442 */  "", //"showboxdepth",\r
+/* 0443 */  "", //"hbadness",\r
+/* 0444 */  "", //"vbadness",\r
+/* 0445 */  "", //"pausing",\r
+/* 0446 */  "", //"tracingonline",\r
+/* 0447 */  "", //"tracingmacros",\r
+/* 0448 */  "", //"tracingstats",\r
+/* 0449 */  "", //"tracingparagraphs",\r
+/* 0450 */  "", //"tracingpages",\r
+/* 0451 */  "", //"tracingoutput",\r
+/* 0452 */  "", //"tracinglostchars",\r
+/* 0453 */  "", //"tracingcommands",\r
+/* 0454 */  "", //"tracingrestores",\r
+/* 0455 */  "", //"uchyph",\r
+/* 0456 */  "", //"outputpenalty",\r
+/* 0457 */  "", //"maxdeadcycles",\r
+/* 0458 */  "", //"hangafter",\r
+/* 0459 */  "", //"floatingpenalty",\r
+/* 0460 */  "", //"globaldefs",\r
+/* 0461 */  "", //"fam",\r
+/* 0462 */  "", //"escapechar",\r
+/* 0463 */  "", //defaulthyphenchar",\r
+/* 0464 */  "", //"defaultskewchar",\r
+/* 0465 */  "", //"endlinechar",\r
+/* 0466 */  "", //"newlinechar",\r
+/* 0467 */  "", //"language",\r
+/* 0468 */  "", //"lefthyphenmin",\r
+/* 0469 */  "", //"righthyphenmin",\r
+/* 0470 */  "", //"holdinginserts",\r
+/* 0471 */  "", //"errorcontextlines",\r
+/* 0472 */  "", //"[unknown integer parameter!]",\r
+/* 0473 */  "", //"count",\r
+/* 0474 */  "", //"delcode",\r
+/* 0475 */  "", //"parindent",\r
+/* 0476 */  "", //"mathsurround",\r
+/* 0477 */  "", //"lineskiplimit",\r
+/* 0478 */  "", //"hsize",\r
+/* 0479 */  "", //"vsize",\r
+/* 0480 */  "", //"maxdepth",\r
+/* 0481 */  "", //"splitmaxdepth",\r
+/* 0482 */  "", //"boxmaxdepth",\r
+/* 0483 */  "", //"hfuzz",\r
+/* 0484 */  "", //"vfuzz",\r
+/* 0485 */  "", //"delimitershortfall",\r
+/* 0486 */  "", //"nulldelimiterspace",\r
+/* 0487 */  "", //"scriptspace",\r
+/* 0488 */  "", //"predisplaysize",\r
+/* 0489 */  "", //"displaywidth",\r
+/* 0490 */  "", //"displayindent",\r
+/* 0491 */  "", //"overfullrule",\r
+/* 0492 */  "", //"hangindent",\r
+/* 0493 */  "", //"hoffset",\r
+/* 0494 */  "", //"voffset",\r
+/* 0495 */  "", //"emergencystretch",\r
+/* 0496 */  "", //"[unknown dimen parameter!]",\r
+/* 0497 */  "", //"dimen",\r
+/* 0498 */  "", //"EQUIV(",\r
+/* 0499 */  "notexpanded:",\r
+/* 0500 */  "", //"hash size",\r
+/* 0501 */  "", //"csname",\r
+/* 0502 */  "", //"endcsname",\r
+/* 0503 */  "", //"IMPOSSIBLE.",\r
+/* 0504 */  "", //"NONEXISTENT.",\r
+/* 0505 */  "", //"accent",\r
+/* 0506 */  "", //"advance",\r
+/* 0507 */  "", //"afterassignment",\r
+/* 0508 */  "", //"aftergroup",\r
+/* 0509 */  "", //"begingroup",\r
+/* 0510 */  "", //"char",\r
+/* 0511 */  "", //"delimiter",\r
+/* 0512 */  "", //"divide",\r
+/* 0513 */  "", //"endgroup",\r
+/* 0514 */  "", //"expandafter",\r
+/* 0515 */  "", //"font",\r
+/* 0516 */  "", //"fontdimen",\r
+/* 0517 */  "", //"halign",\r
+/* 0518 */  "", //"hrule",\r
+/* 0519 */  "", //"ignorespaces",\r
+/* 0520 */  "", //"mathaccent",\r
+/* 0521 */  "", //"mathchar",\r
+/* 0522 */  "", //"mathchoice",\r
+/* 0523 */  "", //"multiply",\r
+/* 0524 */  "", //"noalign",\r
+/* 0525 */  "", //"noboundary",\r
+/* 0526 */  "", //"noexpand",\r
+/* 0527 */  "", //"omit",\r
+/* 0528 */  "", //"penalty",\r
+/* 0529 */  "", //"prevgraf",\r
+/* 0530 */  "", //"radical",\r
+/* 0531 */  "", //"read",\r
+/* 0532 */  "", //"relax",\r
+/* 0533 */  "", //"setbox",\r
+/* 0534 */  "", //"the",\r
+/* 0535 */  "", //"valign",\r
+/* 0536 */  "", //"vcenter",\r
+/* 0537 */  "", //"vrule",\r
+/* 0538 */  "", //"save size",\r
+/* 0539 */  "", //"grouping levels",\r
+/* 0540 */  "", //"curlevel",\r
+/* 0541 */  "", //"retaining",\r
+/* 0542 */  "", //"restoring",\r
+/* 0543 */  "", //"SAVE(",\r
+/* 0544 */  "", //"Incompatible magnification (",\r
+/* 0545 */  "", //");",\r
+/* 0546 */  "", //" the previous value will be retained",\r
+/* 0547 */  "", //"I can handle only one magnification ratio per job. So I've",\r
+/* 0548 */  "", //"reverted to the magnification you used earlier on this run.",\r
+/* 0549 */  "", //"Illegal magnification has been changed to 1000",\r
+/* 0550 */  "", //"The magnification ratio must be between 1 and 32768.",\r
+/* 0551 */  "", //"ETC.",\r
+/* 0552 */  "", //"BAD.",\r
+/* 0553 */  "", //"->",\r
+/* 0554 */  "", //"begin-group character ",\r
+/* 0555 */  "", //"end-group character ",\r
+/* 0556 */  "", //"math shift character ",\r
+/* 0557 */  "", //"macro parameter character ",\r
+/* 0558 */  "", //"superscript character ",\r
+/* 0559 */  "", //"subscript character ",\r
+/* 0560 */  "", //"end of alignment template",\r
+/* 0561 */  "", //"blank space ",\r
+/* 0562 */  "", //"the letter ",\r
+/* 0563 */  "", //"the character ",\r
+/* 0564 */  "", //"[unknown command code!]",\r
+/* 0565 */  "", //": ",\r
+/* 0566 */  "", //"Runaway ",\r
+/* 0567 */  "", //"definition",\r
+/* 0568 */  "", //"argument",\r
+/* 0569 */  "", //"preamble",\r
+/* 0570 */  "", //"text",\r
+/* 0571 */  "", //"<*>",\r
+/* 0572 */  "", //"<insert> ",\r
+/* 0573 */  "", //"<read ",\r
+/* 0574 */  "", //"l.",\r
+/* 0575 */  "", //"<argument> ",\r
+/* 0576 */  "", //"<template> ",\r
+/* 0577 */  "", //"<recently read> ",\r
+/* 0578 */  "", //"<to be read again> ",\r
+/* 0579 */  "", //"<inserted text> ",\r
+/* 0580 */  "", //"<output> ",\r
+/* 0581 */  "", //"<everypar> ",\r
+/* 0582 */  "", //"<everymath> ",\r
+/* 0583 */  "", //"<everydisplay> ",\r
+/* 0584 */  "", //"<everyhbox> ",\r
+/* 0585 */  "", //"<everyvbox> ",\r
+/* 0586 */  "", //"<everyjob> ",\r
+/* 0587 */  "", //"<everycr> ",\r
+/* 0588 */  "", //"<mark> ",\r
+/* 0589 */  "", //"<write> ",\r
+/* 0590 */  "", //"input stack size",\r
+/* 0591 */  "", //"write",\r
+/* 0592 */  "", //"(interwoven alignment preambles are not allowed)",\r
+/* 0593 */  "", //"text input levels",\r
+/* 0594 */  "", //"par",\r
+/* 0595 */  "", //"Incomplete ",\r
+/* 0596 */  "", //"; all text was ignored after line ",\r
+/* 0597 */  "", //"A forbidden control sequence occurred in skipped text.",\r
+/* 0598 */  "", //"This kind of error happens when you say `\\if...' and forget",\r
+/* 0599 */  "", //"the matching `\\fi'. I've inserted a `\\fi'; this might work.",\r
+/* 0600 */  "", //"The file ended while I was skipping conditional text.",\r
+/* 0601 */  "", //"File ended",\r
+/* 0602 */  "", //"Forbidden control sequence found",\r
+/* 0603 */  "", //" while scanning ",\r
+/* 0604 */  "", //" of ",\r
+/* 0605 */  "", //"I suspect you have forgotten a `}', causing me",\r
+/* 0606 */  "", //"to read past where you wanted me to stop.",\r
+/* 0607 */  "", //"I'll try to recover; but if the error is serious,",\r
+/* 0608 */  "", //"you'd better type `E' or `X' now and fix your file.",\r
+/* 0609 */  "", //"use",\r
+/* 0610 */  "", //"Text line contains an invalid character",\r
+/* 0611 */  "", //"A funny symbol that I can't read has just been input.",\r
+/* 0612 */  "", //"Continue, and I'll forget that it ever happened.",\r
+/* 0613 */  "", //"(Please type a command or say `\\end')",\r
+/* 0614 */  "", //"*** (job aborted, no legal \\end found)",\r
+/* 0615 */  "", //"=>",\r
+/* 0616 */  "", //"Undefined control sequence",\r
+/* 0617 */  "", //"The control sequence at the end of the top line",\r
+/* 0618 */  "", //"of your error message was never \\def'ed. If you have",\r
+/* 0619 */  "", //"misspelled it (e.g., `\\hobx'), type `I' and the correct",\r
+/* 0620 */  "", //"spelling (e.g., `I\\hbox'). Otherwise just continue,",\r
+/* 0621 */  "", //"and I'll forget about whatever was undefined.",\r
+/* 0622 */  "", //"Missing ",\r
+/* 0623 */  "", //" inserted",\r
+/* 0624 */  "", //"The control sequence marked <to be read again> should",\r
+/* 0625 */  "", //"not appear between \\csname and \\endcsname.",\r
+/* 0626 */  "", //"input",\r
+/* 0627 */  "", //"endinput",\r
+/* 0628 */  "", //"topmark",\r
+/* 0629 */  "", //"firstmark",\r
+/* 0630 */  "", //"botmark",\r
+/* 0631 */  "", //"splitfirstmark",\r
+/* 0632 */  "", //"splitbotmark",\r
+/* 0633 */  "", //"parameter stack size",\r
+/* 0634 */  "", //"Argument of ",\r
+/* 0635 */  "", //" has an extra }",\r
+/* 0636 */  "", //"I've run across a `}' that doesn't seem to match anything.",\r
+/* 0637 */  "", //"For example, `\\def\\a#1{...}' and `\\a}' would produce",\r
+/* 0638 */  "", //"this error. If you simply proceed now, the `\\par' that",\r
+/* 0639 */  "", //"I've just inserted will cause me to report a runaway",\r
+/* 0640 */  "", //"argument that might be the root of the problem. But if",\r
+/* 0641 */  "", //"your `}' was spurious, just type `2' and it will go away.",\r
+/* 0642 */  "", //"Paragraph ended before ",\r
+/* 0643 */  "", //" was complete",\r
+/* 0644 */  "", //"I suspect you've forgotten a `}', causing me to apply this",\r
+/* 0645 */  "", //"control sequence to too much text. How can we recover" "?",\r
+/* 0646 */  "", //"My plan is to forget the whole thing and hope for the best.",\r
+/* 0647 */  "", //"Use of ",\r
+/* 0648 */  "", //" doesn't match its definition",\r
+/* 0649 */  "", //"If you say, e.g., `\\def\\a1{...}', then you must always",\r
+/* 0650 */  "", //"put `1' after `\\a', since control sequence names are",\r
+/* 0651 */  "", //"made up of letters only. The macro here has not been",\r
+/* 0652 */  "", //"followed by the required stuff, so I'm ignoring it.",\r
+/* 0653 */  "", //"<-",\r
+/* 0654 */  "", //"Missing { inserted",\r
+/* 0655 */  "", //"A left brace was mandatory here, so I've put one in.",\r
+/* 0656 */  "", //"You might want to delete and/or insert some corrections",\r
+/* 0657 */  "", //"so that I will find a matching right brace soon.",\r
+/* 0658 */  "", //"(If you're confused by all this, try typing `I}' now.)",\r
+/* 0659 */  "", //"Incompatible glue units",\r
+/* 0660 */  "", //"I'm going to assume that 1mu=1pt when they're mixed.",\r
+/* 0661 */  "", //"Missing number, treated as zero",\r
+/* 0662 */  "", //"A number should have been here; I inserted `0'.",\r
+/* 0663 */  "", //"(If you can't figure out why I needed to see a number,",\r
+/* 0664 */  "", //"look up `weird error' in the index to The TeXbook.)",\r
+/* 0665 */  "", //"spacefactor",\r
+/* 0666 */  "", //"prevdepth",\r
+/* 0667 */  "", //"deadcycles",\r
+/* 0668 */  "", //"insertpenalties",\r
+/* 0669 */  "", //"wd",\r
+/* 0670 */  "", //"ht",\r
+/* 0671 */  "", //"dp",\r
+/* 0672 */  "", //"lastpenalty",\r
+/* 0673 */  "", //"lastkern",\r
+/* 0674 */  "", //"lastskip",\r
+/* 0675 */  "", //"inputlineno",\r
+/* 0676 */  "", //"badness",\r
+/* 0677 */  "", //"Improper ",\r
+/* 0678 */  "", //"You can refer to \\spacefactor only in horizontal mode;",\r
+/* 0679 */  "", //"you can refer to \\prevdepth only in vertical mode; and",\r
+/* 0680 */  "", //"neither of these is meaningful inside \\write. So",\r
+/* 0681 */  "", //"I'm forgetting what you said and using zero instead.",\r
+/* 0682 */  "", //"You can't use `",\r
+/* 0683 */  "", //"' after ",\r
+/* 0684 */  "", //"Bad register code",\r
+/* 0685 */  "", //"A register number must be between 0 and 255.",\r
+/* 0686 */  "", //"I changed this one to zero.",\r
+/* 0687 */  "", //"Bad character code",\r
+/* 0688 */  "", //"A character number must be between 0 and 255.",\r
+/* 0689 */  "", //"Bad number",\r
+/* 0690 */  "", //"Since I expected to read a number between 0 and 15,",\r
+/* 0691 */  "", //"Bad mathchar",\r
+/* 0692 */  "", //"A mathchar number must be between 0 and 32767.",\r
+/* 0693 */  "", //"Bad delimiter code",\r
+/* 0694 */  "", //"A numeric delimiter code must be between 0 and 2^{27}-1.",\r
+/* 0695 */  "", //"Improper alphabetic constant",\r
+/* 0696 */  "", //"A one-character control sequence belongs after a ` mark.",\r
+/* 0697 */  "", //"So I'm essentially inserting \\0 here.",\r
+/* 0698 */  "", //"Number too big",\r
+/* 0699 */  "", //"I can only go up to 2147483647='17777777777=\"7FFFFFFF,",\r
+/* 0700 */  "", //"so I'm using that number instead of yours.",\r
+/* 0701 */  "", //"true",\r
+/* 0702 */  "", //"Illegal unit of measure (",\r
+/* 0703 */  "", //"replaced by filll)",\r
+/* 0704 */  "", //"I dddon't go any higher than filll.",\r
+/* 0705 */  "", //"em",\r
+/* 0706 */  "", //"ex",\r
+/* 0707 */  "", //"mu inserted)",\r
+/* 0708 */  "", //"The unit of measurement in math glue must be mu.",\r
+/* 0709 */  "", //"To recover gracefully from this error, it's best to",\r
+/* 0710 */  "", //"delete the erroneous units; e.g., type `2' to delete",\r
+/* 0711 */  "", //"two letters. (See Chapter 27 of The TeXbook.)",\r
+/* 0712 */  "", //"in",\r
+/* 0713 */  "", //"pc",\r
+/* 0714 */  "", //"cm",\r
+/* 0715 */  "", //"mm",\r
+/* 0716 */  "", //"bp",\r
+/* 0717 */  "", //"dd",\r
+/* 0718 */  "", //"cc",\r
+/* 0719 */  "", //"sp",\r
+/* 0720 */  "", //"pt inserted)",\r
+/* 0721 */  "", //"Dimensions can be in units of em, ex, in, pt, pc,",\r
+/* 0722 */  "", //"cm, mm, dd, cc, bp, or sp; but yours is a new one!",\r
+/* 0723 */  "", //"I'll assume that you meant to say pt, for printer's points.",\r
+/* 0724 */  "", //"Dimension too large",\r
+/* 0725 */  "", //"I can't work with sizes bigger than about 19 feet.",\r
+/* 0726 */  "", //"Continue and I'll use the largest value I can.",\r
+/* 0727 */  "", //"plus",\r
+/* 0728 */  "", //"minus",\r
+/* 0729 */  "", //"width",\r
+/* 0730 */  "", //"height",\r
+/* 0731 */  "", //"depth",\r
+/* 0732 */  "", //"number",\r
+/* 0733 */  "", //"romannumeral",\r
+/* 0734 */  "", //"string",\r
+/* 0735 */  "", //"meaning",\r
+/* 0736 */  "", //"fontname",\r
+/* 0737 */  "", //"jobname",\r
+/* 0738 */  "", //" at ",\r
+/* 0739 */  "", //"Where was the left brace" "? You said something like `\\def\\a}',",\r
+/* 0740 */  "", //"which I'm going to interpret as `\\def\\a{}'.",\r
+/* 0741 */  "", //"You already have nine parameters",\r
+/* 0742 */  "", //"I'm going to ignore the # sign you just used.",\r
+/* 0743 */  "", //"Parameters must be numbered consecutively",\r
+/* 0744 */  "", //"I've inserted the digit you should have used after the #.",\r
+/* 0745 */  "", //"Type `1' to delete what you did use.",\r
+/* 0746 */  "", //"Illegal parameter number in definition of ",\r
+/* 0747 */  "", //"You meant to type ## instead of #, right" "?",\r
+/* 0748 */  "", //"Or maybe a } was forgotten somewhere earlier, and things",\r
+/* 0749 */  "", //"are all screwed up" "? I'm going to assume that you meant ##.",\r
+/* 0750 */  "", //"*** (cannot \\read from terminal in nonstop modes)",\r
+/* 0751 */  "", //"File ended within ",\r
+/* 0752 */  "", //"This \\read has unbalanced braces.",\r
+/* 0753 */  "", //"if",\r
+/* 0754 */  "", //"ifcat",\r
+/* 0755 */  "", //"ifnum",\r
+/* 0756 */  "", //"ifdim",\r
+/* 0757 */  "", //"ifodd",\r
+/* 0758 */  "", //"ifvmode",\r
+/* 0759 */  "", //"ifhmode",\r
+/* 0760 */  "", //"ifmmode",\r
+/* 0761 */  "", //"ifinner",\r
+/* 0762 */  "", //"ifvoid",\r
+/* 0763 */  "", //"ifhbox",\r
+/* 0764 */  "", //"ifvbox",\r
+/* 0765 */  "", //"ifx",\r
+/* 0766 */  "", //"ifeof",\r
+/* 0767 */  "", //"iftrue",\r
+/* 0768 */  "", //"iffalse",\r
+/* 0769 */  "", //"ifcase",\r
+/* 0770 */  "", //"fi",\r
+/* 0771 */  "", //"or",\r
+/* 0772 */  "", //"else",\r
+/* 0773 */  "", //"Extra ",\r
+/* 0774 */  "", //"I'm ignoring this; it doesn't match any \\if.",\r
+/* 0775 */  "", //"{true}",\r
+/* 0776 */  "", //"{false}",\r
+/* 0777 */  "", //"Missing = inserted for ",\r
+/* 0778 */  "", //"I was expecting to see `<', `=', or `>'. Didn't.",\r
+/* 0779 */  "", //"{case ",\r
+/* 0780 */  "", //".fmt",\r
+/* 0781 */  "", //"input file name",\r
+/* 0782 */  "", //"I can't find file `",\r
+/* 0783 */  "", //"I can't write on file `",\r
+/* 0784 */  "", //"'.",\r
+/* 0785 */  ".tex",\r
+/* 0786 */  "", //"Please type another ",\r
+/* 0787 */  "", //"*** (job aborted, file error in nonstop mode)",\r
+/* 0788 */  "", //".dvi",\r
+/* 0789 */  "", //"file name for output",\r
+/* 0790 */  "texput",\r
+/* 0791 */  "", //".log",\r
+/* 0792 */  "", //"**",\r
+/* 0793 */  "", //"transcript file name",\r
+/* 0794 */  "  ",\r
+/* 0795 */  "nullfont",\r
+/* 0796 */  "", //"Font ",\r
+/* 0797 */  "", //" scaled ",\r
+/* 0798 */  "", //" not loadable: Bad metric (TFM) file",\r
+/* 0799 */  "", //" not loadable: Metric (TFM) file not found",\r
+/* 0800 */  "", //"I wasn't able to read the size data for this font,",\r
+/* 0801 */  "", //"so I will ignore the font specification.",\r
+/* 0802 */  "", //"[Wizards can fix TFM files using TFtoPL/PLtoTF.]",\r
+/* 0803 */  "", //"You might try inserting a different font spec;",\r
+/* 0804 */  "", //"e.g., type `I\\font<same font id>=<substitute font name>'.",\r
+/* 0805 */  ".tfm",\r
+/* 0806 */  "", //" not loaded: Not enough room left",\r
+/* 0807 */  "", //"I'm afraid I won't be able to make use of this font,",\r
+/* 0808 */  "", //"because my memory for character-size data is too small.",\r
+/* 0809 */  "", //"If you're really stuck, ask a wizard to enlarge me.",\r
+/* 0810 */  "", //"Or maybe try `I\\font<same font id>=<name of loaded font>'.",\r
+/* 0811 */  "", //"Missing font identifier",\r
+/* 0812 */  "", //"I was looking for a control sequence whose",\r
+/* 0813 */  "", //"current meaning has been defined by \\font.",\r
+/* 0814 */  "", //" has only ",\r
+/* 0815 */  "", //" fontdimen parameters",\r
+/* 0816 */  "", //"To increase the number of font parameters, you must",\r
+/* 0817 */  "", //"use \\fontdimen immediately after the \\font is loaded.",\r
+/* 0818 */  "", //"font memory",\r
+/* 0819 */  "", //"Missing character: There is no ",\r
+/* 0820 */  "", //" in font ",\r
+/* 0821 */  "", //" TeX output ",\r
+/* 0822 */  "", //"vlistout",\r
+/* 0823 */  "", //"Completed box being shipped out",\r
+/* 0824 */  "", //"Memory usage before: ",\r
+/* 0825 */  "", //" after: ",\r
+/* 0826 */  "", //"; still untouched: ",\r
+/* 0827 */  "", //"Huge page cannot be shipped out",\r
+/* 0828 */  "", //"The page just created is more than 18 feet tall or",\r
+/* 0829 */  "", //"more than 18 feet wide, so I suspect something went wrong.",\r
+/* 0830 */  "", //"The following box has been deleted:",\r
+/* 0831 */  "", //"No pages of output.",\r
+/* 0832 */  "", //"Output written on ",\r
+/* 0833 */  "", //" page",\r
+/* 0834 */  "", //", ",\r
+/* 0835 */  "", //" bytes).",\r
+/* 0836 */  "", //"to",\r
+/* 0837 */  "", //"spread",\r
+/* 0838 */  "", //"Underfull",\r
+/* 0839 */  "", //"Loose",\r
+/* 0840 */  "", //" \\hbox (badness ",\r
+/* 0841 */  "", //") has occurred while \\output is active",\r
+/* 0842 */  "", //") in paragraph at lines ",\r
+/* 0843 */  "", //") in alignment at lines ",\r
+/* 0844 */  "", //"--",\r
+/* 0845 */  "", //") detected at line ",\r
+/* 0846 */  "", //"Overfull \\hbox (",\r
+/* 0847 */  "", //"pt too wide",\r
+/* 0848 */  "", //"Tight \\hbox (badness ",\r
+/* 0849 */  "", //"vpack",\r
+/* 0850 */  "", //" \\vbox (badness ",\r
+/* 0851 */  "", //"Overfull \\vbox (",\r
+/* 0852 */  "", //"pt too high",\r
+/* 0853 */  "", //"Tight \\vbox (badness ",\r
+/* 0854 */  "", //"{}",\r
+/* 0855 */  "", //"displaystyle",\r
+/* 0856 */  "", //"textstyle",\r
+/* 0857 */  "", //"scriptstyle",\r
+/* 0858 */  "", //"scriptscriptstyle",\r
+/* 0859 */  "", //"Unknown style!",\r
+/* 0860 */  "", //"mathord",\r
+/* 0861 */  "", //"mathop",\r
+/* 0862 */  "", //"mathbin",\r
+/* 0863 */  "", //"mathrel",\r
+/* 0864 */  "", //"mathopen",\r
+/* 0865 */  "", //"mathclose",\r
+/* 0866 */  "", //"mathpunct",\r
+/* 0867 */  "", //"mathinner",\r
+/* 0868 */  "", //"overline",\r
+/* 0869 */  "", //"underline",\r
+/* 0870 */  "", //"left",\r
+/* 0871 */  "", //"right",\r
+/* 0872 */  "", //"limits",\r
+/* 0873 */  "", //"nolimits",\r
+/* 0874 */  "", //"fraction, thickness ",\r
+/* 0875 */  "", //"= default",\r
+/* 0876 */  "", //", left-delimiter ",\r
+/* 0877 */  "", //", right-delimiter ",\r
+/* 0878 */  "", //" is undefined (character ",\r
+/* 0879 */  "", //"Somewhere in the math formula just ended, you used the",\r
+/* 0880 */  "", //"stated character from an undefined font family. For example,",\r
+/* 0881 */  "", //"plain TeX doesn't allow \\it or \\sl in subscripts. Proceed,",\r
+/* 0882 */  "", //"and I'll try to forget that I needed that character.",\r
+/* 0883 */  "", //"mlist1",\r
+/* 0884 */  "", //"mlist2",\r
+/* 0885 */  "", //"mlist3",\r
+/* 0886 */  "0234000122*4000133**3**344*0400400*000000234000111*1111112341011",\r
+/* 0887 */  "", //"mlist4",\r
+/* 0888 */  "", //" inside $$'s",\r
+/* 0889 */  "", //"Displays can use special alignments (like \\eqalignno)",\r
+/* 0890 */  "", //"only if nothing but the alignment itself is between $$'s.",\r
+/* 0891 */  "", //"So I've deleted the formulas that preceded this alignment.",\r
+/* 0892 */  "", //"span",\r
+/* 0893 */  "", //"cr",\r
+/* 0894 */  "", //"crcr",\r
+/* 0895 */  "endtemplate",\r
+/* 0896 */  "", //"alignment tab character ",\r
+/* 0897 */  "", //"Missing # inserted in alignment preamble",\r
+/* 0898 */  "", //"There should be exactly one # between &'s, when an",\r
+/* 0899 */  "", //"\\halign or \\valign is being set up. In this case you had",\r
+/* 0900 */  "", //"none, so I've put one in; maybe that will work.",\r
+/* 0901 */  "", //"Only one # is allowed per tab",\r
+/* 0902 */  "", //"more than one, so I'm ignoring all but the first.",\r
+/* 0903 */  "", //"endv",\r
+/* 0904 */  "", //"Extra alignment tab has been changed to ",\r
+/* 0905 */  "", //"You have given more \\span or & marks than there were",\r
+/* 0906 */  "", //"in the preamble to the \\halign or \\valign now in progress.",\r
+/* 0907 */  "", //"So I'll assume that you meant to type \\cr instead.",\r
+/* 0908 */  "", //"256 spans",\r
+/* 0909 */  "", //"align1",\r
+/* 0910 */  "", //"align0",\r
+/* 0911 */  "", //"Infinite glue shrinkage found in a paragraph",\r
+/* 0912 */  "", //"The paragraph just ended includes some glue that has",\r
+/* 0913 */  "", //"infinite shrinkability, e.g., `\\hskip 0pt minus 1fil'.",\r
+/* 0914 */  "", //"Such glue doesn't belong there---it allows a paragraph",\r
+/* 0915 */  "", //"of any length to fit on one line. But it's safe to proceed,",\r
+/* 0916 */  "", //"since the offensive shrinkability has been made finite.",\r
+/* 0917 */  "", //"disc1",\r
+/* 0918 */  "", //"disc2",\r
+/* 0919 */  "", //"@@",\r
+/* 0920 */  "", //": line ",\r
+/* 0921 */  "", //" t=",\r
+/* 0922 */  "", //" -> @@",\r
+/* 0923 */  "", //" via @@",\r
+/* 0924 */  "", //" b=",\r
+/* 0925 */  "", //" p=",\r
+/* 0926 */  "", //" d=",\r
+/* 0927 */  "", //"@firstpass",\r
+/* 0928 */  "", //"@secondpass",\r
+/* 0929 */  "", //"@emergencypass",\r
+/* 0930 */  "", //"paragraph",\r
+/* 0931 */  "", //"disc3",\r
+/* 0932 */  "", //"disc4",\r
+/* 0933 */  "", //"line breaking",\r
+/* 0934 */  "", //"HYPH(",\r
+/* 0935 */  "", //"hyphenation",\r
+/* 0936 */  "", //" will be flushed",\r
+/* 0937 */  "", //"Hyphenation exceptions must contain only letters",\r
+/* 0938 */  "", //"and hyphens. But continue; I'll forgive and forget.",\r
+/* 0939 */  "", //"Not a letter",\r
+/* 0940 */  "", //"Letters in \\hyphenation words must have \\lccode>0.",\r
+/* 0941 */  "", //"Proceed; I'll ignore the character I just read.",\r
+/* 0942 */  "", //"exception dictionary",\r
+/* 0943 */  "", //"pattern memory ops",\r
+/* 0944 */  "", //"pattern memory ops per language",\r
+/* 0945 */  "", //"pattern memory",\r
+/* 0946 */  "", //"Too late for ",\r
+/* 0947 */  "", //"patterns",\r
+/* 0948 */  "", //"All patterns must be given before typesetting begins.",\r
+/* 0949 */  "", //"Bad ",\r
+/* 0950 */  "", //"(See Appendix H.)",\r
+/* 0951 */  "", //"Nonletter",\r
+/* 0952 */  "", //"Duplicate pattern",\r
+/* 0953 */  "", //"pruning",\r
+/* 0954 */  "", //"vertbreak",\r
+/* 0955 */  "", //"Infinite glue shrinkage found in box being split",\r
+/* 0956 */  "", //"The box you are \\vsplitting contains some infinitely",\r
+/* 0957 */  "", //"shrinkable glue, e.g., `\\vss' or `\\vskip 0pt minus 1fil'.",\r
+/* 0958 */  "", //"Such glue doesn't belong there; but you can safely proceed,",\r
+/* 0959 */  "", //"vsplit",\r
+/* 0960 */  "", //" needs a ",\r
+/* 0961 */  "", //"vbox",\r
+/* 0962 */  "", //"The box you are trying to split is an \\hbox.",\r
+/* 0963 */  "", //"I can't split such a box, so I'll leave it alone.",\r
+/* 0964 */  "", //"pagegoal",\r
+/* 0965 */  "", //"pagetotal",\r
+/* 0966 */  "", //"pagestretch",\r
+/* 0967 */  "", //"pagefilstretch",\r
+/* 0968 */  "", //"pagefillstretch",\r
+/* 0969 */  "", //"pagefilllstretch",\r
+/* 0970 */  "", //"pageshrink",\r
+/* 0971 */  "", //"pagedepth",\r
+/* 0972 */  "", //"fill",\r
+/* 0973 */  "", //"filll",\r
+/* 0974 */  "", //"### current page:",\r
+/* 0975 */  "", //" (held over for next output)",\r
+/* 0976 */  "", //"total height ",\r
+/* 0977 */  "", //" goal height ",\r
+/* 0978 */  "", //" adds ",\r
+/* 0979 */  "", //", #",\r
+/* 0980 */  "", //" might split",\r
+/* 0981 */  "", //"%% goal height=",\r
+/* 0982 */  "", //", max depth=",\r
+/* 0983 */  "", //"Insertions can only be added to a vbox",\r
+/* 0984 */  "", //"Tut tut: You're trying to \\insert into a",\r
+/* 0985 */  "", //"\\box register that now contains an \\hbox.",\r
+/* 0986 */  "", //"Proceed, and I'll discard its present contents.",\r
+/* 0987 */  "", //"page",\r
+/* 0988 */  "", //"Infinite glue shrinkage found on current page",\r
+/* 0989 */  "", //"The page about to be output contains some infinitely",\r
+/* 0990 */  "", //" g=",\r
+/* 0991 */  "", //" c=",\r
+/* 0992 */  "", //"Infinite glue shrinkage inserted from ",\r
+/* 0993 */  "", //"The correction glue for page breaking with insertions",\r
+/* 0994 */  "", //"must have finite shrinkability. But you may proceed,",\r
+/* 0995 */  "", //"% split",\r
+/* 0996 */  "", //" to ",\r
+/* 0997 */  "", //"255 is not void",\r
+/* 0998 */  "", //"You shouldn't use \\box255 except in \\output routines.",\r
+/* 0999 */  "", //"Output loop---",\r
+/* 1000 */  "", //" consecutive dead cycles",\r
+/* 1001 */  "", //"I've concluded that your \\output is awry; it never does a",\r
+/* 1002 */  "", //"\\shipout, so I'm shipping \\box255 out myself. Next time",\r
+/* 1003 */  "", //"increase \\maxdeadcycles if you want me to be more patient!",\r
+/* 1004 */  "", //"Unbalanced output routine",\r
+/* 1005 */  "", //"Your sneaky output routine has problematic {'s and/or }'s.",\r
+/* 1006 */  "", //"I can't handle that very well; good luck.",\r
+/* 1007 */  "", //"Output routine didn't use all of ",\r
+/* 1008 */  "", //"Your \\output commands should empty \\box255,",\r
+/* 1009 */  "", //"e.g., by saying `\\shipout\\box255'.",\r
+/* 1010 */  "", //"Proceed; I'll discard its present contents.",\r
+/* 1011 */  "", //"Missing $ inserted",\r
+/* 1012 */  "", //"I've inserted a begin-math/end-math symbol since I think",\r
+/* 1013 */  "", //"you left one out. Proceed, with fingers crossed.",\r
+/* 1014 */  "", //"' in ",\r
+/* 1015 */  "", //"Sorry, but I'm not programmed to handle this case;",\r
+/* 1016 */  "", //"I'll just pretend that you didn't ask for it.",\r
+/* 1017 */  "", //"If you're in the wrong mode, you might be able to",\r
+/* 1018 */  "", //"return to the right one by typing `I}' or `I$' or `I\\par'.",\r
+/* 1019 */  "", //"end",\r
+/* 1020 */  "", //"dump",\r
+/* 1021 */  "", //"hskip",\r
+/* 1022 */  "", //"hfil",\r
+/* 1023 */  "", //"hfill",\r
+/* 1024 */  "", //"hss",\r
+/* 1025 */  "", //"hfilneg",\r
+/* 1026 */  "", //"vskip",\r
+/* 1027 */  "", //"vfil",\r
+/* 1028 */  "", //"vfill",\r
+/* 1029 */  "", //"vss",\r
+/* 1030 */  "", //"vfilneg",\r
+/* 1031 */  "", //"I've inserted something that you may have forgotten.",\r
+/* 1032 */  "", //"(See the <inserted text> above.)",\r
+/* 1033 */  "", //"With luck, this will get me unwedged. But if you",\r
+/* 1034 */  "", //"really didn't forget anything, try typing `2' now; then",\r
+/* 1035 */  "", //"my insertion and my current dilemma will both disappear.",\r
+/* 1036 */  "", //"right.",\r
+/* 1037 */  "", //"Things are pretty mixed up, but I think the worst is over.",\r
+/* 1038 */  "", //"Too many }'s",\r
+/* 1039 */  "", //"You've closed more groups than you opened.",\r
+/* 1040 */  "", //"Such booboos are generally harmless, so keep going.",\r
+/* 1041 */  "", //"rightbrace",\r
+/* 1042 */  "", //"Extra }, or forgotten ",\r
+/* 1043 */  "", //"I've deleted a group-closing symbol because it seems to be",\r
+/* 1044 */  "", //"spurious, as in `$x}$'. But perhaps the } is legitimate and",\r
+/* 1045 */  "", //"you forgot something else, as in `\\hbox{$x}'. In such cases",\r
+/* 1046 */  "", //"the way to recover is to insert both the forgotten and the",\r
+/* 1047 */  "", //"deleted material, e.g., by typing `I$}'.",\r
+/* 1048 */  "", //"moveleft",\r
+/* 1049 */  "", //"moveright",\r
+/* 1050 */  "", //"raise",\r
+/* 1051 */  "", //"lower",\r
+/* 1052 */  "", //"copy",\r
+/* 1053 */  "", //"lastbox",\r
+/* 1054 */  "", //"vtop",\r
+/* 1055 */  "", //"hbox",\r
+/* 1056 */  "", //"shipout",\r
+/* 1057 */  "", //"leaders",\r
+/* 1058 */  "", //"cleaders",\r
+/* 1059 */  "", //"xleaders",\r
+/* 1060 */  "", //"Leaders not followed by proper glue",\r
+/* 1061 */  "", //"You should say `\\leaders <box or rule><hskip or vskip>'.",\r
+/* 1062 */  "", //"I found the <box or rule>, but there's no suitable",\r
+/* 1063 */  "", //"<hskip or vskip>, so I'm ignoring these leaders.",\r
+/* 1064 */  "", //"Sorry; this \\lastbox will be void.",\r
+/* 1065 */  "", //"Sorry...I usually can't take things from the current page.",\r
+/* 1066 */  "", //"This \\lastbox will therefore be void.",\r
+/* 1067 */  "", //"Missing `to' inserted",\r
+/* 1068 */  "", //"I'm working on `\\vsplit<box number> to <dimen>';",\r
+/* 1069 */  "", //"will look for the <dimen> next.",\r
+/* 1070 */  "", //"A <box> was supposed to be here",\r
+/* 1071 */  "", //"I was expecting to see \\hbox or \\vbox or \\copy or \\box or",\r
+/* 1072 */  "", //"something like that. So you might find something missing in",\r
+/* 1073 */  "", //"your output. But keep trying; you can fix this later.",\r
+/* 1074 */  "", //"indent",\r
+/* 1075 */  "", //"noindent",\r
+/* 1076 */  "", //"' here except with leaders",\r
+/* 1077 */  "", //"To put a horizontal rule in an hbox or an alignment,",\r
+/* 1078 */  "", //"you should use \\leaders or \\hrulefill (see The TeXbook).",\r
+/* 1079 */  "", //"You can't ",\r
+/* 1080 */  "", //"I'm changing to \\insert0; box 255 is special.",\r
+/* 1081 */  "", //"Try `I\\vskip-\\lastskip' instead.",\r
+/* 1082 */  "", //"Try `I\\kern-\\lastkern' instead.",\r
+/* 1083 */  "", //"Perhaps you can make the output routine do it.",\r
+/* 1084 */  "", //"unpenalty",\r
+/* 1085 */  "", //"unkern",\r
+/* 1086 */  "", //"unskip",\r
+/* 1087 */  "", //"unhbox",\r
+/* 1088 */  "", //"unhcopy",\r
+/* 1089 */  "", //"unvbox",\r
+/* 1090 */  "", //"unvcopy",\r
+/* 1091 */  "", //"Incompatible list can't be unboxed",\r
+/* 1092 */  "", //"Sorry, Pandora. (You sneaky devil.)",\r
+/* 1093 */  "", //"I refuse to unbox an \\hbox in vertical mode or vice versa.",\r
+/* 1094 */  "", //"And I can't open any boxes in math mode.",\r
+/* 1095 */  "", //"Illegal math ",\r
+/* 1096 */  "", //"Sorry: The third part of a discretionary break must be",\r
+/* 1097 */  "", //"empty, in math formulas. I had to delete your third part.",\r
+/* 1098 */  "", //"Discretionary list is too long",\r
+/* 1099 */  "", //"Wow---I never thought anybody would tweak me here.",\r
+/* 1100 */  "", //"You can't seriously need such a huge discretionary list" "?",\r
+/* 1101 */  "", //"Improper discretionary list",\r
+/* 1102 */  "", //"Discretionary lists must contain only boxes and kerns.",\r
+/* 1103 */  "", //"The following discretionary sublist has been deleted:",\r
+/* 1104 */  "", //"Missing } inserted",\r
+/* 1105 */  "", //"I've put in what seems to be necessary to fix",\r
+/* 1106 */  "", //"the current column of the current alignment.",\r
+/* 1107 */  "", //"Try to go on, since this might almost work.",\r
+/* 1108 */  "", //"Misplaced ",\r
+/* 1109 */  "", //"I can't figure out why you would want to use a tab mark",\r
+/* 1110 */  "", //"here. If you just want an ampersand, the remedy is",\r
+/* 1111 */  "", //"simple: Just type `I\\&' now. But if some right brace",\r
+/* 1112 */  "", //"up above has ended a previous alignment prematurely,",\r
+/* 1113 */  "", //"you're probably due for more error messages, and you",\r
+/* 1114 */  "", //"might try typing `S' now just to see what is salvageable.",\r
+/* 1115 */  "", //"or \\cr or \\span just now. If something like a right brace",\r
+/* 1116 */  "", //"I expect to see \\noalign only after the \\cr of",\r
+/* 1117 */  "", //"an alignment. Proceed, and I'll ignore this case.",\r
+/* 1118 */  "", //"I expect to see \\omit only after tab marks or the \\cr of",\r
+/* 1119 */  "", // "I'm guessing that you meant to end an alignment here.",\r
+/* 1120 */  "", //"I'm ignoring this, since I wasn't doing a \\csname.",\r
+/* 1121 */  "", //"eqno",\r
+/* 1122 */  "", //"leqno",\r
+/* 1123 */  "", //"displaylimits",\r
+/* 1124 */  "", //"Limit controls must follow a math operator",\r
+/* 1125 */  "", //"I'm ignoring this misplaced \\limits or \\nolimits command.",\r
+/* 1126 */  "", //"Missing delimiter (. inserted)",\r
+/* 1127 */  "", //"I was expecting to see something like `(' or `\\{' or",\r
+/* 1128 */  "", //"`\\}' here. If you typed, e.g., `{' instead of `\\{', you",\r
+/* 1129 */  "", //"should probably delete the `{' by typing `1' now, so that",\r
+/* 1130 */  "", //"braces don't get unbalanced. Otherwise just proceed.",\r
+/* 1131 */  "", //"Acceptable delimiters are characters whose \\delcode is",\r
+/* 1132 */  "", //"nonnegative, or you can use `\\delimiter <delimiter code>'.",\r
+/* 1133 */  "", //"Please use ",\r
+/* 1134 */  "", //" for accents in math mode",\r
+/* 1135 */  "", //"I'm changing \\accent to \\mathaccent here; wish me luck.",\r
+/* 1136 */  "", //"(Accents are not the same in formulas as they are in text.)",\r
+/* 1137 */  "", //"Double superscript",\r
+/* 1138 */  "", //"I treat `x^1^2' essentially like `x^1{}^2'.",\r
+/* 1139 */  "", //"Double subscript",\r
+/* 1140 */  "", //"I treat `x_1_2' essentially like `x_1{}_2'.",\r
+/* 1141 */  "", //"above",\r
+/* 1142 */  "", //"over",\r
+/* 1143 */  "", //"atop",\r
+/* 1144 */  "", //"abovewithdelims",\r
+/* 1145 */  "", //"overwithdelims",\r
+/* 1146 */  "", //"atopwithdelims",\r
+/* 1147 */  "", //"Ambiguous; you need another { and }",\r
+/* 1148 */  "", //"I'm ignoring this fraction specification, since I don't",\r
+/* 1149 */  "", //"know whether a construction like `x \\over y \\over z'",\r
+/* 1150 */  "", //"means `{x \\over y} \\over z' or `x \\over {y \\over z}'.",\r
+/* 1151 */  "", //"I'm ignoring a \\right that had no matching \\left.",\r
+/* 1152 */  "", //"Math formula deleted: Insufficient symbol fonts",\r
+/* 1153 */  "", //"Sorry, but I can't typeset math unless \\textfont 2",\r
+/* 1154 */  "", //"and \\scriptfont 2 and \\scriptscriptfont 2 have all",\r
+/* 1155 */  "", //"the \\fontdimen values needed in math symbol fonts.",\r
+/* 1156 */  "", //"Math formula deleted: Insufficient extension fonts",\r
+/* 1157 */  "", //"Sorry, but I can't typeset math unless \\textfont 3",\r
+/* 1158 */  "", //"and \\scriptfont 3 and \\scriptscriptfont 3 have all",\r
+/* 1159 */  "", //"the \\fontdimen values needed in math extension fonts.",\r
+/* 1160 */  "", //"Display math should end with $$",\r
+/* 1161 */  "", //"The `$' that I just saw supposedly matches a previous `$$'.",\r
+/* 1162 */  "", //"So I shall assume that you typed `$$' both times.",\r
+/* 1163 */  "", //"display",\r
+/* 1164 */  "", //"Missing $$ inserted",\r
+/* 1165 */  "", //"long",\r
+/* 1166 */  "", //"outer",\r
+/* 1167 */  "", //"global",\r
+/* 1168 */  "", //"def",\r
+/* 1169 */  "", //"gdef",\r
+/* 1170 */  "", //"edef",\r
+/* 1171 */  "", //"xdef",\r
+/* 1172 */  "", //"prefix",\r
+/* 1173 */  "", //"You can't use a prefix with `",\r
+/* 1174 */  "", //"I'll pretend you didn't say \\long or \\outer or \\global.",\r
+/* 1175 */  "", //"' or `",\r
+/* 1176 */  "", //"' with `",\r
+/* 1177 */  "", //"I'll pretend you didn't say \\long or \\outer here.",\r
+/* 1178 */  "", //"Missing control sequence inserted",\r
+/* 1179 */  "", //"Please don't say `\\def cs{...}', say `\\def\\cs{...}'.",\r
+/* 1180 */  "", //"I've inserted an inaccessible control sequence so that your",\r
+/* 1181 */  "", //"definition will be completed without mixing me up too badly.",\r
+/* 1182 */  "", //"You can recover graciously from this error, if you're",\r
+/* 1183 */  "", //"careful; see exercise 27.2 in The TeXbook.",\r
+/* 1184 */  "inaccessible",\r
+/* 1185 */  "", //"let",\r
+/* 1186 */  "", //"futurelet",\r
+/* 1187 */  "", //"chardef",\r
+/* 1188 */  "", //"mathchardef",\r
+/* 1189 */  "", //"countdef",\r
+/* 1190 */  "", //"dimendef",\r
+/* 1191 */  "", //"skipdef",\r
+/* 1192 */  "", //"muskipdef",\r
+/* 1193 */  "", //"toksdef",\r
+/* 1194 */  "", //"You should have said `\\read<number> to \\cs'.",\r
+/* 1195 */  "", //"I'm going to look for the \\cs now.",\r
+/* 1196 */  "", //"Invalid code (",\r
+/* 1197 */  "", //"), should be in the range 0..",\r
+/* 1198 */  "", //"), should be at most ",\r
+/* 1199 */  "", //"I'm going to use 0 instead of that illegal code value.",\r
+/* 1200 */  "", //"by",\r
+/* 1201 */  "", //"Arithmetic overflow",\r
+/* 1202 */  "", //"I can't carry out that multiplication or division,",\r
+/* 1203 */  "", //"since the result is out of range.",\r
+/* 1204 */  "", //"I'm forgetting what you said and not changing anything.",\r
+/* 1205 */  "", //"Sorry, \\setbox is not allowed after \\halign in a display,",\r
+/* 1206 */  "", //"or between \\accent and an accented character.",\r
+/* 1207 */  "", //"Bad space factor",\r
+/* 1208 */  "", //"I allow only values in the range 1..32767 here.",\r
+/* 1209 */  "", //"I allow only nonnegative values here.",\r
+/* 1210 */  "", //"Patterns can be loaded only by INITEX",\r
+/* 1211 */  "", //"hyphenchar",\r
+/* 1212 */  "", //"skewchar",\r
+/* 1213 */  "FONT",\r
+/* 1214 */  "", //"at",\r
+/* 1215 */  "", //"scaled",\r
+/* 1216 */  "", //"Improper `at' size (",\r
+/* 1217 */  "", //"pt), replaced by 10pt",\r
+/* 1218 */  "", //"I can only handle fonts at positive sizes that are",\r
+/* 1219 */  "", //"less than 2048pt, so I've changed what you said to 10pt.",\r
+/* 1220 */  "", //"select font ",\r
+/* 1221 */  "", //"errorstopmode",\r
+/* 1222 */  "", //"openin",\r
+/* 1223 */  "", //"closein",\r
+/* 1224 */  "", //"message",\r
+/* 1225 */  "", //"errmessage",\r
+/* 1226 */  "", //"(That was another \\errmessage.)",\r
+/* 1227 */  "", //"This error message was generated by an \\errmessage",\r
+/* 1228 */  "", //"command, so I can't give any explicit help.",\r
+/* 1229 */  "", //"Pretend that you're Hercule Poirot: Examine all clues,",\r
+/* 1230 */  "", //"and deduce the truth by order and method.",\r
+/* 1231 */  "", //"lowercase",\r
+/* 1232 */  "", //"uppercase",\r
+/* 1233 */  "", //"show",\r
+/* 1234 */  "", //"showbox",\r
+/* 1235 */  "", //"showthe",\r
+/* 1236 */  "", //"showlists",\r
+/* 1237 */  "", //"This isn't an error message; I'm just \\showing something.",\r
+/* 1238 */  "", //"Type `I\\show...' to show more (e.g., \\show\\cs,",\r
+/* 1239 */  "", //"\\showthe\\count10, \\showbox255, \\showlists).",\r
+/* 1240 */  "", //"And type `I\\tracingonline=1\\show...' to show boxes and",\r
+/* 1241 */  "", //"lists on your terminal as well as in the transcript file.",\r
+/* 1242 */  "", //"> ",\r
+/* 1243 */  "", //"undefined",\r
+/* 1244 */  "", //"macro",\r
+/* 1245 */  "", //"long macro",\r
+/* 1246 */  "", //"outer macro",\r
+/* 1247 */  "", //"outer endtemplate",\r
+/* 1248 */  "", //"> \\box",\r
+/* 1249 */  "", //"OK",\r
+/* 1250 */  "", //" (see the transcript file)",\r
+/* 1251 */  " (INITEX)",\r
+/* 1252 */  "", //"You can't dump inside a group",\r
+/* 1253 */  "", //"`{...\\dump}' is a no-no.",\r
+/* 1254 */  "", //" strings of total length ",\r
+/* 1255 */  "", //" memory locations dumped; current usage is ",\r
+/* 1256 */  "", //" multiletter control sequences",\r
+/* 1257 */  "", //" words of font info for ",\r
+/* 1258 */  "", //" preloaded font",\r
+/* 1259 */  "", //"\\font",\r
+/* 1260 */  "", //" hyphenation exception",\r
+/* 1261 */  "", //"Hyphenation trie of length ",\r
+/* 1262 */  "", //" has ",\r
+/* 1263 */  "", //" op",\r
+/* 1264 */  "", //" out of ",\r
+/* 1265 */  "", //" for language ",\r
+/* 1266 */  "", //" (format=",\r
+/* 1267 */  "", //"format file name",\r
+/* 1268 */  "", //"Beginning to dump on file ",\r
+/* 1269 */  "", //"Transcript written on ",\r
+/* 1270 */  "", //" )",\r
+/* 1271 */  "", //"end occurred ",\r
+/* 1272 */  "", //"inside a group at level ",\r
+/* 1273 */  "", //"when ",\r
+/* 1274 */  "", //" on line ",\r
+/* 1275 */  "", //" was incomplete)",\r
+/* 1276 */  "", //"(see the transcript file for additional information)",\r
+/* 1277 */  "", //"(\\dump is performed only by INITEX)",\r
+/* 1278 */  "", //"debug # (-1 to exit):",\r
+/* 1279 */  "", //"openout",\r
+/* 1280 */  "", //"closeout",\r
+/* 1281 */  "", //"special",\r
+/* 1282 */  "", //"immediate",\r
+/* 1283 */  "", //"setlanguage",\r
+/* 1284 */  "", //"[unknown extension!]",\r
+/* 1285 */  "", //"ext1",\r
+/* 1286 */  "", //" (hyphenmin ",\r
+/* 1287 */  "", //"whatsit" "?",\r
+/* 1288 */  "", //"ext2",\r
+/* 1289 */  "", //"ext3",\r
+/* 1290 */  "endwrite",\r
+/* 1291 */  "", //"Unbalanced write command",\r
+/* 1292 */  "", //"On this page there's a \\write with fewer real {'s than }'s.",\r
+/* 1293 */  "", //"ext4",\r
+/* 1294 */  "", //"output file name",\r
+};\r
+\r
+str_number load_pool_strings (integer spare_size)\r
+{\r
+  str_number g;\r
+  int k, l, i = 0;\r
+\r
+  for (k = 0; k < sizeof(pool_file_arr) / sizeof(char *); k++)\r
+  {\r
+    l = strlen(pool_file_arr[k]);\r
+    i += l;\r
+\r
+    if (i >= spare_size)\r
+      return 0;\r
+\r
+    memcpy(str_pool + pool_ptr, pool_file_arr[k], l);\r
+    pool_ptr += l;\r
+    g = make_string();\r
+  }\r
+\r
+  return g;\r
+}\r
+\r
+str_number make_string_pool (const char * s)\r
+{\r
+  int slen = strlen(s);\r
+\r
+  if (slen == 1)\r
+  {\r
+    return ((str_number)s[0]);\r
+  }\r
+  else\r
+  {\r
+    memcpy(str_pool + pool_ptr, s, slen);\r
+    pool_ptr += slen;\r
+    return (make_string());\r
+  }\r
+}\r
+\r
+str_number get_job_name (str_number job)\r
+{\r
+  str_number ret = job;\r
+\r
+  if (c_job_name != NULL)\r
+    ret = make_string_pool(c_job_name);\r
+\r
+  return ret;\r
 }
\ No newline at end of file
index ece8fdd..209a56c 100644 (file)
-/* Copyright 2007 TeX Users Group
-   Copyright 2014 Clerk Ma
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301 USA.  */
-
-#define EXTERN extern
-
-#include "yandytex.h"
-
-// texk/web2c/lib/uexit.c
-void uexit (int unix_code)
-{
-  int final_code;
-
-  update_terminal();
-
-  if (unix_code == 0)
-    final_code = EXIT_SUCCESS;
-  else if (unix_code == 1)
-    final_code = EXIT_FAILURE;
-  else
-    final_code = unix_code;
-
-  if (jump_used)
-  {
-    printf("Jump Buffer already used.\n");
-    exit(1);
-  }
-
-  jump_used++;
-  exit(final_code);
-}
-// texk/web2c/lib/zround.c
-integer web2c_round (double r)
-{
-  integer i;
-
-  if (r > 2147483647.0)
-    i = 2147483647;
-  else if (r < -2147483647.0)
-    i = -2147483647;
-  else if (r >= 0.0)
-    i = (integer) (r + 0.5);
-  else
-    i = (integer) (r - 0.5);
-
-  return i;
-}
-// Unixify filename and path (turn \ into /)
-// --- assumes null terminated
-char * unixify (char * t)
-{
-  char * s = t;
-
-  if (s == NULL)
-    return s;
-
-  if (t != '\0')
-  {
-    while (*s != '\0')
-    {
-      if (*s == '\\')
-        *s = '/';
-
-      s++;
-    }
-  }
-
-  if (trace_flag)
-    printf("Unixified name: %s\n", t);
-
-  return t;
-}
-
-char * md5_file_name (const char * file_name)
-{
-  static char md5_hex[33];
-  FILE * ship_file;
-
-  ship_file = fopen(file_name, "rb");
-  memset(md5_hex, 0, 33);
-  memcpy(md5_hex, md5_file(ship_file), 32);
-  fclose(ship_file);
-
-  return md5_hex;
-}
-
-char * md5_file (FILE * in_file)
-{
-  md5_state_t md5_ship;
-  md5_byte_t  md5_data[1024];
-  md5_byte_t  md5_digest[16];
-  static char md5_hex[33];
-  int         md5_len;
-  int i;
-
-  md5_init(&md5_ship);
-
-  while ((md5_len = fread(md5_data, 1, 1024, in_file)) != 0)
-    md5_append(&md5_ship, md5_data, md5_len);
-
-  md5_finish(&md5_ship, md5_digest);
-
-  fclose(in_file);
-
-  for (i = 0; i < 16; ++i)
-    sprintf(md5_hex + i * 2, "%02X", md5_digest[i]);
-
-  return md5_hex;
-}
\ No newline at end of file
+/* Copyright 2007 TeX Users Group\r
+   Copyright 2014 Clerk Ma\r
+\r
+   This program is free software; you can redistribute it and/or modify\r
+   it under the terms of the GNU General Public License as published by\r
+   the Free Software Foundation; either version 2 of the License, or\r
+   (at your option) any later version.\r
+\r
+   This program is distributed in the hope that it will be useful, but\r
+   WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+   General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with this program; if not, write to the Free Software\r
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA\r
+   02110-1301 USA.  */\r
+\r
+#define EXTERN extern\r
+\r
+#include "yandytex.h"\r
+\r
+// texk/web2c/lib/uexit.c\r
+void uexit (int unix_code)\r
+{\r
+  int final_code;\r
+\r
+  update_terminal();\r
+\r
+  if (unix_code == 0)\r
+    final_code = EXIT_SUCCESS;\r
+  else if (unix_code == 1)\r
+    final_code = EXIT_FAILURE;\r
+  else\r
+    final_code = unix_code;\r
+\r
+  if (jump_used)\r
+  {\r
+    printf("Jump Buffer already used.\n");\r
+    exit(1);\r
+  }\r
+\r
+  jump_used++;\r
+  exit(final_code);\r
+}\r
+// texk/web2c/lib/zround.c\r
+integer web2c_round (double r)\r
+{\r
+  integer i;\r
+\r
+  if (r > 2147483647.0)\r
+    i = 2147483647;\r
+  else if (r < -2147483647.0)\r
+    i = -2147483647;\r
+  else if (r >= 0.0)\r
+    i = (integer) (r + 0.5);\r
+  else\r
+    i = (integer) (r - 0.5);\r
+\r
+  return i;\r
+}\r
+// Unixify filename and path (turn \ into /)\r
+// --- assumes null terminated\r
+char * unixify (char * t)\r
+{\r
+  char * s = t;\r
+\r
+  if (s == NULL)\r
+    return s;\r
+\r
+  if (t != '\0')\r
+  {\r
+    while (*s != '\0')\r
+    {\r
+      if (*s == '\\')\r
+        *s = '/';\r
+\r
+      s++;\r
+    }\r
+  }\r
+\r
+  if (trace_flag)\r
+    printf("Unixified name: %s\n", t);\r
+\r
+  return t;\r
+}\r
index 871bab2..6974cc0 100644 (file)
-/* Copyright 2014 Clerk Ma
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301 USA.  */
-
-#define EXTERN extern
-#include "yandytex.h"
-
-/* sec 0058 */
-void print_ln (void)
-{
-  switch (selector)
-  {
-    case term_and_log:
-      wterm_cr();
-      term_offset = 0;
-      wlog_cr();
-      file_offset = 0;
-      break;
-
-    case log_only:
-      wlog_cr();
-      file_offset = 0;
-      break;
-
-    case term_only:
-      wterm_cr();
-      term_offset = 0;
-      break;
-
-    case no_print:
-    case pseudo:
-    case new_string:
-      do_nothing();
-      break;
-
-    default:
-      putc('\n', write_file[selector]);
-      break;
-  }
-}
-/* sec 0058 */
-void print_char_ (ASCII_code s)
-{
-  if (s == new_line_char)
-    if (selector < pseudo)
-    {
-      print_ln();
-      return;
-    }
-
-  switch (selector)
-  {
-    case term_and_log:
-      wterm(xchr[s]);
-      incr(term_offset);
-      wlog(xchr[s]);
-      incr(file_offset);
-
-      if (term_offset == max_print_line)
-      {
-        wterm_cr();
-        term_offset = 0;
-      }
-      
-      if (file_offset == max_print_line)
-      {
-        wlog_cr();
-        file_offset = 0;
-      }
-
-      break;
-
-    case log_only:
-      wlog(xchr[s]);
-      incr(file_offset);
-
-      if (file_offset == max_print_line)
-        print_ln();
-
-      break;
-
-    case term_only:
-      wterm(xchr[s]);
-      incr(term_offset);
-
-      if (term_offset == max_print_line)
-        print_ln();
-
-      break;
-
-    case no_print:
-      do_nothing();
-      break;
-
-    case pseudo:
-      if (tally < trick_count)
-        trick_buf[tally % error_line] = s;
-
-      break;
-
-    case new_string:
-#ifdef ALLOCATESTRING
-      if (pool_ptr + 1 > current_pool_size)
-        str_pool = realloc_str_pool(increment_pool_size);
-      
-      if (pool_ptr < current_pool_size)
-        append_char(s);
-#else
-      if (pool_ptr < pool_size)
-        append_char(s);
-#endif
-      break;
-
-    default:
-      putc(xchr[s], write_file[selector]);
-      break;
-  }
-
-  incr(tally);
-}
-/* sec 0059 */
-void print_ (integer s)
-{
-  pool_pointer j;
-  integer nl;
-
-  if (s >= str_ptr)
-    s = 259; /* ??? */
-  else
-  {
-    if (s < 256)
-    {
-      if (s < 0)
-        s = 259; /* ??? */
-      else
-      {
-        if (selector > pseudo)
-        {
-          print_char(s);
-          return;
-        }
-
-        if (s == new_line_char)
-          if (selector < pseudo)
-          {
-            print_ln();
-            return;
-          }
-          
-        nl = new_line_char;
-        new_line_char = -1;
-          
-        /* translate ansi to dos 850 */
-        if (!show_in_hex && s < 256 && s >= 32)
-        {
-          if (show_in_dos && s > 127)
-          {
-            if (wintodos[s - 128] > 0)
-            {
-              print_char(wintodos[s - 128]);
-            }
-            else
-            {
-              j = str_start[s];
-
-              while (j < str_start[s + 1])
-              {
-                print_char(str_pool[j]);
-                incr(j);
-              }
-            }
-          }
-          else
-          {
-            print_char(s);       /* don't translate to hex */
-          }
-        }
-        else
-        {                       /* not just a character */
-          j = str_start[s];
-
-          while (j < str_start[s + 1])
-          {
-            print_char(str_pool[j]);
-            incr(j);
-          }
-        }
-
-        new_line_char = nl; /* restore eol */
-        return;
-      }
-    }
-  }
-/*  we get here with s > 256 - i.e. not a single character */
-  j = str_start[s];
-
-  while (j < str_start[s + 1])
-  {
-    print_char(str_pool[j]);
-    incr(j);
-  }
-}
-/* string version print. */
-void prints_ (const char * s)
-{
-  while (*s)
-    print_char(*s++);
-}
-/* sec 0060 */
-void slow_print_ (integer s)
-{
-  pool_pointer j;
-
-  if ((s >= str_ptr) || (s < 256))
-    print(s);
-  else
-  {
-    j = str_start[s];
-
-    while (j < str_start[s + 1])
-    {
-      print(str_pool[j]);
-      incr(j);
-    }
-  }
-}
-/* sec 0062 */
-void print_nl (const char * s)
-{
-  if (((term_offset > 0) && (odd(selector))) ||
-      ((file_offset > 0) && (selector >= log_only)))
-    print_ln();
-
-  prints(s);
-}
-/* sec 0063 */
-void print_esc (const char * s)
-{
-  integer c;
-
-  c = escape_char;
-
-  if (c >= 0)
-    if (c < 256)
-      print(c);
-
-  prints(s);
-}
-/* sec 0064 */
-void print_the_digs (eight_bits k)
-{
-  while (k > 0)
-  {
-    decr(k);
-
-    if (dig[k] < 10)
-      print_char('0' + dig[k]);
-    else
-      print_char('A' + dig[k]);
-  }
-}
-/* sec 0065 */
-void print_int_ (integer n)
-{
-  char k;
-  integer m;
-
-  k = 0;
-
-  if (n < 0)
-  {
-    print_char('-');
-
-    if (n > -100000000L)
-      n = - (integer) n;
-    else
-    {
-      m = -1 - n;
-      n = m / 10;
-      m = (m % 10) + 1;
-      k = 1;
-
-      if (m < 10)
-        dig[0] = (char) m;
-      else
-      {
-        dig[0] = 0;
-        incr(n);
-      }
-    }
-  }
-
-  do
-    {
-      dig[k] = (char) (n % 10);
-      n = n / 10;
-      incr(k);
-    }
-  while (!(n == 0));
-
-  print_the_digs(k);
-}
-/* sec 0262 */
-void print_cs_ (integer p)
-{
-  if (p < hash_base)
-    if (p >= single_base)
-      if (p == null_cs)
-      {
-        print_esc("csname");
-        print_esc("endcsname");
-        print_char(' ');
-      }
-      else
-      {
-        print_esc(""); print(p - single_base);
-
-        if (cat_code(p - single_base) == letter)
-          print_char(' ');
-      }
-    else if (p < active_base)
-      print_esc("IMPOSSIBLE.");
-    else
-      print(p - active_base);
-  else if (p >= undefined_control_sequence)
-    print_esc("IMPOSSIBLE.");
-  else if ((text(p) >= str_ptr))
-    print_esc("NONEXISTENT.");
-  else
-  {
-    print_esc("");
-    print(text(p));
-    print_char(' ');
-  }
-}
-/* sec 0263 */
-void sprint_cs (pointer p)
-{ 
-  if (p < hash_base)
-    if (p < single_base)
-      print(p - active_base);
-    else if (p < null_cs)
-    {
-      print_esc("");
-      print(p - single_base);
-    }
-    else
-    {
-      print_esc("csname");
-      print_esc("endcsname");
-    }
-  else
-  {
-    print_esc(""); print(text(p));
-  }
-}
-/* sec 0518 */
-void print_file_name (integer n, integer a, integer e)
-{
-  slow_print(a);
-  slow_print(n);
-  slow_print(e);
-}
-/* sec 0699 */
-void print_size_ (integer s)
-{ 
-  if (s == 0)
-    print_esc("textfont");
-  else if (s == 16)
-    print_esc("scriptfont");
-  else
-    print_esc("scriptscriptfont");
-} 
-/* sec 1355 */
-void print_write_whatsit_(const char * s, pointer p)
-{
-  print_esc(s);
-
-  if (write_stream(p) < 16)
-    print_int(write_stream(p)); 
-  else if (write_stream(p) == 16)
-    print_char('*');
-  else
-    print_char('-');
-}
-/* sec 0081 */
-void jump_out (void) 
-{
-  close_files_and_terminate();
-
-  {
-    int code;
-
-    fflush(stdout); 
-    ready_already = 0;
-
-    if (trace_flag)
-      puts("EXITING at JUMPOUT");
-
-    if ((history != 0) && (history != 1))
-      code = 1;
-    else
-      code = 0;
-
-    uexit(code);
-  }
-}
-/* sec 0082 */
-void error (void)
-{
-  ASCII_code c;
-  integer s1, s2, s3, s4;
-
-  if (history < error_message_issued)
-    history = error_message_issued;
-
-  print_char('.');
-  show_context();
-
-  if (interaction == error_stop_mode)
-    while (true)
-    {
-continu:
-      clear_for_error_prompt();
-      prompt_input("? ");
-
-      if (last == first)
-        return; // no input
-
-      c = buffer[first];
-
-      if (c >= 'a')
-        c = (c + 'A' - 'a'); 
-
-      switch (c)
-      {
-        case '0':
-        case '1':
-        case '2':
-        case '3':
-        case '4':
-        case '5':
-        case '6':
-        case '7':
-        case '8':
-        case '9':
-          if (deletions_allowed)
-          {
-            s1 = cur_tok;
-            s2 = cur_cmd;
-            s3 = cur_chr;
-            s4 = align_state;
-            align_state = 1000000L;
-            OK_to_interrupt = false;
-
-            if ((last > first + 1) && (buffer[first + 1] >= '0') && (buffer[first + 1] <= '9'))
-              c = (c * 10 + buffer[first + 1] - '0' * 11);
-            else
-              c = (c - 48);
-            
-            while (c > 0)
-            {
-              get_token();
-              decr(c);
-            }
-
-            cur_tok = s1;
-            cur_cmd = s2;
-            cur_chr = s3;
-            align_state = s4;
-            OK_to_interrupt = true;
-            help2("I have just deleted some text, as you asked.",
-                "You can now delete more, or insert, or whatever.");
-            show_context();
-            goto continu;
-          }
-          break;
-
-#ifdef DEBUG
-        case 'D':
-          {
-            debug_help();
-            goto continu;
-          }
-          break;
-#endif
-
-        case 'E':
-          if (base_ptr > 0)
-          {
-            edit_name_start = str_start[input_stack[base_ptr].name_field];
-            edit_name_length = length(input_stack[base_ptr].name_field);
-            edit_line = line;
-            jump_out();
-          }
-          break;
-
-        case 'H':
-          {
-            if (use_err_help)
-            {
-              give_err_help();
-              use_err_help = false;
-            }
-            else
-            {
-              if (help_ptr == 0)
-                help2("Sorry, I don't know how to help in this situation.",
-                    "Maybe you should try asking a human?");
-              do
-                {
-                  decr(help_ptr);
-                  prints(help_line[help_ptr]);
-                  print_ln();
-                }
-              while (!(help_ptr == 0));
-            }
-
-            help4("Sorry, I already gave what help I could...",
-                "Maybe you should try asking a human?",
-                "An error might have occurred before I noticed any problems.",
-                "``If all else fails, read the instructions.''");
-            goto continu;
-          }
-          break;
-
-        case 'I':
-          {
-            begin_file_reading();
-
-            if (last > first + 1)
-            {
-              loc = first + 1;
-              buffer[first] = 32;
-            }
-            else
-            {
-              prompt_input("insert>");
-              loc = first;
-            }
-
-            first = last;
-            limit = last - 1;
-
-            return;
-          }
-          break;
-
-        case 'Q':
-        case 'R':
-        case 'S':
-          {
-            error_count = 0; 
-            interaction = 0 + c - 'Q';
-            prints("OK, entering ");
-
-            switch (c)
-            {
-              case 'Q':
-                print_esc("batchmode");
-                decr(selector);
-                break;
-
-              case 'R':
-                print_esc("nonstopmode");
-                break;
-
-              case 'S':
-                print_esc("scrollmode");
-                break;
-            }
-
-            prints("...");
-            print_ln();
-            update_terminal();
-            return;
-          }
-          break;
-
-        case 'X':
-          {
-            interaction = scroll_mode;
-            jump_out();
-          }
-          break;
-
-        default:
-          break;
-      }
-
-      {
-        prints("Type <return> to proceed, S to scroll future error messages,");
-        print_nl("R to run without stopping, Q to run quietly,");
-        print_nl("I to insert something, ");
-
-        if (base_ptr > 0)
-          prints("E to edit your file,");
-
-        if (deletions_allowed)
-          print_nl("1 or ... or 9 to ignore the next 1 to 9 tokens of input,");
-
-        print_nl("H for help, X to quit.");
-      }
-    }
-
-  incr(error_count);
-
-  if (error_count == 100)
-  {
-    print_nl("(That makes 100 errors; please try again.)");
-    history = fatal_error_stop;
-    jump_out();
-  }
-
-  if (interaction > batch_mode)
-    decr(selector);
-
-  if (use_err_help)
-  {
-    print_ln();
-    give_err_help();
-  }
-  else while (help_ptr > 0)
-  {
-    decr(help_ptr);
-    print_nl(help_line[help_ptr] == NULL ? "" : help_line[help_ptr]);
-  }
-
-  print_ln();
-
-  if (interaction > batch_mode)
-    incr(selector);
-  
-  print_ln();
-}
-/* sec 0093 */
-void fatal_error (const char * s)
-{
-  normalize_selector();
-  print_err("Emergency stop");
-  help1(s);
-  succumb();
-}
-/* sec 0094 */
-void overflow_(const char * s, integer n)
-{
-  normalize_selector();
-  print_err("TeX capacity exceeded, sorry [");
-  prints(s);
-  print_char('=');
-  print_int(n);
-  print_char(']');
-  help2("If you really absolutely need more capacity,",
-      "you can ask a wizard to enlarge me.");
-
-  if (!knuth_flag)
-  {
-    if (!strcmp(s, "pattern memory") && (n == trie_size))
-      printf("\n  (Maybe use -h=... on command line in initex)\n");
-    else if (!strcmp(s, "exception dictionary") && (n == hyphen_prime))
-      printf("\n  (Maybe use -e=... on command line in initex)\n");
-  }
-
-  succumb();
-}
-/* sec 0095 */
-void confusion (const char * s)
-{
-  normalize_selector();
-
-  if (history < error_message_issued)
-  {
-    print_err("This can't happen (");
-    prints(s);
-    print_char(')');
-    help1("I'm broken. Please show this to someone who can fix can fix");
-  }
-  else
-  {
-    print_err("I can't go on meeting you like this");
-    help2("One of your faux pas seems to have wounded me deeply...",
-        "in fact, I'm barely conscious. Please fix it and try again.");
-  }
-
-  succumb();
-}
-/* sec 0037 */
-boolean init_terminal (void)
-{
-  boolean flag;
-
-  t_open_in();
-
-  if (last > first)
-  {
-    loc = first;
-
-    while ((loc < last) && (buffer[loc]== ' '))
-      incr(loc);
-
-    if (loc < last)
-      return true;
-  }
-
-// failed to find input file name
-  while (true)
-  {
-    fputs("**", stdout);
-    update_terminal();
-    flag = input_ln(stdin, true);
-
-    if (!flag)
-    {
-      wterm_cr();
-      puts("! End of file on the terminal... why?\n");
-      return false;
-    }
-
-    loc = first;
-
-    while ((loc < last) && (buffer[loc]== ' '))
-      incr(loc);    // step over intial white space
-
-    if (loc < last)
-      return true;
-
-    printf("%s\n", "Please type the name of your input file.");
-  }
-}
-/* sec 0043 */
-str_number make_string (void)
-{
-#ifdef ALLOCATESTRING
-  if (str_ptr == current_max_strings)
-    str_start = realloc_str_start(increment_max_strings);
-
-  if (str_ptr == current_max_strings)
-  {
-    overflow("number of strings", current_max_strings - init_str_ptr);
-    return 0;
-  }
-#else
-  if (str_ptr == max_strings)
-  {
-    overflow("number of strings", max_strings - init_str_ptr);
-    return 0;
-  }
-#endif
-
-  incr(str_ptr);
-  str_start[str_ptr] = pool_ptr;
-
-  return (str_ptr - 1);
-}
-/* sec 0044 */
-boolean str_eq_buf_ (str_number s, integer k)
-{
-  pool_pointer j;
-  boolean result;
-
-  j = str_start[s];
-
-  while (j < str_start[s + 1])
-  {
-    if (str_pool[j] != buffer[k])
-    {
-      result = false;
-      goto not_found;
-    }
-
-    incr(j);
-    incr(k);
-  }
-
-  result = true;
-
-not_found:
-  return result;
-}
-/* sec 0045 */
-boolean str_eq_str_ (str_number s, str_number t)
-{
-  pool_pointer j, k;
-  boolean result;
-
-  result = false;
-
-  if (length(s) != length(t))
-    goto not_found;
-
-  j = str_start[s];
-  k = str_start[t];
-
-  while (j < str_start[s + 1])
-  {
-    if (str_pool[j] != str_pool[k])
-      goto not_found;
-
-    incr(j);
-    incr(k);
-  }
-
-  result = true;
-
-not_found:
-  return result;
-}
-/* sec 0066 */
-void print_two_(integer n)
-{ 
-  n = abs(n) % 100;
-  print_char('0' + (n / 10));
-  print_char('0' + (n % 10));
-} 
-/* sec 0067 */
-void print_hex_(integer n)
-{
-  char k;
-
-  k = 0;
-  print_char('"');
-
-  do
-    {
-      dig[k] = (unsigned char) (n % 16);
-      n = n / 16;
-      incr(k);
-    }
-  while (!(n == 0));
-
-  print_the_digs(k);
-}
-/* sec 0069 */
-void print_roman_int_(integer n)
-{
-  pool_pointer j, k;
-  nonnegative_integer u, v;
-
-  j = str_start[260]; /* m2d5c2l5x2v5i */
-  v = 1000;
-
-  while (true)
-  {
-    while (n >= v)
-    {
-      print_char(str_pool[j]);
-      n = n - v;
-    }
-
-    if (n <= 0)
-      return;
-
-    k = j + 2;
-    u = v / (str_pool[k - 1] - '0');
-
-    if (str_pool[k - 1] == 50)
-    {
-      k = k + 2;
-      u = u / (str_pool[k - 1] - '0');
-    }
-
-    if (n + u >= v)
-    {
-      print_char(str_pool[k]);
-      n = n + u;
-    }
-    else
-    {
-      j = j + 2;
-      v = v / (str_pool[j - 1] - '0');
-    }
-  }
-}
-/* sec 0070 */
-void print_current_string (void)
-{
-  pool_pointer j;
-
-  j = str_start[str_ptr];
-
-  while (j < pool_ptr)
-  {
-    print_char(str_pool[j]);
-    incr(j);
-  }
-}
-
-/* sec 0071 */
-void term_input (void)
-{ 
-  integer k;
-  boolean flag;
-  
-  if (!knuth_flag)
-    show_line("\n", 0);
-
-  update_terminal();
-  flag = input_ln(stdin, true);
-
-  if (!flag)
-  {
-    fatal_error("End of file on the terminal!");
-    return;
-  }
-
-  term_offset = 0;
-  decr(selector);
-
-  if (last != first)
-    for (k = first; k <= last - 1; k++)
-      print(buffer[k]);
-
-  print_ln();
-  incr(selector);
-}
-/* sec 0091 */
-void int_error_ (integer n)
-{
-  prints(" (");
-  print_int(n);
-  print_char(')');
-  error();
-}
-/* sec 0092 */
-void normalize_selector (void)
-{
-  if (log_opened)
-    selector = term_and_log;
-  else
-    selector = term_only;
-
-  if (job_name == 0)
-    open_log_file();
-
-  if (interaction == batch_mode)
-    decr(selector);
-}
-/* sec 0098 */
-void pause_for_instructions (void)
-{
-  if (OK_to_interrupt)
-  {
-    interaction = error_stop_mode;
-
-    if ((selector == log_only) || (selector == no_print))
-      incr(selector);
-
-    print_err("Interruption");
-    help3("You rang?",
-        "Try to insert some instructions for me (e.g.,`I\\showlists'),",
-        "unless you just want to quit by typing `X'.");
-    deletions_allowed = false;
-    error();
-    deletions_allowed = true;
-    interrupt = 0;
-  }
-}
-/* sec 0100 */
-integer half_(integer x)
-{
-  if (odd(x))
-    return ((x + 1) / 2);
-  else
-    return (x / 2);
-}
-/* sec 0102 */
-scaled round_decimals_(small_number k)
-{
-  integer a;
-
-  a = 0;
-
-  while (k > 0)
-  {
-    decr(k);
-    a = (a + dig[k] * 131072L) / 10; /* 2^17 */
-  }
-  
-  return ((a + 1) / 2);
-}
-/* sec 0103 */
-void print_scaled_(scaled s)
-{
-  scaled delta;
-
-  if (s < 0)
-  {
-    print_char('-');
-    s = - (integer) s;
-  }
-
-  print_int(s / 65536L);
-  print_char('.');
-  s = 10 * (s % 65536L) + 5;
-  delta = 10;
-
-  do
-    {
-      if (delta > 65536L)
-        s = s - 17232; /* 2^15 - 50000 - rounding */
-
-      print_char('0' + (s / 65536L));
-      s = 10 * (s % 65536L);
-      delta = delta * 10;
-    }
-  while (!(s <= delta));
-}
-/* sec 0105 */
-scaled mult_and_add_(integer n, scaled x, scaled y, scaled max_answer)
-{
-  if (n < 0)
-  {
-    x = - (integer) x;
-    n = - (integer) n;
-  }
-
-  if (n == 0)
-    return y;
-  else if (((x <= (max_answer - y) / n) && (- (integer) x <= (max_answer + y) / n)))
-    return (n * x + y); 
-  else
-  {
-    arith_error = true;
-    return 0;
-  }
-}
-/* sec 0106 */
-scaled x_over_n_(scaled x, integer n)
-{
-  register scaled Result;
-  boolean negative;
-
-  negative = false;
-
-  if (n == 0)
-  {
-    arith_error = true;
-    Result = 0;
-    tex_remainder = x;
-  }
-  else
-  {
-    if (n < 0)
-    {
-      x = - (integer) x;
-      n = - (integer) n;
-      negative = true;
-    }
-
-    if (x >= 0)
-    {
-      Result = x / n;
-      tex_remainder = x % n;
-    }
-    else
-    {
-      Result = - (integer) ((- (integer) x)/ n);
-      tex_remainder = - (integer) ((- (integer) x)% n);
-    }
-  }
-
-  if (negative)
-    tex_remainder = - (integer) tex_remainder;
-
-  return Result;
-}
-/* sec 0107 */
-scaled xn_over_d_(scaled x, integer n, integer d)
-{
-  register scaled Result;
-  boolean positive;
-  nonnegative_integer t, u, v;
-
-  if (x >= 0)
-    positive = true; 
-  else
-  {
-    x = - (integer) x;
-    positive = false;
-  }
-
-  t = (x % 32767L) * n;
-  u = (x / 32768L) * n + (t / 32768L);
-  v = (u % d) * 32768L + (t % 32768L); 
-
-  if (u / d >= 32768L)
-    arith_error = true; 
-  else
-    u = 32768L * (u / d) + (v / d);
-
-  if (positive)
-  {
-    Result = u;
-    tex_remainder = v % d;
-  }
-  else
-  {
-    Result = - (integer) u;
-    tex_remainder = - (integer)(v % d);
-  }
-
-  return Result;
-}
-/* sec 0108 */
-halfword badness_(scaled t, scaled s)
-{
-  integer r;
-
-  if (t == 0)
-    return 0;
-  else if (s <= 0)
-    return 10000;
-  else
-  {
-    if (t <= 7230584L)
-      r = (t * 297) / s;
-    else if (s >= 1663497L)
-      r = t / (s / 297);
-    else
-      r = t;
-
-    if (r > 1290)
-      return 10000; 
-    else
-      return (r * r * r + 131072L) / 262144L;  /* 2^17 */
-  }
-}
-/* sec 0114 */
-#ifdef DEBUG
-void print_word (memory_word w)
-{ 
-  print_int(w.cint); 
-  print_char(' ');
-  print_scaled(w.cint); 
-  print_char(' ');
-  print_scaled(round(unity * w.gr));
-  print_ln();
-  print_int(w.hh.lh);
-  print_char('=');
-  print_int(w.hh.b0);
-  print_char(':');
-  print_int(w.hh.b1);
-  print_char(';');
-  print_int(w.hh.rh);
-  print_char(' ');
-  print_int(w.qqqq.b0); 
-  print_char(':');
-  print_int(w.qqqq.b1); 
-  print_char(':');
-  print_int(w.qqqq.b2); 
-  print_char(':');
-  print_int(w.qqqq.b3);
-}
-#endif
-/* sec 0292 */
-void show_token_list_(integer p, integer q, integer l)
-{
-  integer m, c;
-  ASCII_code match_chr;
-  ASCII_code n;
-
-  match_chr = '#';
-  n = '0';
-  tally = 0;
-
-  while ((p != 0) && (tally < l))
-  {
-    if (p == q)
-    {
-      first_count = tally;
-      trick_count = tally + 1 + error_line - half_error_line;
-
-      if (trick_count < error_line)
-        trick_count = error_line;
-    }
-
-    if ((p < hi_mem_min) || (p > mem_end))
-    {
-      print_esc("CLOBBERED.");
-      return;
-    }
-
-    if (info(p) >= cs_token_flag)
-      print_cs(info(p) - cs_token_flag);
-    else
-    {
-      m = info(p) / 256;
-      c = info(p) % 256;
-
-      if (info(p) < 0)
-        print_esc("BAD.");
-      else switch (m)
-      {
-        case left_brace:
-        case right_brace:
-        case math_shift:
-        case tab_mark:
-        case sup_mark:
-        case sub_mark:
-        case spacer:
-        case letter:
-        case other_char:
-          print(c);
-          break;
-        
-        case mac_param:
-          print(c);
-          print(c);
-          break;
-        
-        case out_param:
-          print(match_chr);
-          
-          if (c <= 9)
-            print_char(c + '0');
-          else
-          {
-            print_char('!');
-            return;
-          }
-          break;
-        
-        case match:
-          match_chr = (ASCII_code) c;
-          print(c);
-          incr(n);
-          print_char(n);
-          
-          if (n > '9')
-            return;
-          break;
-        
-        case end_match:
-          prints("->");
-          break;
-        
-        default:
-          print_esc("BAD.");
-          break;
-      }
-    }
-    p = link(p);
-  }
-
-  if (p != 0)
-    print_esc("ETC.");
-}
-/* sec 0306 */
-void runaway (void)
-{
-  pointer p;
-
-  if (scanner_status > 1)
-  {
-    print_nl("Runaway ");
-
-    switch (scanner_status)
-    {
-      case defining:
-        prints("definition");
-        p = def_ref;
-        break;
-
-      case matching:
-        prints("argument");
-        p = temp_head;
-        break;
-
-      case aligning:
-        prints("preamble");
-        p = hold_head;
-        break;
-
-      case absorbing:
-        prints("text");
-        p = def_ref;
-        break;
-    }
-
-    print_char('?');
-    print_ln();
-    show_token_list(link(p), 0, error_line - 10); 
-  }
-}
-/* sec 0120 */
-/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */
-/* first try list of available nodes (avail != NULL)                   */
-/* then see if can go upwards (mem_end < mem_max)                      */
-/* then see if can go downwards (hi_mem_min > lo_mem_max)              */
-/* if not, extend memory at the top and grab from there --- new        */
-/* else fail ! paragraph 120                                           */
-/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */
-pointer get_avail (void)
-{
-  pointer p;
-
-  p = avail;
-
-  if (p != 0)
-    avail = link(avail);
-  else if (mem_end < mem_max)
-  {
-    incr(mem_end);
-    p = mem_end;
-  }
-  else
-  {
-    decr(hi_mem_min);
-    p = hi_mem_min;
-
-    if (hi_mem_min <= lo_mem_max) /* have we run out in middle ? */
-    {
-      incr(hi_mem_min);
-      mem = realloc_main (0, mem_top / 2);  /* zzzaa = zmem = mem */
-
-      if (mem == NULL)
-        return 0;
-
-      if (mem_end >= mem_max)
-      {
-        runaway();
-        overflow("main memory size", mem_max + 1 - mem_min);
-        return 0;
-      }
-
-      incr(mem_end);        /* then grab from new area */
-      p = mem_end;          /* 1993/Dec/14 */
-    }
-  }
-
-  link(p) = 0;       /* link(p) = null !!! */
-
-#ifdef STAT
-  incr(dyn_used); 
-#endif
-
-  return p; 
-} 
-/* sec 0123 */
-void flush_list_(pointer p)
-{ 
-  pointer q, r;
-
-  if (p != 0)
-  {
-    r = p;
-
-    do
-      {
-        q = r;
-        r = link(r);
-#ifdef STAT
-        decr(dyn_used);
-#endif
-      }
-    while (!(r == 0));
-
-    link(q) = avail;
-    avail = p;
-  }
-}
-/* sec 0125 */
-pointer get_node (integer s)
-{
-  pointer p;
-  pointer q;
-  integer r;
-  integer t;
-
-restart:
-  p = rover;
-
-  do
-    {
-      q = p + node_size(p);
-
-      while (is_empty(q))
-      {
-        t = rlink(q);
-
-        if (q == rover)
-          rover = t;
-
-        llink(t) = llink(q);
-        rlink(llink(q)) = t;
-        q = q + node_size(q);
-      }
-
-      r = q - s;
-
-      if (r > toint(p + 1)) 
-      {
-        node_size(p) = r - p;
-        rover = p;
-        goto found;
-      }
-
-      if (r == p)
-        if (rlink(p) != p)
-        {
-          rover = rlink(p);
-          t = llink(p);
-          llink(rover) = t;
-          rlink(t) = rover;
-          goto found;
-        }
-
-      node_size(p) = q - p;
-      p = rlink(p);
-    }
-  while (!(p == rover));
-
-  if (s == 1073741824L)    /* 2^30 - special case - merge adjacent */
-  {
-    if (trace_flag)
-      puts("Merged adjacent multi-word nodes");
-
-    return max_halfword;
-  }
-
-/*  maybe try downward epxansion first instead ? */
-  if (lo_mem_max + 2 < hi_mem_min)
-    if (lo_mem_max + 2 <= mem_bot + max_halfword)  /* silly ? flush 93/Dec/16 */
-    {
-      if (hi_mem_min - lo_mem_max >= (block_size + block_size - 2))
-        t = lo_mem_max + block_size;
-      else
-        t = lo_mem_max + 1 + (hi_mem_min - lo_mem_max) / 2;
-
-      p = llink(rover);
-      q = lo_mem_max;
-      rlink(p) = q;
-      llink(rover) = q;
-
-      if (t > mem_bot + max_halfword)
-        t = mem_bot + max_halfword;     /* silly ? flush 93/Dec/16 */
-
-      rlink(q) = rover;
-      llink(q) = p;
-      link(q) = empty_flag;
-      node_size(q) = t - lo_mem_max; /* block size */
-      lo_mem_max = t;
-      link(lo_mem_max) = 0;
-      info(lo_mem_max) = 0;
-      rover = q;
-      goto restart;
-    }
-
-/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */
-/* we've run out of space in the middle for variable length blocks */
-/* try and add new block from below mem_bot *//* first check if space ! */
-  if (mem_min - (block_size + 1) <= mem_start) /* extend lower memory downwards */
-  {
-    mem = realloc_main (mem_top / 2 + block_size, 0);  /* zzzaa = zmem = mem */
-
-    if (mem == NULL)
-    {
-      return 0;
-    }
-  }
-
-  if (mem_min - (block_size + 1) <= mem_start) /* check again */
-  {
-    if (trace_flag)
-      printf("mem_min %lld, mem_start %d, block_size %d\n", mem_min, mem_start, block_size);
-
-    overflow("main memory size", mem_max + 1 - mem_min); /* darn: allocation failed ! */
-    return 0;
-  }
-
-  add_variable_space(block_size);
-  goto restart; /* go try get_node again */
-
-found:
-  link(r) = 0;
-
-#ifdef STAT
-  var_used = var_used + s; 
-#endif
-
-  return r; 
-} 
-/* sec 0130 */
-void free_node (pointer p, halfword s)
-{ 
-  pointer q;
-
-  node_size(p) = s;
-  link(p) = empty_flag;
-  q = llink(rover);
-  llink(p) = q;
-  rlink(p) = rover;
-  llink(rover) = p;
-  rlink(q) = p;
-
-#ifdef STAT
-  var_used = var_used - s; 
-#endif
-}
-/* sec 0136 */
-pointer new_null_box (void) 
-{
-  pointer p;
-
-  p = get_node(box_node_size);
-  type(p) = hlist_node;
-  subtype(p) = min_quarterword;
-  width(p) = 0;
-  depth(p) = 0;
-  height(p) = 0;
-  shift_amount(p) = 0;
-  list_ptr(p) = 0;
-  glue_sign(p) = normal;
-  glue_order(p) = normal;
-  glue_set(p) = 0.0;
-
-  return p;
-}
-/* sec 0139 */
-pointer new_rule (void) 
-{
-  pointer p;
-
-  p = get_node(rule_node_size);
-  type(p) = rule_node;
-  subtype(p) = 0;
-  width(p) = null_flag;
-  depth(p) = null_flag;
-  height(p) = null_flag;
-
-  return p;
-}
-/* sec 0144 */
-pointer new_ligature_(quarterword f, quarterword c, pointer q)
-{
-  pointer p;
-
-  p = get_node(small_node_size);
-  type(p) = ligature_node;
-  font(lig_char(p)) = f;
-  character(lig_char(p)) = c;
-  lig_ptr(p) = q;
-  subtype(p) = 0;
-
-  return p;
-}
-/* sec 0144 */
-pointer new_lig_item_(quarterword c)
-{
-  pointer p;
-
-  p = get_node(small_node_size);
-  character(p) = c;
-  lig_ptr(p) = 0;
-
-  return p;
-}
-/* sec 0145 */
-pointer new_disc (void) 
-{
-  pointer p;
-
-  p = get_node(small_node_size);
-  type(p) = disc_node;
-  replace_count(p) = 0;
-  pre_break(p) = 0;
-  post_break(p) = 0;
-
-  return p;
-}
-/* sec 0147 */
-pointer new_math (scaled w, small_number s)
-{
-  pointer p;
-
-  p = get_node(small_node_size);
-  type(p) = math_node;
-  subtype(p) = s;
-  width(p) = w;
-
-  return p;
-}
-/* sec 0151 */
-pointer new_spec_(pointer p)
-{
-  pointer q;
-
-  q = get_node(glue_spec_size);
-  mem[q] = mem[p];
-  glue_ref_count(q) = 0;
-  width(q) = width(p);
-  stretch(q) = stretch(p);
-  shrink(q) = shrink(p);
-
-  return q;
-}
-/* se 0152 */
-pointer new_param_glue (small_number n)
-{
-  pointer p;
-  pointer q;
-
-  p = get_node(small_node_size);
-  type(p) = glue_node;
-  subtype(p) = n + 1;
-  leader_ptr(p) = 0;
-  q = glue_par(n);
-  glue_ptr(p) = q;
-  incr(glue_ref_count(q));
-
-  return p;
-}
-/* sec 0153 */
-pointer new_glue (pointer q)
-{
-  pointer p;
-
-  p = get_node(small_node_size);
-  type(p) = glue_node;
-  subtype(p) = normal;
-  leader_ptr(p) = 0; 
-  glue_ptr(p) = q;
-  incr(glue_ref_count(q));
-
-  return p;
-}
-/* sec 0154 */
-pointer new_skip_param (small_number n)
-{
-  pointer p;
-
-  temp_ptr = new_spec(glue_par(n));
-  p = new_glue(temp_ptr);
-  glue_ref_count(temp_ptr) = 0;
-  subtype(p) = n + 1;
-
-  return p;
-}
-/* sec 0155 */
-pointer new_kern(scaled w)
-{
-  pointer p;
-
-  p = get_node(small_node_size);
-  type(p) = kern_node;
-  subtype(p) = normal;
-  width(p) = w;
-
-  return p;
-}
-/* sec 0158 */
-pointer new_penalty(integer m)
-{
-  pointer p;
-
-  p = get_node(small_node_size);
-  type(p) = penalty_node;
-  subtype(p) = 0;
-  penalty(p) = m;
-
-  return p;
-}
-
-#ifdef DEBUG
-/* sec 0167 */
-void check_mem (boolean print_locs)
-{
-  pointer p, q;
-  boolean clobbered;
-
-  for (p = mem_min; p <= lo_mem_max; p++)
-    freearr[p] = false;
-
-  for (p = hi_mem_min; p <= mem_end; p++)
-    freearr[p] = false;
-
-  p = avail;
-  q = 0;
-  clobbered = false;
-
-  while (p != 0)
-  {
-    if ((p > mem_end) || (p < hi_mem_min))
-      clobbered = true;
-    else if (freearr[p])
-      clobbered = true;
-
-    if (clobbered)
-    {
-      print_nl("AVAIL list clobbered at ");
-      print_int(q);
-      goto done1;
-    }
-
-    freearr[p] = true;
-    q = p;
-    p = link(q);
-  }
-
-done1:
-  p = rover;
-  q = 0;
-  clobbered = false;
-
-  do
-    {
-      if ((p >= lo_mem_max) || (p < mem_min))
-        clobbered = true;
-      else if ((rlink(p) >= lo_mem_max) || (rlink(p) < mem_min))
-        clobbered = true;
-      else if (!(is_empty(p)) || (node_size(p) < 2) ||
-          (p + node_size(p) > lo_mem_max) || (llink(rlink(p)) != p))
-        clobbered = true;
-      
-      if (clobbered)
-      {
-        print_nl("Double-AVAIL list clobbered at ");
-        print_int(q);
-        goto done2;
-      }
-
-      for (q = p; q <= p + node_size(p) - 1; q++)
-      {
-        if (freearr[q])
-        {
-          print_nl("Doubly free location at ");
-          print_int(q);
-          goto done2;
-        }
-
-        freearr[q] = true;
-      }
-
-      q = p;
-      p = rlink(p);
-    }
-  while (!(p == rover));
-
-done2:
-  p = mem_min;
-
-  while (p <= lo_mem_max)
-  {
-    if (is_empty(p))
-    {
-      print_nl("Bad flag at ");
-      print_int(p);
-    }
-
-    while ((p <= lo_mem_max) && !freearr[p])
-      incr(p);
-
-    while ((p <= lo_mem_max) && freearr[p])
-      incr(p);
-  }
-
-  if (print_locs)
-  {
-    print_nl("New busy locs:");
-
-    for (p = mem_min; p <= lo_mem_max; p++)
-      if (!freearr[p] && ((p > was_lo_max) || wasfree[p]))
-      {
-        print_char(' ');
-        print_int(p);
-      }
-
-    for (p = hi_mem_min; p <= mem_end; p++)
-      if (!freearr[p] && ((p < was_hi_min) || (p > was_mem_end) || wasfree[p]))
-      {
-        print_char(' ');
-        print_int(p);
-      }
-  }
-
-  for (p = mem_min; p <= lo_mem_max; p++)
-    wasfree[p] = freearr[p];
-
-  for (p = hi_mem_min; p <= mem_end; p++)
-    wasfree[p] = freearr[p];
-
-  was_mem_end = mem_end;
-  was_lo_max = lo_mem_max;
-  was_hi_min = hi_mem_min;
-}
-#endif /* DEBUG */
-
-#ifdef DEBUG
-/* sec 0172 */
-void search_mem_(pointer p)
-{
-  integer q;
-
-  for (q = mem_min; q <= lo_mem_max; q++)
-  {
-    if (link(q) == p)
-    {
-      print_nl("LINK(");
-      print_int(q);
-      print_char(')');
-    }
-
-    if (info(q) == p)
-    {
-      print_nl("INFO(");
-      print_int(q);
-      print_char(')');
-    }
-  }
-
-  for (q = hi_mem_min; q <= mem_end; q++)
-  {
-    if (link(q) == p)
-    {
-      print_nl("LINK(");
-      print_int(q);
-      print_char(')');
-    }
-
-    if (info(q) == p)
-    {
-      print_nl("INFO(");
-      print_int(q);
-      print_char(')');
-    }
-  }
-
-  for (q = active_base; q <= box_base + 255; q++)
-    if (equiv(q) == p)
-    {
-      print_nl("EQUIV(");
-      print_int(q);
-      print_char(')');
-    }
-
-  if (save_ptr > 0)
-    for (q = 0; q <= save_ptr - 1; q++)
-    {
-      if (equiv_field(save_stack[q]) == p)
-      {
-        print_nl("SAVE(");
-        print_int(q);
-        print_char(')');
-      }
-    }
-
-  for (q = 0; q <= hyphen_prime; q++)
-    if (hyph_list[q] == p)
-    {
-      print_nl("HYPH(");
-      print_int(q);
-      print_char(')');
-    }
-}
-#endif
-/* sec 0174 */
-void short_display_(integer p)
-{
-  integer n; 
-
-  while (p != 0) /* want p != null here ! */
-  {
-    if (is_char_node(p))
-    {
-      if (p <= mem_end)
-      {
-        if (font(p) != font_in_short_display)
-        {
-          if ((font(p) > font_max))
-            print_char('*');
-          else
-          {
-            print_esc("");
-            print(font_id_text(font(p)));
-          }
-          
-          print_char(' ');
-          font_in_short_display = font(p);
-        }
-        
-        print(character(p));
-      }
-    }
-    else switch (type(p))
-    {
-      case hlist_node:
-      case vlist_node:
-      case ins_node:
-      case whatsit_node:
-      case mark_node:
-      case adjust_node:
-      case unset_node:
-        prints("[]");
-        break;
-
-      case rule_node:
-        print_char('|');
-        break;
-
-      case glue_node:
-        if (glue_ptr(p) != 0)
-          print_char(' ');
-        break;
-
-      case math_node:
-        print_char('$');
-        break;
-
-      case ligature_node:
-        short_display(lig_ptr(p));
-        break;
-
-      case disc_node:
-        short_display(pre_break(p));
-        short_display(post_break(p));
-        n = replace_count(p);
-
-        while (n > 0)
-        {
-          if (link(p) != 0)
-            p = link(p);
-
-          decr(n);
-        }
-        break;
-
-      default:
-        break;
-    }
-    
-    p = link(p);
-  }
-}
-/* sec 0176 */
-void print_font_and_char (integer p)
-{
-  if (p > mem_end)
-    print_esc("CLOBBERED.");
-  else
-  {
-    if ((font(p) > font_max))
-      print_char('*');
-    else
-    {
-      print_esc("");
-      print(font_id_text(font(p)));
-    }
-
-    print_char(' ');
-    print(character(p));
-  }
-}
-/* sec 0176 */
-void print_mark (integer p)
-{ 
-  print_char('{');
-
-  if ((p < hi_mem_min) || (p > mem_end))
-    print_esc("CLOBBERED.");
-  else
-    show_token_list(link(p), 0, max_print_line - 10);
-
-  print_char('}');
-}
-/* sec 0176 */
-void print_rule_dimen(scaled d)
-{
-  if (is_running(d))
-    print_char('*');
-  else
-    print_scaled(d);
-}
-/* sec 0177 */
-void print_glue_(scaled d, integer order, const char * s)
-{
-  print_scaled(d); 
-
-  if ((order < normal) || (order > filll))
-    prints("foul");
-  else if (order > 0)
-  {
-    prints("fil");
-
-    while (order > 1)
-    {
-      print_char('l');
-      decr(order);
-    }
-  }
-  else if (*s != '\0')
-    prints(s);
-}
-/* sec 0178 */
-void print_spec_(integer p, const char * s)
-{
-  if ((p < mem_min) || (p >= lo_mem_max)) 
-    print_char('*');
-  else
-  {
-    print_scaled(width(p));
-
-    if (*s != '\0')
-      prints(s);
-
-    if (stretch(p) != 0)
-    {
-      prints("plus");
-      print_glue(stretch(p), stretch_order(p), s);
-    }
-
-    if (shrink(p) != 0)
-    {
-      prints("minus");
-      print_glue(shrink(p), shrink_order(p), s);
-    }
-  }
-}
-/* sec 0691 */
-void print_fam_and_char_(pointer p)
-{
-  print_esc("fam");
-  print_int(fam(p));
-  print_char(' ');
-  print(character(p));
-}
-/* sec 0691 */
-void print_delimiter_(pointer p)
-{
-  integer a;
-
-  a = small_fam(p) * 256 + small_char(p);
-  a = a * 0x1000 + large_fam(p) * 256 + large_char(p);
-
-  if (a < 0)
-    print_int(a);
-  else
-    print_hex(a);
-}
-/* sec 0692 */
-void print_subsidiary_data_(pointer p, ASCII_code c)
-{
-  if ((pool_ptr - str_start[str_ptr]) >= depth_threshold)
-  {
-    if (math_type(p) != 0)
-      prints(" []");
-  }
-  else
-  {
-    append_char(c);
-    temp_ptr = p;
-
-    switch (math_type(p))
-    {
-      case math_char:
-        print_ln();
-        print_current_string();
-        print_fam_and_char(p);
-        break;
-
-      case sub_box:
-        show_info();
-        break;
-
-      case sub_mlist:
-        if (info(p) == 0)
-        {
-          print_ln();
-          print_current_string();
-          prints("{}");
-        }
-        else
-          show_info();
-        break;
-
-      default:
-        break;
-    }
-
-    decr(pool_ptr);
-  }
-}
-/* sec 0694 */
-void print_style_(integer c)
-{
-  switch (c / 2)
-  {
-    case 0:
-      print_esc("displaystyle");
-      break;
-    case 1:
-      print_esc("textstyle");
-      break;
-    case 2:
-      print_esc("scriptstyle");
-      break;
-    case 3:
-      print_esc("scriptscriptstyle");
-      break;
-    default:
-      prints("Unknown style!");
-      break;
-  }
-}
-/* sec 0225 */
-void print_skip_param_(integer n)
-{
-  switch (n)
-  {
-    case line_skip_code:
-      print_esc("lineskip");
-      break;
-
-    case baseline_skip_code:
-      print_esc("baselineskip");
-      break; 
-
-    case par_skip_code:
-      print_esc("parskip");
-      break;
-
-    case above_display_skip_code:
-      print_esc("abovedisplayskip");
-      break;
-
-    case below_display_skip_code:
-      print_esc("belowdisplayskip");
-      break;
-
-    case above_display_short_skip_code:
-      print_esc("abovedisplayshortskip");
-      break;
-
-    case below_display_short_skip_code:
-      print_esc("belowdisplayshortskip");
-      break;
-
-    case left_skip_code:
-      print_esc("leftskip");
-      break;
-
-    case right_skip_code:
-      print_esc("rightskip");
-      break;
-
-    case top_skip_code:
-      print_esc("topskip");
-      break;
-
-    case split_top_skip_code:
-      print_esc("splittopskip");
-      break;
-
-    case tab_skip_code:
-      print_esc("tabskip");
-      break;
-
-    case space_skip_code:
-      print_esc("spaceskip");
-      break;
-
-    case xspace_skip_code:
-      print_esc("xspaceskip");
-      break;
-
-    case par_fill_skip_code:
-      print_esc("parfillskip");
-      break;
-
-    case thin_mu_skip_code:
-      print_esc("thinmuskip");
-      break;
-
-    case med_mu_skip_code:
-      print_esc("medmuskip");
-      break; 
-
-    case thick_mu_skip_code:
-      print_esc("thickmuskip");
-      break;
-
-    default:
-      prints("[unknown glue parameter!]");
-      break;
-  }
-}
-/* sec 0182 */
-void show_node_list_(integer p)
-{
-  integer n;
-  real g;
-
-  if (cur_length > depth_threshold)
-  {
-    if (p != 0)    /* fixed 94/Mar/23 BUG FIX NOTE: still not fixed in 3.14159 ! */
-      prints(" []");
-
-    return; 
-  }
-
-  n = 0;
-
-  while (p != 0)
-  {
-    print_ln(); 
-    print_current_string(); 
-
-    if (p > mem_end)
-    {
-      prints("Bad link, display aborted.");
-      return;
-    }
-
-    incr(n);
-
-    if (n > breadth_max)
-    {
-      prints("etc.");
-      return;
-    }
-
-    if (is_char_node(p))
-      print_font_and_char(p);
-    else switch (type(p))
-    {
-      case hlist_node:
-      case vlist_node:
-      case unset_node:
-        {
-          if (type(p) == hlist_node)
-            print_esc("h");
-          else if (type(p) == vlist_node)
-            print_esc("v");
-          else
-            print_esc("unset");
-
-          prints("box(");
-          print_scaled(height(p));
-          print_char('+');
-          print_scaled(depth(p));
-          prints(")x");
-          print_scaled(width(p));
-
-          if (type(p) == unset_node)
-          {
-            if (span_count(p) != 0)
-            {
-              prints(" (");
-              print_int(span_count(p) + 1);
-              prints(" columns)");
-            }
-
-            if (glue_stretch(p) != 0)
-            {
-              prints(", stretch ");
-              print_glue(glue_stretch(p), glue_order(p), "");
-            }
-
-            if (glue_shrink(p) != 0)
-            {
-              prints(", shrink ");
-              print_glue(glue_shrink(p), glue_sign(p), "");
-            }
-          }
-          else
-          {
-            g = glue_set(p);
-
-            if ((g != 0.0) && (glue_sign(p) != 0))
-            {
-              prints(", glue set ");
-
-              if (glue_sign(p) == shrinking)
-                prints("- ");
-
-              if (fabs(g) > 20000.0)
-              {
-                if (g > 0.0)
-                  print_char('>');
-                else
-                  prints("< -");
-
-                print_glue(20000 * unity, glue_order(p), "");
-              }
-              else
-                print_glue(round(unity * g), glue_order(p), "");
-            }
-
-            if (shift_amount(p) != 0)
-            {
-              prints(", shifted ");
-              print_scaled(shift_amount(p));
-            }
-          }
-
-          node_list_display(list_ptr(p));
-        }
-        break;
-
-      case rule_node:
-        {
-          print_esc("rule(");
-          print_rule_dimen(height(p));
-          print_char('+');
-          print_rule_dimen(depth(p));
-          prints(")x");
-          print_rule_dimen(width(p));
-        }
-        break;
-
-      case ins_node:
-        {
-          print_esc("insert");
-          print_int(subtype(p));
-          prints(", natural size ");
-          print_scaled(height(p));
-          prints("; split(");
-          print_spec(split_top_ptr(p), "");
-          print_char(',');
-          print_scaled(depth(p));
-          prints("); float cost ");
-          print_int(float_cost(p));
-          node_list_display(ins_ptr(p));
-        }
-        break;
-
-      case whatsit_node:
-        switch (subtype(p))
-        {
-          case open_node:
-            {
-              print_write_whatsit("openout", p);
-              print_char('=');
-              print_file_name(open_name(p), open_area(p), open_ext(p));
-            }
-            break;
-
-          case write_node:
-            {
-              print_write_whatsit("write", p);
-              print_mark(write_tokens(p));
-            }
-            break;
-
-          case close_node:
-            print_write_whatsit("closeout", p);
-            break;
-
-          case special_node:
-            {
-              print_esc("special");
-              print_mark(write_tokens(p));
-            }
-            break;
-
-          case language_node:
-            {
-              print_esc("setlanguage");
-              print_int(what_lang(p));
-              prints(" (hyphenmin ");
-              print_int(what_lhm(p));
-              print_char(',');
-              print_int(what_rhm(p));
-              print_char(')');
-            }
-            break;
-
-          default:
-            prints("whatsit?");
-            break;
-        }
-        break;
-
-      case glue_node:
-        if (subtype(p) >= a_leaders)
-        {
-          print_esc("");
-
-          if (subtype(p) == c_leaders)
-            print_char('c');
-          else if (subtype(p) == x_leaders)
-            print_char('x');
-
-          prints("leaders ");
-          print_spec(glue_ptr(p), "");
-          node_list_display(leader_ptr(p));
-        }
-        else
-        {
-          print_esc("glue");
-
-          if (subtype(p) != normal)
-          {
-            print_char('(');
-
-            if (subtype(p) < cond_math_glue)
-              print_skip_param(subtype(p) - 1);
-            else if (subtype(p) == cond_math_glue)
-              print_esc("nonscript");
-            else print_esc("mskip");
-
-            print_char(')');
-          }
-
-          if (subtype(p) != cond_math_glue)
-          {
-            print_char(' ');
-
-            if (subtype(p) < cond_math_glue)
-              print_spec(glue_ptr(p), "");
-            else
-              print_spec(glue_ptr(p), "mu");
-          }
-        }
-        break;
-
-      case kern_node:
-        if (subtype(p) != mu_glue)
-        {
-          print_esc("kern");
-
-          if (subtype(p) != normal)
-            print_char(' ');
-
-          print_scaled(width(p));
-
-          if (subtype(p) == acc_kern)
-            prints(" (for accent)");
-        }
-        else
-        {
-          print_esc("mkern");
-          print_scaled(width(p));
-          prints("mu");
-        }
-        break;
-
-      case math_node:
-        {
-          print_esc("math");
-
-          if (subtype(p) == before)
-            prints("on");
-          else
-            prints("off");
-
-          if (width(p) != 0)
-          {
-            prints(", surrounded ");
-            print_scaled(width(p));
-          }
-        }
-        break;
-
-      case ligature_node:
-        {
-          print_font_and_char(lig_char(p));
-          prints("(ligature ");
-
-          if (subtype(p) > 1)
-            print_char('|');
-
-          font_in_short_display = font(lig_char(p)); 
-          short_display(lig_ptr(p));
-
-          if (odd(subtype(p)))
-            print_char('|');
-
-          print_char(')');
-        }
-        break;
-
-      case penalty_node:
-        {
-          print_esc("penalty ");
-          print_int(penalty(p));
-        }
-        break;
-
-      case disc_node:
-        {
-          print_esc("discretionary");
-
-          if (replace_count(p) > 0)
-          {
-            prints(" replacing ");
-            print_int(replace_count(p));
-          }
-
-          node_list_display(pre_break(p));
-          append_char('|');
-          show_node_list(post_break(p));
-          decr(pool_ptr);
-        }
-        break;
-
-      case mark_node:
-        {
-          print_esc("mark");
-          print_mark(mark_ptr(p));
-        }
-        break;
-
-      case adjust_node:
-        {
-          print_esc("vadjust");
-          node_list_display(adjust_ptr(p));
-        }
-        break;
-
-      case style_node:
-        print_style(subtype(p));
-        break;
-
-      case choice_node:
-        {
-          print_esc("mathchoice");
-          append_char('D');
-          show_node_list(display_mlist(p));
-          decr(pool_ptr);
-          append_char('T');
-          show_node_list(text_mlist(p));
-          decr(pool_ptr);
-          append_char('S');
-          show_node_list(script_mlist(p));
-          decr(pool_ptr);
-          append_char('s');
-          show_node_list(script_script_mlist(p)); 
-          decr(pool_ptr); 
-        } 
-        break;
-
-      case ord_noad:
-      case op_noad:
-      case bin_noad:
-      case rel_noad:
-      case open_noad:
-      case close_noad:
-      case punct_noad:
-      case inner_noad:
-      case radical_noad:
-      case over_noad:
-      case under_noad:
-      case vcenter_noad:
-      case accent_noad:
-      case left_noad:
-      case right_noad:
-        {
-          switch (type(p))
-          {
-            case ord_noad:
-              print_esc("mathord");
-              break;
-
-            case op_noad:
-              print_esc("mathop");
-              break;
-
-            case bin_noad:
-              print_esc("mathbin");
-              break;
-
-            case rel_noad:
-              print_esc("mathrel");
-              break;
-
-            case open_noad:
-              print_esc("mathopen");
-              break;
-
-            case close_noad:
-              print_esc("mathclose");
-              break;
-
-            case punct_noad:
-              print_esc("mathpunct");
-              break;
-
-            case inner_noad:
-              print_esc("mathinner");
-              break;
-
-            case over_noad:
-              print_esc("overline");
-              break;
-
-            case under_noad:
-              print_esc("underline");
-              break;
-
-            case vcenter_noad:
-              print_esc("vcenter");
-              break;
-
-            case radical_noad:
-              {
-                print_esc("radical");
-                print_delimiter(left_delimiter(p));
-              }
-              break;
-
-            case accent_noad:
-              {
-                print_esc("accent");
-                print_fam_and_char(accent_chr(p));
-              }
-              break;
-
-            case left_noad:
-              {
-                print_esc("left");
-                print_delimiter(delimiter(p));
-              }
-              break;
-
-            case right_noad:
-              {
-                print_esc("right");
-                print_delimiter(delimiter(p));
-              }
-              break;
-          }
-
-          if (subtype(p) != normal)
-            if (subtype(p) == limits)
-              print_esc("limits");
-            else
-              print_esc("nolimits");
-
-          if (type(p) < left_noad)
-            print_subsidiary_data(nucleus(p), '.');
-
-          print_subsidiary_data(supscr(p), '^');
-          print_subsidiary_data(subscr(p), '_');
-        }
-        break;
-
-      case fraction_noad:
-        {
-          print_esc("fraction, thickness ");
-
-          if (thickness(p) == 1073741824L)  /* 2^30 */
-            prints("= default");
-          else
-            print_scaled(thickness(p));
-
-          if ((small_fam(left_delimiter(p)) != 0) || (small_char(left_delimiter(p)) != 0) ||
-              (large_fam(left_delimiter(p)) != 0) || (large_char(left_delimiter(p)) != 0))
-          {
-            prints(", left-delimiter ");
-            print_delimiter(left_delimiter(p));
-          }
-
-          if ((small_fam(right_delimiter(p)) != 0) || (small_char(right_delimiter(p)) != 0) ||
-              (large_fam(right_delimiter(p)) != 0) || (large_char(right_delimiter(p)) != 0))
-          {
-            prints(", right-delimiter ");
-            print_delimiter(right_delimiter(p));
-          }
-
-          print_subsidiary_data(numerator(p), '\\');
-          print_subsidiary_data(denominator(p), '/');
-        }
-        break;
-
-      default:
-        prints("Unknown node type!");
-        break;
-    }
-
-    p = link(p);
-  }
+/* Copyright 2014 Clerk Ma\r
+\r
+   This program is free software; you can redistribute it and/or modify\r
+   it under the terms of the GNU General Public License as published by\r
+   the Free Software Foundation; either version 2 of the License, or\r
+   (at your option) any later version.\r
+\r
+   This program is distributed in the hope that it will be useful, but\r
+   WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+   General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with this program; if not, write to the Free Software\r
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA\r
+   02110-1301 USA.  */\r
+\r
+#define EXTERN extern\r
+#include "yandytex.h"\r
+\r
+/* sec 0058 */\r
+void print_ln (void)\r
+{\r
+  switch (selector)\r
+  {\r
+    case term_and_log:\r
+      wterm_cr();\r
+      term_offset = 0;\r
+      wlog_cr();\r
+      file_offset = 0;\r
+      break;\r
+\r
+    case log_only:\r
+      wlog_cr();\r
+      file_offset = 0;\r
+      break;\r
+\r
+    case term_only:\r
+      wterm_cr();\r
+      term_offset = 0;\r
+      break;\r
+\r
+    case no_print:\r
+    case pseudo:\r
+    case new_string:\r
+      do_nothing();\r
+      break;\r
+\r
+    default:\r
+      putc('\n', write_file[selector]);\r
+      break;\r
+  }\r
+}\r
+/* sec 0058 */\r
+void print_char_ (ASCII_code s)\r
+{\r
+  if (s == new_line_char)\r
+    if (selector < pseudo)\r
+    {\r
+      print_ln();\r
+      return;\r
+    }\r
+\r
+  switch (selector)\r
+  {\r
+    case term_and_log:\r
+      wterm(xchr[s]);\r
+      incr(term_offset);\r
+      wlog(xchr[s]);\r
+      incr(file_offset);\r
+\r
+      if (term_offset == max_print_line)\r
+      {\r
+        wterm_cr();\r
+        term_offset = 0;\r
+      }\r
+      \r
+      if (file_offset == max_print_line)\r
+      {\r
+        wlog_cr();\r
+        file_offset = 0;\r
+      }\r
+\r
+      break;\r
+\r
+    case log_only:\r
+      wlog(xchr[s]);\r
+      incr(file_offset);\r
+\r
+      if (file_offset == max_print_line)\r
+        print_ln();\r
+\r
+      break;\r
+\r
+    case term_only:\r
+      wterm(xchr[s]);\r
+      incr(term_offset);\r
+\r
+      if (term_offset == max_print_line)\r
+        print_ln();\r
+\r
+      break;\r
+\r
+    case no_print:\r
+      do_nothing();\r
+      break;\r
+\r
+    case pseudo:\r
+      if (tally < trick_count)\r
+        trick_buf[tally % error_line] = s;\r
+\r
+      break;\r
+\r
+    case new_string:\r
+#ifdef ALLOCATESTRING\r
+      if (pool_ptr + 1 > current_pool_size)\r
+        str_pool = realloc_str_pool(increment_pool_size);\r
+      \r
+      if (pool_ptr < current_pool_size)\r
+        append_char(s);\r
+#else\r
+      if (pool_ptr < pool_size)\r
+        append_char(s);\r
+#endif\r
+      break;\r
+\r
+    default:\r
+      putc(xchr[s], write_file[selector]);\r
+      break;\r
+  }\r
+\r
+  incr(tally);\r
+}\r
+/* sec 0059 */\r
+void print_ (integer s)\r
+{\r
+  pool_pointer j;\r
+  integer nl;\r
+\r
+  if (s >= str_ptr)\r
+    s = 259; /* ??? */\r
+  else\r
+  {\r
+    if (s < 256)\r
+    {\r
+      if (s < 0)\r
+        s = 259; /* ??? */\r
+      else\r
+      {\r
+        if (selector > pseudo)\r
+        {\r
+          print_char(s);\r
+          return;\r
+        }\r
+\r
+        if (s == new_line_char)\r
+          if (selector < pseudo)\r
+          {\r
+            print_ln();\r
+            return;\r
+          }\r
+          \r
+        nl = new_line_char;\r
+        new_line_char = -1;\r
+          \r
+        /* translate ansi to dos 850 */\r
+        if (!show_in_hex && s < 256 && s >= 32)\r
+        {\r
+          if (show_in_dos && s > 127)\r
+          {\r
+            if (wintodos[s - 128] > 0)\r
+            {\r
+              print_char(wintodos[s - 128]);\r
+            }\r
+            else\r
+            {\r
+              j = str_start[s];\r
+\r
+              while (j < str_start[s + 1])\r
+              {\r
+                print_char(str_pool[j]);\r
+                incr(j);\r
+              }\r
+            }\r
+          }\r
+          else\r
+          {\r
+            print_char(s);       /* don't translate to hex */\r
+          }\r
+        }\r
+        else\r
+        {                       /* not just a character */\r
+          j = str_start[s];\r
+\r
+          while (j < str_start[s + 1])\r
+          {\r
+            print_char(str_pool[j]);\r
+            incr(j);\r
+          }\r
+        }\r
+\r
+        new_line_char = nl; /* restore eol */\r
+        return;\r
+      }\r
+    }\r
+  }\r
+/*  we get here with s > 256 - i.e. not a single character */\r
+  j = str_start[s];\r
+\r
+  while (j < str_start[s + 1])\r
+  {\r
+    print_char(str_pool[j]);\r
+    incr(j);\r
+  }\r
+}\r
+/* string version print. */\r
+void prints_ (const char * s)\r
+{\r
+  while (*s)\r
+    print_char(*s++);\r
+}\r
+/* sec 0060 */\r
+void slow_print_ (integer s)\r
+{\r
+  pool_pointer j;\r
+\r
+  if ((s >= str_ptr) || (s < 256))\r
+    print(s);\r
+  else\r
+  {\r
+    j = str_start[s];\r
+\r
+    while (j < str_start[s + 1])\r
+    {\r
+      print(str_pool[j]);\r
+      incr(j);\r
+    }\r
+  }\r
+}\r
+/* sec 0062 */\r
+void print_nl (const char * s)\r
+{\r
+  if (((term_offset > 0) && (odd(selector))) ||\r
+      ((file_offset > 0) && (selector >= log_only)))\r
+    print_ln();\r
+\r
+  prints(s);\r
+}\r
+/* sec 0063 */\r
+void print_esc (const char * s)\r
+{\r
+  integer c;\r
+\r
+  c = escape_char;\r
+\r
+  if (c >= 0)\r
+    if (c < 256)\r
+      print(c);\r
+\r
+  prints(s);\r
+}\r
+/* sec 0064 */\r
+void print_the_digs (eight_bits k)\r
+{\r
+  while (k > 0)\r
+  {\r
+    decr(k);\r
+\r
+    if (dig[k] < 10)\r
+      print_char('0' + dig[k]);\r
+    else\r
+      print_char('A' + dig[k]);\r
+  }\r
+}\r
+/* sec 0065 */\r
+void print_int_ (integer n)\r
+{\r
+  char k;\r
+  integer m;\r
+\r
+  k = 0;\r
+\r
+  if (n < 0)\r
+  {\r
+    print_char('-');\r
+\r
+    if (n > -100000000L)\r
+      n = - (integer) n;\r
+    else\r
+    {\r
+      m = -1 - n;\r
+      n = m / 10;\r
+      m = (m % 10) + 1;\r
+      k = 1;\r
+\r
+      if (m < 10)\r
+        dig[0] = (char) m;\r
+      else\r
+      {\r
+        dig[0] = 0;\r
+        incr(n);\r
+      }\r
+    }\r
+  }\r
+\r
+  do\r
+    {\r
+      dig[k] = (char) (n % 10);\r
+      n = n / 10;\r
+      incr(k);\r
+    }\r
+  while (!(n == 0));\r
+\r
+  print_the_digs(k);\r
+}\r
+/* sec 0262 */\r
+void print_cs_ (integer p)\r
+{\r
+  if (p < hash_base)\r
+    if (p >= single_base)\r
+      if (p == null_cs)\r
+      {\r
+        print_esc("csname");\r
+        print_esc("endcsname");\r
+        print_char(' ');\r
+      }\r
+      else\r
+      {\r
+        print_esc(""); print(p - single_base);\r
+\r
+        if (cat_code(p - single_base) == letter)\r
+          print_char(' ');\r
+      }\r
+    else if (p < active_base)\r
+      print_esc("IMPOSSIBLE.");\r
+    else\r
+      print(p - active_base);\r
+  else if (p >= undefined_control_sequence)\r
+    print_esc("IMPOSSIBLE.");\r
+  else if ((text(p) >= str_ptr))\r
+    print_esc("NONEXISTENT.");\r
+  else\r
+  {\r
+    print_esc("");\r
+    print(text(p));\r
+    print_char(' ');\r
+  }\r
+}\r
+/* sec 0263 */\r
+void sprint_cs (pointer p)\r
+{ \r
+  if (p < hash_base)\r
+    if (p < single_base)\r
+      print(p - active_base);\r
+    else if (p < null_cs)\r
+    {\r
+      print_esc("");\r
+      print(p - single_base);\r
+    }\r
+    else\r
+    {\r
+      print_esc("csname");\r
+      print_esc("endcsname");\r
+    }\r
+  else\r
+  {\r
+    print_esc(""); print(text(p));\r
+  }\r
+}\r
+/* sec 0518 */\r
+void print_file_name (integer n, integer a, integer e)\r
+{\r
+  slow_print(a);\r
+  slow_print(n);\r
+  slow_print(e);\r
+}\r
+/* sec 0699 */\r
+void print_size_ (integer s)\r
+{ \r
+  if (s == 0)\r
+    print_esc("textfont");\r
+  else if (s == 16)\r
+    print_esc("scriptfont");\r
+  else\r
+    print_esc("scriptscriptfont");\r
+} \r
+/* sec 1355 */\r
+void print_write_whatsit_(const char * s, pointer p)\r
+{\r
+  print_esc(s);\r
+\r
+  if (write_stream(p) < 16)\r
+    print_int(write_stream(p)); \r
+  else if (write_stream(p) == 16)\r
+    print_char('*');\r
+  else\r
+    print_char('-');\r
+}\r
+/* sec 0081 */\r
+void jump_out (void) \r
+{\r
+  close_files_and_terminate();\r
+\r
+  {\r
+    int code;\r
+\r
+    fflush(stdout); \r
+    ready_already = 0;\r
+\r
+    if (trace_flag)\r
+      puts("EXITING at JUMPOUT");\r
+\r
+    if ((history != 0) && (history != 1))\r
+      code = 1;\r
+    else\r
+      code = 0;\r
+\r
+    uexit(code);\r
+  }\r
+}\r
+/* sec 0082 */\r
+void error (void)\r
+{\r
+  ASCII_code c;\r
+  integer s1, s2, s3, s4;\r
+\r
+  if (history < error_message_issued)\r
+    history = error_message_issued;\r
+\r
+  print_char('.');\r
+  show_context();\r
+\r
+  if (interaction == error_stop_mode)\r
+    while (true)\r
+    {\r
+continu:\r
+      clear_for_error_prompt();\r
+      prompt_input("? ");\r
+\r
+      if (last == first)\r
+        return; // no input\r
+\r
+      c = buffer[first];\r
+\r
+      if (c >= 'a')\r
+        c = (c + 'A' - 'a'); \r
+\r
+      switch (c)\r
+      {\r
+        case '0':\r
+        case '1':\r
+        case '2':\r
+        case '3':\r
+        case '4':\r
+        case '5':\r
+        case '6':\r
+        case '7':\r
+        case '8':\r
+        case '9':\r
+          if (deletions_allowed)\r
+          {\r
+            s1 = cur_tok;\r
+            s2 = cur_cmd;\r
+            s3 = cur_chr;\r
+            s4 = align_state;\r
+            align_state = 1000000L;\r
+            OK_to_interrupt = false;\r
+\r
+            if ((last > first + 1) && (buffer[first + 1] >= '0') && (buffer[first + 1] <= '9'))\r
+              c = (c * 10 + buffer[first + 1] - '0' * 11);\r
+            else\r
+              c = (c - 48);\r
+            \r
+            while (c > 0)\r
+            {\r
+              get_token();\r
+              decr(c);\r
+            }\r
+\r
+            cur_tok = s1;\r
+            cur_cmd = s2;\r
+            cur_chr = s3;\r
+            align_state = s4;\r
+            OK_to_interrupt = true;\r
+            help2("I have just deleted some text, as you asked.",\r
+                "You can now delete more, or insert, or whatever.");\r
+            show_context();\r
+            goto continu;\r
+          }\r
+          break;\r
+\r
+#ifdef DEBUG\r
+        case 'D':\r
+          {\r
+            debug_help();\r
+            goto continu;\r
+          }\r
+          break;\r
+#endif\r
+\r
+        case 'E':\r
+          if (base_ptr > 0)\r
+          {\r
+            edit_name_start = str_start[input_stack[base_ptr].name_field];\r
+            edit_name_length = length(input_stack[base_ptr].name_field);\r
+            edit_line = line;\r
+            jump_out();\r
+          }\r
+          break;\r
+\r
+        case 'H':\r
+          {\r
+            if (use_err_help)\r
+            {\r
+              give_err_help();\r
+              use_err_help = false;\r
+            }\r
+            else\r
+            {\r
+              if (help_ptr == 0)\r
+                help2("Sorry, I don't know how to help in this situation.",\r
+                    "Maybe you should try asking a human?");\r
+              do\r
+                {\r
+                  decr(help_ptr);\r
+                  prints(help_line[help_ptr]);\r
+                  print_ln();\r
+                }\r
+              while (!(help_ptr == 0));\r
+            }\r
+\r
+            help4("Sorry, I already gave what help I could...",\r
+                "Maybe you should try asking a human?",\r
+                "An error might have occurred before I noticed any problems.",\r
+                "``If all else fails, read the instructions.''");\r
+            goto continu;\r
+          }\r
+          break;\r
+\r
+        case 'I':\r
+          {\r
+            begin_file_reading();\r
+\r
+            if (last > first + 1)\r
+            {\r
+              loc = first + 1;\r
+              buffer[first] = 32;\r
+            }\r
+            else\r
+            {\r
+              prompt_input("insert>");\r
+              loc = first;\r
+            }\r
+\r
+            first = last;\r
+            limit = last - 1;\r
+\r
+            return;\r
+          }\r
+          break;\r
+\r
+        case 'Q':\r
+        case 'R':\r
+        case 'S':\r
+          {\r
+            error_count = 0; \r
+            interaction = 0 + c - 'Q';\r
+            prints("OK, entering ");\r
+\r
+            switch (c)\r
+            {\r
+              case 'Q':\r
+                print_esc("batchmode");\r
+                decr(selector);\r
+                break;\r
+\r
+              case 'R':\r
+                print_esc("nonstopmode");\r
+                break;\r
+\r
+              case 'S':\r
+                print_esc("scrollmode");\r
+                break;\r
+            }\r
+\r
+            prints("...");\r
+            print_ln();\r
+            update_terminal();\r
+            return;\r
+          }\r
+          break;\r
+\r
+        case 'X':\r
+          {\r
+            interaction = scroll_mode;\r
+            jump_out();\r
+          }\r
+          break;\r
+\r
+        default:\r
+          break;\r
+      }\r
+\r
+      {\r
+        prints("Type <return> to proceed, S to scroll future error messages,");\r
+        print_nl("R to run without stopping, Q to run quietly,");\r
+        print_nl("I to insert something, ");\r
+\r
+        if (base_ptr > 0)\r
+          prints("E to edit your file,");\r
+\r
+        if (deletions_allowed)\r
+          print_nl("1 or ... or 9 to ignore the next 1 to 9 tokens of input,");\r
+\r
+        print_nl("H for help, X to quit.");\r
+      }\r
+    }\r
+\r
+  incr(error_count);\r
+\r
+  if (error_count == 100)\r
+  {\r
+    print_nl("(That makes 100 errors; please try again.)");\r
+    history = fatal_error_stop;\r
+    jump_out();\r
+  }\r
+\r
+  if (interaction > batch_mode)\r
+    decr(selector);\r
+\r
+  if (use_err_help)\r
+  {\r
+    print_ln();\r
+    give_err_help();\r
+  }\r
+  else while (help_ptr > 0)\r
+  {\r
+    decr(help_ptr);\r
+    print_nl(help_line[help_ptr] == NULL ? "" : help_line[help_ptr]);\r
+  }\r
+\r
+  print_ln();\r
+\r
+  if (interaction > batch_mode)\r
+    incr(selector);\r
+  \r
+  print_ln();\r
+}\r
+/* sec 0093 */\r
+void fatal_error (const char * s)\r
+{\r
+  normalize_selector();\r
+  print_err("Emergency stop");\r
+  help1(s);\r
+  succumb();\r
+}\r
+/* sec 0094 */\r
+void overflow_(const char * s, integer n)\r
+{\r
+  normalize_selector();\r
+  print_err("TeX capacity exceeded, sorry [");\r
+  prints(s);\r
+  print_char('=');\r
+  print_int(n);\r
+  print_char(']');\r
+  help2("If you really absolutely need more capacity,",\r
+      "you can ask a wizard to enlarge me.");\r
+\r
+  if (!knuth_flag)\r
+  {\r
+    if (!strcmp(s, "pattern memory") && (n == trie_size))\r
+      printf("\n  (Maybe use -h=... on command line in initex)\n");\r
+    else if (!strcmp(s, "exception dictionary") && (n == hyphen_prime))\r
+      printf("\n  (Maybe use -e=... on command line in initex)\n");\r
+  }\r
+\r
+  succumb();\r
+}\r
+/* sec 0095 */\r
+void confusion (const char * s)\r
+{\r
+  normalize_selector();\r
+\r
+  if (history < error_message_issued)\r
+  {\r
+    print_err("This can't happen (");\r
+    prints(s);\r
+    print_char(')');\r
+    help1("I'm broken. Please show this to someone who can fix can fix");\r
+  }\r
+  else\r
+  {\r
+    print_err("I can't go on meeting you like this");\r
+    help2("One of your faux pas seems to have wounded me deeply...",\r
+        "in fact, I'm barely conscious. Please fix it and try again.");\r
+  }\r
+\r
+  succumb();\r
+}\r
+/* sec 0037 */\r
+boolean init_terminal (void)\r
+{\r
+  boolean flag;\r
+\r
+  t_open_in();\r
+\r
+  if (last > first)\r
+  {\r
+    loc = first;\r
+\r
+    while ((loc < last) && (buffer[loc]== ' '))\r
+      incr(loc);\r
+\r
+    if (loc < last)\r
+      return true;\r
+  }\r
+\r
+// failed to find input file name\r
+  while (true)\r
+  {\r
+    fputs("**", stdout);\r
+    update_terminal();\r
+    flag = input_ln(stdin, true);\r
+\r
+    if (!flag)\r
+    {\r
+      wterm_cr();\r
+      puts("! End of file on the terminal... why?\n");\r
+      return false;\r
+    }\r
+\r
+    loc = first;\r
+\r
+    while ((loc < last) && (buffer[loc]== ' '))\r
+      incr(loc);    // step over intial white space\r
+\r
+    if (loc < last)\r
+      return true;\r
+\r
+    printf("%s\n", "Please type the name of your input file.");\r
+  }\r
+}\r
+/* sec 0043 */\r
+str_number make_string (void)\r
+{\r
+#ifdef ALLOCATESTRING\r
+  if (str_ptr == current_max_strings)\r
+    str_start = realloc_str_start(increment_max_strings);\r
+\r
+  if (str_ptr == current_max_strings)\r
+  {\r
+    overflow("number of strings", current_max_strings - init_str_ptr);\r
+    return 0;\r
+  }\r
+#else\r
+  if (str_ptr == max_strings)\r
+  {\r
+    overflow("number of strings", max_strings - init_str_ptr);\r
+    return 0;\r
+  }\r
+#endif\r
+\r
+  incr(str_ptr);\r
+  str_start[str_ptr] = pool_ptr;\r
+\r
+  return (str_ptr - 1);\r
+}\r
+/* sec 0044 */\r
+boolean str_eq_buf_ (str_number s, integer k)\r
+{\r
+  pool_pointer j;\r
+  boolean result;\r
+\r
+  j = str_start[s];\r
+\r
+  while (j < str_start[s + 1])\r
+  {\r
+    if (str_pool[j] != buffer[k])\r
+    {\r
+      result = false;\r
+      goto not_found;\r
+    }\r
+\r
+    incr(j);\r
+    incr(k);\r
+  }\r
+\r
+  result = true;\r
+\r
+not_found:\r
+  return result;\r
+}\r
+/* sec 0045 */\r
+boolean str_eq_str_ (str_number s, str_number t)\r
+{\r
+  pool_pointer j, k;\r
+  boolean result;\r
+\r
+  result = false;\r
+\r
+  if (length(s) != length(t))\r
+    goto not_found;\r
+\r
+  j = str_start[s];\r
+  k = str_start[t];\r
+\r
+  while (j < str_start[s + 1])\r
+  {\r
+    if (str_pool[j] != str_pool[k])\r
+      goto not_found;\r
+\r
+    incr(j);\r
+    incr(k);\r
+  }\r
+\r
+  result = true;\r
+\r
+not_found:\r
+  return result;\r
+}\r
+/* sec 0066 */\r
+void print_two_(integer n)\r
+{ \r
+  n = abs(n) % 100;\r
+  print_char('0' + (n / 10));\r
+  print_char('0' + (n % 10));\r
+} \r
+/* sec 0067 */\r
+void print_hex_(integer n)\r
+{\r
+  char k;\r
+\r
+  k = 0;\r
+  print_char('"');\r
+\r
+  do\r
+    {\r
+      dig[k] = (unsigned char) (n % 16);\r
+      n = n / 16;\r
+      incr(k);\r
+    }\r
+  while (!(n == 0));\r
+\r
+  print_the_digs(k);\r
+}\r
+/* sec 0069 */\r
+void print_roman_int_(integer n)\r
+{\r
+  pool_pointer j, k;\r
+  nonnegative_integer u, v;\r
+\r
+  j = str_start[260]; /* m2d5c2l5x2v5i */\r
+  v = 1000;\r
+\r
+  while (true)\r
+  {\r
+    while (n >= v)\r
+    {\r
+      print_char(str_pool[j]);\r
+      n = n - v;\r
+    }\r
+\r
+    if (n <= 0)\r
+      return;\r
+\r
+    k = j + 2;\r
+    u = v / (str_pool[k - 1] - '0');\r
+\r
+    if (str_pool[k - 1] == 50)\r
+    {\r
+      k = k + 2;\r
+      u = u / (str_pool[k - 1] - '0');\r
+    }\r
+\r
+    if (n + u >= v)\r
+    {\r
+      print_char(str_pool[k]);\r
+      n = n + u;\r
+    }\r
+    else\r
+    {\r
+      j = j + 2;\r
+      v = v / (str_pool[j - 1] - '0');\r
+    }\r
+  }\r
+}\r
+/* sec 0070 */\r
+void print_current_string (void)\r
+{\r
+  pool_pointer j;\r
+\r
+  j = str_start[str_ptr];\r
+\r
+  while (j < pool_ptr)\r
+  {\r
+    print_char(str_pool[j]);\r
+    incr(j);\r
+  }\r
+}\r
+\r
+/* sec 0071 */\r
+void term_input (void)\r
+{ \r
+  integer k;\r
+  boolean flag;\r
+  \r
+  if (!knuth_flag)\r
+    show_line("\n", 0);\r
+\r
+  update_terminal();\r
+  flag = input_ln(stdin, true);\r
+\r
+  if (!flag)\r
+  {\r
+    fatal_error("End of file on the terminal!");\r
+    return;\r
+  }\r
+\r
+  term_offset = 0;\r
+  decr(selector);\r
+\r
+  if (last != first)\r
+    for (k = first; k <= last - 1; k++)\r
+      print(buffer[k]);\r
+\r
+  print_ln();\r
+  incr(selector);\r
+}\r
+/* sec 0091 */\r
+void int_error_ (integer n)\r
+{\r
+  prints(" (");\r
+  print_int(n);\r
+  print_char(')');\r
+  error();\r
+}\r
+/* sec 0092 */\r
+void normalize_selector (void)\r
+{\r
+  if (log_opened)\r
+    selector = term_and_log;\r
+  else\r
+    selector = term_only;\r
+\r
+  if (job_name == 0)\r
+    open_log_file();\r
+\r
+  if (interaction == batch_mode)\r
+    decr(selector);\r
+}\r
+/* sec 0098 */\r
+void pause_for_instructions (void)\r
+{\r
+  if (OK_to_interrupt)\r
+  {\r
+    interaction = error_stop_mode;\r
+\r
+    if ((selector == log_only) || (selector == no_print))\r
+      incr(selector);\r
+\r
+    print_err("Interruption");\r
+    help3("You rang?",\r
+        "Try to insert some instructions for me (e.g.,`I\\showlists'),",\r
+        "unless you just want to quit by typing `X'.");\r
+    deletions_allowed = false;\r
+    error();\r
+    deletions_allowed = true;\r
+    interrupt = 0;\r
+  }\r
+}\r
+/* sec 0100 */\r
+integer half_(integer x)\r
+{\r
+  if (odd(x))\r
+    return ((x + 1) / 2);\r
+  else\r
+    return (x / 2);\r
+}\r
+/* sec 0102 */\r
+scaled round_decimals_(small_number k)\r
+{\r
+  integer a;\r
+\r
+  a = 0;\r
+\r
+  while (k > 0)\r
+  {\r
+    decr(k);\r
+    a = (a + dig[k] * 131072L) / 10; /* 2^17 */\r
+  }\r
+  \r
+  return ((a + 1) / 2);\r
+}\r
+/* sec 0103 */\r
+void print_scaled_(scaled s)\r
+{\r
+  scaled delta;\r
+\r
+  if (s < 0)\r
+  {\r
+    print_char('-');\r
+    s = - (integer) s;\r
+  }\r
+\r
+  print_int(s / 65536L);\r
+  print_char('.');\r
+  s = 10 * (s % 65536L) + 5;\r
+  delta = 10;\r
+\r
+  do\r
+    {\r
+      if (delta > 65536L)\r
+        s = s - 17232; /* 2^15 - 50000 - rounding */\r
+\r
+      print_char('0' + (s / 65536L));\r
+      s = 10 * (s % 65536L);\r
+      delta = delta * 10;\r
+    }\r
+  while (!(s <= delta));\r
+}\r
+/* sec 0105 */\r
+scaled mult_and_add_(integer n, scaled x, scaled y, scaled max_answer)\r
+{\r
+  if (n < 0)\r
+  {\r
+    x = - (integer) x;\r
+    n = - (integer) n;\r
+  }\r
+\r
+  if (n == 0)\r
+    return y;\r
+  else if (((x <= (max_answer - y) / n) && (- (integer) x <= (max_answer + y) / n)))\r
+    return (n * x + y); \r
+  else\r
+  {\r
+    arith_error = true;\r
+    return 0;\r
+  }\r
+}\r
+/* sec 0106 */\r
+scaled x_over_n_(scaled x, integer n)\r
+{\r
+  register scaled Result;\r
+  boolean negative;\r
+\r
+  negative = false;\r
+\r
+  if (n == 0)\r
+  {\r
+    arith_error = true;\r
+    Result = 0;\r
+    tex_remainder = x;\r
+  }\r
+  else\r
+  {\r
+    if (n < 0)\r
+    {\r
+      x = - (integer) x;\r
+      n = - (integer) n;\r
+      negative = true;\r
+    }\r
+\r
+    if (x >= 0)\r
+    {\r
+      Result = x / n;\r
+      tex_remainder = x % n;\r
+    }\r
+    else\r
+    {\r
+      Result = - (integer) ((- (integer) x)/ n);\r
+      tex_remainder = - (integer) ((- (integer) x)% n);\r
+    }\r
+  }\r
+\r
+  if (negative)\r
+    tex_remainder = - (integer) tex_remainder;\r
+\r
+  return Result;\r
+}\r
+/* sec 0107 */\r
+scaled xn_over_d_(scaled x, integer n, integer d)\r
+{\r
+  register scaled Result;\r
+  boolean positive;\r
+  nonnegative_integer t, u, v;\r
+\r
+  if (x >= 0)\r
+    positive = true; \r
+  else\r
+  {\r
+    x = - (integer) x;\r
+    positive = false;\r
+  }\r
+\r
+  t = (x % 32767L) * n;\r
+  u = (x / 32768L) * n + (t / 32768L);\r
+  v = (u % d) * 32768L + (t % 32768L); \r
+\r
+  if (u / d >= 32768L)\r
+    arith_error = true; \r
+  else\r
+    u = 32768L * (u / d) + (v / d);\r
+\r
+  if (positive)\r
+  {\r
+    Result = u;\r
+    tex_remainder = v % d;\r
+  }\r
+  else\r
+  {\r
+    Result = - (integer) u;\r
+    tex_remainder = - (integer)(v % d);\r
+  }\r
+\r
+  return Result;\r
+}\r
+/* sec 0108 */\r
+halfword badness_(scaled t, scaled s)\r
+{\r
+  integer r;\r
+\r
+  if (t == 0)\r
+    return 0;\r
+  else if (s <= 0)\r
+    return 10000;\r
+  else\r
+  {\r
+    if (t <= 7230584L)\r
+      r = (t * 297) / s;\r
+    else if (s >= 1663497L)\r
+      r = t / (s / 297);\r
+    else\r
+      r = t;\r
+\r
+    if (r > 1290)\r
+      return 10000; \r
+    else\r
+      return (r * r * r + 131072L) / 262144L;  /* 2^17 */\r
+  }\r
+}\r
+/* sec 0114 */\r
+#ifdef DEBUG\r
+void print_word (memory_word w)\r
+{ \r
+  print_int(w.cint); \r
+  print_char(' ');\r
+  print_scaled(w.cint); \r
+  print_char(' ');\r
+  print_scaled(round(unity * w.gr));\r
+  print_ln();\r
+  print_int(w.hh.lh);\r
+  print_char('=');\r
+  print_int(w.hh.b0);\r
+  print_char(':');\r
+  print_int(w.hh.b1);\r
+  print_char(';');\r
+  print_int(w.hh.rh);\r
+  print_char(' ');\r
+  print_int(w.qqqq.b0); \r
+  print_char(':');\r
+  print_int(w.qqqq.b1); \r
+  print_char(':');\r
+  print_int(w.qqqq.b2); \r
+  print_char(':');\r
+  print_int(w.qqqq.b3);\r
+}\r
+#endif\r
+/* sec 0292 */\r
+void show_token_list_(integer p, integer q, integer l)\r
+{\r
+  integer m, c;\r
+  ASCII_code match_chr;\r
+  ASCII_code n;\r
+\r
+  match_chr = '#';\r
+  n = '0';\r
+  tally = 0;\r
+\r
+  while ((p != 0) && (tally < l))\r
+  {\r
+    if (p == q)\r
+    {\r
+      first_count = tally;\r
+      trick_count = tally + 1 + error_line - half_error_line;\r
+\r
+      if (trick_count < error_line)\r
+        trick_count = error_line;\r
+    }\r
+\r
+    if ((p < hi_mem_min) || (p > mem_end))\r
+    {\r
+      print_esc("CLOBBERED.");\r
+      return;\r
+    }\r
+\r
+    if (info(p) >= cs_token_flag)\r
+      print_cs(info(p) - cs_token_flag);\r
+    else\r
+    {\r
+      m = info(p) / 256;\r
+      c = info(p) % 256;\r
+\r
+      if (info(p) < 0)\r
+        print_esc("BAD.");\r
+      else switch (m)\r
+      {\r
+        case left_brace:\r
+        case right_brace:\r
+        case math_shift:\r
+        case tab_mark:\r
+        case sup_mark:\r
+        case sub_mark:\r
+        case spacer:\r
+        case letter:\r
+        case other_char:\r
+          print(c);\r
+          break;\r
+        \r
+        case mac_param:\r
+          print(c);\r
+          print(c);\r
+          break;\r
+        \r
+        case out_param:\r
+          print(match_chr);\r
+          \r
+          if (c <= 9)\r
+            print_char(c + '0');\r
+          else\r
+          {\r
+            print_char('!');\r
+            return;\r
+          }\r
+          break;\r
+        \r
+        case match:\r
+          match_chr = (ASCII_code) c;\r
+          print(c);\r
+          incr(n);\r
+          print_char(n);\r
+          \r
+          if (n > '9')\r
+            return;\r
+          break;\r
+        \r
+        case end_match:\r
+          prints("->");\r
+          break;\r
+        \r
+        default:\r
+          print_esc("BAD.");\r
+          break;\r
+      }\r
+    }\r
+    p = link(p);\r
+  }\r
+\r
+  if (p != 0)\r
+    print_esc("ETC.");\r
+}\r
+/* sec 0306 */\r
+void runaway (void)\r
+{\r
+  pointer p;\r
+\r
+  if (scanner_status > 1)\r
+  {\r
+    print_nl("Runaway ");\r
+\r
+    switch (scanner_status)\r
+    {\r
+      case defining:\r
+        prints("definition");\r
+        p = def_ref;\r
+        break;\r
+\r
+      case matching:\r
+        prints("argument");\r
+        p = temp_head;\r
+        break;\r
+\r
+      case aligning:\r
+        prints("preamble");\r
+        p = hold_head;\r
+        break;\r
+\r
+      case absorbing:\r
+        prints("text");\r
+        p = def_ref;\r
+        break;\r
+    }\r
+\r
+    print_char('?');\r
+    print_ln();\r
+    show_token_list(link(p), 0, error_line - 10); \r
+  }\r
+}\r
+/* sec 0120 */\r
+/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */\r
+/* first try list of available nodes (avail != NULL)                   */\r
+/* then see if can go upwards (mem_end < mem_max)                      */\r
+/* then see if can go downwards (hi_mem_min > lo_mem_max)              */\r
+/* if not, extend memory at the top and grab from there --- new        */\r
+/* else fail ! paragraph 120                                           */\r
+/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */\r
+pointer get_avail (void)\r
+{\r
+  pointer p;\r
+\r
+  p = avail;\r
+\r
+  if (p != 0)\r
+    avail = link(avail);\r
+  else if (mem_end < mem_max)\r
+  {\r
+    incr(mem_end);\r
+    p = mem_end;\r
+  }\r
+  else\r
+  {\r
+    decr(hi_mem_min);\r
+    p = hi_mem_min;\r
+\r
+    if (hi_mem_min <= lo_mem_max) /* have we run out in middle ? */\r
+    {\r
+      incr(hi_mem_min);\r
+      mem = realloc_main (0, mem_top / 2);  /* zzzaa = zmem = mem */\r
+\r
+      if (mem == NULL)\r
+        return 0;\r
+\r
+      if (mem_end >= mem_max)\r
+      {\r
+        runaway();\r
+        overflow("main memory size", mem_max + 1 - mem_min);\r
+        return 0;\r
+      }\r
+\r
+      incr(mem_end);        /* then grab from new area */\r
+      p = mem_end;          /* 1993/Dec/14 */\r
+    }\r
+  }\r
+\r
+  link(p) = 0;       /* link(p) = null !!! */\r
+\r
+#ifdef STAT\r
+  incr(dyn_used); \r
+#endif\r
+\r
+  return p; \r
+} \r
+/* sec 0123 */\r
+void flush_list_(pointer p)\r
+{ \r
+  pointer q, r;\r
+\r
+  if (p != 0)\r
+  {\r
+    r = p;\r
+\r
+    do\r
+      {\r
+        q = r;\r
+        r = link(r);\r
+#ifdef STAT\r
+        decr(dyn_used);\r
+#endif\r
+      }\r
+    while (!(r == 0));\r
+\r
+    link(q) = avail;\r
+    avail = p;\r
+  }\r
+}\r
+/* sec 0125 */\r
+pointer get_node (integer s)\r
+{\r
+  pointer p;\r
+  pointer q;\r
+  integer r;\r
+  integer t;\r
+\r
+restart:\r
+  p = rover;\r
+\r
+  do\r
+    {\r
+      q = p + node_size(p);\r
+\r
+      while (is_empty(q))\r
+      {\r
+        t = rlink(q);\r
+\r
+        if (q == rover)\r
+          rover = t;\r
+\r
+        llink(t) = llink(q);\r
+        rlink(llink(q)) = t;\r
+        q = q + node_size(q);\r
+      }\r
+\r
+      r = q - s;\r
+\r
+      if (r > toint(p + 1)) \r
+      {\r
+        node_size(p) = r - p;\r
+        rover = p;\r
+        goto found;\r
+      }\r
+\r
+      if (r == p)\r
+        if (rlink(p) != p)\r
+        {\r
+          rover = rlink(p);\r
+          t = llink(p);\r
+          llink(rover) = t;\r
+          rlink(t) = rover;\r
+          goto found;\r
+        }\r
+\r
+      node_size(p) = q - p;\r
+      p = rlink(p);\r
+    }\r
+  while (!(p == rover));\r
+\r
+  if (s == 1073741824L)    /* 2^30 - special case - merge adjacent */\r
+  {\r
+    if (trace_flag)\r
+      puts("Merged adjacent multi-word nodes");\r
+\r
+    return max_halfword;\r
+  }\r
+\r
+/*  maybe try downward epxansion first instead ? */\r
+  if (lo_mem_max + 2 < hi_mem_min)\r
+    if (lo_mem_max + 2 <= mem_bot + max_halfword)  /* silly ? flush 93/Dec/16 */\r
+    {\r
+      if (hi_mem_min - lo_mem_max >= (block_size + block_size - 2))\r
+        t = lo_mem_max + block_size;\r
+      else\r
+        t = lo_mem_max + 1 + (hi_mem_min - lo_mem_max) / 2;\r
+\r
+      p = llink(rover);\r
+      q = lo_mem_max;\r
+      rlink(p) = q;\r
+      llink(rover) = q;\r
+\r
+      if (t > mem_bot + max_halfword)\r
+        t = mem_bot + max_halfword;     /* silly ? flush 93/Dec/16 */\r
+\r
+      rlink(q) = rover;\r
+      llink(q) = p;\r
+      link(q) = empty_flag;\r
+      node_size(q) = t - lo_mem_max; /* block size */\r
+      lo_mem_max = t;\r
+      link(lo_mem_max) = 0;\r
+      info(lo_mem_max) = 0;\r
+      rover = q;\r
+      goto restart;\r
+    }\r
+\r
+/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */\r
+/* we've run out of space in the middle for variable length blocks */\r
+/* try and add new block from below mem_bot *//* first check if space ! */\r
+  if (mem_min - (block_size + 1) <= mem_start) /* extend lower memory downwards */\r
+  {\r
+    mem = realloc_main (mem_top / 2 + block_size, 0);  /* zzzaa = zmem = mem */\r
+\r
+    if (mem == NULL)\r
+    {\r
+      return 0;\r
+    }\r
+  }\r
+\r
+  if (mem_min - (block_size + 1) <= mem_start) /* check again */\r
+  {\r
+    if (trace_flag)\r
+      printf("mem_min %lld, mem_start %d, block_size %d\n", mem_min, mem_start, block_size);\r
+\r
+    overflow("main memory size", mem_max + 1 - mem_min); /* darn: allocation failed ! */\r
+    return 0;\r
+  }\r
+\r
+  add_variable_space(block_size);\r
+  goto restart; /* go try get_node again */\r
+\r
+found:\r
+  link(r) = 0;\r
+\r
+#ifdef STAT\r
+  var_used = var_used + s; \r
+#endif\r
+\r
+  return r; \r
+} \r
+/* sec 0130 */\r
+void free_node (pointer p, halfword s)\r
+{ \r
+  pointer q;\r
+\r
+  node_size(p) = s;\r
+  link(p) = empty_flag;\r
+  q = llink(rover);\r
+  llink(p) = q;\r
+  rlink(p) = rover;\r
+  llink(rover) = p;\r
+  rlink(q) = p;\r
+\r
+#ifdef STAT\r
+  var_used = var_used - s; \r
+#endif\r
+}\r
+/* sec 0136 */\r
+pointer new_null_box (void) \r
+{\r
+  pointer p;\r
+\r
+  p = get_node(box_node_size);\r
+  type(p) = hlist_node;\r
+  subtype(p) = min_quarterword;\r
+  width(p) = 0;\r
+  depth(p) = 0;\r
+  height(p) = 0;\r
+  shift_amount(p) = 0;\r
+  list_ptr(p) = 0;\r
+  glue_sign(p) = normal;\r
+  glue_order(p) = normal;\r
+  glue_set(p) = 0.0;\r
+\r
+  return p;\r
+}\r
+/* sec 0139 */\r
+pointer new_rule (void) \r
+{\r
+  pointer p;\r
+\r
+  p = get_node(rule_node_size);\r
+  type(p) = rule_node;\r
+  subtype(p) = 0;\r
+  width(p) = null_flag;\r
+  depth(p) = null_flag;\r
+  height(p) = null_flag;\r
+\r
+  return p;\r
+}\r
+/* sec 0144 */\r
+pointer new_ligature_(quarterword f, quarterword c, pointer q)\r
+{\r
+  pointer p;\r
+\r
+  p = get_node(small_node_size);\r
+  type(p) = ligature_node;\r
+  font(lig_char(p)) = f;\r
+  character(lig_char(p)) = c;\r
+  lig_ptr(p) = q;\r
+  subtype(p) = 0;\r
+\r
+  return p;\r
+}\r
+/* sec 0144 */\r
+pointer new_lig_item_(quarterword c)\r
+{\r
+  pointer p;\r
+\r
+  p = get_node(small_node_size);\r
+  character(p) = c;\r
+  lig_ptr(p) = 0;\r
+\r
+  return p;\r
+}\r
+/* sec 0145 */\r
+pointer new_disc (void) \r
+{\r
+  pointer p;\r
+\r
+  p = get_node(small_node_size);\r
+  type(p) = disc_node;\r
+  replace_count(p) = 0;\r
+  pre_break(p) = 0;\r
+  post_break(p) = 0;\r
+\r
+  return p;\r
+}\r
+/* sec 0147 */\r
+pointer new_math (scaled w, small_number s)\r
+{\r
+  pointer p;\r
+\r
+  p = get_node(small_node_size);\r
+  type(p) = math_node;\r
+  subtype(p) = s;\r
+  width(p) = w;\r
+\r
+  return p;\r
+}\r
+/* sec 0151 */\r
+pointer new_spec_(pointer p)\r
+{\r
+  pointer q;\r
+\r
+  q = get_node(glue_spec_size);\r
+  mem[q] = mem[p];\r
+  glue_ref_count(q) = 0;\r
+  width(q) = width(p);\r
+  stretch(q) = stretch(p);\r
+  shrink(q) = shrink(p);\r
+\r
+  return q;\r
+}\r
+/* se 0152 */\r
+pointer new_param_glue (small_number n)\r
+{\r
+  pointer p;\r
+  pointer q;\r
+\r
+  p = get_node(small_node_size);\r
+  type(p) = glue_node;\r
+  subtype(p) = n + 1;\r
+  leader_ptr(p) = 0;\r
+  q = glue_par(n);\r
+  glue_ptr(p) = q;\r
+  incr(glue_ref_count(q));\r
+\r
+  return p;\r
+}\r
+/* sec 0153 */\r
+pointer new_glue (pointer q)\r
+{\r
+  pointer p;\r
+\r
+  p = get_node(small_node_size);\r
+  type(p) = glue_node;\r
+  subtype(p) = normal;\r
+  leader_ptr(p) = 0; \r
+  glue_ptr(p) = q;\r
+  incr(glue_ref_count(q));\r
+\r
+  return p;\r
+}\r
+/* sec 0154 */\r
+pointer new_skip_param (small_number n)\r
+{\r
+  pointer p;\r
+\r
+  temp_ptr = new_spec(glue_par(n));\r
+  p = new_glue(temp_ptr);\r
+  glue_ref_count(temp_ptr) = 0;\r
+  subtype(p) = n + 1;\r
+\r
+  return p;\r
+}\r
+/* sec 0155 */\r
+pointer new_kern(scaled w)\r
+{\r
+  pointer p;\r
+\r
+  p = get_node(small_node_size);\r
+  type(p) = kern_node;\r
+  subtype(p) = normal;\r
+  width(p) = w;\r
+\r
+  return p;\r
+}\r
+/* sec 0158 */\r
+pointer new_penalty(integer m)\r
+{\r
+  pointer p;\r
+\r
+  p = get_node(small_node_size);\r
+  type(p) = penalty_node;\r
+  subtype(p) = 0;\r
+  penalty(p) = m;\r
+\r
+  return p;\r
+}\r
+\r
+#ifdef DEBUG\r
+/* sec 0167 */\r
+void check_mem (boolean print_locs)\r
+{\r
+  pointer p, q;\r
+  boolean clobbered;\r
+\r
+  for (p = mem_min; p <= lo_mem_max; p++)\r
+    freearr[p] = false;\r
+\r
+  for (p = hi_mem_min; p <= mem_end; p++)\r
+    freearr[p] = false;\r
+\r
+  p = avail;\r
+  q = 0;\r
+  clobbered = false;\r
+\r
+  while (p != 0)\r
+  {\r
+    if ((p > mem_end) || (p < hi_mem_min))\r
+      clobbered = true;\r
+    else if (freearr[p])\r
+      clobbered = true;\r
+\r
+    if (clobbered)\r
+    {\r
+      print_nl("AVAIL list clobbered at ");\r
+      print_int(q);\r
+      goto done1;\r
+    }\r
+\r
+    freearr[p] = true;\r
+    q = p;\r
+    p = link(q);\r
+  }\r
+\r
+done1:\r
+  p = rover;\r
+  q = 0;\r
+  clobbered = false;\r
+\r
+  do\r
+    {\r
+      if ((p >= lo_mem_max) || (p < mem_min))\r
+        clobbered = true;\r
+      else if ((rlink(p) >= lo_mem_max) || (rlink(p) < mem_min))\r
+        clobbered = true;\r
+      else if (!(is_empty(p)) || (node_size(p) < 2) ||\r
+          (p + node_size(p) > lo_mem_max) || (llink(rlink(p)) != p))\r
+        clobbered = true;\r
+      \r
+      if (clobbered)\r
+      {\r
+        print_nl("Double-AVAIL list clobbered at ");\r
+        print_int(q);\r
+        goto done2;\r
+      }\r
+\r
+      for (q = p; q <= p + node_size(p) - 1; q++)\r
+      {\r
+        if (freearr[q])\r
+        {\r
+          print_nl("Doubly free location at ");\r
+          print_int(q);\r
+          goto done2;\r
+        }\r
+\r
+        freearr[q] = true;\r
+      }\r
+\r
+      q = p;\r
+      p = rlink(p);\r
+    }\r
+  while (!(p == rover));\r
+\r
+done2:\r
+  p = mem_min;\r
+\r
+  while (p <= lo_mem_max)\r
+  {\r
+    if (is_empty(p))\r
+    {\r
+      print_nl("Bad flag at ");\r
+      print_int(p);\r
+    }\r
+\r
+    while ((p <= lo_mem_max) && !freearr[p])\r
+      incr(p);\r
+\r
+    while ((p <= lo_mem_max) && freearr[p])\r
+      incr(p);\r
+  }\r
+\r
+  if (print_locs)\r
+  {\r
+    print_nl("New busy locs:");\r
+\r
+    for (p = mem_min; p <= lo_mem_max; p++)\r
+      if (!freearr[p] && ((p > was_lo_max) || wasfree[p]))\r
+      {\r
+        print_char(' ');\r
+        print_int(p);\r
+      }\r
+\r
+    for (p = hi_mem_min; p <= mem_end; p++)\r
+      if (!freearr[p] && ((p < was_hi_min) || (p > was_mem_end) || wasfree[p]))\r
+      {\r
+        print_char(' ');\r
+        print_int(p);\r
+      }\r
+  }\r
+\r
+  for (p = mem_min; p <= lo_mem_max; p++)\r
+    wasfree[p] = freearr[p];\r
+\r
+  for (p = hi_mem_min; p <= mem_end; p++)\r
+    wasfree[p] = freearr[p];\r
+\r
+  was_mem_end = mem_end;\r
+  was_lo_max = lo_mem_max;\r
+  was_hi_min = hi_mem_min;\r
+}\r
+#endif /* DEBUG */\r
+\r
+#ifdef DEBUG\r
+/* sec 0172 */\r
+void search_mem_(pointer p)\r
+{\r
+  integer q;\r
+\r
+  for (q = mem_min; q <= lo_mem_max; q++)\r
+  {\r
+    if (link(q) == p)\r
+    {\r
+      print_nl("LINK(");\r
+      print_int(q);\r
+      print_char(')');\r
+    }\r
+\r
+    if (info(q) == p)\r
+    {\r
+      print_nl("INFO(");\r
+      print_int(q);\r
+      print_char(')');\r
+    }\r
+  }\r
+\r
+  for (q = hi_mem_min; q <= mem_end; q++)\r
+  {\r
+    if (link(q) == p)\r
+    {\r
+      print_nl("LINK(");\r
+      print_int(q);\r
+      print_char(')');\r
+    }\r
+\r
+    if (info(q) == p)\r
+    {\r
+      print_nl("INFO(");\r
+      print_int(q);\r
+      print_char(')');\r
+    }\r
+  }\r
+\r
+  for (q = active_base; q <= box_base + 255; q++)\r
+    if (equiv(q) == p)\r
+    {\r
+      print_nl("EQUIV(");\r
+      print_int(q);\r
+      print_char(')');\r
+    }\r
+\r
+  if (save_ptr > 0)\r
+    for (q = 0; q <= save_ptr - 1; q++)\r
+    {\r
+      if (equiv_field(save_stack[q]) == p)\r
+      {\r
+        print_nl("SAVE(");\r
+        print_int(q);\r
+        print_char(')');\r
+      }\r
+    }\r
+\r
+  for (q = 0; q <= hyphen_prime; q++)\r
+    if (hyph_list[q] == p)\r
+    {\r
+      print_nl("HYPH(");\r
+      print_int(q);\r
+      print_char(')');\r
+    }\r
+}\r
+#endif\r
+/* sec 0174 */\r
+void short_display_(integer p)\r
+{\r
+  integer n; \r
+\r
+  while (p != 0) /* want p != null here ! */\r
+  {\r
+    if (is_char_node(p))\r
+    {\r
+      if (p <= mem_end)\r
+      {\r
+        if (font(p) != font_in_short_display)\r
+        {\r
+          if ((font(p) > font_max))\r
+            print_char('*');\r
+          else\r
+          {\r
+            print_esc("");\r
+            print(font_id_text(font(p)));\r
+          }\r
+          \r
+          print_char(' ');\r
+          font_in_short_display = font(p);\r
+        }\r
+        \r
+        print(character(p));\r
+      }\r
+    }\r
+    else switch (type(p))\r
+    {\r
+      case hlist_node:\r
+      case vlist_node:\r
+      case ins_node:\r
+      case whatsit_node:\r
+      case mark_node:\r
+      case adjust_node:\r
+      case unset_node:\r
+        prints("[]");\r
+        break;\r
+\r
+      case rule_node:\r
+        print_char('|');\r
+        break;\r
+\r
+      case glue_node:\r
+        if (glue_ptr(p) != 0)\r
+          print_char(' ');\r
+        break;\r
+\r
+      case math_node:\r
+        print_char('$');\r
+        break;\r
+\r
+      case ligature_node:\r
+        short_display(lig_ptr(p));\r
+        break;\r
+\r
+      case disc_node:\r
+        short_display(pre_break(p));\r
+        short_display(post_break(p));\r
+        n = replace_count(p);\r
+\r
+        while (n > 0)\r
+        {\r
+          if (link(p) != 0)\r
+            p = link(p);\r
+\r
+          decr(n);\r
+        }\r
+        break;\r
+\r
+      default:\r
+        break;\r
+    }\r
+    \r
+    p = link(p);\r
+  }\r
+}\r
+/* sec 0176 */\r
+void print_font_and_char (integer p)\r
+{\r
+  if (p > mem_end)\r
+    print_esc("CLOBBERED.");\r
+  else\r
+  {\r
+    if ((font(p) > font_max))\r
+      print_char('*');\r
+    else\r
+    {\r
+      print_esc("");\r
+      print(font_id_text(font(p)));\r
+    }\r
+\r
+    print_char(' ');\r
+    print(character(p));\r
+  }\r
+}\r
+/* sec 0176 */\r
+void print_mark (integer p)\r
+{ \r
+  print_char('{');\r
+\r
+  if ((p < hi_mem_min) || (p > mem_end))\r
+    print_esc("CLOBBERED.");\r
+  else\r
+    show_token_list(link(p), 0, max_print_line - 10);\r
+\r
+  print_char('}');\r
+}\r
+/* sec 0176 */\r
+void print_rule_dimen(scaled d)\r
+{\r
+  if (is_running(d))\r
+    print_char('*');\r
+  else\r
+    print_scaled(d);\r
+}\r
+/* sec 0177 */\r
+void print_glue_(scaled d, integer order, const char * s)\r
+{\r
+  print_scaled(d); \r
+\r
+  if ((order < normal) || (order > filll))\r
+    prints("foul");\r
+  else if (order > 0)\r
+  {\r
+    prints("fil");\r
+\r
+    while (order > 1)\r
+    {\r
+      print_char('l');\r
+      decr(order);\r
+    }\r
+  }\r
+  else if (*s != '\0')\r
+    prints(s);\r
+}\r
+/* sec 0178 */\r
+void print_spec_(integer p, const char * s)\r
+{\r
+  if ((p < mem_min) || (p >= lo_mem_max)) \r
+    print_char('*');\r
+  else\r
+  {\r
+    print_scaled(width(p));\r
+\r
+    if (*s != '\0')\r
+      prints(s);\r
+\r
+    if (stretch(p) != 0)\r
+    {\r
+      prints("plus");\r
+      print_glue(stretch(p), stretch_order(p), s);\r
+    }\r
+\r
+    if (shrink(p) != 0)\r
+    {\r
+      prints("minus");\r
+      print_glue(shrink(p), shrink_order(p), s);\r
+    }\r
+  }\r
+}\r
+/* sec 0691 */\r
+void print_fam_and_char_(pointer p)\r
+{\r
+  print_esc("fam");\r
+  print_int(fam(p));\r
+  print_char(' ');\r
+  print(character(p));\r
+}\r
+/* sec 0691 */\r
+void print_delimiter_(pointer p)\r
+{\r
+  integer a;\r
+\r
+  a = small_fam(p) * 256 + small_char(p);\r
+  a = a * 0x1000 + large_fam(p) * 256 + large_char(p);\r
+\r
+  if (a < 0)\r
+    print_int(a);\r
+  else\r
+    print_hex(a);\r
+}\r
+/* sec 0692 */\r
+void print_subsidiary_data_(pointer p, ASCII_code c)\r
+{\r
+  if ((pool_ptr - str_start[str_ptr]) >= depth_threshold)\r
+  {\r
+    if (math_type(p) != 0)\r
+      prints(" []");\r
+  }\r
+  else\r
+  {\r
+    append_char(c);\r
+    temp_ptr = p;\r
+\r
+    switch (math_type(p))\r
+    {\r
+      case math_char:\r
+        print_ln();\r
+        print_current_string();\r
+        print_fam_and_char(p);\r
+        break;\r
+\r
+      case sub_box:\r
+        show_info();\r
+        break;\r
+\r
+      case sub_mlist:\r
+        if (info(p) == 0)\r
+        {\r
+          print_ln();\r
+          print_current_string();\r
+          prints("{}");\r
+        }\r
+        else\r
+          show_info();\r
+        break;\r
+\r
+      default:\r
+        break;\r
+    }\r
+\r
+    decr(pool_ptr);\r
+  }\r
+}\r
+/* sec 0694 */\r
+void print_style_(integer c)\r
+{\r
+  switch (c / 2)\r
+  {\r
+    case 0:\r
+      print_esc("displaystyle");\r
+      break;\r
+    case 1:\r
+      print_esc("textstyle");\r
+      break;\r
+    case 2:\r
+      print_esc("scriptstyle");\r
+      break;\r
+    case 3:\r
+      print_esc("scriptscriptstyle");\r
+      break;\r
+    default:\r
+      prints("Unknown style!");\r
+      break;\r
+  }\r
+}\r
+/* sec 0225 */\r
+void print_skip_param_(integer n)\r
+{\r
+  switch (n)\r
+  {\r
+    case line_skip_code:\r
+      print_esc("lineskip");\r
+      break;\r
+\r
+    case baseline_skip_code:\r
+      print_esc("baselineskip");\r
+      break; \r
+\r
+    case par_skip_code:\r
+      print_esc("parskip");\r
+      break;\r
+\r
+    case above_display_skip_code:\r
+      print_esc("abovedisplayskip");\r
+      break;\r
+\r
+    case below_display_skip_code:\r
+      print_esc("belowdisplayskip");\r
+      break;\r
+\r
+    case above_display_short_skip_code:\r
+      print_esc("abovedisplayshortskip");\r
+      break;\r
+\r
+    case below_display_short_skip_code:\r
+      print_esc("belowdisplayshortskip");\r
+      break;\r
+\r
+    case left_skip_code:\r
+      print_esc("leftskip");\r
+      break;\r
+\r
+    case right_skip_code:\r
+      print_esc("rightskip");\r
+      break;\r
+\r
+    case top_skip_code:\r
+      print_esc("topskip");\r
+      break;\r
+\r
+    case split_top_skip_code:\r
+      print_esc("splittopskip");\r
+      break;\r
+\r
+    case tab_skip_code:\r
+      print_esc("tabskip");\r
+      break;\r
+\r
+    case space_skip_code:\r
+      print_esc("spaceskip");\r
+      break;\r
+\r
+    case xspace_skip_code:\r
+      print_esc("xspaceskip");\r
+      break;\r
+\r
+    case par_fill_skip_code:\r
+      print_esc("parfillskip");\r
+      break;\r
+\r
+    case thin_mu_skip_code:\r
+      print_esc("thinmuskip");\r
+      break;\r
+\r
+    case med_mu_skip_code:\r
+      print_esc("medmuskip");\r
+      break; \r
+\r
+    case thick_mu_skip_code:\r
+      print_esc("thickmuskip");\r
+      break;\r
+\r
+    default:\r
+      prints("[unknown glue parameter!]");\r
+      break;\r
+  }\r
+}\r
+/* sec 0182 */\r
+void show_node_list_(integer p)\r
+{\r
+  integer n;\r
+  real g;\r
+\r
+  if (cur_length > depth_threshold)\r
+  {\r
+    if (p != 0)    /* fixed 94/Mar/23 BUG FIX NOTE: still not fixed in 3.14159 ! */\r
+      prints(" []");\r
+\r
+    return; \r
+  }\r
+\r
+  n = 0;\r
+\r
+  while (p != 0)\r
+  {\r
+    print_ln(); \r
+    print_current_string(); \r
+\r
+    if (p > mem_end)\r
+    {\r
+      prints("Bad link, display aborted.");\r
+      return;\r
+    }\r
+\r
+    incr(n);\r
+\r
+    if (n > breadth_max)\r
+    {\r
+      prints("etc.");\r
+      return;\r
+    }\r
+\r
+    if (is_char_node(p))\r
+      print_font_and_char(p);\r
+    else switch (type(p))\r
+    {\r
+      case hlist_node:\r
+      case vlist_node:\r
+      case unset_node:\r
+        {\r
+          if (type(p) == hlist_node)\r
+            print_esc("h");\r
+          else if (type(p) == vlist_node)\r
+            print_esc("v");\r
+          else\r
+            print_esc("unset");\r
+\r
+          prints("box(");\r
+          print_scaled(height(p));\r
+          print_char('+');\r
+          print_scaled(depth(p));\r
+          prints(")x");\r
+          print_scaled(width(p));\r
+\r
+          if (type(p) == unset_node)\r
+          {\r
+            if (span_count(p) != 0)\r
+            {\r
+              prints(" (");\r
+              print_int(span_count(p) + 1);\r
+              prints(" columns)");\r
+            }\r
+\r
+            if (glue_stretch(p) != 0)\r
+            {\r
+              prints(", stretch ");\r
+              print_glue(glue_stretch(p), glue_order(p), "");\r
+            }\r
+\r
+            if (glue_shrink(p) != 0)\r
+            {\r
+              prints(", shrink ");\r
+              print_glue(glue_shrink(p), glue_sign(p), "");\r
+            }\r
+          }\r
+          else\r
+          {\r
+            g = glue_set(p);\r
+\r
+            if ((g != 0.0) && (glue_sign(p) != 0))\r
+            {\r
+              prints(", glue set ");\r
+\r
+              if (glue_sign(p) == shrinking)\r
+                prints("- ");\r
+\r
+              if (fabs(g) > 20000.0)\r
+              {\r
+                if (g > 0.0)\r
+                  print_char('>');\r
+                else\r
+                  prints("< -");\r
+\r
+                print_glue(20000 * unity, glue_order(p), "");\r
+              }\r
+              else\r
+                print_glue(round(unity * g), glue_order(p), "");\r
+            }\r
+\r
+            if (shift_amount(p) != 0)\r
+            {\r
+              prints(", shifted ");\r
+              print_scaled(shift_amount(p));\r
+            }\r
+          }\r
+\r
+          node_list_display(list_ptr(p));\r
+        }\r
+        break;\r
+\r
+      case rule_node:\r
+        {\r
+          print_esc("rule(");\r
+          print_rule_dimen(height(p));\r
+          print_char('+');\r
+          print_rule_dimen(depth(p));\r
+          prints(")x");\r
+          print_rule_dimen(width(p));\r
+        }\r
+        break;\r
+\r
+      case ins_node:\r
+        {\r
+          print_esc("insert");\r
+          print_int(subtype(p));\r
+          prints(", natural size ");\r
+          print_scaled(height(p));\r
+          prints("; split(");\r
+          print_spec(split_top_ptr(p), "");\r
+          print_char(',');\r
+          print_scaled(depth(p));\r
+          prints("); float cost ");\r
+          print_int(float_cost(p));\r
+          node_list_display(ins_ptr(p));\r
+        }\r
+        break;\r
+\r
+      case whatsit_node:\r
+        switch (subtype(p))\r
+        {\r
+          case open_node:\r
+            {\r
+              print_write_whatsit("openout", p);\r
+              print_char('=');\r
+              print_file_name(open_name(p), open_area(p), open_ext(p));\r
+            }\r
+            break;\r
+\r
+          case write_node:\r
+            {\r
+              print_write_whatsit("write", p);\r
+              print_mark(write_tokens(p));\r
+            }\r
+            break;\r
+\r
+          case close_node:\r
+            print_write_whatsit("closeout", p);\r
+            break;\r
+\r
+          case special_node:\r
+            {\r
+              print_esc("special");\r
+              print_mark(write_tokens(p));\r
+            }\r
+            break;\r
+\r
+          case language_node:\r
+            {\r
+              print_esc("setlanguage");\r
+              print_int(what_lang(p));\r
+              prints(" (hyphenmin ");\r
+              print_int(what_lhm(p));\r
+              print_char(',');\r
+              print_int(what_rhm(p));\r
+              print_char(')');\r
+            }\r
+            break;\r
+\r
+          default:\r
+            prints("whatsit?");\r
+            break;\r
+        }\r
+        break;\r
+\r
+      case glue_node:\r
+        if (subtype(p) >= a_leaders)\r
+        {\r
+          print_esc("");\r
+\r
+          if (subtype(p) == c_leaders)\r
+            print_char('c');\r
+          else if (subtype(p) == x_leaders)\r
+            print_char('x');\r
+\r
+          prints("leaders ");\r
+          print_spec(glue_ptr(p), "");\r
+          node_list_display(leader_ptr(p));\r
+        }\r
+        else\r
+        {\r
+          print_esc("glue");\r
+\r
+          if (subtype(p) != normal)\r
+          {\r
+            print_char('(');\r
+\r
+            if (subtype(p) < cond_math_glue)\r
+              print_skip_param(subtype(p) - 1);\r
+            else if (subtype(p) == cond_math_glue)\r
+              print_esc("nonscript");\r
+            else print_esc("mskip");\r
+\r
+            print_char(')');\r
+          }\r
+\r
+          if (subtype(p) != cond_math_glue)\r
+          {\r
+            print_char(' ');\r
+\r
+            if (subtype(p) < cond_math_glue)\r
+              print_spec(glue_ptr(p), "");\r
+            else\r
+              print_spec(glue_ptr(p), "mu");\r
+          }\r
+        }\r
+        break;\r
+\r
+      case kern_node:\r
+        if (subtype(p) != mu_glue)\r
+        {\r
+          print_esc("kern");\r
+\r
+          if (subtype(p) != normal)\r
+            print_char(' ');\r
+\r
+          print_scaled(width(p));\r
+\r
+          if (subtype(p) == acc_kern)\r
+            prints(" (for accent)");\r
+        }\r
+        else\r
+        {\r
+          print_esc("mkern");\r
+          print_scaled(width(p));\r
+          prints("mu");\r
+        }\r
+        break;\r
+\r
+      case math_node:\r
+        {\r
+          print_esc("math");\r
+\r
+          if (subtype(p) == before)\r
+            prints("on");\r
+          else\r
+            prints("off");\r
+\r
+          if (width(p) != 0)\r
+          {\r
+            prints(", surrounded ");\r
+            print_scaled(width(p));\r
+          }\r
+        }\r
+        break;\r
+\r
+      case ligature_node:\r
+        {\r
+          print_font_and_char(lig_char(p));\r
+          prints("(ligature ");\r
+\r
+          if (subtype(p) > 1)\r
+            print_char('|');\r
+\r
+          font_in_short_display = font(lig_char(p)); \r
+          short_display(lig_ptr(p));\r
+\r
+          if (odd(subtype(p)))\r
+            print_char('|');\r
+\r
+          print_char(')');\r
+        }\r
+        break;\r
+\r
+      case penalty_node:\r
+        {\r
+          print_esc("penalty ");\r
+          print_int(penalty(p));\r
+        }\r
+        break;\r
+\r
+      case disc_node:\r
+        {\r
+          print_esc("discretionary");\r
+\r
+          if (replace_count(p) > 0)\r
+          {\r
+            prints(" replacing ");\r
+            print_int(replace_count(p));\r
+          }\r
+\r
+          node_list_display(pre_break(p));\r
+          append_char('|');\r
+          show_node_list(post_break(p));\r
+          decr(pool_ptr);\r
+        }\r
+        break;\r
+\r
+      case mark_node:\r
+        {\r
+          print_esc("mark");\r
+          print_mark(mark_ptr(p));\r
+        }\r
+        break;\r
+\r
+      case adjust_node:\r
+        {\r
+          print_esc("vadjust");\r
+          node_list_display(adjust_ptr(p));\r
+        }\r
+        break;\r
+\r
+      case style_node:\r
+        print_style(subtype(p));\r
+        break;\r
+\r
+      case choice_node:\r
+        {\r
+          print_esc("mathchoice");\r
+          append_char('D');\r
+          show_node_list(display_mlist(p));\r
+          decr(pool_ptr);\r
+          append_char('T');\r
+          show_node_list(text_mlist(p));\r
+          decr(pool_ptr);\r
+          append_char('S');\r
+          show_node_list(script_mlist(p));\r
+          decr(pool_ptr);\r
+          append_char('s');\r
+          show_node_list(script_script_mlist(p)); \r
+          decr(pool_ptr); \r
+        } \r
+        break;\r
+\r
+      case ord_noad:\r
+      case op_noad:\r
+      case bin_noad:\r
+      case rel_noad:\r
+      case open_noad:\r
+      case close_noad:\r
+      case punct_noad:\r
+      case inner_noad:\r
+      case radical_noad:\r
+      case over_noad:\r
+      case under_noad:\r
+      case vcenter_noad:\r
+      case accent_noad:\r
+      case left_noad:\r
+      case right_noad:\r
+        {\r
+          switch (type(p))\r
+          {\r
+            case ord_noad:\r
+              print_esc("mathord");\r
+              break;\r
+\r
+            case op_noad:\r
+              print_esc("mathop");\r
+              break;\r
+\r
+            case bin_noad:\r
+              print_esc("mathbin");\r
+              break;\r
+\r
+            case rel_noad:\r
+              print_esc("mathrel");\r
+              break;\r
+\r
+            case open_noad:\r
+              print_esc("mathopen");\r
+              break;\r
+\r
+            case close_noad:\r
+              print_esc("mathclose");\r
+              break;\r
+\r
+            case punct_noad:\r
+              print_esc("mathpunct");\r
+              break;\r
+\r
+            case inner_noad:\r
+              print_esc("mathinner");\r
+              break;\r
+\r
+            case over_noad:\r
+              print_esc("overline");\r
+              break;\r
+\r
+            case under_noad:\r
+              print_esc("underline");\r
+              break;\r
+\r
+            case vcenter_noad:\r
+              print_esc("vcenter");\r
+              break;\r
+\r
+            case radical_noad:\r
+              {\r
+                print_esc("radical");\r
+                print_delimiter(left_delimiter(p));\r
+              }\r
+              break;\r
+\r
+            case accent_noad:\r
+              {\r
+                print_esc("accent");\r
+                print_fam_and_char(accent_chr(p));\r
+              }\r
+              break;\r
+\r
+            case left_noad:\r
+              {\r
+                print_esc("left");\r
+                print_delimiter(delimiter(p));\r
+              }\r
+              break;\r
+\r
+            case right_noad:\r
+              {\r
+                print_esc("right");\r
+                print_delimiter(delimiter(p));\r
+              }\r
+              break;\r
+          }\r
+\r
+          if (subtype(p) != normal)\r
+            if (subtype(p) == limits)\r
+              print_esc("limits");\r
+            else\r
+              print_esc("nolimits");\r
+\r
+          if (type(p) < left_noad)\r
+            print_subsidiary_data(nucleus(p), '.');\r
+\r
+          print_subsidiary_data(supscr(p), '^');\r
+          print_subsidiary_data(subscr(p), '_');\r
+        }\r
+        break;\r
+\r
+      case fraction_noad:\r
+        {\r
+          print_esc("fraction, thickness ");\r
+\r
+          if (thickness(p) == 1073741824L)  /* 2^30 */\r
+            prints("= default");\r
+          else\r
+            print_scaled(thickness(p));\r
+\r
+          if ((small_fam(left_delimiter(p)) != 0) || (small_char(left_delimiter(p)) != 0) ||\r
+              (large_fam(left_delimiter(p)) != 0) || (large_char(left_delimiter(p)) != 0))\r
+          {\r
+            prints(", left-delimiter ");\r
+            print_delimiter(left_delimiter(p));\r
+          }\r
+\r
+          if ((small_fam(right_delimiter(p)) != 0) || (small_char(right_delimiter(p)) != 0) ||\r
+              (large_fam(right_delimiter(p)) != 0) || (large_char(right_delimiter(p)) != 0))\r
+          {\r
+            prints(", right-delimiter ");\r
+            print_delimiter(right_delimiter(p));\r
+          }\r
+\r
+          print_subsidiary_data(numerator(p), '\\');\r
+          print_subsidiary_data(denominator(p), '/');\r
+        }\r
+        break;\r
+\r
+      default:\r
+        prints("Unknown node type!");\r
+        break;\r
+    }\r
+\r
+    p = link(p);\r
+  }\r
 }
\ No newline at end of file
index 89bf452..22064eb 100644 (file)
-/* Copyright 2014 Clerk Ma
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301 USA.  */
-
-#define EXTERN extern
-
-#include "yandytex.h"
-
-/* sec 0198 */
-void show_box_(pointer p)
-{
-  depth_threshold = show_box_depth;
-  breadth_max = show_box_breadth;
-
-  if (breadth_max <= 0)
-    breadth_max = 5;
-
-#ifdef ALLOCATESTRING
-  if (pool_ptr + depth_threshold >= current_pool_size)
-    str_pool = realloc_str_pool(increment_pool_size);
-
-  if (pool_ptr + depth_threshold >= current_pool_size)
-    depth_threshold = current_pool_size - pool_ptr - 1;
-#else
-  if (pool_ptr + depth_threshold >= pool_size)
-    depth_threshold = pool_size - pool_ptr - 1;
-#endif
-
-  show_node_list(p);
-  print_ln();
-}
-/* sec 0200 */
-void delete_token_ref_(pointer p)
-{
-  if (token_ref_count(p) == 0)
-    flush_list(p);
-  else
-    decr(token_ref_count(p));
-}
-/* sec 0201 */
-void delete_glue_ref_(pointer p)
-{
-  if (glue_ref_count(p) == 0)
-    free_node(p, glue_spec_size);
-  else
-    decr(glue_ref_count(p));
-}
-/* sec 0202 */
-void flush_node_list_(pointer p)
-{
-  pointer q;
-
-  while (is_char_node(p))
-  {
-    q = link(p);
-
-    if (is_char_node(p))
-      free_avail(p);
-    else
-    {
-      switch (type(p))
-      {
-        case hlist_node:
-        case vlist_node:
-        case unset_node:
-          {
-            flush_node_list(list_ptr(p));
-            free_node(p, box_node_size);
-            goto done;
-          }
-          break;
-        case rule_node:
-          {
-            free_node(p, rule_node_size);
-            goto done;
-          }
-          break;
-        case ins_node:
-          {
-            flush_node_list(ins_ptr(p));
-            delete_glue_ref(split_top_ptr(p));
-            free_node(p, ins_node_size);
-            goto done;
-          }
-          break;
-        case whatsit_node:
-          {
-            switch (subtype(p))
-            {
-              case open_node:
-                free_node(p, open_node_size);
-                break;
-              case write_node:
-              case special_node:
-                {
-                  delete_token_ref(write_tokens(p));
-                  free_node(p, write_node_size);
-                  goto done;
-                }
-                break;
-              case close_node:
-              case set_language_code:
-                free_node(p, small_node_size);
-                break;
-              default:
-                {
-                  confusion("ext3");
-                  return;
-                }
-                break;
-            }
-            goto done;
-          }
-          break;
-        case glue_node:
-          delete_glue_ref(p);
-
-          if (leader_ptr(p) != 0)
-            flush_node_list(leader_ptr(p));
-          break;
-        case kern_node:
-        case math_node:
-        case penalty_node:
-          break;
-        case ligature_node:
-          flush_node_list(lig_ptr(p));
-          break;
-        case mark_node:
-          delete_token_ref(mark_ptr(p));
-          break;
-        case disc_node:
-          flush_node_list(pre_break(p));
-          flush_node_list(post_break(p));
-          break;
-        case adjust_node:
-          flush_node_list(adjust_ptr(p));
-          break;
-        case style_node:
-          {
-            free_node(p, style_node_size);
-            goto done;
-          }
-          break;
-        case choice_node:
-          {
-            flush_node_list(display_mlist(p));
-            flush_node_list(text_mlist(p));
-            flush_node_list(script_mlist(p));
-            flush_node_list(script_script_mlist(p));
-            free_node(p, style_node_size);
-            goto done;
-          }
-          break;
-        case ord_noad:
-        case op_noad:
-        case bin_noad:
-        case rel_noad:
-        case open_noad:
-        case close_noad:
-        case punct_noad:
-        case inner_noad:
-        case radical_noad:
-        case over_noad:
-        case under_noad:
-        case vcenter_noad:
-        case accent_noad:
-          {
-            if (math_type(nucleus(p)) >= sub_box)
-              flush_node_list(info(nucleus(p)));
-
-            if (math_type(supscr(p)) >= sub_box)
-              flush_node_list(info(supscr(p)));
-
-            if (math_type(subscr(p)) >= sub_box)
-              flush_node_list(info(subscr(p)));
-
-            if (type(p) == radical_noad)
-              free_node(p, radical_noad_size);
-            else
-            {
-              if (type(p) == accent_noad)
-                free_node(p, accent_noad_size);
-              else
-                free_node(p, noad_size);
-            }
-
-            goto done;
-          }
-          break;
-        case left_noad:
-        case right_noad:
-          {
-            free_node(p, noad_size);
-            goto done;
-          }
-          break;
-        case fraction_noad:
-          {
-            flush_node_list(info(numerator(p)));
-            flush_node_list(info(denominator(p)));
-            free_node(p, fraction_noad_size);
-            goto done;
-          }
-          break;
-        default:
-          {
-            confusion("flushing");
-            return;
-          }
-          break;
-      }
-
-      free_node(p, small_node_size);
-done:;
-    }
-
-    p = q;
-  }
-}
-/* sec 0204 */
-pointer copy_node_list_(pointer p)
-{
-  pointer h;
-  pointer q;
-  pointer r;
-  char words;
-
-  h = get_avail();
-  q = h;
-
-  while (p != 0)
-  {
-    words = 1;
-
-    if (is_char_node(p)) 
-      r = get_avail();
-    else switch (type(p))
-    {
-      case hlist_node:
-      case vlist_node:
-      case unset_node:
-        {
-          r = get_node(box_node_size);
-          mem[r + 6] = mem[p + 6];
-          mem[r + 5] = mem[p + 5];
-          list_ptr(r) = copy_node_list(list_ptr(p));
-          words = 5;
-        }
-        break;
-      case rule_node:
-        {
-          r = get_node(rule_node_size);
-          words = rule_node_size;
-        }
-        break;
-      case ins_node:
-        {
-          r = get_node(ins_node_size);
-          mem[r + 4] = mem[p + 4];
-          add_glue_ref(split_top_ptr(p));
-          ins_ptr(r) = copy_node_list(ins_ptr(p));
-          words = ins_node_size - 1;
-        }
-        break;
-      case whatsit_node:
-        switch (subtype(p))
-        {
-          case open_node:
-            {
-              r = get_node(open_node_size);
-              words = open_node_size;
-            }
-            break;
-
-          case write_node:
-          case special_node:
-            {
-              r = get_node(write_node_size);
-              add_token_ref(write_tokens(p));
-              words = write_node_size;
-            }
-            break;
-
-          case close_node:
-          case language_node:
-            {
-              r = get_node(small_node_size);
-              words = small_node_size;
-            }
-            break;
-
-          default:
-            {
-              confusion("ext2");
-              return 0;
-            }
-            break;
-        }
-        break;
-
-      case glue_node:
-        {
-          r = get_node(small_node_size);
-          add_glue_ref(glue_ptr(p));
-          glue_ptr(r) = glue_ptr(p);
-          leader_ptr(r) = copy_node_list(leader_ptr(p));
-        }
-        break;
-
-      case kern_node:
-      case math_node:
-      case penalty_node:
-        {
-          r = get_node(small_node_size);
-          words = small_node_size;
-        }
-        break;
-
-      case ligature_node:
-        {
-          r = get_node(small_node_size);
-          mem[lig_char(r)] = mem[lig_char(p)];
-          lig_ptr(r) = copy_node_list(lig_ptr(p));
-        }
-        break;
-
-      case disc_node:
-        {
-          r = get_node(small_node_size);
-          pre_break(r) = copy_node_list(pre_break(p));
-          post_break(r) = copy_node_list(pre_break(p));
-        }
-        break;
-
-      case mark_node:
-        {
-          r = get_node(small_node_size);
-          add_token_ref(mark_ptr(p));
-          words = small_node_size;
-        }
-        break;
-
-      case adjust_node:
-        {
-          r = get_node(small_node_size);
-          adjust_ptr(r) = copy_node_list(adjust_ptr(p));
-        }
-        break;
-
-      default:
-        {
-          confusion("copying");
-          return 0;
-        }
-        break;
-    }
-
-    while (words > 0)
-    {
-      decr(words);
-      mem[r + words] = mem[p + words];
-    }
-
-    link(q) = r;
-    q = r;
-    p = link(p);
-  }
-
-  link(q) = 0;
-  q = link(h);
-  free_avail(h);
-
-  return q;
-}
-/* sec 0211 */
-void print_mode_(integer m)
-{ 
-  if (m > 0)
-  {
-    switch (m / (max_command + 1))
-    {
-      case 0:
-        prints("vertical");
-        break;
-      case 1:
-        prints("horizontal");
-        break;
-      case 2:
-        prints("display math");
-        break;
-    }
-  }
-  else
-  {
-    if (m == 0)
-      prints("no");
-    else
-    {
-      switch ((- (integer) m) / (max_command + 1))
-      {
-        case 0:
-          prints("internal vertical");
-          break;
-        case 1:
-          prints("restricted horizontal");
-          break;
-        case 2:
-          prints("math");
-          break;
-      }
-    }
-  }
-
-  prints(" mode");
-}
-/* sec 0216 */
-void push_nest (void) 
-{
-  if (nest_ptr > max_nest_stack)
-  {
-    max_nest_stack = nest_ptr;
-
-#ifdef ALLOCATEINPUTSTACK
-    if (nest_ptr == current_nest_size)
-      nest = realloc_nest_stack(increment_nest_size);
-
-    if (nest_ptr == current_nest_size)
-    {
-      overflow("semantic nest size", current_nest_size);
-      return;
-    }
-#else
-    if (nest_ptr == nest_size)
-    {
-      overflow("semantic nest size", nest_size);
-      return;
-    }
-#endif
-  }
-
-  nest[nest_ptr]= cur_list;
-  incr(nest_ptr);
-  head = get_avail();
-  tail = head;
-  prev_graf = 0;
-  mode_line = line;
-}
-/* sec 0217 */
-void pop_nest (void) 
-{
-  free_avail(head);
-  decr(nest_ptr);
-  cur_list = nest[nest_ptr];
-}
-/* sec 0218 */
-void show_activities (void)
-{
-  integer p;
-  short m;
-  memory_word a;
-  halfword q, r;
-  integer t;
-
-  nest[nest_ptr] = cur_list;
-  print_nl("");
-  print_ln();
-
-  for (p = nest_ptr; p >= 0; p--)
-  {
-    m = nest[p].mode_field;
-    a = nest[p].aux_field;
-    print_nl("### ");
-    print_mode(m);
-    prints(" entered at line ");
-    print_int(abs(nest[p].ml_field));
-
-    if (m == hmode)
-    {
-      if (nest[p].pg_field != 040600000)
-      {
-        prints(" (language");
-        print_int(nest[p].pg_field % 65536L);
-        prints(":hyphenmin");
-        print_int(nest[p].pg_field / 4194304L);
-        print_char(',');
-        print_int((nest[p].pg_field / 65536L) % 64);
-        print_char(')');
-      }
-    }
-
-    if (nest[p].ml_field < 0)
-      prints(" (\\output routine)");
-
-    if (p == 0)
-    {
-      if (page_head != page_tail)
-      {
-        print_nl("### current page:");
-        
-        if (output_active)
-          prints(" (held over for next output)");
-
-        show_box(link(page_head));
-
-        if (page_contents > 0)
-        {
-          print_nl("total height ");
-          print_totals();
-          print_nl(" goal height ");
-          print_scaled(page_so_far[0]);
-          r = link(page_ins_head);
-          
-          while (r != mem_top)
-          {
-            print_ln();
-            print_esc("insert");
-            t = subtype(r);
-            print_int(t);
-            prints(" adds ");
-
-            if (count(t) == 1000)
-              t = height(r);
-            else
-              t = x_over_n(height(r), 1000) * count(t);
-
-            print_scaled(t);
-
-            if (type(r) == split_up)
-            {
-              q = page_head;
-              t = 0;
-
-              do
-                {
-                  q = link(q);
-
-                  if ((type(q) == ins_node) && (subtype(q) == subtype(r)))
-                    incr(t);
-                }
-              while (!(q == broken_ins(r)));
-
-              prints(", #");
-              print_int(t);
-              prints(" might split");
-            }
-            r = link(r);
-          }
-        }
-      }
-
-      if (link(contrib_head) != 0)
-        print_nl("### recent contributions:");
-    }
-
-    show_box(link(nest[p].head_field));
-
-    switch (abs(m) / (max_command + 1))
-    {
-      case 0:
-        {
-          print_nl("prevdepth ");
-
-          if  (a.cint <= ignore_depth)
-            prints("ignored");
-          else
-            print_scaled(a.cint);
-
-          if (nest[p].pg_field != 0)
-          {
-            prints(", prevgraf ");
-            print_int(nest[p].pg_field);
-            prints(" line");
-
-            if (nest[p].pg_field != 1)
-              print_char('s');
-          }
-        }
-        break;
-
-      case 1:
-        {
-          print_nl("spacefactor ");
-          print_int(a.hh.lh);
-
-          if (m > 0)
-          {
-            if (a.hh.rh > 0)
-            {
-              prints(", current language ");
-              print_int(a.hh.rh);
-            }
-          }
-        }
-        break;
-
-      case 2:
-        if (a.cint != 0)
-        {
-          prints("this will be denominator of:");
-          show_box(a.cint);
-        }
-        break;
-    }
-  }
-}
-/* sec 0237 */
-void print_param_(integer n)
-{
-  switch (n)
-  {
-    case pretolerance_code:
-      print_esc("pretolerance");
-      break;
-
-    case tolerance_code:
-      print_esc("tolerance");
-      break;
-
-    case line_penalty_code:
-      print_esc("linepenalty");
-      break;
-
-    case hyphen_penalty_code:
-      print_esc("hyphenpenalty");
-      break;
-
-    case ex_hyphen_penalty_code:
-      print_esc("exhyphenpenalty");
-      break;
-
-    case club_penalty_code:
-      print_esc("clubpenalty");
-      break;
-
-    case widow_penalty_code:
-      print_esc("widowpenalty");
-      break;
-
-    case display_widow_penalty_code:
-      print_esc("displaywidowpenalty");
-      break;
-
-    case broken_penalty_code:
-      print_esc("brokenpenalty");
-      break;
-
-    case bin_op_penalty_code:
-      print_esc("binoppenalty");
-      break;
-
-    case rel_penalty_code:
-      print_esc("relpenalty");
-      break;
-
-    case pre_display_penalty_code:
-      print_esc("predisplaypenalty");
-      break;
-
-    case post_display_penalty_code:
-      print_esc("postdisplaypenalty");
-      break;
-
-    case inter_line_penalty_code:
-      print_esc("interlinepenalty");
-      break;
-
-    case double_hyphen_demerits_code:
-      print_esc("doublehyphendemerits");
-      break;
-
-    case final_hyphen_demerits_code:
-      print_esc("finalhyphendemerits");
-      break;
-
-    case adj_demerits_code:
-      print_esc("adjdemerits");
-      break;
-
-    case mag_code:
-      print_esc("mag");
-      break;
-
-    case delimiter_factor_code:
-      print_esc("delimiterfactor");
-      break;
-
-    case looseness_code:
-      print_esc("looseness");
-      break;
-
-    case time_code:
-      print_esc("time");
-      break;
-
-    case day_code:
-      print_esc("day");
-      break;
-
-    case month_code:
-      print_esc("month");
-      break;
-
-    case year_code:
-      print_esc("year");
-      break;
-
-    case show_box_breadth_code:
-      print_esc("showboxbreadth");
-      break;
-
-    case show_box_depth_code:
-      print_esc("showboxdepth");
-      break;
-
-    case hbadness_code:
-      print_esc("hbadness");
-      break;
-
-    case vbadness_code:
-      print_esc("vbadness");
-      break;
-
-    case pausing_code:
-      print_esc("pausing");
-      break;
-
-    case tracing_online_code:
-      print_esc("tracingonline");
-      break;
-
-    case tracing_macros_code:
-      print_esc("tracingmacros");
-      break;
-
-    case tracing_stats_code:
-      print_esc("tracingstats");
-      break;
-
-    case tracing_paragraphs_code:
-      print_esc("tracingparagraphs");
-      break;
-
-    case tracing_pages_code:
-      print_esc("tracingpages");
-      break;
-
-    case tracing_output_code:
-      print_esc("tracingoutput");
-      break;
-
-    case tracing_lost_chars_code:
-      print_esc("tracinglostchars");
-      break;
-
-    case tracing_commands_code:
-      print_esc("tracingcommands");
-      break;
-
-    case tracing_restores_code:
-      print_esc("tracingrestores");
-      break;
-
-    case uc_hyph_code:
-      print_esc("uchyph");
-      break;
-
-    case output_penalty_code:
-      print_esc("outputpenalty");
-      break;
-
-    case max_dead_cycles_code:
-      print_esc("maxdeadcycles");
-      break;
-
-    case hang_after_code:
-      print_esc("hangafter");
-      break;
-
-    case floating_penalty_code:
-      print_esc("floatingpenalty");
-      break;
-
-    case global_defs_code:
-      print_esc("globaldefs");
-      break;
-
-    case cur_fam_code:
-      print_esc("fam");
-      break;
-
-    case escape_char_code:
-      print_esc("escapechar");
-      break;
-
-    case default_hyphen_char_code:
-      print_esc("defaulthyphenchar");
-      break;
-
-    case default_skew_char_code:
-      print_esc("defaultskewchar");
-      break;
-
-    case end_line_char_code:
-      print_esc("endlinechar");
-      break;
-
-    case new_line_char_code:
-      print_esc("newlinechar");
-      break;
-
-    case language_code:
-      print_esc("language");
-      break;
-
-    case left_hyphen_min_code:
-      print_esc("lefthyphenmin");
-      break;
-
-    case right_hyphen_min_code:
-      print_esc("righthyphenmin");
-      break;
-
-    case holding_inserts_code:
-      print_esc("holdinginserts");
-      break;
-
-    case error_context_lines_code:
-      print_esc("errorcontextlines");
-      break;
-
-    default:
-      prints("[unknown integer parameter!]");
-      break;
-  }
-}
-/* sec 0245 */
-void begin_diagnostic (void)
-{
-  old_setting = selector;
-
-  if ((tracing_online <= 0) && (selector == term_and_log))
-  {
-    decr(selector);
-
-    if (history == spotless)
-      history = warning_issued;
-  }
-}
-/* sec 0245 */
-void end_diagnostic(boolean blank_line)
-{
-  print_nl("");
-
-  if (blank_line)
-    print_ln();
-
-  selector = old_setting;
-}
-/* sec 0247 */
-void print_length_param_ (integer n)
-{
-  switch (n)
-  {
-    case par_indent_code:
-      print_esc("parindent");
-      break;
-
-    case math_surround_code:
-      print_esc("mathsurround");
-      break;
-
-    case line_skip_limit_code:
-      print_esc("lineskiplimit");
-      break;
-
-    case hsize_code:
-      print_esc("hsize");
-      break;
-
-    case vsize_code:
-      print_esc("vsize");
-      break;
-
-    case max_depth_code:
-      print_esc("maxdepth");
-      break;
-
-    case split_max_depth_code:
-      print_esc("splitmaxdepth");
-      break;
-
-    case box_max_depth_code:
-      print_esc("boxmaxdepth");
-      break;
-
-    case hfuzz_code:
-      print_esc("hfuzz");
-      break;
-
-    case vfuzz_code:
-      print_esc("vfuzz");
-      break;
-
-    case delimiter_shortfall_code:
-      print_esc("delimitershortfall");
-      break;
-
-    case null_delimiter_space_code:
-      print_esc("nulldelimiterspace");
-      break;
-
-    case script_space_code:
-      print_esc("scriptspace");
-      break;
-
-    case pre_display_size_code:
-      print_esc("predisplaysize");
-      break;
-
-    case display_width_code:
-      print_esc("displaywidth");
-      break;
-
-    case display_indent_code:
-      print_esc("displayindent");
-      break;
-
-    case overfull_rule_code:
-      print_esc("overfullrule");
-      break;
-
-    case hang_indent_code:
-      print_esc("hangindent");
-      break;
-
-    case h_offset_code:
-      print_esc("hoffset");
-      break;
-
-    case v_offset_code:
-      print_esc("voffset");
-      break;
-
-    case emergency_stretch_code:
-      print_esc("emergencystretch");
-      break;
-
-    default:
-      prints("[unknown dimen parameter!]");
-      break;
-  }
-}
-/* sec 0298 */
-void print_cmd_chr_ (quarterword cmd, halfword chr_code)
-{
-  switch (cmd)
-  {
-    case left_brace:
-      chr_cmd("begin-group character ");
-      break;
-
-    case right_brace:
-      chr_cmd("end-group character ");
-      break;
-
-    case math_shift:
-      chr_cmd("math shift character ");
-      break;
-
-    case mac_param:
-      chr_cmd("macro parameter character ");
-      break;
-
-    case sup_mark:
-      chr_cmd("superscript character ");
-      break;
-
-    case sub_mark:
-      chr_cmd("subscript character ");
-      break;
-
-    case endv:
-      chr_cmd("end of alignment template");
-      break;
-
-    case spacer:
-      chr_cmd("blank space ");
-      break;
-
-    case letter:
-      chr_cmd("the letter ");
-      break;
-
-    case other_char:
-      chr_cmd("the character ");
-      break;
-
-    case assign_glue:
-    case assign_mu_glue:
-      if (chr_code < skip_base)
-        print_skip_param(chr_code - glue_base);
-      else if (chr_code < mu_skip_base)
-      {
-        print_esc("skip");
-        print_int(chr_code - skip_base);
-      }
-      else
-      {
-        print_esc("muskip");
-        print_int(chr_code - mu_skip_base);
-      }
-      break;
-
-    case assign_toks:
-      if (chr_code >= toks_base)
-      {
-        print_esc("toks");
-        print_int(chr_code - toks_base);
-      }
-      else
-      {
-        switch (chr_code)
-        {
-          case output_routine_loc:
-            print_esc("output");
-            break;
-
-          case every_par_loc:
-            print_esc("everypar");
-            break;
-
-          case every_math_loc:
-            print_esc("everymath");
-            break;
-
-          case every_display_loc:
-            print_esc("everydisplay");
-            break;
-
-          case every_hbox_loc:
-            print_esc("everyhbox");
-            break;
-
-          case every_vbox_loc:
-            print_esc("everyvbox");
-            break;
-
-          case every_job_loc:
-            print_esc("everyjob");
-            break;
-
-          case every_cr_loc:
-            print_esc("everycr");
-            break;
-
-          default:
-            print_esc("errhelp");
-            break;
-        }
-      }
-      break;
-
-    case assign_int:
-      if (chr_code < count_base)
-        print_param(chr_code - int_base);
-      else
-      {
-        print_esc("count");
-        print_int(chr_code - count_base);
-      }
-      break;
-
-    case assign_dimen:
-      if (chr_code < scaled_base)
-        print_length_param(chr_code - dimen_base);
-      else
-      {
-        print_esc("dimen");
-        print_int(chr_code - scaled_base);
-      }
-      break;
-
-    case accent:
-      print_esc("accent");
-      break;
-
-    case advance:
-      print_esc("advance");
-      break;
-
-    case after_assignment:
-      print_esc("afterassignment");
-      break;
-
-    case after_group:
-      print_esc("aftergroup");
-      break;
-
-    case assign_font_dimen:
-      print_esc("fontdimen");
-      break;
-
-    case begin_group:
-      print_esc("begingroup");
-      break;
-
-    case break_penalty:
-      print_esc("penalty");
-      break;
-
-    case char_num:
-      print_esc("char");
-      break;
-
-    case cs_name:
-      print_esc("csname");
-      break;
-
-    case def_font:
-      print_esc("font");
-      break;
-
-    case delim_num:
-      print_esc("delimiter");
-      break;
-
-    case divide:
-      print_esc("divide");
-      break;
-
-    case end_cs_name:
-      print_esc("endcsname");
-      break;
-
-    case end_group:
-      print_esc("endgroup");
-      break;
-
-    case ex_space:
-      print_esc(" ");
-      break;
-
-    case expand_after:
-      print_esc("expandafter");
-      break;
-
-    case halign:
-      print_esc("halign");
-      break;
-
-    case hrule:
-      print_esc("hrule");
-      break;
-
-    case ignore_spaces:
-      print_esc("ignorespaces");
-      break;
-
-    case insert:
-      print_esc("insert");
-      break;
-
-    case ital_corr:
-      print_esc("/");
-      break;
-
-    case mark:
-      print_esc("mark");
-      break;
-
-    case math_accent:
-      print_esc("mathaccent");
-      break;
-
-    case math_char_num:
-      print_esc("mathchar");
-      break;
-
-    case math_choice:
-      print_esc("mathchoice");
-      break;
-
-    case multiply:
-      print_esc("multiply");
-      break;
-
-    case no_align:
-      print_esc("noalign");
-      break;
-
-    case no_boundary:
-      print_esc("noboundary");
-      break;
-
-    case no_expand:
-      print_esc("noexpand");
-      break;
-
-    case non_script:
-      print_esc("nonscript");
-      break;
-
-    case omit:
-      print_esc("omit");
-      break;
-
-    case radical:
-      print_esc("radical");
-      break;
-
-    case read_to_cs:
-      print_esc("read");
-      break;
-
-    case relax:
-      print_esc("relax");
-      break;
-
-    case set_box:
-      print_esc("setbox");
-      break;
-
-    case set_prev_graf:
-      print_esc("prevgraf");
-      break;
-
-    case set_shape:
-      print_esc("parshape");
-      break;
-
-    case the:
-      print_esc("the");
-      break;
-
-    case toks_register:
-      print_esc("toks");
-      break;
-
-    case vadjust:
-      print_esc("vadjust");
-      break;
-
-    case valign:
-      print_esc("valign");
-      break;
-
-    case vcenter:
-      print_esc("vcenter");
-      break;
-
-    case vrule:
-      print_esc("vrule");
-      break;
-
-    case par_end:
-      print_esc("par");
-      break;
-
-    case input:
-      if (chr_code == 0)
-        print_esc("input");
-      else
-        print_esc("endinput");
-      break;
-
-    case top_bot_mark:
-      switch (chr_code)
-      {
-        case first_mark_code:
-          print_esc("firstmark");
-          break;
-
-        case bot_mark_code:
-          print_esc("botmark");
-          break;
-
-        case split_first_mark_code:
-          print_esc("splitfirstmark");
-          break;
-
-        case split_bot_mark_code:
-          print_esc("splitbotmark");
-          break;
-
-        default:
-          print_esc("topmark");
-          break;
-      }
-      break;
-
-    case tex_register:
-      if (chr_code == int_val)
-        print_esc("count");
-      else if (chr_code == dimen_val)
-        print_esc("dimen");
-      else if (chr_code == glue_val)
-        print_esc("skip");
-      else
-        print_esc("muskip");
-      break;
-
-    case set_aux:
-      if (chr_code == vmode)
-        print_esc("prevdepth");
-      else
-        print_esc("spacefactor");
-      break;
-
-    case set_page_int:
-      if (chr_code == 0)
-        print_esc("deadcycles");
-      else
-        print_esc("insertpenalties");
-      break;
-
-    case set_box_dimen:
-      if (chr_code == width_offset)
-        print_esc("wd");
-      else if (chr_code == height_offset)
-        print_esc("ht");
-      else
-        print_esc("dp");
-      break;
-
-    case last_item:
-      switch (chr_code)
-      {
-        case int_val:
-          print_esc("lastpenalty");
-          break;
-
-        case dimen_val:
-          print_esc("lastkern");
-          break;
-
-        case glue_val:
-          print_esc("lastskip");
-          break;
-
-        case input_line_no_code:
-          print_esc("inputlineno");
-          break;
-
-        default:
-          print_esc("badness");
-          break;
-      }
-      break;
-
-    case convert:
-      switch (chr_code)
-      {
-        case number_code:
-          print_esc("number");
-          break;
-
-        case roman_numeral_code:
-          print_esc("romannumeral");
-          break;
-
-        case string_code:
-          print_esc("string");
-          break;
-
-        case meaning_code:
-          print_esc("meaning");
-          break;
-
-        case font_name_code:
-          print_esc("fontname");
-          break;
-
-        default:
-          print_esc("jobname");
-          break;
-      }
-      break;
-
-    case if_test:
-      switch (chr_code)
-      {
-        case if_cat_code:
-          print_esc("ifcat");
-          break;
-
-        case if_int_code:
-          print_esc("ifnum");
-          break;
-
-        case if_dim_code:
-          print_esc("ifdim");
-          break;
-
-        case if_odd_code:
-          print_esc("ifodd");
-          break;
-
-        case if_vmode_code:
-          print_esc("ifvmode");
-          break;
-
-        case if_hmode_code:
-          print_esc("ifhmode");
-          break;
-
-        case if_mmode_code:
-          print_esc("ifmmode");
-          break;
-
-        case if_inner_code:
-          print_esc("ifinner");
-          break;
-
-        case if_void_code:
-          print_esc("ifvoid");
-          break;
-
-        case if_hbox_code:
-          print_esc("ifhbox");
-          break;
-
-        case if_vbox_code:
-          print_esc("ifvbox");
-          break;
-
-        case ifx_code:
-          print_esc("ifx");
-          break;
-
-        case if_eof_code:
-          print_esc("ifeof");
-          break;
-
-        case if_true_code:
-          print_esc("iftrue");
-          break;
-
-        case if_false_code:
-          print_esc("iffalse");
-          break;
-
-        case if_case_code:
-          print_esc("ifcase");
-          break;
-
-        default:
-          print_esc("if");
-          break;
-      }
-      break;
-
-    case fi_or_else:
-      if (chr_code == fi_code)
-        print_esc("fi");
-      else if (chr_code == or_code)
-        print_esc("or");
-      else
-        print_esc("else");
-      break;
-
-    case tab_mark:
-      if (chr_code == span_code)
-        print_esc("span");
-      else
-      {
-        prints("alignment tab character ");
-        print(chr_code);
-      }
-      break;
-
-    case car_ret:
-      if (chr_code == cr_code)
-        print_esc("cr");
-      else
-        print_esc("crcr");
-      break;
-
-    case set_page_dimen:
-      switch (chr_code)
-      {
-        case 0:
-          print_esc("pagegoal");
-          break;
-
-        case 1:
-          print_esc("pagetotal");
-          break;
-
-        case 2:
-          print_esc("pagestretch");
-          break;
-
-        case 3:
-          print_esc("pagefilstretch");
-          break;
-
-        case 4:
-          print_esc("pagefillstretch");
-          break;
-
-        case 5:
-          print_esc("pagefilllstretch");
-          break;
-
-        case 6:
-          print_esc("pageshrink");
-          break;
-
-        default:
-          print_esc("pagedepth");
-          break;
-      }
-      break;
-
-    case stop:
-      if (chr_code == 1)
-        print_esc("dump");
-      else
-        print_esc("end");
-      break;
-
-    case hskip:
-      switch (chr_code)
-      {
-        case skip_code:
-          print_esc("hskip");
-          break;
-
-        case fil_code:
-          print_esc("hfil");
-          break;
-
-        case fill_code:
-          print_esc("hfill");
-          break;
-
-        case ss_code:
-          print_esc("hss");
-          break;
-
-        default:
-          print_esc("hfilneg");
-          break;
-      }
-      break;
-
-    case vskip:
-      switch (chr_code)
-      {
-        case skip_code:
-          print_esc("vskip");
-          break;
-
-        case fil_code:
-          print_esc("vfil");
-          break;
-
-        case fill_code:
-          print_esc("vfill");
-          break;
-
-        case ss_code:
-          print_esc("vss");
-          break;
-
-        default:
-          print_esc("vfilneg");
-          break;
-      }
-      break;
-
-    case mskip:
-      print_esc("mskip");
-      break;
-
-    case kern:
-      print_esc("kern");
-      break;
-
-    case mkern:
-      print_esc("mkern");
-      break;
-
-    case hmove:
-      if (chr_code == 1)
-        print_esc("moveleft");
-      else
-        print_esc("moveright");
-      break;
-
-    case vmove:
-      if (chr_code == 1)
-        print_esc("raise");
-      else
-        print_esc("lower");
-      break;
-
-    case make_box:
-      switch (chr_code)
-      {
-        case box_code:
-          print_esc("box");
-          break;
-
-        case copy_code:
-          print_esc("copy");
-          break;
-
-        case last_box_code:
-          print_esc("lastbox");
-          break;
-
-        case vsplit_code:
-          print_esc("vsplit");
-          break;
-
-        case vtop_code:
-          print_esc("vtop");
-          break;
-
-        case vtop_code + vmode:
-          print_esc("vbox");
-          break;
-
-        default:
-          print_esc("hbox");
-          break;
-      }
-      break;
-
-    case leader_ship:
-      if (chr_code == a_leaders)
-        print_esc("leaders");
-      else if (chr_code == c_leaders)
-        print_esc("cleaders");
-      else if (chr_code == x_leaders)
-        print_esc("xleaders");
-      else
-        print_esc("shipout");
-      break;
-
-    case start_par:
-      if (chr_code == 0)
-        print_esc("noindent");
-      else
-        print_esc("indent");
-      break;
-
-    case remove_item:
-      if (chr_code == glue_node)
-        print_esc("unskip");
-      else if (chr_code == kern_node)
-        print_esc("unkern");
-      else
-        print_esc("unpenalty");
-      break;
-
-    case un_hbox:
-      if (chr_code == copy_code)
-        print_esc("unhcopy");
-      else
-        print_esc("unhbox");
-      break;
-
-    case un_vbox:
-      if (chr_code == copy_code)
-        print_esc("unvcopy");
-      else
-        print_esc("unvbox");
-      break;
-
-    case discretionary:
-      if (chr_code == 1)
-        print_esc("-");
-      else
-        print_esc("discretionary");
-      break;
-
-    case eq_no:
-      if (chr_code == 1)
-        print_esc("leqno");
-      else
-        print_esc("eqno");
-      break;
-
-    case math_comp:
-      switch (chr_code)
-      {
-        case ord_noad:
-          print_esc("mathord");
-          break;
-
-        case op_noad:
-          print_esc("mathop");
-          break;
-
-        case bin_noad:
-          print_esc("mathbin");
-          break;
-
-        case rel_noad:
-          print_esc("mathrel");
-          break;
-
-        case open_noad:
-          print_esc("mathopen");
-          break;
-
-        case close_noad:
-          print_esc("mathclose");
-          break;
-
-        case punct_noad:
-          print_esc("mathpunct");
-          break;
-
-        case inner_noad:
-          print_esc("mathinner");
-          break;
-
-        case under_noad:
-          print_esc("underline");
-          break;
-
-        default:
-          print_esc("overline");
-          break;
-      }
-      break;
-
-    case limit_switch:
-      if (chr_code == limits)
-        print_esc("limits");
-      else if (chr_code == no_limits)
-        print_esc("nolimits");
-      else
-        print_esc("displaylimits");
-      break;
-
-    case math_style:
-      print_style(chr_code);
-      break;
-
-    case above:
-      switch (chr_code)
-      {
-        case over_code:
-          print_esc("over");
-          break;
-
-        case atop_code:
-          print_esc("atop");
-          break;
-
-        case delimited_code + above_code:
-          print_esc("abovewithdelims");
-          break;
-
-        case delimited_code + over_code:
-          print_esc("overwithdelims");
-          break;
-
-        case delimited_code + atop_code:
-          print_esc("atopwithdelims");
-          break;
-
-        default:
-          print_esc("above");
-          break;
-      }
-      break;
-
-    case left_right:
-      if (chr_code == left_noad)
-        print_esc("left");
-      else
-        print_esc("right");
-      break;
-
-    case prefix:
-      if (chr_code == 1)
-        print_esc("long");
-      else if (chr_code == 2)
-        print_esc("outer");
-      else
-        print_esc("global");
-      break;
-
-    case def:
-      if (chr_code == 0)
-        print_esc("def");
-      else if (chr_code == 1)
-        print_esc("gdef");
-      else if (chr_code == 2)
-        print_esc("edef");
-      else
-        print_esc("xdef");
-      break;
-
-    case let:
-      if (chr_code != normal)
-        print_esc("futurelet");
-      else
-        print_esc("let");
-      break;
-
-    case shorthand_def:
-      switch (chr_code)
-      {
-        case char_def_code:
-          print_esc("chardef");
-          break;
-
-        case math_char_def_code:
-          print_esc("mathchardef");
-          break;
-
-        case count_def_code:
-          print_esc("countdef");
-          break;
-
-        case dimen_def_code:
-          print_esc("dimendef");
-          break;
-
-        case skip_def_code:
-          print_esc("skipdef");
-          break;
-
-        case mu_skip_def_code:
-          print_esc("muskipdef");
-          break;
-
-        default:
-          print_esc("toksdef");
-          break;
-      }
-      break;
-
-    case char_given:
-      print_esc("char");
-      print_hex(chr_code);
-      break;
-
-    case math_given:
-      print_esc("mathchar");
-      print_hex(chr_code);
-      break;
-
-    case def_code:
-      if (chr_code == cat_code_base)
-        print_esc("catcode");
-      else if (chr_code == math_code_base)
-        print_esc("mathcode");
-      else if (chr_code == lc_code_base)
-        print_esc("lccode");
-      else if (chr_code == uc_code_base)
-        print_esc("uccode");
-      else if (chr_code == sf_code_base)
-        print_esc("sfcode");
-      else
-        print_esc("delcode");
-      break;
-
-    case def_family:
-      print_size(chr_code - math_font_base);
-      break; 
-
-    case hyph_data:
-      if (chr_code == 1)
-        print_esc("patterns");
-      else
-        print_esc("hyphenation");
-      break;
-
-    case assign_font_int:
-      if (chr_code == 0)
-        print_esc("hyphenchar");
-      else
-        print_esc("skewchar");
-      break;
-
-    case set_font:
-      prints("select font ");
-      slow_print(font_name[chr_code]);
-
-      if (font_size[chr_code] != font_dsize[chr_code])
-      {
-        prints(" at ");
-        print_scaled(font_size[chr_code]);
-        prints("pt");
-      }
-      break;
-
-    case set_interaction:
-      switch (chr_code)
-      {
-        case batch_mode:
-          print_esc("batchmode");
-          break;
-
-        case nonstop_mode:
-          print_esc("nonstopmode");
-          break;
-
-        case scroll_mode:
-          print_esc("scrollmode");
-          break;
-
-        default:
-          print_esc("errorstopmode");
-          break;
-      }
-      break;
-
-    case in_stream:
-      if (chr_code == 0)
-        print_esc("closein");
-      else
-        print_esc("openin");
-      break;
-
-    case message:
-      if (chr_code == 0)
-        print_esc("message");
-      else
-        print_esc("errmessage");
-      break;
-
-    case case_shift:
-      if (chr_code == lc_code_base)
-        print_esc("lowercase");
-      else
-        print_esc("uppercase");
-      break;
-
-    case xray:
-      switch (chr_code)
-      {
-        case show_box_code:
-          print_esc("showbox");
-          break;
-
-        case show_the_code:
-          print_esc("showthe");
-          break;
-
-        case show_lists:
-          print_esc("showlists");
-          break;
-
-        default:
-          print_esc("show");
-          break;
-      }
-      break;
-
-    case undefined_cs:
-      prints("undefined");
-      break;
-
-    case call:
-      prints("macro");
-      break;
-
-    case long_call:
-      print_esc("long macro");
-      break;
-
-    case outer_call:
-      print_esc("outer macro");
-      break;
-
-    case long_outer_call:
-      print_esc("long");
-      print_esc("outer macro");
-      break;
-
-    case end_template:
-      print_esc("outer endtemplate");
-      break;
-
-    case extension:
-      switch (chr_code)
-      {
-        case open_node:
-          print_esc("openout");
-          break;
-
-        case write_node:
-          print_esc("write");
-          break;
-
-        case close_node:
-          print_esc("closeout");
-          break;
-
-        case special_node:
-          print_esc("special");
-          break;
-
-        case immediate_code:
-          print_esc("immediate");
-          break;
-
-        case set_language_code:
-          print_esc("setlanguage");
-          break;
-
-        default:
-          prints("[unknown extension!]");
-          break;
-      }
-      break;
-
-    default:
-      prints("[unknown command code!]");
-      break;
-  }
-}
-#ifdef STAT
-/* sec 0252 */
-void show_eqtb (pointer n)
-{ 
-  if (n < active_base)
-    print_char('?');
-  else if (n < glue_base)
-  {
-    sprint_cs(n);
-    print_char('=');
-    print_cmd_chr(eq_type(n), equiv(n));
-    
-    if (eq_type(n) >= call)
-    {
-      print_char(':');
-      show_token_list(link(equiv(n)), 0, 32);
-    }
-  }
-  else if (n < local_base)
-    if (n < skip_base)
-    {
-      print_skip_param(n - glue_base);
-      print_char('=');
-      
-      if (n < glue_base + thin_mu_skip_code)
-        print_spec(equiv(n), "pt");
-      else
-        print_spec(equiv(n), "mu");
-    }
-    else if (n < mu_skip_base)
-    {
-      print_esc("skip");
-      print_int(n - skip_base);
-      print_char('=');
-      print_spec(equiv(n), "pt");
-    }
-    else
-    {
-      print_esc("muskip");
-      print_int(n - mu_skip_base);
-      print_char('=');
-      print_spec(equiv(n), "mu");
-    }
-  else if (n < int_base)
-    if (n == par_shape_loc)
-    {
-      print_esc("parshape");
-      print_char('=');
-      
-      if (par_shape_ptr == 0)
-        print_char('0');
-      else
-        print_int(info(par_shape_ptr));
-    }
-    else if (n < toks_base)
-    {
-      print_cmd_chr(assign_toks, n);
-      print_char('=');
-      
-      if (equiv(n) != 0)
-        show_token_list(link(equiv(n)), 0, 32);
-    }
-    else if (n < box_base)
-    {
-      print_esc("toks");
-      print_int(n - toks_base);
-      print_char('=');
-      
-      if (equiv(n) != 0)
-        show_token_list(link(equiv(n)), 0, 32);
-    }
-    else if (n < cur_font_loc)
-    {
-      print_esc("box");
-      print_int(n - box_base);
-      print_char('=');
-      
-      if (equiv(n) == 0)
-        prints("void");
-      else
-      {
-        depth_threshold = 0;
-        breadth_max = 1;
-        show_node_list(equiv(n));
-      }
-    }
-    else if (n < cat_code_base)
-    {
-      if (n == cur_font_loc)
-        prints("current font");
-      else if (n < math_font_base + 16)
-      {
-        print_esc("textfont");
-        print_int(n - math_font_base);
-      }
-      else if (n < math_font_base + 32)
-      {
-        print_esc("scriptfont");
-        print_int(n - math_font_base - 16);
-      }
-      else
-      {
-        print_esc("scriptscriptfont");
-        print_int(n - math_font_base - 32);
-      }
-      
-      print_char('=');
-      print_esc("");
-      print(hash[font_id_base + equiv(n)].rh);
-    }
-    else if (n < math_code_base)
-    {
-      if (n < lc_code_base)
-      {
-        print_esc("catcode");
-        print_int(n - cat_code_base);
-      }
-      else if (n < uc_code_base)
-      {
-        print_esc("lccode");
-        print_int(n - lc_code_base);
-      }
-      else if (n < sf_code_base)
-      {
-        print_esc("uccode");
-        print_int(n - uc_code_base);
-      }
-      else
-      {
-        print_esc("sfcode");
-        print_int(n - sf_code_base);
-      }
-      
-      print_char('=');
-      print_int(equiv(n));
-    }
-    else
-    {
-      print_esc("mathcode");
-      print_int(n - math_code_base);
-      print_char('=');
-      print_int(equiv(n));
-    }
-  else if (n < dimen_base)
-  {
-    if (n < count_base)
-      print_param(n - int_base);
-    else if (n < del_code_base)
-    {
-      print_esc("count");
-      print_int(n - count_base);
-    }
-    else
-    {
-      print_esc("delcode");
-      print_int(n - del_code_base);
-    }
-    
-    print_char('=');
-    print_int(eqtb[n].cint);
-  }
-  else if (n <= eqtb_size)
-  {
-    if (n < scaled_base)
-      print_length_param(n - dimen_base);
-    else
-    {
-      print_esc("dimen");
-      print_int(n - scaled_base);
-    }
-    
-    print_char('=');
-    print_scaled(eqtb[n].cint);
-    prints("pt");
-  }
-  else
-    print_char('?');
-}
-#endif
-/* sec 0259 */
-pointer id_lookup_(integer j, integer l)
-{
-  integer h;
-  integer d;
-  pointer p;
-  pointer k;
-
-  h = buffer[j];
-
-  for (k = j + 1; k <= j + l - 1; k++)
-  {
-    h = h + h + buffer[k];
-
-    while (h >= hash_prime)
-      h = h - hash_prime;
-  }
-
-  p = h + hash_base;
-
-  while (true)
-  {
-    if (text(p) > 0)
-      if (length(text(p)) == l)
-        if (str_eq_buf(text(p), j))
-          goto found;
-
-    if (next(p) == 0)
-    {
-      if (no_new_control_sequence)
-        p = undefined_control_sequence;
-      else
-      {
-        if (text(p) > 0)
-        {
-          do
-            {
-              if (hash_is_full)
-              {
-                overflow("hash size", hash_size + hash_extra);
-                /* not dynamic        ^~~~~~~~~~~~~~~~~~~~~~*/
-                return 0;
-              }
-
-              decr(hash_used);
-            }
-          while (!(text(hash_used) == 0));
-
-          next(p) = hash_used;
-          p = hash_used;
-        }
-
-        str_room(l);
-        d = cur_length;
-
-        while (pool_ptr > str_start[str_ptr])
-        {
-          decr(pool_ptr);
-          str_pool[pool_ptr + l] = str_pool[pool_ptr];
-        }
-
-        for (k = j; k <= j + l - 1; k++)
-          append_char(buffer[k]);
-
-        text(p) = make_string();
-        pool_ptr = pool_ptr + d;
-
-#ifdef STAT
-        incr(cs_count);
-
-        if (trace_flag)
-        {
-          str_pool[pool_ptr] = '\0';
-          printf(" tex1.c incr(cs_count): '%s' ", &str_pool[pool_ptr - l - d]);
-        }
-#endif
-      }
-
-      goto found;
-    }
-
-    p = next(p);
-  } 
-
-found:
-  return p;
-}
-/* sec 0274 */
-void new_save_level (group_code c)
-{
-  check_full_save_stack();
-  save_type(save_ptr) = level_boundary;
-  save_level(save_ptr) = (quarterword) cur_group; 
-  save_index(save_ptr) = cur_boundary;
-
-  if (cur_level == max_quarterword)
-  {
-    overflow("grouping levels", max_quarterword - min_quarterword);
-    return;
-  }
-
-  cur_boundary = save_ptr;
-  incr(cur_level);
-  incr(save_ptr);
-  cur_group = c;
-}
-/* sec 0275 */
-void eq_destroy (memory_word w)
-{
-  pointer q;
-
-  switch (eq_type_field(w))
-  {
-    case call:
-    case long_call:
-    case outer_call:
-    case long_outer_call:
-      delete_token_ref(equiv_field(w));
-      break;
-
-    case glue_ref:
-      delete_glue_ref(equiv_field(w));
-      break;
-
-    case shape_ref:
-      q = equiv_field(w);
-
-      if (q != 0)
-        free_node(q, info(q) + info(q) + 1);
-      break;
-
-    case box_ref:
-      flush_node_list(equiv_field(w));
-      break;
-
-    default:
-      break;
-  }
-}
-/* sec 0276 */
-void eq_save (pointer p, quarterword l)
-{
-  check_full_save_stack();
-
-  if (l == level_zero)
-    save_type(save_ptr) = restore_zero;
-  else
-  {
-    save_stack[save_ptr] = eqtb[p];
-    incr(save_ptr);
-    save_type(save_ptr) = restore_old_value;
-  }
-
-  save_level(save_ptr) = l;
-  save_index(save_ptr) = p;
-  incr(save_ptr);
-}
-/* sec 0277 */
-void eq_define_(pointer p, quarterword t, halfword e)
-{
-  if (eq_level(p) == cur_level)
-    eq_destroy(eqtb[p]);
-  else if (cur_level > level_one)
-    eq_save(p, eq_level(p));
-
-  eq_level(p) = (quarterword) cur_level;
-  eq_type(p) = t;
-  equiv(p) = e;
-}
-/* sec 0278 */
-void eq_word_define_(pointer p, integer w)
-{
-  if (xeq_level[p] != cur_level)
-  {
-    eq_save(p, xeq_level[p]);
-    xeq_level[p] = (quarterword) cur_level;
-  }
-
-  eqtb[p].cint = w;
-}
-/* sec 0279 */
-void geq_define_(pointer p, quarterword t, halfword e)
-{
-  eq_destroy(eqtb[p]);
-  eq_level(p) = level_one;
-  eq_type(p) = t;
-  equiv(p) = e;
-}
-/* sec 0279 */
-void geq_word_define_(pointer p, integer w)
-{
-  eqtb[p].cint = w;
-  xeq_level[p]= level_one;
-}
-/* sec 0280 */
-void save_for_after (halfword t)
-{ 
-  if (cur_level > level_one)
-  {
-    check_full_save_stack();
-    save_type(save_ptr) = insert_token;
-    save_level(save_ptr) = level_zero;
-    save_index(save_ptr) = t;
-    incr(save_ptr);
-  }
+/* Copyright 2014 Clerk Ma\r
+\r
+   This program is free software; you can redistribute it and/or modify\r
+   it under the terms of the GNU General Public License as published by\r
+   the Free Software Foundation; either version 2 of the License, or\r
+   (at your option) any later version.\r
+\r
+   This program is distributed in the hope that it will be useful, but\r
+   WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+   General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with this program; if not, write to the Free Software\r
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA\r
+   02110-1301 USA.  */\r
+\r
+#define EXTERN extern\r
+\r
+#include "yandytex.h"\r
+\r
+/* sec 0198 */\r
+void show_box_(pointer p)\r
+{\r
+  depth_threshold = show_box_depth;\r
+  breadth_max = show_box_breadth;\r
+\r
+  if (breadth_max <= 0)\r
+    breadth_max = 5;\r
+\r
+#ifdef ALLOCATESTRING\r
+  if (pool_ptr + depth_threshold >= current_pool_size)\r
+    str_pool = realloc_str_pool(increment_pool_size);\r
+\r
+  if (pool_ptr + depth_threshold >= current_pool_size)\r
+    depth_threshold = current_pool_size - pool_ptr - 1;\r
+#else\r
+  if (pool_ptr + depth_threshold >= pool_size)\r
+    depth_threshold = pool_size - pool_ptr - 1;\r
+#endif\r
+\r
+  show_node_list(p);\r
+  print_ln();\r
+}\r
+/* sec 0200 */\r
+void delete_token_ref_(pointer p)\r
+{\r
+  if (token_ref_count(p) == 0)\r
+    flush_list(p);\r
+  else\r
+    decr(token_ref_count(p));\r
+}\r
+/* sec 0201 */\r
+void delete_glue_ref_(pointer p)\r
+{\r
+  if (glue_ref_count(p) == 0)\r
+    free_node(p, glue_spec_size);\r
+  else\r
+    decr(glue_ref_count(p));\r
+}\r
+/* sec 0202 */\r
+void flush_node_list_(pointer p)\r
+{\r
+  pointer q;\r
+\r
+  while (is_char_node(p))\r
+  {\r
+    q = link(p);\r
+\r
+    if (is_char_node(p))\r
+      free_avail(p);\r
+    else\r
+    {\r
+      switch (type(p))\r
+      {\r
+        case hlist_node:\r
+        case vlist_node:\r
+        case unset_node:\r
+          {\r
+            flush_node_list(list_ptr(p));\r
+            free_node(p, box_node_size);\r
+            goto done;\r
+          }\r
+          break;\r
+        case rule_node:\r
+          {\r
+            free_node(p, rule_node_size);\r
+            goto done;\r
+          }\r
+          break;\r
+        case ins_node:\r
+          {\r
+            flush_node_list(ins_ptr(p));\r
+            delete_glue_ref(split_top_ptr(p));\r
+            free_node(p, ins_node_size);\r
+            goto done;\r
+          }\r
+          break;\r
+        case whatsit_node:\r
+          {\r
+            switch (subtype(p))\r
+            {\r
+              case open_node:\r
+                free_node(p, open_node_size);\r
+                break;\r
+              case write_node:\r
+              case special_node:\r
+                {\r
+                  delete_token_ref(write_tokens(p));\r
+                  free_node(p, write_node_size);\r
+                  goto done;\r
+                }\r
+                break;\r
+              case close_node:\r
+              case set_language_code:\r
+                free_node(p, small_node_size);\r
+                break;\r
+              default:\r
+                {\r
+                  confusion("ext3");\r
+                  return;\r
+                }\r
+                break;\r
+            }\r
+            goto done;\r
+          }\r
+          break;\r
+        case glue_node:\r
+          delete_glue_ref(p);\r
+\r
+          if (leader_ptr(p) != 0)\r
+            flush_node_list(leader_ptr(p));\r
+          break;\r
+        case kern_node:\r
+        case math_node:\r
+        case penalty_node:\r
+          break;\r
+        case ligature_node:\r
+          flush_node_list(lig_ptr(p));\r
+          break;\r
+        case mark_node:\r
+          delete_token_ref(mark_ptr(p));\r
+          break;\r
+        case disc_node:\r
+          flush_node_list(pre_break(p));\r
+          flush_node_list(post_break(p));\r
+          break;\r
+        case adjust_node:\r
+          flush_node_list(adjust_ptr(p));\r
+          break;\r
+        case style_node:\r
+          {\r
+            free_node(p, style_node_size);\r
+            goto done;\r
+          }\r
+          break;\r
+        case choice_node:\r
+          {\r
+            flush_node_list(display_mlist(p));\r
+            flush_node_list(text_mlist(p));\r
+            flush_node_list(script_mlist(p));\r
+            flush_node_list(script_script_mlist(p));\r
+            free_node(p, style_node_size);\r
+            goto done;\r
+          }\r
+          break;\r
+        case ord_noad:\r
+        case op_noad:\r
+        case bin_noad:\r
+        case rel_noad:\r
+        case open_noad:\r
+        case close_noad:\r
+        case punct_noad:\r
+        case inner_noad:\r
+        case radical_noad:\r
+        case over_noad:\r
+        case under_noad:\r
+        case vcenter_noad:\r
+        case accent_noad:\r
+          {\r
+            if (math_type(nucleus(p)) >= sub_box)\r
+              flush_node_list(info(nucleus(p)));\r
+\r
+            if (math_type(supscr(p)) >= sub_box)\r
+              flush_node_list(info(supscr(p)));\r
+\r
+            if (math_type(subscr(p)) >= sub_box)\r
+              flush_node_list(info(subscr(p)));\r
+\r
+            if (type(p) == radical_noad)\r
+              free_node(p, radical_noad_size);\r
+            else\r
+            {\r
+              if (type(p) == accent_noad)\r
+                free_node(p, accent_noad_size);\r
+              else\r
+                free_node(p, noad_size);\r
+            }\r
+\r
+            goto done;\r
+          }\r
+          break;\r
+        case left_noad:\r
+        case right_noad:\r
+          {\r
+            free_node(p, noad_size);\r
+            goto done;\r
+          }\r
+          break;\r
+        case fraction_noad:\r
+          {\r
+            flush_node_list(info(numerator(p)));\r
+            flush_node_list(info(denominator(p)));\r
+            free_node(p, fraction_noad_size);\r
+            goto done;\r
+          }\r
+          break;\r
+        default:\r
+          {\r
+            confusion("flushing");\r
+            return;\r
+          }\r
+          break;\r
+      }\r
+\r
+      free_node(p, small_node_size);\r
+done:;\r
+    }\r
+\r
+    p = q;\r
+  }\r
+}\r
+/* sec 0204 */\r
+pointer copy_node_list_(pointer p)\r
+{\r
+  pointer h;\r
+  pointer q;\r
+  pointer r;\r
+  char words;\r
+\r
+  h = get_avail();\r
+  q = h;\r
+\r
+  while (p != 0)\r
+  {\r
+    words = 1;\r
+\r
+    if (is_char_node(p)) \r
+      r = get_avail();\r
+    else switch (type(p))\r
+    {\r
+      case hlist_node:\r
+      case vlist_node:\r
+      case unset_node:\r
+        {\r
+          r = get_node(box_node_size);\r
+          mem[r + 6] = mem[p + 6];\r
+          mem[r + 5] = mem[p + 5];\r
+          list_ptr(r) = copy_node_list(list_ptr(p));\r
+          words = 5;\r
+        }\r
+        break;\r
+      case rule_node:\r
+        {\r
+          r = get_node(rule_node_size);\r
+          words = rule_node_size;\r
+        }\r
+        break;\r
+      case ins_node:\r
+        {\r
+          r = get_node(ins_node_size);\r
+          mem[r + 4] = mem[p + 4];\r
+          add_glue_ref(split_top_ptr(p));\r
+          ins_ptr(r) = copy_node_list(ins_ptr(p));\r
+          words = ins_node_size - 1;\r
+        }\r
+        break;\r
+      case whatsit_node:\r
+        switch (subtype(p))\r
+        {\r
+          case open_node:\r
+            {\r
+              r = get_node(open_node_size);\r
+              words = open_node_size;\r
+            }\r
+            break;\r
+\r
+          case write_node:\r
+          case special_node:\r
+            {\r
+              r = get_node(write_node_size);\r
+              add_token_ref(write_tokens(p));\r
+              words = write_node_size;\r
+            }\r
+            break;\r
+\r
+          case close_node:\r
+          case language_node:\r
+            {\r
+              r = get_node(small_node_size);\r
+              words = small_node_size;\r
+            }\r
+            break;\r
+\r
+          default:\r
+            {\r
+              confusion("ext2");\r
+              return 0;\r
+            }\r
+            break;\r
+        }\r
+        break;\r
+\r
+      case glue_node:\r
+        {\r
+          r = get_node(small_node_size);\r
+          add_glue_ref(glue_ptr(p));\r
+          glue_ptr(r) = glue_ptr(p);\r
+          leader_ptr(r) = copy_node_list(leader_ptr(p));\r
+        }\r
+        break;\r
+\r
+      case kern_node:\r
+      case math_node:\r
+      case penalty_node:\r
+        {\r
+          r = get_node(small_node_size);\r
+          words = small_node_size;\r
+        }\r
+        break;\r
+\r
+      case ligature_node:\r
+        {\r
+          r = get_node(small_node_size);\r
+          mem[lig_char(r)] = mem[lig_char(p)];\r
+          lig_ptr(r) = copy_node_list(lig_ptr(p));\r
+        }\r
+        break;\r
+\r
+      case disc_node:\r
+        {\r
+          r = get_node(small_node_size);\r
+          pre_break(r) = copy_node_list(pre_break(p));\r
+          post_break(r) = copy_node_list(pre_break(p));\r
+        }\r
+        break;\r
+\r
+      case mark_node:\r
+        {\r
+          r = get_node(small_node_size);\r
+          add_token_ref(mark_ptr(p));\r
+          words = small_node_size;\r
+        }\r
+        break;\r
+\r
+      case adjust_node:\r
+        {\r
+          r = get_node(small_node_size);\r
+          adjust_ptr(r) = copy_node_list(adjust_ptr(p));\r
+        }\r
+        break;\r
+\r
+      default:\r
+        {\r
+          confusion("copying");\r
+          return 0;\r
+        }\r
+        break;\r
+    }\r
+\r
+    while (words > 0)\r
+    {\r
+      decr(words);\r
+      mem[r + words] = mem[p + words];\r
+    }\r
+\r
+    link(q) = r;\r
+    q = r;\r
+    p = link(p);\r
+  }\r
+\r
+  link(q) = 0;\r
+  q = link(h);\r
+  free_avail(h);\r
+\r
+  return q;\r
+}\r
+/* sec 0211 */\r
+void print_mode_(integer m)\r
+{ \r
+  if (m > 0)\r
+  {\r
+    switch (m / (max_command + 1))\r
+    {\r
+      case 0:\r
+        prints("vertical");\r
+        break;\r
+      case 1:\r
+        prints("horizontal");\r
+        break;\r
+      case 2:\r
+        prints("display math");\r
+        break;\r
+    }\r
+  }\r
+  else\r
+  {\r
+    if (m == 0)\r
+      prints("no");\r
+    else\r
+    {\r
+      switch ((- (integer) m) / (max_command + 1))\r
+      {\r
+        case 0:\r
+          prints("internal vertical");\r
+          break;\r
+        case 1:\r
+          prints("restricted horizontal");\r
+          break;\r
+        case 2:\r
+          prints("math");\r
+          break;\r
+      }\r
+    }\r
+  }\r
+\r
+  prints(" mode");\r
+}\r
+/* sec 0216 */\r
+void push_nest (void) \r
+{\r
+  if (nest_ptr > max_nest_stack)\r
+  {\r
+    max_nest_stack = nest_ptr;\r
+\r
+#ifdef ALLOCATEINPUTSTACK\r
+    if (nest_ptr == current_nest_size)\r
+      nest = realloc_nest_stack(increment_nest_size);\r
+\r
+    if (nest_ptr == current_nest_size)\r
+    {\r
+      overflow("semantic nest size", current_nest_size);\r
+      return;\r
+    }\r
+#else\r
+    if (nest_ptr == nest_size)\r
+    {\r
+      overflow("semantic nest size", nest_size);\r
+      return;\r
+    }\r
+#endif\r
+  }\r
+\r
+  nest[nest_ptr]= cur_list;\r
+  incr(nest_ptr);\r
+  head = get_avail();\r
+  tail = head;\r
+  prev_graf = 0;\r
+  mode_line = line;\r
+}\r
+/* sec 0217 */\r
+void pop_nest (void) \r
+{\r
+  free_avail(head);\r
+  decr(nest_ptr);\r
+  cur_list = nest[nest_ptr];\r
+}\r
+/* sec 0218 */\r
+void show_activities (void)\r
+{\r
+  integer p;\r
+  short m;\r
+  memory_word a;\r
+  halfword q, r;\r
+  integer t;\r
+\r
+  nest[nest_ptr] = cur_list;\r
+  print_nl("");\r
+  print_ln();\r
+\r
+  for (p = nest_ptr; p >= 0; p--)\r
+  {\r
+    m = nest[p].mode_field;\r
+    a = nest[p].aux_field;\r
+    print_nl("### ");\r
+    print_mode(m);\r
+    prints(" entered at line ");\r
+    print_int(abs(nest[p].ml_field));\r
+\r
+    if (m == hmode)\r
+    {\r
+      if (nest[p].pg_field != 040600000)\r
+      {\r
+        prints(" (language");\r
+        print_int(nest[p].pg_field % 65536L);\r
+        prints(":hyphenmin");\r
+        print_int(nest[p].pg_field / 4194304L);\r
+        print_char(',');\r
+        print_int((nest[p].pg_field / 65536L) % 64);\r
+        print_char(')');\r
+      }\r
+    }\r
+\r
+    if (nest[p].ml_field < 0)\r
+      prints(" (\\output routine)");\r
+\r
+    if (p == 0)\r
+    {\r
+      if (page_head != page_tail)\r
+      {\r
+        print_nl("### current page:");\r
+        \r
+        if (output_active)\r
+          prints(" (held over for next output)");\r
+\r
+        show_box(link(page_head));\r
+\r
+        if (page_contents > 0)\r
+        {\r
+          print_nl("total height ");\r
+          print_totals();\r
+          print_nl(" goal height ");\r
+          print_scaled(page_so_far[0]);\r
+          r = link(page_ins_head);\r
+          \r
+          while (r != mem_top)\r
+          {\r
+            print_ln();\r
+            print_esc("insert");\r
+            t = subtype(r);\r
+            print_int(t);\r
+            prints(" adds ");\r
+\r
+            if (count(t) == 1000)\r
+              t = height(r);\r
+            else\r
+              t = x_over_n(height(r), 1000) * count(t);\r
+\r
+            print_scaled(t);\r
+\r
+            if (type(r) == split_up)\r
+            {\r
+              q = page_head;\r
+              t = 0;\r
+\r
+              do\r
+                {\r
+                  q = link(q);\r
+\r
+                  if ((type(q) == ins_node) && (subtype(q) == subtype(r)))\r
+                    incr(t);\r
+                }\r
+              while (!(q == broken_ins(r)));\r
+\r
+              prints(", #");\r
+              print_int(t);\r
+              prints(" might split");\r
+            }\r
+            r = link(r);\r
+          }\r
+        }\r
+      }\r
+\r
+      if (link(contrib_head) != 0)\r
+        print_nl("### recent contributions:");\r
+    }\r
+\r
+    show_box(link(nest[p].head_field));\r
+\r
+    switch (abs(m) / (max_command + 1))\r
+    {\r
+      case 0:\r
+        {\r
+          print_nl("prevdepth ");\r
+\r
+          if  (a.cint <= ignore_depth)\r
+            prints("ignored");\r
+          else\r
+            print_scaled(a.cint);\r
+\r
+          if (nest[p].pg_field != 0)\r
+          {\r
+            prints(", prevgraf ");\r
+            print_int(nest[p].pg_field);\r
+            prints(" line");\r
+\r
+            if (nest[p].pg_field != 1)\r
+              print_char('s');\r
+          }\r
+        }\r
+        break;\r
+\r
+      case 1:\r
+        {\r
+          print_nl("spacefactor ");\r
+          print_int(a.hh.lh);\r
+\r
+          if (m > 0)\r
+          {\r
+            if (a.hh.rh > 0)\r
+            {\r
+              prints(", current language ");\r
+              print_int(a.hh.rh);\r
+            }\r
+          }\r
+        }\r
+        break;\r
+\r
+      case 2:\r
+        if (a.cint != 0)\r
+        {\r
+          prints("this will be denominator of:");\r
+          show_box(a.cint);\r
+        }\r
+        break;\r
+    }\r
+  }\r
+}\r
+/* sec 0237 */\r
+void print_param_(integer n)\r
+{\r
+  switch (n)\r
+  {\r
+    case pretolerance_code:\r
+      print_esc("pretolerance");\r
+      break;\r
+\r
+    case tolerance_code:\r
+      print_esc("tolerance");\r
+      break;\r
+\r
+    case line_penalty_code:\r
+      print_esc("linepenalty");\r
+      break;\r
+\r
+    case hyphen_penalty_code:\r
+      print_esc("hyphenpenalty");\r
+      break;\r
+\r
+    case ex_hyphen_penalty_code:\r
+      print_esc("exhyphenpenalty");\r
+      break;\r
+\r
+    case club_penalty_code:\r
+      print_esc("clubpenalty");\r
+      break;\r
+\r
+    case widow_penalty_code:\r
+      print_esc("widowpenalty");\r
+      break;\r
+\r
+    case display_widow_penalty_code:\r
+      print_esc("displaywidowpenalty");\r
+      break;\r
+\r
+    case broken_penalty_code:\r
+      print_esc("brokenpenalty");\r
+      break;\r
+\r
+    case bin_op_penalty_code:\r
+      print_esc("binoppenalty");\r
+      break;\r
+\r
+    case rel_penalty_code:\r
+      print_esc("relpenalty");\r
+      break;\r
+\r
+    case pre_display_penalty_code:\r
+      print_esc("predisplaypenalty");\r
+      break;\r
+\r
+    case post_display_penalty_code:\r
+      print_esc("postdisplaypenalty");\r
+      break;\r
+\r
+    case inter_line_penalty_code:\r
+      print_esc("interlinepenalty");\r
+      break;\r
+\r
+    case double_hyphen_demerits_code:\r
+      print_esc("doublehyphendemerits");\r
+      break;\r
+\r
+    case final_hyphen_demerits_code:\r
+      print_esc("finalhyphendemerits");\r
+      break;\r
+\r
+    case adj_demerits_code:\r
+      print_esc("adjdemerits");\r
+      break;\r
+\r
+    case mag_code:\r
+      print_esc("mag");\r
+      break;\r
+\r
+    case delimiter_factor_code:\r
+      print_esc("delimiterfactor");\r
+      break;\r
+\r
+    case looseness_code:\r
+      print_esc("looseness");\r
+      break;\r
+\r
+    case time_code:\r
+      print_esc("time");\r
+      break;\r
+\r
+    case day_code:\r
+      print_esc("day");\r
+      break;\r
+\r
+    case month_code:\r
+      print_esc("month");\r
+      break;\r
+\r
+    case year_code:\r
+      print_esc("year");\r
+      break;\r
+\r
+    case show_box_breadth_code:\r
+      print_esc("showboxbreadth");\r
+      break;\r
+\r
+    case show_box_depth_code:\r
+      print_esc("showboxdepth");\r
+      break;\r
+\r
+    case hbadness_code:\r
+      print_esc("hbadness");\r
+      break;\r
+\r
+    case vbadness_code:\r
+      print_esc("vbadness");\r
+      break;\r
+\r
+    case pausing_code:\r
+      print_esc("pausing");\r
+      break;\r
+\r
+    case tracing_online_code:\r
+      print_esc("tracingonline");\r
+      break;\r
+\r
+    case tracing_macros_code:\r
+      print_esc("tracingmacros");\r
+      break;\r
+\r
+    case tracing_stats_code:\r
+      print_esc("tracingstats");\r
+      break;\r
+\r
+    case tracing_paragraphs_code:\r
+      print_esc("tracingparagraphs");\r
+      break;\r
+\r
+    case tracing_pages_code:\r
+      print_esc("tracingpages");\r
+      break;\r
+\r
+    case tracing_output_code:\r
+      print_esc("tracingoutput");\r
+      break;\r
+\r
+    case tracing_lost_chars_code:\r
+      print_esc("tracinglostchars");\r
+      break;\r
+\r
+    case tracing_commands_code:\r
+      print_esc("tracingcommands");\r
+      break;\r
+\r
+    case tracing_restores_code:\r
+      print_esc("tracingrestores");\r
+      break;\r
+\r
+    case uc_hyph_code:\r
+      print_esc("uchyph");\r
+      break;\r
+\r
+    case output_penalty_code:\r
+      print_esc("outputpenalty");\r
+      break;\r
+\r
+    case max_dead_cycles_code:\r
+      print_esc("maxdeadcycles");\r
+      break;\r
+\r
+    case hang_after_code:\r
+      print_esc("hangafter");\r
+      break;\r
+\r
+    case floating_penalty_code:\r
+      print_esc("floatingpenalty");\r
+      break;\r
+\r
+    case global_defs_code:\r
+      print_esc("globaldefs");\r
+      break;\r
+\r
+    case cur_fam_code:\r
+      print_esc("fam");\r
+      break;\r
+\r
+    case escape_char_code:\r
+      print_esc("escapechar");\r
+      break;\r
+\r
+    case default_hyphen_char_code:\r
+      print_esc("defaulthyphenchar");\r
+      break;\r
+\r
+    case default_skew_char_code:\r
+      print_esc("defaultskewchar");\r
+      break;\r
+\r
+    case end_line_char_code:\r
+      print_esc("endlinechar");\r
+      break;\r
+\r
+    case new_line_char_code:\r
+      print_esc("newlinechar");\r
+      break;\r
+\r
+    case language_code:\r
+      print_esc("language");\r
+      break;\r
+\r
+    case left_hyphen_min_code:\r
+      print_esc("lefthyphenmin");\r
+      break;\r
+\r
+    case right_hyphen_min_code:\r
+      print_esc("righthyphenmin");\r
+      break;\r
+\r
+    case holding_inserts_code:\r
+      print_esc("holdinginserts");\r
+      break;\r
+\r
+    case error_context_lines_code:\r
+      print_esc("errorcontextlines");\r
+      break;\r
+\r
+    default:\r
+      prints("[unknown integer parameter!]");\r
+      break;\r
+  }\r
+}\r
+/* sec 0245 */\r
+void begin_diagnostic (void)\r
+{\r
+  old_setting = selector;\r
+\r
+  if ((tracing_online <= 0) && (selector == term_and_log))\r
+  {\r
+    decr(selector);\r
+\r
+    if (history == spotless)\r
+      history = warning_issued;\r
+  }\r
+}\r
+/* sec 0245 */\r
+void end_diagnostic(boolean blank_line)\r
+{\r
+  print_nl("");\r
+\r
+  if (blank_line)\r
+    print_ln();\r
+\r
+  selector = old_setting;\r
+}\r
+/* sec 0247 */\r
+void print_length_param_ (integer n)\r
+{\r
+  switch (n)\r
+  {\r
+    case par_indent_code:\r
+      print_esc("parindent");\r
+      break;\r
+\r
+    case math_surround_code:\r
+      print_esc("mathsurround");\r
+      break;\r
+\r
+    case line_skip_limit_code:\r
+      print_esc("lineskiplimit");\r
+      break;\r
+\r
+    case hsize_code:\r
+      print_esc("hsize");\r
+      break;\r
+\r
+    case vsize_code:\r
+      print_esc("vsize");\r
+      break;\r
+\r
+    case max_depth_code:\r
+      print_esc("maxdepth");\r
+      break;\r
+\r
+    case split_max_depth_code:\r
+      print_esc("splitmaxdepth");\r
+      break;\r
+\r
+    case box_max_depth_code:\r
+      print_esc("boxmaxdepth");\r
+      break;\r
+\r
+    case hfuzz_code:\r
+      print_esc("hfuzz");\r
+      break;\r
+\r
+    case vfuzz_code:\r
+      print_esc("vfuzz");\r
+      break;\r
+\r
+    case delimiter_shortfall_code:\r
+      print_esc("delimitershortfall");\r
+      break;\r
+\r
+    case null_delimiter_space_code:\r
+      print_esc("nulldelimiterspace");\r
+      break;\r
+\r
+    case script_space_code:\r
+      print_esc("scriptspace");\r
+      break;\r
+\r
+    case pre_display_size_code:\r
+      print_esc("predisplaysize");\r
+      break;\r
+\r
+    case display_width_code:\r
+      print_esc("displaywidth");\r
+      break;\r
+\r
+    case display_indent_code:\r
+      print_esc("displayindent");\r
+      break;\r
+\r
+    case overfull_rule_code:\r
+      print_esc("overfullrule");\r
+      break;\r
+\r
+    case hang_indent_code:\r
+      print_esc("hangindent");\r
+      break;\r
+\r
+    case h_offset_code:\r
+      print_esc("hoffset");\r
+      break;\r
+\r
+    case v_offset_code:\r
+      print_esc("voffset");\r
+      break;\r
+\r
+    case emergency_stretch_code:\r
+      print_esc("emergencystretch");\r
+      break;\r
+\r
+    default:\r
+      prints("[unknown dimen parameter!]");\r
+      break;\r
+  }\r
+}\r
+/* sec 0298 */\r
+void print_cmd_chr_ (quarterword cmd, halfword chr_code)\r
+{\r
+  switch (cmd)\r
+  {\r
+    case left_brace:\r
+      chr_cmd("begin-group character ");\r
+      break;\r
+\r
+    case right_brace:\r
+      chr_cmd("end-group character ");\r
+      break;\r
+\r
+    case math_shift:\r
+      chr_cmd("math shift character ");\r
+      break;\r
+\r
+    case mac_param:\r
+      chr_cmd("macro parameter character ");\r
+      break;\r
+\r
+    case sup_mark:\r
+      chr_cmd("superscript character ");\r
+      break;\r
+\r
+    case sub_mark:\r
+      chr_cmd("subscript character ");\r
+      break;\r
+\r
+    case endv:\r
+      chr_cmd("end of alignment template");\r
+      break;\r
+\r
+    case spacer:\r
+      chr_cmd("blank space ");\r
+      break;\r
+\r
+    case letter:\r
+      chr_cmd("the letter ");\r
+      break;\r
+\r
+    case other_char:\r
+      chr_cmd("the character ");\r
+      break;\r
+\r
+    case assign_glue:\r
+    case assign_mu_glue:\r
+      if (chr_code < skip_base)\r
+        print_skip_param(chr_code - glue_base);\r
+      else if (chr_code < mu_skip_base)\r
+      {\r
+        print_esc("skip");\r
+        print_int(chr_code - skip_base);\r
+      }\r
+      else\r
+      {\r
+        print_esc("muskip");\r
+        print_int(chr_code - mu_skip_base);\r
+      }\r
+      break;\r
+\r
+    case assign_toks:\r
+      if (chr_code >= toks_base)\r
+      {\r
+        print_esc("toks");\r
+        print_int(chr_code - toks_base);\r
+      }\r
+      else\r
+      {\r
+        switch (chr_code)\r
+        {\r
+          case output_routine_loc:\r
+            print_esc("output");\r
+            break;\r
+\r
+          case every_par_loc:\r
+            print_esc("everypar");\r
+            break;\r
+\r
+          case every_math_loc:\r
+            print_esc("everymath");\r
+            break;\r
+\r
+          case every_display_loc:\r
+            print_esc("everydisplay");\r
+            break;\r
+\r
+          case every_hbox_loc:\r
+            print_esc("everyhbox");\r
+            break;\r
+\r
+          case every_vbox_loc:\r
+            print_esc("everyvbox");\r
+            break;\r
+\r
+          case every_job_loc:\r
+            print_esc("everyjob");\r
+            break;\r
+\r
+          case every_cr_loc:\r
+            print_esc("everycr");\r
+            break;\r
+\r
+          default:\r
+            print_esc("errhelp");\r
+            break;\r
+        }\r
+      }\r
+      break;\r
+\r
+    case assign_int:\r
+      if (chr_code < count_base)\r
+        print_param(chr_code - int_base);\r
+      else\r
+      {\r
+        print_esc("count");\r
+        print_int(chr_code - count_base);\r
+      }\r
+      break;\r
+\r
+    case assign_dimen:\r
+      if (chr_code < scaled_base)\r
+        print_length_param(chr_code - dimen_base);\r
+      else\r
+      {\r
+        print_esc("dimen");\r
+        print_int(chr_code - scaled_base);\r
+      }\r
+      break;\r
+\r
+    case accent:\r
+      print_esc("accent");\r
+      break;\r
+\r
+    case advance:\r
+      print_esc("advance");\r
+      break;\r
+\r
+    case after_assignment:\r
+      print_esc("afterassignment");\r
+      break;\r
+\r
+    case after_group:\r
+      print_esc("aftergroup");\r
+      break;\r
+\r
+    case assign_font_dimen:\r
+      print_esc("fontdimen");\r
+      break;\r
+\r
+    case begin_group:\r
+      print_esc("begingroup");\r
+      break;\r
+\r
+    case break_penalty:\r
+      print_esc("penalty");\r
+      break;\r
+\r
+    case char_num:\r
+      print_esc("char");\r
+      break;\r
+\r
+    case cs_name:\r
+      print_esc("csname");\r
+      break;\r
+\r
+    case def_font:\r
+      print_esc("font");\r
+      break;\r
+\r
+    case delim_num:\r
+      print_esc("delimiter");\r
+      break;\r
+\r
+    case divide:\r
+      print_esc("divide");\r
+      break;\r
+\r
+    case end_cs_name:\r
+      print_esc("endcsname");\r
+      break;\r
+\r
+    case end_group:\r
+      print_esc("endgroup");\r
+      break;\r
+\r
+    case ex_space:\r
+      print_esc(" ");\r
+      break;\r
+\r
+    case expand_after:\r
+      print_esc("expandafter");\r
+      break;\r
+\r
+    case halign:\r
+      print_esc("halign");\r
+      break;\r
+\r
+    case hrule:\r
+      print_esc("hrule");\r
+      break;\r
+\r
+    case ignore_spaces:\r
+      print_esc("ignorespaces");\r
+      break;\r
+\r
+    case insert:\r
+      print_esc("insert");\r
+      break;\r
+\r
+    case ital_corr:\r
+      print_esc("/");\r
+      break;\r
+\r
+    case mark:\r
+      print_esc("mark");\r
+      break;\r
+\r
+    case math_accent:\r
+      print_esc("mathaccent");\r
+      break;\r
+\r
+    case math_char_num:\r
+      print_esc("mathchar");\r
+      break;\r
+\r
+    case math_choice:\r
+      print_esc("mathchoice");\r
+      break;\r
+\r
+    case multiply:\r
+      print_esc("multiply");\r
+      break;\r
+\r
+    case no_align:\r
+      print_esc("noalign");\r
+      break;\r
+\r
+    case no_boundary:\r
+      print_esc("noboundary");\r
+      break;\r
+\r
+    case no_expand:\r
+      print_esc("noexpand");\r
+      break;\r
+\r
+    case non_script:\r
+      print_esc("nonscript");\r
+      break;\r
+\r
+    case omit:\r
+      print_esc("omit");\r
+      break;\r
+\r
+    case radical:\r
+      print_esc("radical");\r
+      break;\r
+\r
+    case read_to_cs:\r
+      print_esc("read");\r
+      break;\r
+\r
+    case relax:\r
+      print_esc("relax");\r
+      break;\r
+\r
+    case set_box:\r
+      print_esc("setbox");\r
+      break;\r
+\r
+    case set_prev_graf:\r
+      print_esc("prevgraf");\r
+      break;\r
+\r
+    case set_shape:\r
+      print_esc("parshape");\r
+      break;\r
+\r
+    case the:\r
+      print_esc("the");\r
+      break;\r
+\r
+    case toks_register:\r
+      print_esc("toks");\r
+      break;\r
+\r
+    case vadjust:\r
+      print_esc("vadjust");\r
+      break;\r
+\r
+    case valign:\r
+      print_esc("valign");\r
+      break;\r
+\r
+    case vcenter:\r
+      print_esc("vcenter");\r
+      break;\r
+\r
+    case vrule:\r
+      print_esc("vrule");\r
+      break;\r
+\r
+    case par_end:\r
+      print_esc("par");\r
+      break;\r
+\r
+    case input:\r
+      if (chr_code == 0)\r
+        print_esc("input");\r
+      else\r
+        print_esc("endinput");\r
+      break;\r
+\r
+    case top_bot_mark:\r
+      switch (chr_code)\r
+      {\r
+        case first_mark_code:\r
+          print_esc("firstmark");\r
+          break;\r
+\r
+        case bot_mark_code:\r
+          print_esc("botmark");\r
+          break;\r
+\r
+        case split_first_mark_code:\r
+          print_esc("splitfirstmark");\r
+          break;\r
+\r
+        case split_bot_mark_code:\r
+          print_esc("splitbotmark");\r
+          break;\r
+\r
+        default:\r
+          print_esc("topmark");\r
+          break;\r
+      }\r
+      break;\r
+\r
+    case tex_register:\r
+      if (chr_code == int_val)\r
+        print_esc("count");\r
+      else if (chr_code == dimen_val)\r
+        print_esc("dimen");\r
+      else if (chr_code == glue_val)\r
+        print_esc("skip");\r
+      else\r
+        print_esc("muskip");\r
+      break;\r
+\r
+    case set_aux:\r
+      if (chr_code == vmode)\r
+        print_esc("prevdepth");\r
+      else\r
+        print_esc("spacefactor");\r
+      break;\r
+\r
+    case set_page_int:\r
+      if (chr_code == 0)\r
+        print_esc("deadcycles");\r
+      else\r
+        print_esc("insertpenalties");\r
+      break;\r
+\r
+    case set_box_dimen:\r
+      if (chr_code == width_offset)\r
+        print_esc("wd");\r
+      else if (chr_code == height_offset)\r
+        print_esc("ht");\r
+      else\r
+        print_esc("dp");\r
+      break;\r
+\r
+    case last_item:\r
+      switch (chr_code)\r
+      {\r
+        case int_val:\r
+          print_esc("lastpenalty");\r
+          break;\r
+\r
+        case dimen_val:\r
+          print_esc("lastkern");\r
+          break;\r
+\r
+        case glue_val:\r
+          print_esc("lastskip");\r
+          break;\r
+\r
+        case input_line_no_code:\r
+          print_esc("inputlineno");\r
+          break;\r
+\r
+        default:\r
+          print_esc("badness");\r
+          break;\r
+      }\r
+      break;\r
+\r
+    case convert:\r
+      switch (chr_code)\r
+      {\r
+        case number_code:\r
+          print_esc("number");\r
+          break;\r
+\r
+        case roman_numeral_code:\r
+          print_esc("romannumeral");\r
+          break;\r
+\r
+        case string_code:\r
+          print_esc("string");\r
+          break;\r
+\r
+        case meaning_code:\r
+          print_esc("meaning");\r
+          break;\r
+\r
+        case font_name_code:\r
+          print_esc("fontname");\r
+          break;\r
+\r
+        default:\r
+          print_esc("jobname");\r
+          break;\r
+      }\r
+      break;\r
+\r
+    case if_test:\r
+      switch (chr_code)\r
+      {\r
+        case if_cat_code:\r
+          print_esc("ifcat");\r
+          break;\r
+\r
+        case if_int_code:\r
+          print_esc("ifnum");\r
+          break;\r
+\r
+        case if_dim_code:\r
+          print_esc("ifdim");\r
+          break;\r
+\r
+        case if_odd_code:\r
+          print_esc("ifodd");\r
+          break;\r
+\r
+        case if_vmode_code:\r
+          print_esc("ifvmode");\r
+          break;\r
+\r
+        case if_hmode_code:\r
+          print_esc("ifhmode");\r
+          break;\r
+\r
+        case if_mmode_code:\r
+          print_esc("ifmmode");\r
+          break;\r
+\r
+        case if_inner_code:\r
+          print_esc("ifinner");\r
+          break;\r
+\r
+        case if_void_code:\r
+          print_esc("ifvoid");\r
+          break;\r
+\r
+        case if_hbox_code:\r
+          print_esc("ifhbox");\r
+          break;\r
+\r
+        case if_vbox_code:\r
+          print_esc("ifvbox");\r
+          break;\r
+\r
+        case ifx_code:\r
+          print_esc("ifx");\r
+          break;\r
+\r
+        case if_eof_code:\r
+          print_esc("ifeof");\r
+          break;\r
+\r
+        case if_true_code:\r
+          print_esc("iftrue");\r
+          break;\r
+\r
+        case if_false_code:\r
+          print_esc("iffalse");\r
+          break;\r
+\r
+        case if_case_code:\r
+          print_esc("ifcase");\r
+          break;\r
+\r
+        default:\r
+          print_esc("if");\r
+          break;\r
+      }\r
+      break;\r
+\r
+    case fi_or_else:\r
+      if (chr_code == fi_code)\r
+        print_esc("fi");\r
+      else if (chr_code == or_code)\r
+        print_esc("or");\r
+      else\r
+        print_esc("else");\r
+      break;\r
+\r
+    case tab_mark:\r
+      if (chr_code == span_code)\r
+        print_esc("span");\r
+      else\r
+      {\r
+        prints("alignment tab character ");\r
+        print(chr_code);\r
+      }\r
+      break;\r
+\r
+    case car_ret:\r
+      if (chr_code == cr_code)\r
+        print_esc("cr");\r
+      else\r
+        print_esc("crcr");\r
+      break;\r
+\r
+    case set_page_dimen:\r
+      switch (chr_code)\r
+      {\r
+        case 0:\r
+          print_esc("pagegoal");\r
+          break;\r
+\r
+        case 1:\r
+          print_esc("pagetotal");\r
+          break;\r
+\r
+        case 2:\r
+          print_esc("pagestretch");\r
+          break;\r
+\r
+        case 3:\r
+          print_esc("pagefilstretch");\r
+          break;\r
+\r
+        case 4:\r
+          print_esc("pagefillstretch");\r
+          break;\r
+\r
+        case 5:\r
+          print_esc("pagefilllstretch");\r
+          break;\r
+\r
+        case 6:\r
+          print_esc("pageshrink");\r
+          break;\r
+\r
+        default:\r
+          print_esc("pagedepth");\r
+          break;\r
+      }\r
+      break;\r
+\r
+    case stop:\r
+      if (chr_code == 1)\r
+        print_esc("dump");\r
+      else\r
+        print_esc("end");\r
+      break;\r
+\r
+    case hskip:\r
+      switch (chr_code)\r
+      {\r
+        case skip_code:\r
+          print_esc("hskip");\r
+          break;\r
+\r
+        case fil_code:\r
+          print_esc("hfil");\r
+          break;\r
+\r
+        case fill_code:\r
+          print_esc("hfill");\r
+          break;\r
+\r
+        case ss_code:\r
+          print_esc("hss");\r
+          break;\r
+\r
+        default:\r
+          print_esc("hfilneg");\r
+          break;\r
+      }\r
+      break;\r
+\r
+    case vskip:\r
+      switch (chr_code)\r
+      {\r
+        case skip_code:\r
+          print_esc("vskip");\r
+          break;\r
+\r
+        case fil_code:\r
+          print_esc("vfil");\r
+          break;\r
+\r
+        case fill_code:\r
+          print_esc("vfill");\r
+          break;\r
+\r
+        case ss_code:\r
+          print_esc("vss");\r
+          break;\r
+\r
+        default:\r
+          print_esc("vfilneg");\r
+          break;\r
+      }\r
+      break;\r
+\r
+    case mskip:\r
+      print_esc("mskip");\r
+      break;\r
+\r
+    case kern:\r
+      print_esc("kern");\r
+      break;\r
+\r
+    case mkern:\r
+      print_esc("mkern");\r
+      break;\r
+\r
+    case hmove:\r
+      if (chr_code == 1)\r
+        print_esc("moveleft");\r
+      else\r
+        print_esc("moveright");\r
+      break;\r
+\r
+    case vmove:\r
+      if (chr_code == 1)\r
+        print_esc("raise");\r
+      else\r
+        print_esc("lower");\r
+      break;\r
+\r
+    case make_box:\r
+      switch (chr_code)\r
+      {\r
+        case box_code:\r
+          print_esc("box");\r
+          break;\r
+\r
+        case copy_code:\r
+          print_esc("copy");\r
+          break;\r
+\r
+        case last_box_code:\r
+          print_esc("lastbox");\r
+          break;\r
+\r
+        case vsplit_code:\r
+          print_esc("vsplit");\r
+          break;\r
+\r
+        case vtop_code:\r
+          print_esc("vtop");\r
+          break;\r
+\r
+        case vtop_code + vmode:\r
+          print_esc("vbox");\r
+          break;\r
+\r
+        default:\r
+          print_esc("hbox");\r
+          break;\r
+      }\r
+      break;\r
+\r
+    case leader_ship:\r
+      if (chr_code == a_leaders)\r
+        print_esc("leaders");\r
+      else if (chr_code == c_leaders)\r
+        print_esc("cleaders");\r
+      else if (chr_code == x_leaders)\r
+        print_esc("xleaders");\r
+      else\r
+        print_esc("shipout");\r
+      break;\r
+\r
+    case start_par:\r
+      if (chr_code == 0)\r
+        print_esc("noindent");\r
+      else\r
+        print_esc("indent");\r
+      break;\r
+\r
+    case remove_item:\r
+      if (chr_code == glue_node)\r
+        print_esc("unskip");\r
+      else if (chr_code == kern_node)\r
+        print_esc("unkern");\r
+      else\r
+        print_esc("unpenalty");\r
+      break;\r
+\r
+    case un_hbox:\r
+      if (chr_code == copy_code)\r
+        print_esc("unhcopy");\r
+      else\r
+        print_esc("unhbox");\r
+      break;\r
+\r
+    case un_vbox:\r
+      if (chr_code == copy_code)\r
+        print_esc("unvcopy");\r
+      else\r
+        print_esc("unvbox");\r
+      break;\r
+\r
+    case discretionary:\r
+      if (chr_code == 1)\r
+        print_esc("-");\r
+      else\r
+        print_esc("discretionary");\r
+      break;\r
+\r
+    case eq_no:\r
+      if (chr_code == 1)\r
+        print_esc("leqno");\r
+      else\r
+        print_esc("eqno");\r
+      break;\r
+\r
+    case math_comp:\r
+      switch (chr_code)\r
+      {\r
+        case ord_noad:\r
+          print_esc("mathord");\r
+          break;\r
+\r
+        case op_noad:\r
+          print_esc("mathop");\r
+          break;\r
+\r
+        case bin_noad:\r
+          print_esc("mathbin");\r
+          break;\r
+\r
+        case rel_noad:\r
+          print_esc("mathrel");\r
+          break;\r
+\r
+        case open_noad:\r
+          print_esc("mathopen");\r
+          break;\r
+\r
+        case close_noad:\r
+          print_esc("mathclose");\r
+          break;\r
+\r
+        case punct_noad:\r
+          print_esc("mathpunct");\r
+          break;\r
+\r
+        case inner_noad:\r
+          print_esc("mathinner");\r
+          break;\r
+\r
+        case under_noad:\r
+          print_esc("underline");\r
+          break;\r
+\r
+        default:\r
+          print_esc("overline");\r
+          break;\r
+      }\r
+      break;\r
+\r
+    case limit_switch:\r
+      if (chr_code == limits)\r
+        print_esc("limits");\r
+      else if (chr_code == no_limits)\r
+        print_esc("nolimits");\r
+      else\r
+        print_esc("displaylimits");\r
+      break;\r
+\r
+    case math_style:\r
+      print_style(chr_code);\r
+      break;\r
+\r
+    case above:\r
+      switch (chr_code)\r
+      {\r
+        case over_code:\r
+          print_esc("over");\r
+          break;\r
+\r
+        case atop_code:\r
+          print_esc("atop");\r
+          break;\r
+\r
+        case delimited_code + above_code:\r
+          print_esc("abovewithdelims");\r
+          break;\r
+\r
+        case delimited_code + over_code:\r
+          print_esc("overwithdelims");\r
+          break;\r
+\r
+        case delimited_code + atop_code:\r
+          print_esc("atopwithdelims");\r
+          break;\r
+\r
+        default:\r
+          print_esc("above");\r
+          break;\r
+      }\r
+      break;\r
+\r
+    case left_right:\r
+      if (chr_code == left_noad)\r
+        print_esc("left");\r
+      else\r
+        print_esc("right");\r
+      break;\r
+\r
+    case prefix:\r
+      if (chr_code == 1)\r
+        print_esc("long");\r
+      else if (chr_code == 2)\r
+        print_esc("outer");\r
+      else\r
+        print_esc("global");\r
+      break;\r
+\r
+    case def:\r
+      if (chr_code == 0)\r
+        print_esc("def");\r
+      else if (chr_code == 1)\r
+        print_esc("gdef");\r
+      else if (chr_code == 2)\r
+        print_esc("edef");\r
+      else\r
+        print_esc("xdef");\r
+      break;\r
+\r
+    case let:\r
+      if (chr_code != normal)\r
+        print_esc("futurelet");\r
+      else\r
+        print_esc("let");\r
+      break;\r
+\r
+    case shorthand_def:\r
+      switch (chr_code)\r
+      {\r
+        case char_def_code:\r
+          print_esc("chardef");\r
+          break;\r
+\r
+        case math_char_def_code:\r
+          print_esc("mathchardef");\r
+          break;\r
+\r
+        case count_def_code:\r
+          print_esc("countdef");\r
+          break;\r
+\r
+        case dimen_def_code:\r
+          print_esc("dimendef");\r
+          break;\r
+\r
+        case skip_def_code:\r
+          print_esc("skipdef");\r
+          break;\r
+\r
+        case mu_skip_def_code:\r
+          print_esc("muskipdef");\r
+          break;\r
+\r
+        default:\r
+          print_esc("toksdef");\r
+          break;\r
+      }\r
+      break;\r
+\r
+    case char_given:\r
+      print_esc("char");\r
+      print_hex(chr_code);\r
+      break;\r
+\r
+    case math_given:\r
+      print_esc("mathchar");\r
+      print_hex(chr_code);\r
+      break;\r
+\r
+    case def_code:\r
+      if (chr_code == cat_code_base)\r
+        print_esc("catcode");\r
+      else if (chr_code == math_code_base)\r
+        print_esc("mathcode");\r
+      else if (chr_code == lc_code_base)\r
+        print_esc("lccode");\r
+      else if (chr_code == uc_code_base)\r
+        print_esc("uccode");\r
+      else if (chr_code == sf_code_base)\r
+        print_esc("sfcode");\r
+      else\r
+        print_esc("delcode");\r
+      break;\r
+\r
+    case def_family:\r
+      print_size(chr_code - math_font_base);\r
+      break; \r
+\r
+    case hyph_data:\r
+      if (chr_code == 1)\r
+        print_esc("patterns");\r
+      else\r
+        print_esc("hyphenation");\r
+      break;\r
+\r
+    case assign_font_int:\r
+      if (chr_code == 0)\r
+        print_esc("hyphenchar");\r
+      else\r
+        print_esc("skewchar");\r
+      break;\r
+\r
+    case set_font:\r
+      prints("select font ");\r
+      slow_print(font_name[chr_code]);\r
+\r
+      if (font_size[chr_code] != font_dsize[chr_code])\r
+      {\r
+        prints(" at ");\r
+        print_scaled(font_size[chr_code]);\r
+        prints("pt");\r
+      }\r
+      break;\r
+\r
+    case set_interaction:\r
+      switch (chr_code)\r
+      {\r
+        case batch_mode:\r
+          print_esc("batchmode");\r
+          break;\r
+\r
+        case nonstop_mode:\r
+          print_esc("nonstopmode");\r
+          break;\r
+\r
+        case scroll_mode:\r
+          print_esc("scrollmode");\r
+          break;\r
+\r
+        default:\r
+          print_esc("errorstopmode");\r
+          break;\r
+      }\r
+      break;\r
+\r
+    case in_stream:\r
+      if (chr_code == 0)\r
+        print_esc("closein");\r
+      else\r
+        print_esc("openin");\r
+      break;\r
+\r
+    case message:\r
+      if (chr_code == 0)\r
+        print_esc("message");\r
+      else\r
+        print_esc("errmessage");\r
+      break;\r
+\r
+    case case_shift:\r
+      if (chr_code == lc_code_base)\r
+        print_esc("lowercase");\r
+      else\r
+        print_esc("uppercase");\r
+      break;\r
+\r
+    case xray:\r
+      switch (chr_code)\r
+      {\r
+        case show_box_code:\r
+          print_esc("showbox");\r
+          break;\r
+\r
+        case show_the_code:\r
+          print_esc("showthe");\r
+          break;\r
+\r
+        case show_lists:\r
+          print_esc("showlists");\r
+          break;\r
+\r
+        default:\r
+          print_esc("show");\r
+          break;\r
+      }\r
+      break;\r
+\r
+    case undefined_cs:\r
+      prints("undefined");\r
+      break;\r
+\r
+    case call:\r
+      prints("macro");\r
+      break;\r
+\r
+    case long_call:\r
+      print_esc("long macro");\r
+      break;\r
+\r
+    case outer_call:\r
+      print_esc("outer macro");\r
+      break;\r
+\r
+    case long_outer_call:\r
+      print_esc("long");\r
+      print_esc("outer macro");\r
+      break;\r
+\r
+    case end_template:\r
+      print_esc("outer endtemplate");\r
+      break;\r
+\r
+    case extension:\r
+      switch (chr_code)\r
+      {\r
+        case open_node:\r
+          print_esc("openout");\r
+          break;\r
+\r
+        case write_node:\r
+          print_esc("write");\r
+          break;\r
+\r
+        case close_node:\r
+          print_esc("closeout");\r
+          break;\r
+\r
+        case special_node:\r
+          print_esc("special");\r
+          break;\r
+\r
+        case immediate_code:\r
+          print_esc("immediate");\r
+          break;\r
+\r
+        case set_language_code:\r
+          print_esc("setlanguage");\r
+          break;\r
+\r
+        default:\r
+          prints("[unknown extension!]");\r
+          break;\r
+      }\r
+      break;\r
+\r
+    default:\r
+      prints("[unknown command code!]");\r
+      break;\r
+  }\r
+}\r
+#ifdef STAT\r
+/* sec 0252 */\r
+void show_eqtb (pointer n)\r
+{ \r
+  if (n < active_base)\r
+    print_char('?');\r
+  else if (n < glue_base)\r
+  {\r
+    sprint_cs(n);\r
+    print_char('=');\r
+    print_cmd_chr(eq_type(n), equiv(n));\r
+    \r
+    if (eq_type(n) >= call)\r
+    {\r
+      print_char(':');\r
+      show_token_list(link(equiv(n)), 0, 32);\r
+    }\r
+  }\r
+  else if (n < local_base)\r
+    if (n < skip_base)\r
+    {\r
+      print_skip_param(n - glue_base);\r
+      print_char('=');\r
+      \r
+      if (n < glue_base + thin_mu_skip_code)\r
+        print_spec(equiv(n), "pt");\r
+      else\r
+        print_spec(equiv(n), "mu");\r
+    }\r
+    else if (n < mu_skip_base)\r
+    {\r
+      print_esc("skip");\r
+      print_int(n - skip_base);\r
+      print_char('=');\r
+      print_spec(equiv(n), "pt");\r
+    }\r
+    else\r
+    {\r
+      print_esc("muskip");\r
+      print_int(n - mu_skip_base);\r
+      print_char('=');\r
+      print_spec(equiv(n), "mu");\r
+    }\r
+  else if (n < int_base)\r
+    if (n == par_shape_loc)\r
+    {\r
+      print_esc("parshape");\r
+      print_char('=');\r
+      \r
+      if (par_shape_ptr == 0)\r
+        print_char('0');\r
+      else\r
+        print_int(info(par_shape_ptr));\r
+    }\r
+    else if (n < toks_base)\r
+    {\r
+      print_cmd_chr(assign_toks, n);\r
+      print_char('=');\r
+      \r
+      if (equiv(n) != 0)\r
+        show_token_list(link(equiv(n)), 0, 32);\r
+    }\r
+    else if (n < box_base)\r
+    {\r
+      print_esc("toks");\r
+      print_int(n - toks_base);\r
+      print_char('=');\r
+      \r
+      if (equiv(n) != 0)\r
+        show_token_list(link(equiv(n)), 0, 32);\r
+    }\r
+    else if (n < cur_font_loc)\r
+    {\r
+      print_esc("box");\r
+      print_int(n - box_base);\r
+      print_char('=');\r
+      \r
+      if (equiv(n) == 0)\r
+        prints("void");\r
+      else\r
+      {\r
+        depth_threshold = 0;\r
+        breadth_max = 1;\r
+        show_node_list(equiv(n));\r
+      }\r
+    }\r
+    else if (n < cat_code_base)\r
+    {\r
+      if (n == cur_font_loc)\r
+        prints("current font");\r
+      else if (n < math_font_base + 16)\r
+      {\r
+        print_esc("textfont");\r
+        print_int(n - math_font_base);\r
+      }\r
+      else if (n < math_font_base + 32)\r
+      {\r
+        print_esc("scriptfont");\r
+        print_int(n - math_font_base - 16);\r
+      }\r
+      else\r
+      {\r
+        print_esc("scriptscriptfont");\r
+        print_int(n - math_font_base - 32);\r
+      }\r
+      \r
+      print_char('=');\r
+      print_esc("");\r
+      print(hash[font_id_base + equiv(n)].rh);\r
+    }\r
+    else if (n < math_code_base)\r
+    {\r
+      if (n < lc_code_base)\r
+      {\r
+        print_esc("catcode");\r
+        print_int(n - cat_code_base);\r
+      }\r
+      else if (n < uc_code_base)\r
+      {\r
+        print_esc("lccode");\r
+        print_int(n - lc_code_base);\r
+      }\r
+      else if (n < sf_code_base)\r
+      {\r
+        print_esc("uccode");\r
+        print_int(n - uc_code_base);\r
+      }\r
+      else\r
+      {\r
+        print_esc("sfcode");\r
+        print_int(n - sf_code_base);\r
+      }\r
+      \r
+      print_char('=');\r
+      print_int(equiv(n));\r
+    }\r
+    else\r
+    {\r
+      print_esc("mathcode");\r
+      print_int(n - math_code_base);\r
+      print_char('=');\r
+      print_int(equiv(n));\r
+    }\r
+  else if (n < dimen_base)\r
+  {\r
+    if (n < count_base)\r
+      print_param(n - int_base);\r
+    else if (n < del_code_base)\r
+    {\r
+      print_esc("count");\r
+      print_int(n - count_base);\r
+    }\r
+    else\r
+    {\r
+      print_esc("delcode");\r
+      print_int(n - del_code_base);\r
+    }\r
+    \r
+    print_char('=');\r
+    print_int(eqtb[n].cint);\r
+  }\r
+  else if (n <= eqtb_size)\r
+  {\r
+    if (n < scaled_base)\r
+      print_length_param(n - dimen_base);\r
+    else\r
+    {\r
+      print_esc("dimen");\r
+      print_int(n - scaled_base);\r
+    }\r
+    \r
+    print_char('=');\r
+    print_scaled(eqtb[n].cint);\r
+    prints("pt");\r
+  }\r
+  else\r
+    print_char('?');\r
+}\r
+#endif\r
+/* sec 0259 */\r
+pointer id_lookup_(integer j, integer l)\r
+{\r
+  integer h;\r
+  integer d;\r
+  pointer p;\r
+  pointer k;\r
+\r
+  h = buffer[j];\r
+\r
+  for (k = j + 1; k <= j + l - 1; k++)\r
+  {\r
+    h = h + h + buffer[k];\r
+\r
+    while (h >= hash_prime)\r
+      h = h - hash_prime;\r
+  }\r
+\r
+  p = h + hash_base;\r
+\r
+  while (true)\r
+  {\r
+    if (text(p) > 0)\r
+      if (length(text(p)) == l)\r
+        if (str_eq_buf(text(p), j))\r
+          goto found;\r
+\r
+    if (next(p) == 0)\r
+    {\r
+      if (no_new_control_sequence)\r
+        p = undefined_control_sequence;\r
+      else\r
+      {\r
+        if (text(p) > 0)\r
+        {\r
+          do\r
+            {\r
+              if (hash_is_full)\r
+              {\r
+                overflow("hash size", hash_size + hash_extra);\r
+                /* not dynamic        ^~~~~~~~~~~~~~~~~~~~~~*/\r
+                return 0;\r
+              }\r
+\r
+              decr(hash_used);\r
+            }\r
+          while (!(text(hash_used) == 0));\r
+\r
+          next(p) = hash_used;\r
+          p = hash_used;\r
+        }\r
+\r
+        str_room(l);\r
+        d = cur_length;\r
+\r
+        while (pool_ptr > str_start[str_ptr])\r
+        {\r
+          decr(pool_ptr);\r
+          str_pool[pool_ptr + l] = str_pool[pool_ptr];\r
+        }\r
+\r
+        for (k = j; k <= j + l - 1; k++)\r
+          append_char(buffer[k]);\r
+\r
+        text(p) = make_string();\r
+        pool_ptr = pool_ptr + d;\r
+\r
+#ifdef STAT\r
+        incr(cs_count);\r
+\r
+        if (trace_flag)\r
+        {\r
+          str_pool[pool_ptr] = '\0';\r
+          printf(" tex1.c incr(cs_count): '%s' ", &str_pool[pool_ptr - l - d]);\r
+        }\r
+#endif\r
+      }\r
+\r
+      goto found;\r
+    }\r
+\r
+    p = next(p);\r
+  } \r
+\r
+found:\r
+  return p;\r
+}\r
+/* sec 0274 */\r
+void new_save_level (group_code c)\r
+{\r
+  check_full_save_stack();\r
+  save_type(save_ptr) = level_boundary;\r
+  save_level(save_ptr) = (quarterword) cur_group; \r
+  save_index(save_ptr) = cur_boundary;\r
+\r
+  if (cur_level == max_quarterword)\r
+  {\r
+    overflow("grouping levels", max_quarterword - min_quarterword);\r
+    return;\r
+  }\r
+\r
+  cur_boundary = save_ptr;\r
+  incr(cur_level);\r
+  incr(save_ptr);\r
+  cur_group = c;\r
+}\r
+/* sec 0275 */\r
+void eq_destroy (memory_word w)\r
+{\r
+  pointer q;\r
+\r
+  switch (eq_type_field(w))\r
+  {\r
+    case call:\r
+    case long_call:\r
+    case outer_call:\r
+    case long_outer_call:\r
+      delete_token_ref(equiv_field(w));\r
+      break;\r
+\r
+    case glue_ref:\r
+      delete_glue_ref(equiv_field(w));\r
+      break;\r
+\r
+    case shape_ref:\r
+      q = equiv_field(w);\r
+\r
+      if (q != 0)\r
+        free_node(q, info(q) + info(q) + 1);\r
+      break;\r
+\r
+    case box_ref:\r
+      flush_node_list(equiv_field(w));\r
+      break;\r
+\r
+    default:\r
+      break;\r
+  }\r
+}\r
+/* sec 0276 */\r
+void eq_save (pointer p, quarterword l)\r
+{\r
+  check_full_save_stack();\r
+\r
+  if (l == level_zero)\r
+    save_type(save_ptr) = restore_zero;\r
+  else\r
+  {\r
+    save_stack[save_ptr] = eqtb[p];\r
+    incr(save_ptr);\r
+    save_type(save_ptr) = restore_old_value;\r
+  }\r
+\r
+  save_level(save_ptr) = l;\r
+  save_index(save_ptr) = p;\r
+  incr(save_ptr);\r
+}\r
+/* sec 0277 */\r
+void eq_define_(pointer p, quarterword t, halfword e)\r
+{\r
+  if (eq_level(p) == cur_level)\r
+    eq_destroy(eqtb[p]);\r
+  else if (cur_level > level_one)\r
+    eq_save(p, eq_level(p));\r
+\r
+  eq_level(p) = (quarterword) cur_level;\r
+  eq_type(p) = t;\r
+  equiv(p) = e;\r
+}\r
+/* sec 0278 */\r
+void eq_word_define_(pointer p, integer w)\r
+{\r
+  if (xeq_level[p] != cur_level)\r
+  {\r
+    eq_save(p, xeq_level[p]);\r
+    xeq_level[p] = (quarterword) cur_level;\r
+  }\r
+\r
+  eqtb[p].cint = w;\r
+}\r
+/* sec 0279 */\r
+void geq_define_(pointer p, quarterword t, halfword e)\r
+{\r
+  eq_destroy(eqtb[p]);\r
+  eq_level(p) = level_one;\r
+  eq_type(p) = t;\r
+  equiv(p) = e;\r
+}\r
+/* sec 0279 */\r
+void geq_word_define_(pointer p, integer w)\r
+{\r
+  eqtb[p].cint = w;\r
+  xeq_level[p]= level_one;\r
+}\r
+/* sec 0280 */\r
+void save_for_after (halfword t)\r
+{ \r
+  if (cur_level > level_one)\r
+  {\r
+    check_full_save_stack();\r
+    save_type(save_ptr) = insert_token;\r
+    save_level(save_ptr) = level_zero;\r
+    save_index(save_ptr) = t;\r
+    incr(save_ptr);\r
+  }\r
 }
\ No newline at end of file
index 3f2ff0d..fc060d1 100644 (file)
-/* Copyright 2014 Clerk Ma
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301 USA.  */
-
-#define EXTERN extern
-
-#include "yandytex.h"
-
-/* following bit used to be end of tex1.c */
-#ifdef STAT
-/* sec 0284 */
-void restore_trace (pointer p, const char * s)
-{
-  begin_diagnostic();
-  print_char('{');
-  prints(s);
-  print_char(' ');
-  show_eqtb(p);
-  print_char('}');
-  end_diagnostic(false);
-}
-#endif
-/* sec 0281 */
-void unsave (void)
-{
-  pointer p;
-  quarterword l;
-  halfword t;
-
-  if (cur_level > level_one)
-  {
-    decr(cur_level);
-
-    while (true)
-    {
-      decr(save_ptr);
-
-      if (save_type(save_ptr) == level_boundary)
-        goto done;
-
-      p = save_index(save_ptr);
-
-      if (save_type(save_ptr) == insert_token)
-      {
-        t = cur_tok;
-        cur_tok = p;
-        back_input();
-        cur_tok = t;
-      }
-      else
-      {
-        if (save_type(save_ptr) == restore_old_value)
-        {
-          l = save_level(save_ptr);
-          decr(save_ptr);
-        }
-        else
-          save_stack[save_ptr] = eqtb[undefined_control_sequence];
-        
-        if (p < int_base)
-          if (eq_level(p) == level_one)
-          {
-            eq_destroy(save_stack[save_ptr]);
-#ifdef STAT
-            if (tracing_restores > 0)
-              restore_trace(p, "retaining");
-#endif
-          }
-          else
-          {
-            eq_destroy(eqtb[p]);
-            eqtb[p] = save_stack[save_ptr];
-#ifdef STAT
-            if (tracing_restores > 0)
-              restore_trace(p, "restoring");
-#endif
-          }
-        else if (xeq_level[p] != level_one)
-        {
-          eqtb[p] = save_stack[save_ptr];
-          xeq_level[p] = l;
-#ifdef STAT
-          if (tracing_restores > 0)
-            restore_trace(p, "restoring");
-#endif
-        }
-        else
-        {
-#ifdef STAT
-          if (tracing_restores > 0)
-            restore_trace(p, "retaining");
-#endif
-        }
-      }
-    }
-
-done:
-    cur_group = save_level(save_ptr);
-    cur_boundary = save_index(save_ptr);
-  }
-  else
-  {
-    confusion("curlevel");
-    return;
-  }
-}
-/* sec 0288 */
-void prepare_mag (void) 
-{
-  if ((mag_set > 0) && (mag != mag_set))
-  {
-    print_err("Incompatible magnification (");
-    print_int(mag);
-    prints(");");
-    print_nl(" the previous value will be retained");
-    help2("I can handle only one magnification ratio per job. So I've",
-        "reverted to the magnification you used earlier on this run.");
-    int_error(mag_set);
-    geq_word_define(int_base + mag_code, mag_set);
-  }
-
-  if ((mag <= 0) || (mag > 32768L))
-  {
-    print_err("Illegal magnification has been changed to 1000");
-    help1("The magnification ratio must be between 1 and 32768.");
-    int_error(mag);
-    geq_word_define(int_base + mag_code, 1000);
-  }
-
-  mag_set = mag;
-}
-/* sec 0295 */
-void token_show (pointer p)
-{
-  if (p != 0)
-    show_token_list(link(p), 0, 10000000L);
-}
-/* sec 0296 */
-void print_meaning (void) 
-{
-  print_cmd_chr(cur_cmd, cur_chr);
-
-  if (cur_cmd >= call)
-  {
-    print_char(':');
-    print_ln();
-    token_show(cur_chr);
-  }
-  else if (cur_cmd == top_bot_mark)
-  {
-    print_char(':');
-    print_ln();
-    token_show(cur_mark[cur_chr]);
-  }
-}
-/* sec 0299 */
-void show_cur_cmd_chr (void)
-{ 
-  begin_diagnostic();
-  print_nl("{");
-
-  if (mode != shown_mode)
-  {
-    print_mode(mode);
-    prints(": ");
-    shown_mode = mode;
-  }
-
-  print_cmd_chr(cur_cmd, cur_chr);
-  print_char('}');
-  end_diagnostic(false);
-}
-/* sec 0311 */
-void show_context (void)
-{
-  char old_setting;
-  integer nn;
-  boolean bottom_line;
-  integer i;
-  integer j;
-  integer l;
-  integer m;
-  integer n;
-  integer p;
-  integer q;
-
-  base_ptr = input_ptr;
-  input_stack[base_ptr] = cur_input;
-  nn = -1;
-  bottom_line = false;
-
-  while (true)
-  {
-    cur_input = input_stack[base_ptr];
-
-    if ((state != token_list))
-      if ((name > 17) || (base_ptr == 0))
-        bottom_line = true;
-
-    if ((base_ptr == input_ptr) || bottom_line || (nn < error_context_lines))
-    {
-      if ((base_ptr == input_ptr) || (state != token_list) ||
-          (index != backed_up) || (loc != 0))
-      {
-        tally = 0;
-        old_setting = selector;
-
-        if (state != token_list)
-        {
-          if (name <= 17)
-            if (name == 0)
-              if (base_ptr == 0)
-                print_nl("<*>");
-              else
-                print_nl("<insert> ");
-            else
-            {
-              print_nl("<read ");
-
-              if (name == 17)
-                print_char('*');
-              else
-                print_int(name - 1);
-
-              print_char('>');
-            }
-          else
-          {
-            if (c_style_flag)
-            {
-              print_ln();
-
-              if (name > 17)
-                print(name);
-
-              print_char('(');
-              print_int(line);
-              prints(") :");
-            }
-            else
-            {
-              print_nl("l.");
-              print_int(line);
-            }
-          }
-
-          print_char(' ');
-          begin_pseudoprint();
-
-          if (buffer[limit] == end_line_char)
-            j = limit;
-          else
-            j = limit + 1;
-
-          if (j > 0)
-            for (i = start; i <= j - 1; i++)
-            {
-              if (i == loc)
-                set_trick_count();
-
-              print(buffer[i]);
-            }
-        }
-        else
-        {
-          switch (index)
-          {
-            case parameter:
-              print_nl("<argument> ");
-              break;
-
-            case u_template:
-            case v_template:
-              print_nl("<template> ");
-              break;
-
-            case backed_up:
-              if (loc == 0)
-                print_nl("<recently read> ");
-              else
-                print_nl("<to be read again> ");
-              break;
-
-            case inserted:
-              print_nl("<inserted text> ");
-              break;
-
-            case macro:
-              print_ln();
-              print_cs(name);
-              break;
-
-            case output_text:
-              print_nl("<output> ");
-              break;
-
-            case every_par_text:
-              print_nl("<everypar> ");
-              break;
-
-            case every_math_text:
-              print_nl("<everymath> ");
-              break;
-
-            case every_display_text:
-              print_nl("<everydisplay> ");
-              break;
-
-            case every_hbox_text:
-              print_nl("<everyhbox> ");
-              break;
-
-            case every_vbox_text:
-              print_nl("<everyvbox> ");
-              break;
-
-            case every_job_text:
-              print_nl("<everyjob> ");
-              break;
-
-            case every_cr_text:
-              print_nl("<everycr> ");
-              break;
-
-            case mark_text:
-              print_nl("<mark> ");
-              break;
-
-            case write_text:
-              print_nl("<write> ");
-              break;
-
-            default:
-              print_nl("?");
-              break;
-          }
-
-          begin_pseudoprint();
-
-          if (index < macro)
-            show_token_list(start, loc, 100000L);
-          else
-            show_token_list(link(start), loc, 100000L);
-        }
-
-        selector = old_setting;
-
-        if (trick_count == 1000000L)
-          set_trick_count();
-        
-        if (tally < trick_count)
-          m = tally - first_count;
-        else
-          m = trick_count - first_count;
-
-        if (l + first_count <= half_error_line)
-        {
-          p = 0;
-          n = l + first_count;
-        }
-        else
-        {
-          prints("...");
-          p = l + first_count - half_error_line + 3;
-          n = half_error_line;
-        }
-
-        for (q = p; q <= first_count - 1; q++)
-          print_char(trick_buf[q % error_line]);
-
-        print_ln();
-
-        for (q = 1; q <= n; q++)
-          print_char(' ');
-
-        if (m + n <= error_line)
-          p = first_count + m;
-        else
-          p = first_count +(error_line - n - 3);
-
-        for (q = first_count; q <= p - 1; q++)
-          print_char(trick_buf[q % error_line]);
-
-        if (m + n > error_line)
-          prints("...");
-
-        incr(nn);
-      }
-    }
-    else if (nn == error_context_lines)
-    {
-      print_nl("...");
-      incr(nn); 
-    }
-
-    if (bottom_line)
-      goto done;
-
-    decr(base_ptr);
-  }
-
-done:
-  cur_input = input_stack[input_ptr];
-}
-/* sec 0323 */
-void begin_token_list_ (pointer p, quarterword t)
-{
-  push_input();
-  state = token_list;
-  start = p;
-  index = t;
-
-  if (t >= macro)
-  {
-    add_token_ref(p);
-
-    if (t == macro)
-      limit = param_ptr;
-    else
-    {
-      loc = link(p);
-
-      if (tracing_macros > 1)
-      {
-        begin_diagnostic(); 
-        print_nl("");
-
-        switch (t)
-        {
-          case mark_text:
-            print_esc("mark");
-            break;
-
-          case write_text:
-            print_esc("write");
-            break;
-
-          default:
-            print_cmd_chr(assign_toks, t - output_text + output_routine_loc);
-            break;
-        }
-
-        prints("->");
-        token_show(p);
-        end_diagnostic(false);
-      }
-    }
-  }
-  else
-    loc = p;
-}
-/* sec 0324 */
-void end_token_list (void) 
-{ 
-  if (index >= backed_up)
-  {
-    if (index <= inserted)
-      flush_list(start); 
-    else
-    {
-      delete_token_ref(start);
-
-      if (index == macro)
-        while (param_ptr > limit)
-        {
-          decr(param_ptr);
-          flush_list(param_stack[param_ptr]);
-        }
-    }
-  }
-  else if (index == u_template)
-    if (align_state > 500000L)
-      align_state = 0;
-    else
-    {
-      fatal_error("(interwoven alignment preambles are not allowed)");
-      return;
-    }
-
-  pop_input();
-  check_interrupt();
-}
-/* sec 0325 */
-void back_input (void)
-{
-  pointer p;
-
-  while ((state == 0) && (loc == 0) &&
-      (index != v_template))
-  {
-    end_token_list();
-  }
-
-  p = get_avail();
-  info(p) = cur_tok;
-
-  if (cur_tok < right_brace_limit)
-    if (cur_tok < left_brace_limit)
-      decr(align_state);
-    else
-      incr(align_state);
-
-  push_input();
-  state = token_list;
-  start = p;
-  index = backed_up;
-  loc = p;
-}
-/* sec 0327 */
-void back_error (void)
-{
-  OK_to_interrupt = false;
-  back_input();
-  OK_to_interrupt = true;
-  error();
-}
-/* sec 0327 */
-void ins_error (void) 
-{
-  OK_to_interrupt = false;
-  back_input();
-  index = inserted;
-  OK_to_interrupt = true;
-  error();
-}
-/* sec 0328 */
-void begin_file_reading (void)
-{
-  if (in_open == max_in_open)
-  {
-    overflow("text input levels", max_in_open);
-    return;
-  }
-
-#ifdef ALLOCATEBUFFER
-  if (first == current_buf_size)
-    buffer = realloc_buffer(increment_buf_size);
-
-  if (first == current_buf_size)
-  {
-    overflow("buffer size", current_buf_size);
-    return;
-  }
-#else
-  if (first == buf_size)
-  {
-    overflow("buffer size", buf_size);
-    return;
-  }
-#endif
-
-  incr(in_open);
-
-  if (in_open > high_in_open) /* 1999 Jan 17 */
-    high_in_open = in_open;
-
-  push_input();
-  index = in_open;
-  line_stack[index] = line;
-  start = first;
-  state = mid_line;
-  name = 0;
-}
-/* sec 0329 */
-void end_file_reading (void)
-{
-  first = start;
-  line = line_stack[index];
-
-  if (name > 17)
-    a_close(cur_file);
-
-  pop_input();
-  decr(in_open);
-}
-/* called only form tex0.c */
-/* sec 0330 */
-void clear_for_error_prompt (void) 
-{
-  while ((state != 0) && (name == 0) &&
-    (input_ptr > 0) && (loc > limit))
-    end_file_reading();
-
-  print_ln();
-}
-/* sec 0336 */
-void check_outer_validity (void)
-{
-  pointer p;
-  pointer q;
-
-  if (scanner_status != 0)
-  {
-    deletions_allowed = false;
-
-    if (cur_cs != 0)
-    {
-      if ((state == 0) || (name < 1) || (name > 17))
-      {
-        p = get_avail();
-        info(p) = cs_token_flag + cur_cs;
-        back_list(p);
-      }
-
-      cur_cmd = spacer;
-      cur_chr = ' ';
-    }
-
-    if (scanner_status > skipping)
-    {
-      runaway();
-
-      if (cur_cs == 0)
-        print_err("File ended");
-      else
-      {
-        cur_cs = 0;
-        print_err("Forbidden control sequence found");
-      }
-
-      prints(" while scanning ");
-      p = get_avail();
-
-      switch (scanner_status)
-      {
-        case defining:
-          prints("definition");
-          info(p) = right_brace_token + '}';
-          break;
-
-        case matching:
-          prints("use");
-          info(p) = par_token;
-          long_state = outer_call;
-          break;
-
-        case aligning:
-          prints("preamble");
-          info(p) = right_brace_token + '}';
-          q = p;
-          p = get_avail();
-          link(p) = q;
-          info(p) = cs_token_flag + frozen_cr;
-          align_state = -1000000L;
-          break;
-
-        case absorbing:
-          prints("text");
-          info(p) = right_brace_token + '}';
-          break;
-      }
-
-      ins_list(p);
-      prints(" of ");
-      sprint_cs(warning_index);
-      help4("I suspect you have forgotten a `}', causing me",
-          "to read past where you wanted me to stop.",
-          "I'll try to recover; but if the error is serious,",
-          "you'd better type `E' or `X' now and fix your file.");
-      error();
-    }
-    else
-    {
-      print_err("Incomplete ");
-      print_cmd_chr(if_test, cur_if);
-      prints("; all text was ignored after line ");
-      print_int(skip_line);
-      help3("A forbidden control sequence occurred in skipped text.",
-          "This kind of error happens when you say `\\if...' and forget",
-          "the matching `\\fi'. I've inserted a `\\fi'; this might work.");
-
-      if (cur_cs != 0)
-        cur_cs = 0; 
-      else
-        help_line[2] = "The file ended while I was skipping conditional text.";
-
-      cur_tok = cs_token_flag + frozen_fi;
-      ins_error();
-    }
-
-    deletions_allowed = true;
-  }
-}
-/* sec 0363 */
-void firm_up_the_line (void)
-{
-  integer k;
-
-  limit = last;
-
-  if (pausing > 0)
-    if (interaction > nonstop_mode)
-    {
-      ;
-      print_ln();
-
-      if (start < limit)
-        for (k = start; k <= limit - 1; k++)
-          print(buffer[k]);
-
-      first = limit;
-      prompt_input("=>");
-
-      if (last > first)
-      {
-        for (k = first; k <= last - 1; k++)
-          buffer[k + start - first] = buffer[k];
-
-        limit = start + last - first;
-      }
-    }
-}
-/* sec 0365 */
-void get_token (void)
-{ 
-  no_new_control_sequence = false;
-  get_next();
-  no_new_control_sequence = true;
-
-  if (cur_cs == 0)
-    cur_tok = (cur_cmd * 256) + cur_chr;
-  else
-    cur_tok = cs_token_flag + cur_cs;
-}
-/* sec 0389 */
-void macro_call (void)
-{
-  pointer r;
-  pointer p;
-  pointer q;
-  pointer s;
-  pointer t;
-  pointer u, v;
-  pointer rbrace_ptr;
-  small_number n;
-  halfword unbalance;
-  halfword m;
-  pointer ref_count;
-  small_number save_scanner_status;
-  pointer save_warning_index;
-  ASCII_code match_chr;
-
-  save_scanner_status = scanner_status;
-  save_warning_index = warning_index;
-  warning_index = cur_cs;
-  ref_count = cur_chr;
-  r = link(ref_count);
-  n = 0;
-
-  if (tracing_macros > 0)
-  {
-    begin_diagnostic();
-    print_ln();
-    print_cs(warning_index);
-    token_show(ref_count);
-    end_diagnostic(false);
-  }
-
-  if (info(r) != end_match_token)
-  {
-    scanner_status = matching;
-    unbalance = 0;
-    long_state = eq_type(cur_cs);
-
-    if (long_state >= outer_call)
-      long_state = long_state - 2;
-
-    do
-      {
-        link(temp_head) = 0;
-
-        if ((info(r) > match_token + 255) || (info(r) < match_token))
-          s = 0;
-        else
-        {
-          match_chr = info(r) - match_token;
-          s = link(r);
-          r = s;
-          p = temp_head;
-          m = 0;
-        }
-
-continu:
-        get_token();
-
-        if (cur_tok == info(r))
-        {
-          r = link(r);
-
-          if ((info(r) >= match_token) && (info(r) <= end_match_token))
-          {
-            if (cur_tok < left_brace_limit)
-              decr(align_state);
-
-            goto found;
-          }
-          else
-            goto continu;
-        }
-
-        if (s != r)
-          if (s == 0)
-          {
-            print_err("Use of ");
-            sprint_cs(warning_index);
-            prints(" doesn't match its definition");
-            help4("If you say, e.g., `\\def\\a1{...}', then you must always",
-              "put `1' after `\\a', since control sequence names are",
-              "made up of letters only. The macro here has not been",
-              "followed by the required stuff, so I'm ignoring it.");
-            error();
-            goto exit;
-          }
-          else
-          {
-            t = s;
-
-            do
-              {
-                store_new_token(info(t));
-                incr(m);
-                u = link(t);
-                v = s;
-
-                while (true)
-                {
-                  if (u == r)
-                    if (cur_tok != info(v))
-                      goto done;
-                    else
-                    {
-                      r = link(v);
-                      goto continu;
-                    }
-
-                    if (info(u) != info(v))
-                      goto done;
-
-                    u = link(u);
-                    v = link(v);
-                }
-done:
-                t = link(t);
-              }
-            while (!(t == r));
-
-            r = s;
-          }
-
-        if (cur_tok == par_token)
-          if (long_state != long_call)
-          {
-            if (long_state == call)
-            {
-              runaway();
-              print_err("Paragraph ended before ");
-              sprint_cs(warning_index);
-              prints("was complete");
-              help3("I suspect you've forgotten a `}', causing me to apply this",
-                  "control sequence to too much text. How can we recover?",
-                  "My plan is to forget the whole thing and hope for the best.");
-              back_error();
-            }
-
-            pstack[n] = link(temp_head);
-            align_state = align_state - unbalance;
-
-            for (m = 0; m <= n; m++)
-              flush_list(pstack[m]);
-
-            goto exit;
-          }
-
-        if (cur_tok < right_brace_limit)
-          if (cur_tok < left_brace_limit)
-          {
-            unbalance = 1;
-
-            while (true)
-            {
-              fast_store_new_token(cur_tok);
-              get_token();
-
-              if (cur_tok == par_token)
-                if (long_state != long_call)
-                {
-                  if (long_state == call)
-                  {
-                    runaway();
-                    print_err("Paragraph ended before ");
-                    sprint_cs(warning_index);
-                    prints(" was complete");
-                    help3("I suspect you've forgotten a `}', causing me to apply this",
-                        "control sequence to too much text. How can we recover?",
-                        "My plan is to forget the whole thing and hope for the best.");
-                    back_error();
-                  }
-
-                  pstack[n] = link(temp_head);
-                  align_state = align_state - unbalance;
-
-                  for (m = 0; m <= n; m++)
-                    flush_list(pstack[m]);
-                  goto exit;
-                }
-
-              if (cur_tok < right_brace_limit)
-                if (cur_tok < left_brace_limit)
-                  incr(unbalance);
-                else
-                {
-                  decr(unbalance);
-
-                  if (unbalance == 0)
-                    goto done1;
-                }
-            }
-done1:
-            rbrace_ptr = p;
-            store_new_token(cur_tok);
-          }
-          else
-          {
-            back_input();
-            print_err("Argument of ");
-            sprint_cs(warning_index);
-            prints(" has an extra }");
-            help6("I've run across a `}' that doesn't seem to match anything.",
-                "For example, `\\def\\a#1{...}' and `\\a}' would produce",
-                "this error. If you simply proceed now, the `\\par' that",
-                "I've just inserted will cause me to report a runaway",
-                "argument that might be the root of the problem. But if",
-                "your `}' was spurious, just type `2' and it will go away.");
-            incr(align_state);
-            long_state = call;
-            cur_tok = par_token;
-            ins_error();
-            goto continu;
-          }
-        else
-        {
-          if (cur_tok == space_token)
-            if (info(r) <= end_match_token)
-              if (info(r) >= match_token)
-                goto continu;
-
-          store_new_token(cur_tok);
-        }
-
-        incr(m);
-
-        if (info(r) > end_match_token)
-          goto continu;
-
-        if (info(r) < match_token)
-          goto continu;
-
-found:
-        if (s != 0)
-        {
-          if ((m == 1) && (info(p) < right_brace_limit) && (p != temp_head))
-          {
-            link(rbrace_ptr) = 0;
-            free_avail(p);
-            p = link(temp_head);
-            pstack[n] = link(p);
-            free_avail(p);
-          }
-          else
-            pstack[n] = link(temp_head);
-
-          incr(n);
-
-          if (tracing_macros > 0)
-          {
-            begin_diagnostic();
-            //print_nl(match_chr);
-            print_nl(""); print(match_chr);
-            print_int(n);
-            prints("<-");
-            show_token_list(pstack[n - 1], 0, 1000);
-            end_diagnostic(false);
-          }
-        }
-      }
-    while (!(info(r) == end_match_token));
-  }
-
-  while ((state == token_list) && (loc == 0) &&
-      (index != v_template))
-    end_token_list();
-
-  begin_token_list(ref_count, macro);
-  name = warning_index;
-  loc = link(r);
-
-  if (n > 0)
-  {
-    if (param_ptr + n > max_param_stack)
-    {
-      max_param_stack = param_ptr + n;
-
-#ifdef ALLOCATEPARAMSTACK
-      if (max_param_stack > current_param_size)
-        param_stack = realloc_param_stack(increment_param_size);
-
-      if (max_param_stack > current_param_size)
-      {
-        overflow("parameter stack size", current_param_size);
-        return;
-      }
-#else
-      if (max_param_stack > param_size)
-      {
-        overflow("parameter stack size", param_size);
-        return;
-      }
-#endif
-    }
-
-    for (m = 0; m <= n - 1; m++)
-      param_stack[param_ptr + m] = pstack[m];
-
-    param_ptr = param_ptr + n;
-  }
-
-exit:
-  scanner_status = save_scanner_status;
-  warning_index = save_warning_index;
-}
-/* sec 0379 */
-void insert_relax (void)
-{
-  cur_tok = cs_token_flag + cur_cs;
-  back_input();
-  cur_tok = cs_token_flag + frozen_relax;
-  back_input();
-  index = inserted;
-}
-/* sec 0366 */
-void expand (void)
-{
-  halfword t;
-  pointer p, q, r;
-  integer j;
-  integer cv_backup;
-  small_number cvl_backup, radix_backup, co_backup;
-  pointer backup_backup;
-  small_number save_scanner_status;
-
-  cv_backup = cur_val;
-  cvl_backup = cur_val_level;
-  radix_backup = radix;
-  co_backup = cur_order;
-  backup_backup = link(backup_head);
-
-  if (cur_cmd < call)
-  {
-    if (tracing_commands > 1)
-      show_cur_cmd_chr();
-
-    switch (cur_cmd)
-    {
-      case top_bot_mark:
-        if (cur_mark[cur_chr] != 0)
-          begin_token_list(cur_mark[cur_chr], mark_text);
-        break;
-
-      case expand_after:
-        get_token();
-        t = cur_tok;
-        get_token();
-
-        if (cur_cmd > max_command)
-          expand();
-        else
-          back_input();
-
-        cur_tok = t;
-        back_input();
-        break;
-
-      case no_expand:
-        save_scanner_status = scanner_status;
-        scanner_status = normal;
-        get_token();
-        scanner_status = save_scanner_status;
-        t = cur_tok;
-        back_input();
-
-        if (t >= cs_token_flag)
-        {
-          p = get_avail();
-          info(p) = cs_token_flag + frozen_dont_expand;
-          link(p) = loc;
-          start = p;
-          loc = p;
-        }
-        break;
-
-      case cs_name:
-        r = get_avail();
-        p = r;
-
-        do
-          {
-            get_x_token();
-  
-            if (cur_cs == 0)
-              store_new_token(cur_tok);
-          }
-        while (!(cur_cs != 0));
-
-        if (cur_cmd != end_cs_name)
-        {
-          print_err("Missing ");
-          print_esc("endcsname");
-          prints(" inserted");
-          help2("The control sequence marked <to be read again> should",
-              "not appear between \\csname and \\endcsname.");
-          back_error();
-        }
-
-        j = first;
-        p = link(r);
-
-        while (p != 0)
-        {
-          if (j >= max_buf_stack)
-          {
-            max_buf_stack = j + 1;
-
-#ifdef ALLOCATEBUFFER
-            if (max_buf_stack == current_buf_size)
-              buffer = realloc_buffer (increment_buf_size);
-
-            if (max_buf_stack == current_buf_size)
-            {
-              overflow("buffer size", current_buf_size);
-              return;
-            }
-#else
-            if (max_buf_stack == buf_size)
-            {
-              overflow("buffer size", buf_size);
-              return;
-            }
-#endif
-          }
-
-          buffer[j] = info(p) % 256;
-          incr(j);
-          p = link(p);
-        }
-
-        if (j > first + 1)
-        {
-          no_new_control_sequence = false;
-          cur_cs = id_lookup(first, j - first);
-          no_new_control_sequence = true;
-        }
-        else if (j == first)
-          cur_cs = null_cs;
-        else
-          cur_cs = single_base + buffer[first];
-
-        flush_list(r);
-
-        if (eq_type(cur_cs) == undefined_cs)
-        {
-          eq_define(cur_cs, relax, 256);
-        }
-
-        cur_tok = cur_cs + cs_token_flag;
-        back_input();
-        break;
-
-      case convert:
-        conv_toks();
-        break;
-
-      case the:
-        ins_the_toks();
-        break;
-
-      case if_test:
-        conditional();
-        break;
-
-      case fi_or_else:
-        if (cur_chr > if_limit)
-          if (if_limit == 1)
-            insert_relax();
-          else
-          {
-            print_err("Extra ");
-            print_cmd_chr(fi_or_else, cur_chr);
-            help1("I'm ignoring this; it doesn't match any \\if.");
-            error();
-          }
-        else
-        {
-          while (cur_chr != fi_code)
-            pass_text();
-
-          {
-            p = cond_ptr;
-            if_line = if_line_field(p);
-            cur_if = subtype(p);
-            if_limit = type(p);
-            cond_ptr = link(p);
-            free_node(p, if_node_size);
-          }
-        }
-        break;
-
-      case input:
-        if (cur_chr > 0)
-          force_eof = true;
-        else if (name_in_progress)
-          insert_relax();
-        else
-          start_input();
-        break;
-
-      default:
-        print_err("Undefined control sequence");
-        help5("The control sequence at the end of the top line",
-            "of your error message was never \\def'ed. If you have",
-            "misspelled it (e.g., `\\hobx'), type `I' and the correct",
-            "spelling (e.g., `I\\hbox'). Otherwise just continue,",
-            "and I'll forget about whatever was undefined.");
-        error();
-        break;
-    }
-  }
-  else if (cur_cmd < end_template)
-  {
-    macro_call();
-  }
-  else
-  {
-    cur_tok = cs_token_flag + frozen_endv;
-    back_input();
-  }
-
-  cur_val = cv_backup;
-  cur_val_level = cvl_backup;
-  radix = radix_backup;
-  cur_order = co_backup;
-  link(backup_head) = backup_backup;
-}
-/* sec 0380 */
-void get_x_token (void)
-{
-restart:
-  get_next();
-
-  if (cur_cmd <= max_command)
-    goto done;
-
-  if (cur_cmd >= call)
-    if (cur_cmd < end_template)
-      macro_call();
-    else
-    {
-      cur_cs = frozen_endv;
-      cur_cmd = endv;
-      goto done;
-    }
-  else
-    expand();
-
-  goto restart;
-
-done:
-  if (cur_cs == 0)
-    cur_tok = (cur_cmd * 256) + cur_chr;
-  else
-    cur_tok = cs_token_flag + cur_cs;
-}
-/* sec 0381 */
-void x_token (void)
-{
-  while (cur_cmd > max_command)
-  {
-    expand();
-    get_next();
-  }
-
-  if (cur_cs == 0)
-    cur_tok = (cur_cmd * 256) + cur_chr;
-  else
-    cur_tok = cs_token_flag + cur_cs;
-}
-/* sec 0403 */
-void scan_left_brace (void)
-{
-  do
-    {
-      get_x_token();
-    }
-  while (!((cur_cmd != spacer) && (cur_cmd != relax)));
-
-  if (cur_cmd != left_brace)
-  {
-    print_err("Missing { inserted");
-    help4("A left brace was mandatory here, so I've put one in.",
-        "You might want to delete and/or insert some corrections",
-        "so that I will find a matching right brace soon.",
-        "(If you're confused by all this, try typing `I}' now.)");
-    back_error();
-    cur_tok = left_brace_token + '{';
-    cur_cmd = left_brace;
-    cur_chr = '{';
-    incr(align_state);
-  }
-}
-/* sec 0405 */
-void scan_optional_equals (void)
-{
-  do
-    {
-      get_x_token();
-    }
-  while (!(cur_cmd != spacer));
-
-  if (cur_tok != other_token + '=')
-    back_input();
-}
-/* sec 0407 */
-boolean scan_keyword (const char * s)
-{
-  pointer p;
-  pointer q;
-  const char * k;
-
-  p = backup_head;
-  link(p) = 0;
-  k = s;
-
-  while (*k)
-  {
-    get_x_token(); 
-
-    if ((cur_cs == 0) && ((cur_chr == (*k)) || (cur_chr == (*k) - 'a' + 'A')))
-    {
-      store_new_token(cur_tok);
-      incr(k);
-    }
-    else if ((cur_cmd != spacer) || (p != backup_head))
-    {
-      back_input();
-
-      if (p != backup_head)
-        back_list(link(backup_head));
-
-      return false;
-    }
-  }
-
-  flush_list(link(backup_head));
-
-  return true;
-}
-/* sec 0408 */
-void mu_error (void)
-{
-  print_err("Incompatible glue units");
-  help1("I'm going to assume that 1mu=1pt when they're mixed.");
-  error();
-}
-/* sec 0433 */
-void scan_eight_bit_int (void)
-{
-  scan_int();
-
-  if ((cur_val < 0) || (cur_val > 255))
-  {
-    print_err("Bad register code");
-    help2("A register number must be between 0 and 255.",
-        "I changed this one to zero.");
-    int_error(cur_val);
-    cur_val = 0;
-  }
-}
-/* sec 0434 */
-void scan_char_num (void)
-{
-  scan_int();
-
-  if ((cur_val < 0) || (cur_val > 255))
-  {
-    print_err("Bad character code");
-    help2("A character number must be between 0 and 255.",
-        "I changed this one to zero.");
-    int_error(cur_val);
-    cur_val = 0;
-  }
-}
-/* sec 0435 */
-void scan_four_bit_int (void)
-{
-  scan_int();
-
-  if ((cur_val < 0) || (cur_val > 15))
-  {
-    print_err("Bad number");
-    help2("Since I expected to read a number between 0 and 15,",
-        "I changed this one to zero.");
-    int_error(cur_val);
-    cur_val = 0;
-  }
-}
-/* sec 0436 */
-void scan_fifteen_bit_int (void) 
-{
-  scan_int();
-
-  if ((cur_val < 0) || (cur_val > 32767))
-  {
-    print_err("Bad mathchar");
-    help2("A mathchar number must be between 0 and 32767.",
-        "I changed this one to zero.");
-    int_error(cur_val);
-    cur_val = 0;
-  }
-}
-/* sec 0437 */
-void scan_twenty_seven_bit_int (void)
-{
-  scan_int();
-
-  if ((cur_val < 0) || (cur_val > 134217727L))
-  {
-    print_err("Bad delimiter code");
-    help2("A numeric delimiter code must be between 0 and 2^{27}-1.",
-        "I changed this one to zero.");
-    int_error(cur_val);
-    cur_val = 0;
-  }
-}
-/* sec 0577 */
-void scan_font_ident (void) 
-{
-  internal_font_number f;
-  halfword m;
-
-  do
-    {
-      get_x_token();
-    }
-  while (!(cur_cmd != spacer));
-
-  if (cur_cmd == def_font)
-    f = cur_font;
-  else if (cur_cmd == set_font)
-    f = cur_chr; 
-  else if (cur_cmd == def_family)
-  {
-    m = cur_chr;
-    scan_four_bit_int();
-    f = equiv(m + cur_val);
-  }
-  else
-  {
-    print_err("Missing font identifier");
-    help2("I was looking for a control sequence whose",
-        "current meaning has been defined by \\font.");
-    back_error();
-    f = null_font;
-  }
-
-  cur_val = f;
-}
-/* sec 0578 */
-void find_font_dimen (boolean writing)
-{
-  internal_font_number f;
-  integer n;
-
-  scan_int();
-  n = cur_val;
-  scan_font_ident();
-  f = cur_val;
-
-  if (n < 0)
-    cur_val = fmem_ptr;
-  else
-  {
-    if (writing && (n <= space_shrink_code) && (n >= space_code) && (font_glue[f] != 0)) 
-    {
-      delete_glue_ref(font_glue[f]);
-      font_glue[f] = 0;
-    }
-
-    if (n > font_params[f])
-      if (f < font_ptr)
-        cur_val = fmem_ptr;
-      else
-      {
-        do
-          {
- #ifdef ALLOCATEFONT
-            if (fmem_ptr == current_font_mem_size)
-              font_info = realloc_font_info(increment_font_mem_size);
-
-            if (fmem_ptr == current_font_mem_size)
-            {
-              overflow("font memory", current_font_mem_size);
-              return;
-            }
-#else
-            if (fmem_ptr == font_mem_size)
-            {
-              overflow("font memory", font_mem_size);
-              return;
-            }
-#endif
-            font_info[fmem_ptr].cint = 0;
-            incr(fmem_ptr);
-            incr(font_params[f]);
-          }
-        while (!(n == font_params[f]));
-
-        cur_val = fmem_ptr - 1;
-      }
-    else if (n > 0)
-      cur_val = n + param_base[f];
-  }
-
-  if (cur_val == fmem_ptr)
-  {
-    print_err("Font ");
-    print_esc(""); print(font_id_text(f));
-    prints(" has only ");
-    print_int(font_params[f]);
-    prints(" fontdimen parameters");
-    help2("To increase the number of font parameters, you must",
-      "use \\fontdimen immediately after the \\font is loaded.");
-    error();
-  }
-}
-/* sec 0413 */
-void scan_something_internal (small_number level, boolean negative)
-{
-  halfword m;
-  integer p;
-
-  m = cur_chr;
-
-  switch (cur_cmd)
-  {
-    case def_code:
-      {
-        scan_char_num();
-
-        if (m == math_code_base)
-          scanned_result(math_code(cur_val), int_val);
-        else if (m < math_code_base)
-          scanned_result(equiv(m + cur_val), int_val);
-        else
-          scanned_result(eqtb[m + cur_val].cint, int_val);
-      }
-      break;
-
-    case toks_register:
-    case assign_toks:
-    case def_family:
-    case set_font:
-    case def_font:
-      if (level != tok_val)
-      {
-        print_err("Missing number, treated as zero");
-        help3("A number should have been here; I inserted `0'.",
-            "(If you can't figure out why I needed to see a number,",
-            "look up `weird error' in the index to The TeXbook.)");
-        back_error();
-        scanned_result(0, dimen_val);
-      }
-      else if (cur_cmd <= assign_toks)
-      {
-        if (cur_cmd < assign_toks)
-        {
-          scan_eight_bit_int();
-          m = toks_base + cur_val;
-        }
-
-        scanned_result(equiv(m), tok_val);
-      }
-      else
-      {
-        back_input();
-        scan_font_ident();
-        scanned_result(font_id_base + cur_val, ident_val);
-      }
-      break;
-
-    case assign_int:
-      scanned_result(eqtb[m].cint, int_val);
-      break;
-
-    case assign_dimen:
-      scanned_result(eqtb[m].cint, dimen_val);
-      break; 
-
-    case assign_glue:
-      scanned_result(equiv(m), glue_val);
-      break;
-
-    case assign_mu_glue:
-      scanned_result(equiv(m), mu_val);
-      break;
-
-    case set_aux:
-      if (abs(mode) != m)
-      {
-        print_err("Improper ");
-        print_cmd_chr(set_aux, m);
-        help4("You can refer to \\spacefactor only in horizontal mode;",
-            "you can refer to \\prevdepth only in vertical mode; and",
-            "neither of these is meaningful inside \\write. So",
-            "I'm forgetting what you said and using zero instead.");
-        error();
-
-        if (level != tok_val)
-          scanned_result(0, dimen_val);
-        else
-          scanned_result(0, int_val);
-      }
-      else if (m == vmode)
-        scanned_result(prev_depth, dimen_val);
-      else
-        scanned_result(space_factor, int_val);
-      break;
-
-    case set_prev_graf:
-      if (mode == 0)
-        scanned_result(0, int_val);
-      else
-      {
-        nest[nest_ptr] = cur_list;
-        p = nest_ptr;
-
-        while (abs(nest[p].mode_field) != vmode)
-          decr(p);
-
-        scanned_result(nest[p].pg_field, int_val);
-      }
-      break;
-
-    case set_page_int:
-      {
-        if (m == 0)
-          cur_val = dead_cycles; 
-        else
-          cur_val = insert_penalties;
-
-        cur_val_level = 0;
-      }
-      break;
-
-    case set_page_dimen:
-      {
-        if ((page_contents == 0) && (! output_active))
-          if (m == 0)
-            cur_val = max_dimen;
-          else
-            cur_val = 0;
-        else
-          cur_val = page_so_far[m];
-
-        cur_val_level = dimen_val;
-      }
-      break;
-
-    case set_shape:
-      {
-        if (par_shape_ptr == 0)
-          cur_val = 0; 
-        else
-          cur_val = info(par_shape_ptr);
-
-        cur_val_level = int_val;
-      }
-      break;
-
-    case set_box_dimen:
-      {
-        scan_eight_bit_int();
-
-        if (box(cur_val) == 0)
-          cur_val = 0;
-        else
-          cur_val = mem[box(cur_val) + m].cint;
-
-        cur_val_level = dimen_val;
-      }
-      break;
-
-    case char_given:
-    case math_given:
-      scanned_result(cur_chr, int_val);
-      break;
-
-    case assign_font_dimen:
-      {
-        find_font_dimen(false);
-        font_info[fmem_ptr].cint = 0;
-        scanned_result(font_info[cur_val].cint, dimen_val);
-      }
-      break;
-
-    case assign_font_int:
-      {
-        scan_font_ident();
-
-        if (m == 0)
-          scanned_result(hyphen_char[cur_val], int_val);
-        else
-          scanned_result(skew_char[cur_val], int_val);
-      }
-      break;
-
-    case tex_register:
-      {
-        scan_eight_bit_int();
-
-        switch (m)
-        {
-          case int_val:
-            cur_val = count(cur_val);
-            break;
-
-          case dimen_val:
-            cur_val = dimen(cur_val);
-            break;
-
-          case glue_val:
-            cur_val = skip(cur_val);
-            break;
-
-          case mu_val:
-            cur_val = mu_skip(cur_val);
-            break;
-        }
-        
-        cur_val_level = m;
-      }
-      break;
-
-    case last_item:
-      if (cur_chr > glue_val)
-      {
-        if (cur_chr == input_line_no_code)
-          cur_val = line;
-        else
-          cur_val = last_badness;
-
-        cur_val_level = int_val;
-      }
-      else
-      {
-        if (cur_chr == glue_val)
-          cur_val = zero_glue;
-        else
-          cur_val = 0;
-
-        cur_val_level = cur_chr;
-
-        if (!is_char_node(tail) && (mode != 0))
-          switch (cur_chr)
-          {
-            case int_val:
-              if (type(tail) == penalty_node)
-                cur_val = penalty(tail);
-              break;
-
-            case dimen_val:
-              if (type(tail) == kern_node)
-                cur_val = width(tail);
-              break;
-
-            case glue_val:
-              if (type(tail) == glue_node)
-              {
-                cur_val = glue_ptr(tail);
-
-                if (subtype(tail) == mu_glue)
-                  cur_val_level = mu_val;
-              }
-              break;
-          }
-        else if ((mode == vmode) && (tail == head))
-          switch (cur_chr)
-          {
-            case int_val:
-              cur_val = last_penalty;
-              break;
-
-            case dimen_val:
-              cur_val = last_kern;
-              break;
-
-            case glue_val:
-              if (last_glue != empty_flag)
-                cur_val = last_glue;
-              break;
-          }
-      }
-      break;
-
-    default:
-      {
-        print_err("You can't use `");
-        print_cmd_chr(cur_cmd, cur_chr);
-        prints("' after ");
-        print_esc("the");
-        help1("I'm forgetting what you said and using zero instead.");
-        error();
-
-        if (level != tok_val)
-          scanned_result(0, dimen_val);
-        else
-          scanned_result(0, int_val);
-      }
-      break;
-  }
-
-  while (cur_val_level > level)
-  {
-    if (cur_val_level == glue_val)
-      cur_val = width(cur_val);
-    else if (cur_val_level == mu_val)
-      mu_error();
-
-    decr(cur_val_level);
-  }
-
-  if (negative)
-    if (cur_val_level >= 2)
-    {
-      cur_val = new_spec(cur_val);
-
-      {
-        width(cur_val) = -width(cur_val);
-        stretch(cur_val) = -stretch(cur_val);
-        shrink(cur_val) = -shrink(cur_val);
-      }
-    }
-    else
-      cur_val = -cur_val;
-  else if ((cur_val_level >= glue_val) && (cur_val_level <= mu_val))
-    add_glue_ref(cur_val);
-}
-/* sec 0341 */
-void get_next (void)
-{
-  integer k;
-  halfword t;
-  /* char cat; */
-  int cat;
-  ASCII_code c, cc;
-  char d;
-
-restart:
-  cur_cs = 0;
-
-  if (state != token_list)
-  {
-lab_switch:
-    if (loc <= limit)
-    {
-      cur_chr = buffer[loc];
-      incr(loc);
-
-reswitch:
-      cur_cmd = cat_code(cur_chr);
-
-      switch (state + cur_cmd)
-      {
-        case any_state_plus(ignore):
-        case skip_blanks + spacer:
-        case new_line + spacer:
-          goto lab_switch;
-          break;
-
-        case any_state_plus(escape):
-          {
-            if (loc > limit)
-              cur_cs = null_cs;
-            else
-            {
-start_cs:
-              k = loc;
-              cur_chr = buffer[k];
-              cat = cat_code(cur_chr);
-              incr(k);
-
-              if (cat == letter)
-                state = skip_blanks;
-              else if (cat == spacer)
-                state = skip_blanks;
-              else
-                state = mid_line;
-
-              if ((cat == letter) && (k <= limit))
-              {
-                do
-                  {
-                    cur_chr = buffer[k];
-                    cat = cat_code(cur_chr);
-                    incr(k);
-                  }
-                while (!((cat != letter) || (k > limit)));
-
-                {
-                  if (buffer[k]== cur_chr)
-                    if (cat == sup_mark)
-                      if (k < limit)
-                      {
-                        c = buffer[k + 1];
-
-                        if (c < 128)
-                        {
-                          d = 2;
-                          if (is_hex(c))
-                            if (k + 2 <= limit)
-                            {
-                              cc = buffer[k + 2];
-
-                              if (is_hex(cc))
-                                incr(d);
-                            }
-
-                          if (d > 2)
-                          {
-                            hex_to_cur_chr();
-                            buffer[k - 1] = cur_chr;
-                          }
-                          else if (c < 64)
-                            buffer[k - 1] = c + 64;
-                          else
-                            buffer[k - 1] = c - 64;
-
-                          limit = limit - d;
-                          first = first - d;
-
-                          while (k <= limit)
-                          {
-                            buffer[k] = buffer[k + d];
-                            incr(k);
-                          }
-
-                          goto start_cs;
-                        }
-                      }
-                }
-
-                if (cat != letter)
-                  decr(k);
-
-                if (k > loc + 1)
-                {
-                  cur_cs = id_lookup(loc, k - loc);
-                  loc = k;
-                  goto found;
-                }
-              }
-              else
-              {
-                if (buffer[k] == cur_chr)
-                  if (cat == sup_mark)
-                    if (k < limit)
-                    {
-                      c = buffer[k + 1];
-
-                      if (c < 128)
-                      {
-                        d = 2;
-
-                        if (is_hex(c))
-                          if (k + 2 <= limit)
-                          {
-                            cc = buffer[k + 2];
-
-                            if (is_hex(cc))
-                              incr(d);
-                          }
-
-                        if (d > 2)
-                        {
-                          hex_to_cur_chr();
-                          buffer[k - 1] = cur_chr;
-                        }
-                        else if (c < 64)
-                          buffer[k - 1] = c + 64;
-                        else
-                          buffer[k - 1] = c - 64;
-
-                        limit = limit - d;
-                        first = first - d;
-
-                        while (k <= limit)
-                        {
-                          buffer[k] = buffer[k + d];
-                          incr(k);
-                        }
-
-                        goto start_cs;
-                      }
-                    }
-              }
-
-              cur_cs = single_base + buffer[loc];
-              incr(loc);
-            }
-found:
-            cur_cmd = eq_type(cur_cs);
-            cur_chr = equiv(cur_cs);
-            
-            if (cur_cmd >= outer_call)
-              check_outer_validity();
-          }
-          break;
-
-        case any_state_plus(active_char):
-          {
-            cur_cs = cur_chr + active_base;
-            cur_cmd = eq_type(cur_cs);
-            cur_chr = equiv(cur_cs);
-            state = mid_line;
-            
-            if (cur_cmd >= outer_call)
-              check_outer_validity();
-          }
-          break;
-
-        case any_state_plus(sup_mark):
-          {
-            if (cur_chr == buffer[loc])
-              if (loc < limit)
-              {
-                c = buffer[loc + 1];
-
-                if (c < 128)
-                {
-                  loc = loc + 2;
-
-                  if (is_hex(c))
-                    if (loc <= limit)
-                    {
-                      cc = buffer[loc];
-
-                      if (is_hex(cc))
-                      {
-                        incr(loc);
-                        hex_to_cur_chr();
-                        goto reswitch;
-                      }
-                    }
-
-                  if (c < 64)
-                    cur_chr = c + 64;
-                  else
-                    cur_chr = c - 64;
-
-                  goto reswitch;
-                }
-              }
-
-              state = mid_line;
-          }
-          break;
-
-        case any_state_plus(invalid_char):
-          {
-            print_err("Text line contains an invalid character");
-            help2("A funny symbol that I can't read has just been input.",
-                "Continue, and I'll forget that it ever happened.");
-            deletions_allowed = false;
-            error();
-            deletions_allowed = true;
-            goto restart;
-          }
-          break;
-
-        case mid_line + spacer:
-          {
-            state = skip_blanks;
-            cur_chr = ' ';
-          }
-          break;
-
-        case mid_line + car_ret:
-          {
-            loc = limit + 1;
-            cur_cmd = spacer;
-            cur_chr = ' ';
-          }
-          break;
-
-        case skip_blanks + car_ret:
-        case any_state_plus(comment):
-          {
-            loc = limit + 1;
-            goto lab_switch;
-          }
-          break;
-
-        case new_line + car_ret:
-          {
-            loc = limit + 1;
-            cur_cs = par_loc;
-            cur_cmd = eq_type(cur_cs);
-            cur_chr = equiv(cur_cs);
-            
-            if (cur_cmd >= outer_call)
-              check_outer_validity();
-          }
-          break;
-
-        case mid_line + left_brace:
-          incr(align_state);
-          break;
-
-        case skip_blanks + left_brace:
-        case new_line + left_brace:
-          {
-            state = mid_line;
-            incr(align_state);
-          }
-          break;
-
-        case mid_line + right_brace:
-          decr(align_state);
-          break;
-
-        case skip_blanks + right_brace:
-        case new_line + right_brace:
-          {
-            state = mid_line;
-            decr(align_state);
-          }
-          break;
-
-        case add_delims_to(skip_blanks):
-        case add_delims_to(new_line):
-          state = 1;
-          break;
-
-        default:
-          break;
-      }
-    }
-    else
-    {
-      state = new_line;
-
-      if (name > 17)
-      {
-        incr(line);
-        first = start;
-
-        if (!force_eof)
-        {
-          if (input_ln(cur_file, true))
-            firm_up_the_line();
-          else
-            force_eof = true;
-        }
-
-        if (force_eof)
-        {
-          print_char(')');
-          decr(open_parens);
-          update_terminal();
-          force_eof = false;
-          end_file_reading();
-          check_outer_validity();
-          goto restart;
-        }
-
-        if (end_line_char_inactive())
-          decr(limit);
-        else
-          buffer[limit] = end_line_char;
-
-        first = limit + 1;
-        loc = start;
-      }
-      else
-      {
-        if (!(name == 0))
-        {
-          cur_cmd = 0;
-          cur_chr = 0;
-          return;
-        }
-
-        if (input_ptr > 0)
-        {
-          end_file_reading();
-          goto restart;
-        }
-
-        if (selector < log_only)
-          open_log_file();
-
-        if (interaction > nonstop_mode)
-        {
-          if (end_line_char_inactive())
-            incr(limit);
-
-          if (limit == start)
-            print_nl("(Please type a command or say `\\end')");
-
-          print_ln();
-          first = start;
-          prompt_input("*");
-          limit = last;
-
-          if (end_line_char_inactive())
-            decr(limit);
-          else
-            buffer[limit]= end_line_char;
-
-          first = limit + 1;
-          loc = start;
-        }
-        else
-        {
-          fatal_error("*** (job aborted, no legal \\end found)");
-          return;
-        }
-      }
-
-      check_interrupt();
-      goto lab_switch;
-    }
-  }
-  else if (loc != 0)
-  {
-    t = info(loc);
-    loc = link(loc);
-
-    if (t >= cs_token_flag)
-    {
-      cur_cs = t - cs_token_flag;
-      cur_cmd = eq_type(cur_cs);
-      cur_chr = equiv(cur_cs);
-
-      if (cur_cmd >= outer_call)
-        if (cur_cmd == dont_expand)
-        {
-          cur_cs = info(loc) - cs_token_flag;
-          loc = 0;
-          cur_cmd = eq_type(cur_cs);
-          cur_chr = equiv(cur_cs);
-
-          if (cur_cmd > max_command)
-          {
-            cur_cmd = relax;
-            cur_chr = no_expand_flag;
-          }
-        }
-        else
-        {
-          check_outer_validity();
-        }
-    }
-    else
-    {
-      cur_cmd = t / 256;
-      cur_chr = t % 256;
-
-      switch (cur_cmd)
-      {
-        case left_brace:
-          incr(align_state);
-          break;
-
-        case right_brace:
-          decr(align_state);
-          break;
-
-        case out_param:
-          {
-            begin_token_list(param_stack[limit + cur_chr - 1], parameter);
-            goto restart;
-          }
-          break;
-
-        default:
-          break;
-      }
-    }
-  }
-  else
-  {
-    end_token_list();
-    goto restart;
-  }
-
-  if (cur_cmd <= car_ret)
-    if (cur_cmd >= tab_mark)
-      if (align_state == 0)
-      {
-        if ((scanner_status == aligning) && (cur_align == 0))
-        {
-          fatal_error("(interwoven alignment preambles are not allowed)");
-          return;
-        }
-
-        cur_cmd = extra_info(cur_align);
-        extra_info(cur_align) = cur_chr;
-
-        if (cur_cmd == omit)
-          begin_token_list(omit_template, v_template);
-        else
-          begin_token_list(v_part(cur_align), v_template);
-
-        align_state = 1000000L;
-        goto restart;
-      }
+/* Copyright 2014 Clerk Ma\r
+\r
+   This program is free software; you can redistribute it and/or modify\r
+   it under the terms of the GNU General Public License as published by\r
+   the Free Software Foundation; either version 2 of the License, or\r
+   (at your option) any later version.\r
+\r
+   This program is distributed in the hope that it will be useful, but\r
+   WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+   General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with this program; if not, write to the Free Software\r
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA\r
+   02110-1301 USA.  */\r
+\r
+#define EXTERN extern\r
+\r
+#include "yandytex.h"\r
+\r
+/* following bit used to be end of tex1.c */\r
+#ifdef STAT\r
+/* sec 0284 */\r
+void restore_trace (pointer p, const char * s)\r
+{\r
+  begin_diagnostic();\r
+  print_char('{');\r
+  prints(s);\r
+  print_char(' ');\r
+  show_eqtb(p);\r
+  print_char('}');\r
+  end_diagnostic(false);\r
+}\r
+#endif\r
+/* sec 0281 */\r
+void unsave (void)\r
+{\r
+  pointer p;\r
+  quarterword l;\r
+  halfword t;\r
+\r
+  if (cur_level > level_one)\r
+  {\r
+    decr(cur_level);\r
+\r
+    while (true)\r
+    {\r
+      decr(save_ptr);\r
+\r
+      if (save_type(save_ptr) == level_boundary)\r
+        goto done;\r
+\r
+      p = save_index(save_ptr);\r
+\r
+      if (save_type(save_ptr) == insert_token)\r
+      {\r
+        t = cur_tok;\r
+        cur_tok = p;\r
+        back_input();\r
+        cur_tok = t;\r
+      }\r
+      else\r
+      {\r
+        if (save_type(save_ptr) == restore_old_value)\r
+        {\r
+          l = save_level(save_ptr);\r
+          decr(save_ptr);\r
+        }\r
+        else\r
+          save_stack[save_ptr] = eqtb[undefined_control_sequence];\r
+        \r
+        if (p < int_base)\r
+          if (eq_level(p) == level_one)\r
+          {\r
+            eq_destroy(save_stack[save_ptr]);\r
+#ifdef STAT\r
+            if (tracing_restores > 0)\r
+              restore_trace(p, "retaining");\r
+#endif\r
+          }\r
+          else\r
+          {\r
+            eq_destroy(eqtb[p]);\r
+            eqtb[p] = save_stack[save_ptr];\r
+#ifdef STAT\r
+            if (tracing_restores > 0)\r
+              restore_trace(p, "restoring");\r
+#endif\r
+          }\r
+        else if (xeq_level[p] != level_one)\r
+        {\r
+          eqtb[p] = save_stack[save_ptr];\r
+          xeq_level[p] = l;\r
+#ifdef STAT\r
+          if (tracing_restores > 0)\r
+            restore_trace(p, "restoring");\r
+#endif\r
+        }\r
+        else\r
+        {\r
+#ifdef STAT\r
+          if (tracing_restores > 0)\r
+            restore_trace(p, "retaining");\r
+#endif\r
+        }\r
+      }\r
+    }\r
+\r
+done:\r
+    cur_group = save_level(save_ptr);\r
+    cur_boundary = save_index(save_ptr);\r
+  }\r
+  else\r
+  {\r
+    confusion("curlevel");\r
+    return;\r
+  }\r
+}\r
+/* sec 0288 */\r
+void prepare_mag (void) \r
+{\r
+  if ((mag_set > 0) && (mag != mag_set))\r
+  {\r
+    print_err("Incompatible magnification (");\r
+    print_int(mag);\r
+    prints(");");\r
+    print_nl(" the previous value will be retained");\r
+    help2("I can handle only one magnification ratio per job. So I've",\r
+        "reverted to the magnification you used earlier on this run.");\r
+    int_error(mag_set);\r
+    geq_word_define(int_base + mag_code, mag_set);\r
+  }\r
+\r
+  if ((mag <= 0) || (mag > 32768L))\r
+  {\r
+    print_err("Illegal magnification has been changed to 1000");\r
+    help1("The magnification ratio must be between 1 and 32768.");\r
+    int_error(mag);\r
+    geq_word_define(int_base + mag_code, 1000);\r
+  }\r
+\r
+  mag_set = mag;\r
+}\r
+/* sec 0295 */\r
+void token_show (pointer p)\r
+{\r
+  if (p != 0)\r
+    show_token_list(link(p), 0, 10000000L);\r
+}\r
+/* sec 0296 */\r
+void print_meaning (void) \r
+{\r
+  print_cmd_chr(cur_cmd, cur_chr);\r
+\r
+  if (cur_cmd >= call)\r
+  {\r
+    print_char(':');\r
+    print_ln();\r
+    token_show(cur_chr);\r
+  }\r
+  else if (cur_cmd == top_bot_mark)\r
+  {\r
+    print_char(':');\r
+    print_ln();\r
+    token_show(cur_mark[cur_chr]);\r
+  }\r
+}\r
+/* sec 0299 */\r
+void show_cur_cmd_chr (void)\r
+{ \r
+  begin_diagnostic();\r
+  print_nl("{");\r
+\r
+  if (mode != shown_mode)\r
+  {\r
+    print_mode(mode);\r
+    prints(": ");\r
+    shown_mode = mode;\r
+  }\r
+\r
+  print_cmd_chr(cur_cmd, cur_chr);\r
+  print_char('}');\r
+  end_diagnostic(false);\r
+}\r
+/* sec 0311 */\r
+void show_context (void)\r
+{\r
+  char old_setting;\r
+  integer nn;\r
+  boolean bottom_line;\r
+  integer i;\r
+  integer j;\r
+  integer l;\r
+  integer m;\r
+  integer n;\r
+  integer p;\r
+  integer q;\r
+\r
+  base_ptr = input_ptr;\r
+  input_stack[base_ptr] = cur_input;\r
+  nn = -1;\r
+  bottom_line = false;\r
+\r
+  while (true)\r
+  {\r
+    cur_input = input_stack[base_ptr];\r
+\r
+    if ((state != token_list))\r
+      if ((name > 17) || (base_ptr == 0))\r
+        bottom_line = true;\r
+\r
+    if ((base_ptr == input_ptr) || bottom_line || (nn < error_context_lines))\r
+    {\r
+      if ((base_ptr == input_ptr) || (state != token_list) ||\r
+          (index != backed_up) || (loc != 0))\r
+      {\r
+        tally = 0;\r
+        old_setting = selector;\r
+\r
+        if (state != token_list)\r
+        {\r
+          if (name <= 17)\r
+            if (name == 0)\r
+              if (base_ptr == 0)\r
+                print_nl("<*>");\r
+              else\r
+                print_nl("<insert> ");\r
+            else\r
+            {\r
+              print_nl("<read ");\r
+\r
+              if (name == 17)\r
+                print_char('*');\r
+              else\r
+                print_int(name - 1);\r
+\r
+              print_char('>');\r
+            }\r
+          else\r
+          {\r
+            if (c_style_flag)\r
+            {\r
+              print_ln();\r
+\r
+              if (name > 17)\r
+                print(name);\r
+\r
+              print_char('(');\r
+              print_int(line);\r
+              prints(") :");\r
+            }\r
+            else\r
+            {\r
+              print_nl("l.");\r
+              print_int(line);\r
+            }\r
+          }\r
+\r
+          print_char(' ');\r
+          begin_pseudoprint();\r
+\r
+          if (buffer[limit] == end_line_char)\r
+            j = limit;\r
+          else\r
+            j = limit + 1;\r
+\r
+          if (j > 0)\r
+            for (i = start; i <= j - 1; i++)\r
+            {\r
+              if (i == loc)\r
+                set_trick_count();\r
+\r
+              print(buffer[i]);\r
+            }\r
+        }\r
+        else\r
+        {\r
+          switch (index)\r
+          {\r
+            case parameter:\r
+              print_nl("<argument> ");\r
+              break;\r
+\r
+            case u_template:\r
+            case v_template:\r
+              print_nl("<template> ");\r
+              break;\r
+\r
+            case backed_up:\r
+              if (loc == 0)\r
+                print_nl("<recently read> ");\r
+              else\r
+                print_nl("<to be read again> ");\r
+              break;\r
+\r
+            case inserted:\r
+              print_nl("<inserted text> ");\r
+              break;\r
+\r
+            case macro:\r
+              print_ln();\r
+              print_cs(name);\r
+              break;\r
+\r
+            case output_text:\r
+              print_nl("<output> ");\r
+              break;\r
+\r
+            case every_par_text:\r
+              print_nl("<everypar> ");\r
+              break;\r
+\r
+            case every_math_text:\r
+              print_nl("<everymath> ");\r
+              break;\r
+\r
+            case every_display_text:\r
+              print_nl("<everydisplay> ");\r
+              break;\r
+\r
+            case every_hbox_text:\r
+              print_nl("<everyhbox> ");\r
+              break;\r
+\r
+            case every_vbox_text:\r
+              print_nl("<everyvbox> ");\r
+              break;\r
+\r
+            case every_job_text:\r
+              print_nl("<everyjob> ");\r
+              break;\r
+\r
+            case every_cr_text:\r
+              print_nl("<everycr> ");\r
+              break;\r
+\r
+            case mark_text:\r
+              print_nl("<mark> ");\r
+              break;\r
+\r
+            case write_text:\r
+              print_nl("<write> ");\r
+              break;\r
+\r
+            default:\r
+              print_nl("?");\r
+              break;\r
+          }\r
+\r
+          begin_pseudoprint();\r
+\r
+          if (index < macro)\r
+            show_token_list(start, loc, 100000L);\r
+          else\r
+            show_token_list(link(start), loc, 100000L);\r
+        }\r
+\r
+        selector = old_setting;\r
+\r
+        if (trick_count == 1000000L)\r
+          set_trick_count();\r
+        \r
+        if (tally < trick_count)\r
+          m = tally - first_count;\r
+        else\r
+          m = trick_count - first_count;\r
+\r
+        if (l + first_count <= half_error_line)\r
+        {\r
+          p = 0;\r
+          n = l + first_count;\r
+        }\r
+        else\r
+        {\r
+          prints("...");\r
+          p = l + first_count - half_error_line + 3;\r
+          n = half_error_line;\r
+        }\r
+\r
+        for (q = p; q <= first_count - 1; q++)\r
+          print_char(trick_buf[q % error_line]);\r
+\r
+        print_ln();\r
+\r
+        for (q = 1; q <= n; q++)\r
+          print_char(' ');\r
+\r
+        if (m + n <= error_line)\r
+          p = first_count + m;\r
+        else\r
+          p = first_count +(error_line - n - 3);\r
+\r
+        for (q = first_count; q <= p - 1; q++)\r
+          print_char(trick_buf[q % error_line]);\r
+\r
+        if (m + n > error_line)\r
+          prints("...");\r
+\r
+        incr(nn);\r
+      }\r
+    }\r
+    else if (nn == error_context_lines)\r
+    {\r
+      print_nl("...");\r
+      incr(nn); \r
+    }\r
+\r
+    if (bottom_line)\r
+      goto done;\r
+\r
+    decr(base_ptr);\r
+  }\r
+\r
+done:\r
+  cur_input = input_stack[input_ptr];\r
+}\r
+/* sec 0323 */\r
+void begin_token_list_ (pointer p, quarterword t)\r
+{\r
+  push_input();\r
+  state = token_list;\r
+  start = p;\r
+  index = t;\r
+\r
+  if (t >= macro)\r
+  {\r
+    add_token_ref(p);\r
+\r
+    if (t == macro)\r
+      limit = param_ptr;\r
+    else\r
+    {\r
+      loc = link(p);\r
+\r
+      if (tracing_macros > 1)\r
+      {\r
+        begin_diagnostic(); \r
+        print_nl("");\r
+\r
+        switch (t)\r
+        {\r
+          case mark_text:\r
+            print_esc("mark");\r
+            break;\r
+\r
+          case write_text:\r
+            print_esc("write");\r
+            break;\r
+\r
+          default:\r
+            print_cmd_chr(assign_toks, t - output_text + output_routine_loc);\r
+            break;\r
+        }\r
+\r
+        prints("->");\r
+        token_show(p);\r
+        end_diagnostic(false);\r
+      }\r
+    }\r
+  }\r
+  else\r
+    loc = p;\r
+}\r
+/* sec 0324 */\r
+void end_token_list (void) \r
+{ \r
+  if (index >= backed_up)\r
+  {\r
+    if (index <= inserted)\r
+      flush_list(start); \r
+    else\r
+    {\r
+      delete_token_ref(start);\r
+\r
+      if (index == macro)\r
+        while (param_ptr > limit)\r
+        {\r
+          decr(param_ptr);\r
+          flush_list(param_stack[param_ptr]);\r
+        }\r
+    }\r
+  }\r
+  else if (index == u_template)\r
+    if (align_state > 500000L)\r
+      align_state = 0;\r
+    else\r
+    {\r
+      fatal_error("(interwoven alignment preambles are not allowed)");\r
+      return;\r
+    }\r
+\r
+  pop_input();\r
+  check_interrupt();\r
+}\r
+/* sec 0325 */\r
+void back_input (void)\r
+{\r
+  pointer p;\r
+\r
+  while ((state == 0) && (loc == 0) &&\r
+      (index != v_template))\r
+  {\r
+    end_token_list();\r
+  }\r
+\r
+  p = get_avail();\r
+  info(p) = cur_tok;\r
+\r
+  if (cur_tok < right_brace_limit)\r
+    if (cur_tok < left_brace_limit)\r
+      decr(align_state);\r
+    else\r
+      incr(align_state);\r
+\r
+  push_input();\r
+  state = token_list;\r
+  start = p;\r
+  index = backed_up;\r
+  loc = p;\r
+}\r
+/* sec 0327 */\r
+void back_error (void)\r
+{\r
+  OK_to_interrupt = false;\r
+  back_input();\r
+  OK_to_interrupt = true;\r
+  error();\r
+}\r
+/* sec 0327 */\r
+void ins_error (void) \r
+{\r
+  OK_to_interrupt = false;\r
+  back_input();\r
+  index = inserted;\r
+  OK_to_interrupt = true;\r
+  error();\r
+}\r
+/* sec 0328 */\r
+void begin_file_reading (void)\r
+{\r
+  if (in_open == max_in_open)\r
+  {\r
+    overflow("text input levels", max_in_open);\r
+    return;\r
+  }\r
+\r
+#ifdef ALLOCATEBUFFER\r
+  if (first == current_buf_size)\r
+    buffer = realloc_buffer(increment_buf_size);\r
+\r
+  if (first == current_buf_size)\r
+  {\r
+    overflow("buffer size", current_buf_size);\r
+    return;\r
+  }\r
+#else\r
+  if (first == buf_size)\r
+  {\r
+    overflow("buffer size", buf_size);\r
+    return;\r
+  }\r
+#endif\r
+\r
+  incr(in_open);\r
+\r
+  if (in_open > high_in_open) /* 1999 Jan 17 */\r
+    high_in_open = in_open;\r
+\r
+  push_input();\r
+  index = in_open;\r
+  line_stack[index] = line;\r
+  start = first;\r
+  state = mid_line;\r
+  name = 0;\r
+}\r
+/* sec 0329 */\r
+void end_file_reading (void)\r
+{\r
+  first = start;\r
+  line = line_stack[index];\r
+\r
+  if (name > 17)\r
+    a_close(cur_file);\r
+\r
+  pop_input();\r
+  decr(in_open);\r
+}\r
+/* called only form tex0.c */\r
+/* sec 0330 */\r
+void clear_for_error_prompt (void) \r
+{\r
+  while ((state != 0) && (name == 0) &&\r
+    (input_ptr > 0) && (loc > limit))\r
+    end_file_reading();\r
+\r
+  print_ln();\r
+}\r
+/* sec 0336 */\r
+void check_outer_validity (void)\r
+{\r
+  pointer p;\r
+  pointer q;\r
+\r
+  if (scanner_status != 0)\r
+  {\r
+    deletions_allowed = false;\r
+\r
+    if (cur_cs != 0)\r
+    {\r
+      if ((state == 0) || (name < 1) || (name > 17))\r
+      {\r
+        p = get_avail();\r
+        info(p) = cs_token_flag + cur_cs;\r
+        back_list(p);\r
+      }\r
+\r
+      cur_cmd = spacer;\r
+      cur_chr = ' ';\r
+    }\r
+\r
+    if (scanner_status > skipping)\r
+    {\r
+      runaway();\r
+\r
+      if (cur_cs == 0)\r
+        print_err("File ended");\r
+      else\r
+      {\r
+        cur_cs = 0;\r
+        print_err("Forbidden control sequence found");\r
+      }\r
+\r
+      prints(" while scanning ");\r
+      p = get_avail();\r
+\r
+      switch (scanner_status)\r
+      {\r
+        case defining:\r
+          prints("definition");\r
+          info(p) = right_brace_token + '}';\r
+          break;\r
+\r
+        case matching:\r
+          prints("use");\r
+          info(p) = par_token;\r
+          long_state = outer_call;\r
+          break;\r
+\r
+        case aligning:\r
+          prints("preamble");\r
+          info(p) = right_brace_token + '}';\r
+          q = p;\r
+          p = get_avail();\r
+          link(p) = q;\r
+          info(p) = cs_token_flag + frozen_cr;\r
+          align_state = -1000000L;\r
+          break;\r
+\r
+        case absorbing:\r
+          prints("text");\r
+          info(p) = right_brace_token + '}';\r
+          break;\r
+      }\r
+\r
+      ins_list(p);\r
+      prints(" of ");\r
+      sprint_cs(warning_index);\r
+      help4("I suspect you have forgotten a `}', causing me",\r
+          "to read past where you wanted me to stop.",\r
+          "I'll try to recover; but if the error is serious,",\r
+          "you'd better type `E' or `X' now and fix your file.");\r
+      error();\r
+    }\r
+    else\r
+    {\r
+      print_err("Incomplete ");\r
+      print_cmd_chr(if_test, cur_if);\r
+      prints("; all text was ignored after line ");\r
+      print_int(skip_line);\r
+      help3("A forbidden control sequence occurred in skipped text.",\r
+          "This kind of error happens when you say `\\if...' and forget",\r
+          "the matching `\\fi'. I've inserted a `\\fi'; this might work.");\r
+\r
+      if (cur_cs != 0)\r
+        cur_cs = 0; \r
+      else\r
+        help_line[2] = "The file ended while I was skipping conditional text.";\r
+\r
+      cur_tok = cs_token_flag + frozen_fi;\r
+      ins_error();\r
+    }\r
+\r
+    deletions_allowed = true;\r
+  }\r
+}\r
+/* sec 0363 */\r
+void firm_up_the_line (void)\r
+{\r
+  integer k;\r
+\r
+  limit = last;\r
+\r
+  if (pausing > 0)\r
+    if (interaction > nonstop_mode)\r
+    {\r
+      ;\r
+      print_ln();\r
+\r
+      if (start < limit)\r
+        for (k = start; k <= limit - 1; k++)\r
+          print(buffer[k]);\r
+\r
+      first = limit;\r
+      prompt_input("=>");\r
+\r
+      if (last > first)\r
+      {\r
+        for (k = first; k <= last - 1; k++)\r
+          buffer[k + start - first] = buffer[k];\r
+\r
+        limit = start + last - first;\r
+      }\r
+    }\r
+}\r
+/* sec 0365 */\r
+void get_token (void)\r
+{ \r
+  no_new_control_sequence = false;\r
+  get_next();\r
+  no_new_control_sequence = true;\r
+\r
+  if (cur_cs == 0)\r
+    cur_tok = (cur_cmd * 256) + cur_chr;\r
+  else\r
+    cur_tok = cs_token_flag + cur_cs;\r
+}\r
+/* sec 0389 */\r
+void macro_call (void)\r
+{\r
+  pointer r;\r
+  pointer p;\r
+  pointer q;\r
+  pointer s;\r
+  pointer t;\r
+  pointer u, v;\r
+  pointer rbrace_ptr;\r
+  small_number n;\r
+  halfword unbalance;\r
+  halfword m;\r
+  pointer ref_count;\r
+  small_number save_scanner_status;\r
+  pointer save_warning_index;\r
+  ASCII_code match_chr;\r
+\r
+  save_scanner_status = scanner_status;\r
+  save_warning_index = warning_index;\r
+  warning_index = cur_cs;\r
+  ref_count = cur_chr;\r
+  r = link(ref_count);\r
+  n = 0;\r
+\r
+  if (tracing_macros > 0)\r
+  {\r
+    begin_diagnostic();\r
+    print_ln();\r
+    print_cs(warning_index);\r
+    token_show(ref_count);\r
+    end_diagnostic(false);\r
+  }\r
+\r
+  if (info(r) != end_match_token)\r
+  {\r
+    scanner_status = matching;\r
+    unbalance = 0;\r
+    long_state = eq_type(cur_cs);\r
+\r
+    if (long_state >= outer_call)\r
+      long_state = long_state - 2;\r
+\r
+    do\r
+      {\r
+        link(temp_head) = 0;\r
+\r
+        if ((info(r) > match_token + 255) || (info(r) < match_token))\r
+          s = 0;\r
+        else\r
+        {\r
+          match_chr = info(r) - match_token;\r
+          s = link(r);\r
+          r = s;\r
+          p = temp_head;\r
+          m = 0;\r
+        }\r
+\r
+continu:\r
+        get_token();\r
+\r
+        if (cur_tok == info(r))\r
+        {\r
+          r = link(r);\r
+\r
+          if ((info(r) >= match_token) && (info(r) <= end_match_token))\r
+          {\r
+            if (cur_tok < left_brace_limit)\r
+              decr(align_state);\r
+\r
+            goto found;\r
+          }\r
+          else\r
+            goto continu;\r
+        }\r
+\r
+        if (s != r)\r
+          if (s == 0)\r
+          {\r
+            print_err("Use of ");\r
+            sprint_cs(warning_index);\r
+            prints(" doesn't match its definition");\r
+            help4("If you say, e.g., `\\def\\a1{...}', then you must always",\r
+              "put `1' after `\\a', since control sequence names are",\r
+              "made up of letters only. The macro here has not been",\r
+              "followed by the required stuff, so I'm ignoring it.");\r
+            error();\r
+            goto exit;\r
+          }\r
+          else\r
+          {\r
+            t = s;\r
+\r
+            do\r
+              {\r
+                store_new_token(info(t));\r
+                incr(m);\r
+                u = link(t);\r
+                v = s;\r
+\r
+                while (true)\r
+                {\r
+                  if (u == r)\r
+                    if (cur_tok != info(v))\r
+                      goto done;\r
+                    else\r
+                    {\r
+                      r = link(v);\r
+                      goto continu;\r
+                    }\r
+\r
+                    if (info(u) != info(v))\r
+                      goto done;\r
+\r
+                    u = link(u);\r
+                    v = link(v);\r
+                }\r
+done:\r
+                t = link(t);\r
+              }\r
+            while (!(t == r));\r
+\r
+            r = s;\r
+          }\r
+\r
+        if (cur_tok == par_token)\r
+          if (long_state != long_call)\r
+          {\r
+            if (long_state == call)\r
+            {\r
+              runaway();\r
+              print_err("Paragraph ended before ");\r
+              sprint_cs(warning_index);\r
+              prints("was complete");\r
+              help3("I suspect you've forgotten a `}', causing me to apply this",\r
+                  "control sequence to too much text. How can we recover?",\r
+                  "My plan is to forget the whole thing and hope for the best.");\r
+              back_error();\r
+            }\r
+\r
+            pstack[n] = link(temp_head);\r
+            align_state = align_state - unbalance;\r
+\r
+            for (m = 0; m <= n; m++)\r
+              flush_list(pstack[m]);\r
+\r
+            goto exit;\r
+          }\r
+\r
+        if (cur_tok < right_brace_limit)\r
+          if (cur_tok < left_brace_limit)\r
+          {\r
+            unbalance = 1;\r
+\r
+            while (true)\r
+            {\r
+              fast_store_new_token(cur_tok);\r
+              get_token();\r
+\r
+              if (cur_tok == par_token)\r
+                if (long_state != long_call)\r
+                {\r
+                  if (long_state == call)\r
+                  {\r
+                    runaway();\r
+                    print_err("Paragraph ended before ");\r
+                    sprint_cs(warning_index);\r
+                    prints(" was complete");\r
+                    help3("I suspect you've forgotten a `}', causing me to apply this",\r
+                        "control sequence to too much text. How can we recover?",\r
+                        "My plan is to forget the whole thing and hope for the best.");\r
+                    back_error();\r
+                  }\r
+\r
+                  pstack[n] = link(temp_head);\r
+                  align_state = align_state - unbalance;\r
+\r
+                  for (m = 0; m <= n; m++)\r
+                    flush_list(pstack[m]);\r
+                  goto exit;\r
+                }\r
+\r
+              if (cur_tok < right_brace_limit)\r
+                if (cur_tok < left_brace_limit)\r
+                  incr(unbalance);\r
+                else\r
+                {\r
+                  decr(unbalance);\r
+\r
+                  if (unbalance == 0)\r
+                    goto done1;\r
+                }\r
+            }\r
+done1:\r
+            rbrace_ptr = p;\r
+            store_new_token(cur_tok);\r
+          }\r
+          else\r
+          {\r
+            back_input();\r
+            print_err("Argument of ");\r
+            sprint_cs(warning_index);\r
+            prints(" has an extra }");\r
+            help6("I've run across a `}' that doesn't seem to match anything.",\r
+                "For example, `\\def\\a#1{...}' and `\\a}' would produce",\r
+                "this error. If you simply proceed now, the `\\par' that",\r
+                "I've just inserted will cause me to report a runaway",\r
+                "argument that might be the root of the problem. But if",\r
+                "your `}' was spurious, just type `2' and it will go away.");\r
+            incr(align_state);\r
+            long_state = call;\r
+            cur_tok = par_token;\r
+            ins_error();\r
+            goto continu;\r
+          }\r
+        else\r
+        {\r
+          if (cur_tok == space_token)\r
+            if (info(r) <= end_match_token)\r
+              if (info(r) >= match_token)\r
+                goto continu;\r
+\r
+          store_new_token(cur_tok);\r
+        }\r
+\r
+        incr(m);\r
+\r
+        if (info(r) > end_match_token)\r
+          goto continu;\r
+\r
+        if (info(r) < match_token)\r
+          goto continu;\r
+\r
+found:\r
+        if (s != 0)\r
+        {\r
+          if ((m == 1) && (info(p) < right_brace_limit) && (p != temp_head))\r
+          {\r
+            link(rbrace_ptr) = 0;\r
+            free_avail(p);\r
+            p = link(temp_head);\r
+            pstack[n] = link(p);\r
+            free_avail(p);\r
+          }\r
+          else\r
+            pstack[n] = link(temp_head);\r
+\r
+          incr(n);\r
+\r
+          if (tracing_macros > 0)\r
+          {\r
+            begin_diagnostic();\r
+            //print_nl(match_chr);\r
+            print_nl(""); print(match_chr);\r
+            print_int(n);\r
+            prints("<-");\r
+            show_token_list(pstack[n - 1], 0, 1000);\r
+            end_diagnostic(false);\r
+          }\r
+        }\r
+      }\r
+    while (!(info(r) == end_match_token));\r
+  }\r
+\r
+  while ((state == token_list) && (loc == 0) &&\r
+      (index != v_template))\r
+    end_token_list();\r
+\r
+  begin_token_list(ref_count, macro);\r
+  name = warning_index;\r
+  loc = link(r);\r
+\r
+  if (n > 0)\r
+  {\r
+    if (param_ptr + n > max_param_stack)\r
+    {\r
+      max_param_stack = param_ptr + n;\r
+\r
+#ifdef ALLOCATEPARAMSTACK\r
+      if (max_param_stack > current_param_size)\r
+        param_stack = realloc_param_stack(increment_param_size);\r
+\r
+      if (max_param_stack > current_param_size)\r
+      {\r
+        overflow("parameter stack size", current_param_size);\r
+        return;\r
+      }\r
+#else\r
+      if (max_param_stack > param_size)\r
+      {\r
+        overflow("parameter stack size", param_size);\r
+        return;\r
+      }\r
+#endif\r
+    }\r
+\r
+    for (m = 0; m <= n - 1; m++)\r
+      param_stack[param_ptr + m] = pstack[m];\r
+\r
+    param_ptr = param_ptr + n;\r
+  }\r
+\r
+exit:\r
+  scanner_status = save_scanner_status;\r
+  warning_index = save_warning_index;\r
+}\r
+/* sec 0379 */\r
+void insert_relax (void)\r
+{\r
+  cur_tok = cs_token_flag + cur_cs;\r
+  back_input();\r
+  cur_tok = cs_token_flag + frozen_relax;\r
+  back_input();\r
+  index = inserted;\r
+}\r
+/* sec 0366 */\r
+void expand (void)\r
+{\r
+  halfword t;\r
+  pointer p, q, r;\r
+  integer j;\r
+  integer cv_backup;\r
+  small_number cvl_backup, radix_backup, co_backup;\r
+  pointer backup_backup;\r
+  small_number save_scanner_status;\r
+\r
+  cv_backup = cur_val;\r
+  cvl_backup = cur_val_level;\r
+  radix_backup = radix;\r
+  co_backup = cur_order;\r
+  backup_backup = link(backup_head);\r
+\r
+  if (cur_cmd < call)\r
+  {\r
+    if (tracing_commands > 1)\r
+      show_cur_cmd_chr();\r
+\r
+    switch (cur_cmd)\r
+    {\r
+      case top_bot_mark:\r
+        if (cur_mark[cur_chr] != 0)\r
+          begin_token_list(cur_mark[cur_chr], mark_text);\r
+        break;\r
+\r
+      case expand_after:\r
+        get_token();\r
+        t = cur_tok;\r
+        get_token();\r
+\r
+        if (cur_cmd > max_command)\r
+          expand();\r
+        else\r
+          back_input();\r
+\r
+        cur_tok = t;\r
+        back_input();\r
+        break;\r
+\r
+      case no_expand:\r
+        save_scanner_status = scanner_status;\r
+        scanner_status = normal;\r
+        get_token();\r
+        scanner_status = save_scanner_status;\r
+        t = cur_tok;\r
+        back_input();\r
+\r
+        if (t >= cs_token_flag)\r
+        {\r
+          p = get_avail();\r
+          info(p) = cs_token_flag + frozen_dont_expand;\r
+          link(p) = loc;\r
+          start = p;\r
+          loc = p;\r
+        }\r
+        break;\r
+\r
+      case cs_name:\r
+        r = get_avail();\r
+        p = r;\r
+\r
+        do\r
+          {\r
+            get_x_token();\r
+  \r
+            if (cur_cs == 0)\r
+              store_new_token(cur_tok);\r
+          }\r
+        while (!(cur_cs != 0));\r
+\r
+        if (cur_cmd != end_cs_name)\r
+        {\r
+          print_err("Missing ");\r
+          print_esc("endcsname");\r
+          prints(" inserted");\r
+          help2("The control sequence marked <to be read again> should",\r
+              "not appear between \\csname and \\endcsname.");\r
+          back_error();\r
+        }\r
+\r
+        j = first;\r
+        p = link(r);\r
+\r
+        while (p != 0)\r
+        {\r
+          if (j >= max_buf_stack)\r
+          {\r
+            max_buf_stack = j + 1;\r
+\r
+#ifdef ALLOCATEBUFFER\r
+            if (max_buf_stack == current_buf_size)\r
+              buffer = realloc_buffer (increment_buf_size);\r
+\r
+            if (max_buf_stack == current_buf_size)\r
+            {\r
+              overflow("buffer size", current_buf_size);\r
+              return;\r
+            }\r
+#else\r
+            if (max_buf_stack == buf_size)\r
+            {\r
+              overflow("buffer size", buf_size);\r
+              return;\r
+            }\r
+#endif\r
+          }\r
+\r
+          buffer[j] = info(p) % 256;\r
+          incr(j);\r
+          p = link(p);\r
+        }\r
+\r
+        if (j > first + 1)\r
+        {\r
+          no_new_control_sequence = false;\r
+          cur_cs = id_lookup(first, j - first);\r
+          no_new_control_sequence = true;\r
+        }\r
+        else if (j == first)\r
+          cur_cs = null_cs;\r
+        else\r
+          cur_cs = single_base + buffer[first];\r
+\r
+        flush_list(r);\r
+\r
+        if (eq_type(cur_cs) == undefined_cs)\r
+        {\r
+          eq_define(cur_cs, relax, 256);\r
+        }\r
+\r
+        cur_tok = cur_cs + cs_token_flag;\r
+        back_input();\r
+        break;\r
+\r
+      case convert:\r
+        conv_toks();\r
+        break;\r
+\r
+      case the:\r
+        ins_the_toks();\r
+        break;\r
+\r
+      case if_test:\r
+        conditional();\r
+        break;\r
+\r
+      case fi_or_else:\r
+        if (cur_chr > if_limit)\r
+          if (if_limit == 1)\r
+            insert_relax();\r
+          else\r
+          {\r
+            print_err("Extra ");\r
+            print_cmd_chr(fi_or_else, cur_chr);\r
+            help1("I'm ignoring this; it doesn't match any \\if.");\r
+            error();\r
+          }\r
+        else\r
+        {\r
+          while (cur_chr != fi_code)\r
+            pass_text();\r
+\r
+          {\r
+            p = cond_ptr;\r
+            if_line = if_line_field(p);\r
+            cur_if = subtype(p);\r
+            if_limit = type(p);\r
+            cond_ptr = link(p);\r
+            free_node(p, if_node_size);\r
+          }\r
+        }\r
+        break;\r
+\r
+      case input:\r
+        if (cur_chr > 0)\r
+          force_eof = true;\r
+        else if (name_in_progress)\r
+          insert_relax();\r
+        else\r
+          start_input();\r
+        break;\r
+\r
+      default:\r
+        print_err("Undefined control sequence");\r
+        help5("The control sequence at the end of the top line",\r
+            "of your error message was never \\def'ed. If you have",\r
+            "misspelled it (e.g., `\\hobx'), type `I' and the correct",\r
+            "spelling (e.g., `I\\hbox'). Otherwise just continue,",\r
+            "and I'll forget about whatever was undefined.");\r
+        error();\r
+        break;\r
+    }\r
+  }\r
+  else if (cur_cmd < end_template)\r
+  {\r
+    macro_call();\r
+  }\r
+  else\r
+  {\r
+    cur_tok = cs_token_flag + frozen_endv;\r
+    back_input();\r
+  }\r
+\r
+  cur_val = cv_backup;\r
+  cur_val_level = cvl_backup;\r
+  radix = radix_backup;\r
+  cur_order = co_backup;\r
+  link(backup_head) = backup_backup;\r
+}\r
+/* sec 0380 */\r
+void get_x_token (void)\r
+{\r
+restart:\r
+  get_next();\r
+\r
+  if (cur_cmd <= max_command)\r
+    goto done;\r
+\r
+  if (cur_cmd >= call)\r
+    if (cur_cmd < end_template)\r
+      macro_call();\r
+    else\r
+    {\r
+      cur_cs = frozen_endv;\r
+      cur_cmd = endv;\r
+      goto done;\r
+    }\r
+  else\r
+    expand();\r
+\r
+  goto restart;\r
+\r
+done:\r
+  if (cur_cs == 0)\r
+    cur_tok = (cur_cmd * 256) + cur_chr;\r
+  else\r
+    cur_tok = cs_token_flag + cur_cs;\r
+}\r
+/* sec 0381 */\r
+void x_token (void)\r
+{\r
+  while (cur_cmd > max_command)\r
+  {\r
+    expand();\r
+    get_next();\r
+  }\r
+\r
+  if (cur_cs == 0)\r
+    cur_tok = (cur_cmd * 256) + cur_chr;\r
+  else\r
+    cur_tok = cs_token_flag + cur_cs;\r
+}\r
+/* sec 0403 */\r
+void scan_left_brace (void)\r
+{\r
+  do\r
+    {\r
+      get_x_token();\r
+    }\r
+  while (!((cur_cmd != spacer) && (cur_cmd != relax)));\r
+\r
+  if (cur_cmd != left_brace)\r
+  {\r
+    print_err("Missing { inserted");\r
+    help4("A left brace was mandatory here, so I've put one in.",\r
+        "You might want to delete and/or insert some corrections",\r
+        "so that I will find a matching right brace soon.",\r
+        "(If you're confused by all this, try typing `I}' now.)");\r
+    back_error();\r
+    cur_tok = left_brace_token + '{';\r
+    cur_cmd = left_brace;\r
+    cur_chr = '{';\r
+    incr(align_state);\r
+  }\r
+}\r
+/* sec 0405 */\r
+void scan_optional_equals (void)\r
+{\r
+  do\r
+    {\r
+      get_x_token();\r
+    }\r
+  while (!(cur_cmd != spacer));\r
+\r
+  if (cur_tok != other_token + '=')\r
+    back_input();\r
+}\r
+/* sec 0407 */\r
+boolean scan_keyword (const char * s)\r
+{\r
+  pointer p;\r
+  pointer q;\r
+  const char * k;\r
+\r
+  p = backup_head;\r
+  link(p) = 0;\r
+  k = s;\r
+\r
+  while (*k)\r
+  {\r
+    get_x_token(); \r
+\r
+    if ((cur_cs == 0) && ((cur_chr == (*k)) || (cur_chr == (*k) - 'a' + 'A')))\r
+    {\r
+      store_new_token(cur_tok);\r
+      incr(k);\r
+    }\r
+    else if ((cur_cmd != spacer) || (p != backup_head))\r
+    {\r
+      back_input();\r
+\r
+      if (p != backup_head)\r
+        back_list(link(backup_head));\r
+\r
+      return false;\r
+    }\r
+  }\r
+\r
+  flush_list(link(backup_head));\r
+\r
+  return true;\r
+}\r
+/* sec 0408 */\r
+void mu_error (void)\r
+{\r
+  print_err("Incompatible glue units");\r
+  help1("I'm going to assume that 1mu=1pt when they're mixed.");\r
+  error();\r
+}\r
+/* sec 0433 */\r
+void scan_eight_bit_int (void)\r
+{\r
+  scan_int();\r
+\r
+  if ((cur_val < 0) || (cur_val > 255))\r
+  {\r
+    print_err("Bad register code");\r
+    help2("A register number must be between 0 and 255.",\r
+        "I changed this one to zero.");\r
+    int_error(cur_val);\r
+    cur_val = 0;\r
+  }\r
+}\r
+/* sec 0434 */\r
+void scan_char_num (void)\r
+{\r
+  scan_int();\r
+\r
+  if ((cur_val < 0) || (cur_val > 255))\r
+  {\r
+    print_err("Bad character code");\r
+    help2("A character number must be between 0 and 255.",\r
+        "I changed this one to zero.");\r
+    int_error(cur_val);\r
+    cur_val = 0;\r
+  }\r
+}\r
+/* sec 0435 */\r
+void scan_four_bit_int (void)\r
+{\r
+  scan_int();\r
+\r
+  if ((cur_val < 0) || (cur_val > 15))\r
+  {\r
+    print_err("Bad number");\r
+    help2("Since I expected to read a number between 0 and 15,",\r
+        "I changed this one to zero.");\r
+    int_error(cur_val);\r
+    cur_val = 0;\r
+  }\r
+}\r
+/* sec 0436 */\r
+void scan_fifteen_bit_int (void) \r
+{\r
+  scan_int();\r
+\r
+  if ((cur_val < 0) || (cur_val > 32767))\r
+  {\r
+    print_err("Bad mathchar");\r
+    help2("A mathchar number must be between 0 and 32767.",\r
+        "I changed this one to zero.");\r
+    int_error(cur_val);\r
+    cur_val = 0;\r
+  }\r
+}\r
+/* sec 0437 */\r
+void scan_twenty_seven_bit_int (void)\r
+{\r
+  scan_int();\r
+\r
+  if ((cur_val < 0) || (cur_val > 134217727L))\r
+  {\r
+    print_err("Bad delimiter code");\r
+    help2("A numeric delimiter code must be between 0 and 2^{27}-1.",\r
+        "I changed this one to zero.");\r
+    int_error(cur_val);\r
+    cur_val = 0;\r
+  }\r
+}\r
+/* sec 0577 */\r
+void scan_font_ident (void) \r
+{\r
+  internal_font_number f;\r
+  halfword m;\r
+\r
+  do\r
+    {\r
+      get_x_token();\r
+    }\r
+  while (!(cur_cmd != spacer));\r
+\r
+  if (cur_cmd == def_font)\r
+    f = cur_font;\r
+  else if (cur_cmd == set_font)\r
+    f = cur_chr; \r
+  else if (cur_cmd == def_family)\r
+  {\r
+    m = cur_chr;\r
+    scan_four_bit_int();\r
+    f = equiv(m + cur_val);\r
+  }\r
+  else\r
+  {\r
+    print_err("Missing font identifier");\r
+    help2("I was looking for a control sequence whose",\r
+        "current meaning has been defined by \\font.");\r
+    back_error();\r
+    f = null_font;\r
+  }\r
+\r
+  cur_val = f;\r
+}\r
+/* sec 0578 */\r
+void find_font_dimen (boolean writing)\r
+{\r
+  internal_font_number f;\r
+  integer n;\r
+\r
+  scan_int();\r
+  n = cur_val;\r
+  scan_font_ident();\r
+  f = cur_val;\r
+\r
+  if (n < 0)\r
+    cur_val = fmem_ptr;\r
+  else\r
+  {\r
+    if (writing && (n <= space_shrink_code) && (n >= space_code) && (font_glue[f] != 0)) \r
+    {\r
+      delete_glue_ref(font_glue[f]);\r
+      font_glue[f] = 0;\r
+    }\r
+\r
+    if (n > font_params[f])\r
+      if (f < font_ptr)\r
+        cur_val = fmem_ptr;\r
+      else\r
+      {\r
+        do\r
+          {\r
+ #ifdef ALLOCATEFONT\r
+            if (fmem_ptr == current_font_mem_size)\r
+              font_info = realloc_font_info(increment_font_mem_size);\r
+\r
+            if (fmem_ptr == current_font_mem_size)\r
+            {\r
+              overflow("font memory", current_font_mem_size);\r
+              return;\r
+            }\r
+#else\r
+            if (fmem_ptr == font_mem_size)\r
+            {\r
+              overflow("font memory", font_mem_size);\r
+              return;\r
+            }\r
+#endif\r
+            font_info[fmem_ptr].cint = 0;\r
+            incr(fmem_ptr);\r
+            incr(font_params[f]);\r
+          }\r
+        while (!(n == font_params[f]));\r
+\r
+        cur_val = fmem_ptr - 1;\r
+      }\r
+    else if (n > 0)\r
+      cur_val = n + param_base[f];\r
+  }\r
+\r
+  if (cur_val == fmem_ptr)\r
+  {\r
+    print_err("Font ");\r
+    print_esc(""); print(font_id_text(f));\r
+    prints(" has only ");\r
+    print_int(font_params[f]);\r
+    prints(" fontdimen parameters");\r
+    help2("To increase the number of font parameters, you must",\r
+      "use \\fontdimen immediately after the \\font is loaded.");\r
+    error();\r
+  }\r
+}\r
+/* sec 0413 */\r
+void scan_something_internal (small_number level, boolean negative)\r
+{\r
+  halfword m;\r
+  integer p;\r
+\r
+  m = cur_chr;\r
+\r
+  switch (cur_cmd)\r
+  {\r
+    case def_code:\r
+      {\r
+        scan_char_num();\r
+\r
+        if (m == math_code_base)\r
+          scanned_result(math_code(cur_val), int_val);\r
+        else if (m < math_code_base)\r
+          scanned_result(equiv(m + cur_val), int_val);\r
+        else\r
+          scanned_result(eqtb[m + cur_val].cint, int_val);\r
+      }\r
+      break;\r
+\r
+    case toks_register:\r
+    case assign_toks:\r
+    case def_family:\r
+    case set_font:\r
+    case def_font:\r
+      if (level != tok_val)\r
+      {\r
+        print_err("Missing number, treated as zero");\r
+        help3("A number should have been here; I inserted `0'.",\r
+            "(If you can't figure out why I needed to see a number,",\r
+            "look up `weird error' in the index to The TeXbook.)");\r
+        back_error();\r
+        scanned_result(0, dimen_val);\r
+      }\r
+      else if (cur_cmd <= assign_toks)\r
+      {\r
+        if (cur_cmd < assign_toks)\r
+        {\r
+          scan_eight_bit_int();\r
+          m = toks_base + cur_val;\r
+        }\r
+\r
+        scanned_result(equiv(m), tok_val);\r
+      }\r
+      else\r
+      {\r
+        back_input();\r
+        scan_font_ident();\r
+        scanned_result(font_id_base + cur_val, ident_val);\r
+      }\r
+      break;\r
+\r
+    case assign_int:\r
+      scanned_result(eqtb[m].cint, int_val);\r
+      break;\r
+\r
+    case assign_dimen:\r
+      scanned_result(eqtb[m].cint, dimen_val);\r
+      break; \r
+\r
+    case assign_glue:\r
+      scanned_result(equiv(m), glue_val);\r
+      break;\r
+\r
+    case assign_mu_glue:\r
+      scanned_result(equiv(m), mu_val);\r
+      break;\r
+\r
+    case set_aux:\r
+      if (abs(mode) != m)\r
+      {\r
+        print_err("Improper ");\r
+        print_cmd_chr(set_aux, m);\r
+        help4("You can refer to \\spacefactor only in horizontal mode;",\r
+            "you can refer to \\prevdepth only in vertical mode; and",\r
+            "neither of these is meaningful inside \\write. So",\r
+            "I'm forgetting what you said and using zero instead.");\r
+        error();\r
+\r
+        if (level != tok_val)\r
+          scanned_result(0, dimen_val);\r
+        else\r
+          scanned_result(0, int_val);\r
+      }\r
+      else if (m == vmode)\r
+        scanned_result(prev_depth, dimen_val);\r
+      else\r
+        scanned_result(space_factor, int_val);\r
+      break;\r
+\r
+    case set_prev_graf:\r
+      if (mode == 0)\r
+        scanned_result(0, int_val);\r
+      else\r
+      {\r
+        nest[nest_ptr] = cur_list;\r
+        p = nest_ptr;\r
+\r
+        while (abs(nest[p].mode_field) != vmode)\r
+          decr(p);\r
+\r
+        scanned_result(nest[p].pg_field, int_val);\r
+      }\r
+      break;\r
+\r
+    case set_page_int:\r
+      {\r
+        if (m == 0)\r
+          cur_val = dead_cycles; \r
+        else\r
+          cur_val = insert_penalties;\r
+\r
+        cur_val_level = 0;\r
+      }\r
+      break;\r
+\r
+    case set_page_dimen:\r
+      {\r
+        if ((page_contents == 0) && (! output_active))\r
+          if (m == 0)\r
+            cur_val = max_dimen;\r
+          else\r
+            cur_val = 0;\r
+        else\r
+          cur_val = page_so_far[m];\r
+\r
+        cur_val_level = dimen_val;\r
+      }\r
+      break;\r
+\r
+    case set_shape:\r
+      {\r
+        if (par_shape_ptr == 0)\r
+          cur_val = 0; \r
+        else\r
+          cur_val = info(par_shape_ptr);\r
+\r
+        cur_val_level = int_val;\r
+      }\r
+      break;\r
+\r
+    case set_box_dimen:\r
+      {\r
+        scan_eight_bit_int();\r
+\r
+        if (box(cur_val) == 0)\r
+          cur_val = 0;\r
+        else\r
+          cur_val = mem[box(cur_val) + m].cint;\r
+\r
+        cur_val_level = dimen_val;\r
+      }\r
+      break;\r
+\r
+    case char_given:\r
+    case math_given:\r
+      scanned_result(cur_chr, int_val);\r
+      break;\r
+\r
+    case assign_font_dimen:\r
+      {\r
+        find_font_dimen(false);\r
+        font_info[fmem_ptr].cint = 0;\r
+        scanned_result(font_info[cur_val].cint, dimen_val);\r
+      }\r
+      break;\r
+\r
+    case assign_font_int:\r
+      {\r
+        scan_font_ident();\r
+\r
+        if (m == 0)\r
+          scanned_result(hyphen_char[cur_val], int_val);\r
+        else\r
+          scanned_result(skew_char[cur_val], int_val);\r
+      }\r
+      break;\r
+\r
+    case tex_register:\r
+      {\r
+        scan_eight_bit_int();\r
+\r
+        switch (m)\r
+        {\r
+          case int_val:\r
+            cur_val = count(cur_val);\r
+            break;\r
+\r
+          case dimen_val:\r
+            cur_val = dimen(cur_val);\r
+            break;\r
+\r
+          case glue_val:\r
+            cur_val = skip(cur_val);\r
+            break;\r
+\r
+          case mu_val:\r
+            cur_val = mu_skip(cur_val);\r
+            break;\r
+        }\r
+        \r
+        cur_val_level = m;\r
+      }\r
+      break;\r
+\r
+    case last_item:\r
+      if (cur_chr > glue_val)\r
+      {\r
+        if (cur_chr == input_line_no_code)\r
+          cur_val = line;\r
+        else\r
+          cur_val = last_badness;\r
+\r
+        cur_val_level = int_val;\r
+      }\r
+      else\r
+      {\r
+        if (cur_chr == glue_val)\r
+          cur_val = zero_glue;\r
+        else\r
+          cur_val = 0;\r
+\r
+        cur_val_level = cur_chr;\r
+\r
+        if (!is_char_node(tail) && (mode != 0))\r
+          switch (cur_chr)\r
+          {\r
+            case int_val:\r
+              if (type(tail) == penalty_node)\r
+                cur_val = penalty(tail);\r
+              break;\r
+\r
+            case dimen_val:\r
+              if (type(tail) == kern_node)\r
+                cur_val = width(tail);\r
+              break;\r
+\r
+            case glue_val:\r
+              if (type(tail) == glue_node)\r
+              {\r
+                cur_val = glue_ptr(tail);\r
+\r
+                if (subtype(tail) == mu_glue)\r
+                  cur_val_level = mu_val;\r
+              }\r
+              break;\r
+          }\r
+        else if ((mode == vmode) && (tail == head))\r
+          switch (cur_chr)\r
+          {\r
+            case int_val:\r
+              cur_val = last_penalty;\r
+              break;\r
+\r
+            case dimen_val:\r
+              cur_val = last_kern;\r
+              break;\r
+\r
+            case glue_val:\r
+              if (last_glue != empty_flag)\r
+                cur_val = last_glue;\r
+              break;\r
+          }\r
+      }\r
+      break;\r
+\r
+    default:\r
+      {\r
+        print_err("You can't use `");\r
+        print_cmd_chr(cur_cmd, cur_chr);\r
+        prints("' after ");\r
+        print_esc("the");\r
+        help1("I'm forgetting what you said and using zero instead.");\r
+        error();\r
+\r
+        if (level != tok_val)\r
+          scanned_result(0, dimen_val);\r
+        else\r
+          scanned_result(0, int_val);\r
+      }\r
+      break;\r
+  }\r
+\r
+  while (cur_val_level > level)\r
+  {\r
+    if (cur_val_level == glue_val)\r
+      cur_val = width(cur_val);\r
+    else if (cur_val_level == mu_val)\r
+      mu_error();\r
+\r
+    decr(cur_val_level);\r
+  }\r
+\r
+  if (negative)\r
+    if (cur_val_level >= 2)\r
+    {\r
+      cur_val = new_spec(cur_val);\r
+\r
+      {\r
+        width(cur_val) = -width(cur_val);\r
+        stretch(cur_val) = -stretch(cur_val);\r
+        shrink(cur_val) = -shrink(cur_val);\r
+      }\r
+    }\r
+    else\r
+      cur_val = -cur_val;\r
+  else if ((cur_val_level >= glue_val) && (cur_val_level <= mu_val))\r
+    add_glue_ref(cur_val);\r
+}\r
+/* sec 0341 */\r
+void get_next (void)\r
+{\r
+  integer k;\r
+  halfword t;\r
+  /* char cat; */\r
+  int cat;\r
+  ASCII_code c, cc;\r
+  char d;\r
+\r
+restart:\r
+  cur_cs = 0;\r
+\r
+  if (state != token_list)\r
+  {\r
+lab_switch:\r
+    if (loc <= limit)\r
+    {\r
+      cur_chr = buffer[loc];\r
+      incr(loc);\r
+\r
+reswitch:\r
+      cur_cmd = cat_code(cur_chr);\r
+\r
+      switch (state + cur_cmd)\r
+      {\r
+        case any_state_plus(ignore):\r
+        case skip_blanks + spacer:\r
+        case new_line + spacer:\r
+          goto lab_switch;\r
+          break;\r
+\r
+        case any_state_plus(escape):\r
+          {\r
+            if (loc > limit)\r
+              cur_cs = null_cs;\r
+            else\r
+            {\r
+start_cs:\r
+              k = loc;\r
+              cur_chr = buffer[k];\r
+              cat = cat_code(cur_chr);\r
+              incr(k);\r
+\r
+              if (cat == letter)\r
+                state = skip_blanks;\r
+              else if (cat == spacer)\r
+                state = skip_blanks;\r
+              else\r
+                state = mid_line;\r
+\r
+              if ((cat == letter) && (k <= limit))\r
+              {\r
+                do\r
+                  {\r
+                    cur_chr = buffer[k];\r
+                    cat = cat_code(cur_chr);\r
+                    incr(k);\r
+                  }\r
+                while (!((cat != letter) || (k > limit)));\r
+\r
+                {\r
+                  if (buffer[k]== cur_chr)\r
+                    if (cat == sup_mark)\r
+                      if (k < limit)\r
+                      {\r
+                        c = buffer[k + 1];\r
+\r
+                        if (c < 128)\r
+                        {\r
+                          d = 2;\r
+                          if (is_hex(c))\r
+                            if (k + 2 <= limit)\r
+                            {\r
+                              cc = buffer[k + 2];\r
+\r
+                              if (is_hex(cc))\r
+                                incr(d);\r
+                            }\r
+\r
+                          if (d > 2)\r
+                          {\r
+                            hex_to_cur_chr();\r
+                            buffer[k - 1] = cur_chr;\r
+                          }\r
+                          else if (c < 64)\r
+                            buffer[k - 1] = c + 64;\r
+                          else\r
+                            buffer[k - 1] = c - 64;\r
+\r
+                          limit = limit - d;\r
+                          first = first - d;\r
+\r
+                          while (k <= limit)\r
+                          {\r
+                            buffer[k] = buffer[k + d];\r
+                            incr(k);\r
+                          }\r
+\r
+                          goto start_cs;\r
+                        }\r
+                      }\r
+                }\r
+\r
+                if (cat != letter)\r
+                  decr(k);\r
+\r
+                if (k > loc + 1)\r
+                {\r
+                  cur_cs = id_lookup(loc, k - loc);\r
+                  loc = k;\r
+                  goto found;\r
+                }\r
+              }\r
+              else\r
+              {\r
+                if (buffer[k] == cur_chr)\r
+                  if (cat == sup_mark)\r
+                    if (k < limit)\r
+                    {\r
+                      c = buffer[k + 1];\r
+\r
+                      if (c < 128)\r
+                      {\r
+                        d = 2;\r
+\r
+                        if (is_hex(c))\r
+                          if (k + 2 <= limit)\r
+                          {\r
+                            cc = buffer[k + 2];\r
+\r
+                            if (is_hex(cc))\r
+                              incr(d);\r
+                          }\r
+\r
+                        if (d > 2)\r
+                        {\r
+                          hex_to_cur_chr();\r
+                          buffer[k - 1] = cur_chr;\r
+                        }\r
+                        else if (c < 64)\r
+                          buffer[k - 1] = c + 64;\r
+                        else\r
+                          buffer[k - 1] = c - 64;\r
+\r
+                        limit = limit - d;\r
+                        first = first - d;\r
+\r
+                        while (k <= limit)\r
+                        {\r
+                          buffer[k] = buffer[k + d];\r
+                          incr(k);\r
+                        }\r
+\r
+                        goto start_cs;\r
+                      }\r
+                    }\r
+              }\r
+\r
+              cur_cs = single_base + buffer[loc];\r
+              incr(loc);\r
+            }\r
+found:\r
+            cur_cmd = eq_type(cur_cs);\r
+            cur_chr = equiv(cur_cs);\r
+            \r
+            if (cur_cmd >= outer_call)\r
+              check_outer_validity();\r
+          }\r
+          break;\r
+\r
+        case any_state_plus(active_char):\r
+          {\r
+            cur_cs = cur_chr + active_base;\r
+            cur_cmd = eq_type(cur_cs);\r
+            cur_chr = equiv(cur_cs);\r
+            state = mid_line;\r
+            \r
+            if (cur_cmd >= outer_call)\r
+              check_outer_validity();\r
+          }\r
+          break;\r
+\r
+        case any_state_plus(sup_mark):\r
+          {\r
+            if (cur_chr == buffer[loc])\r
+              if (loc < limit)\r
+              {\r
+                c = buffer[loc + 1];\r
+\r
+                if (c < 128)\r
+                {\r
+                  loc = loc + 2;\r
+\r
+                  if (is_hex(c))\r
+                    if (loc <= limit)\r
+                    {\r
+                      cc = buffer[loc];\r
+\r
+                      if (is_hex(cc))\r
+                      {\r
+                        incr(loc);\r
+                        hex_to_cur_chr();\r
+                        goto reswitch;\r
+                      }\r
+                    }\r
+\r
+                  if (c < 64)\r
+                    cur_chr = c + 64;\r
+                  else\r
+                    cur_chr = c - 64;\r
+\r
+                  goto reswitch;\r
+                }\r
+              }\r
+\r
+              state = mid_line;\r
+          }\r
+          break;\r
+\r
+        case any_state_plus(invalid_char):\r
+          {\r
+            print_err("Text line contains an invalid character");\r
+            help2("A funny symbol that I can't read has just been input.",\r
+                "Continue, and I'll forget that it ever happened.");\r
+            deletions_allowed = false;\r
+            error();\r
+            deletions_allowed = true;\r
+            goto restart;\r
+          }\r
+          break;\r
+\r
+        case mid_line + spacer:\r
+          {\r
+            state = skip_blanks;\r
+            cur_chr = ' ';\r
+          }\r
+          break;\r
+\r
+        case mid_line + car_ret:\r
+          {\r
+            loc = limit + 1;\r
+            cur_cmd = spacer;\r
+            cur_chr = ' ';\r
+          }\r
+          break;\r
+\r
+        case skip_blanks + car_ret:\r
+        case any_state_plus(comment):\r
+          {\r
+            loc = limit + 1;\r
+            goto lab_switch;\r
+          }\r
+          break;\r
+\r
+        case new_line + car_ret:\r
+          {\r
+            loc = limit + 1;\r
+            cur_cs = par_loc;\r
+            cur_cmd = eq_type(cur_cs);\r
+            cur_chr = equiv(cur_cs);\r
+            \r
+            if (cur_cmd >= outer_call)\r
+              check_outer_validity();\r
+          }\r
+          break;\r
+\r
+        case mid_line + left_brace:\r
+          incr(align_state);\r
+          break;\r
+\r
+        case skip_blanks + left_brace:\r
+        case new_line + left_brace:\r
+          {\r
+            state = mid_line;\r
+            incr(align_state);\r
+          }\r
+          break;\r
+\r
+        case mid_line + right_brace:\r
+          decr(align_state);\r
+          break;\r
+\r
+        case skip_blanks + right_brace:\r
+        case new_line + right_brace:\r
+          {\r
+            state = mid_line;\r
+            decr(align_state);\r
+          }\r
+          break;\r
+\r
+        case add_delims_to(skip_blanks):\r
+        case add_delims_to(new_line):\r
+          state = 1;\r
+          break;\r
+\r
+        default:\r
+          break;\r
+      }\r
+    }\r
+    else\r
+    {\r
+      state = new_line;\r
+\r
+      if (name > 17)\r
+      {\r
+        incr(line);\r
+        first = start;\r
+\r
+        if (!force_eof)\r
+        {\r
+          if (input_ln(cur_file, true))\r
+            firm_up_the_line();\r
+          else\r
+            force_eof = true;\r
+        }\r
+\r
+        if (force_eof)\r
+        {\r
+          print_char(')');\r
+          decr(open_parens);\r
+          update_terminal();\r
+          force_eof = false;\r
+          end_file_reading();\r
+          check_outer_validity();\r
+          goto restart;\r
+        }\r
+\r
+        if (end_line_char_inactive())\r
+          decr(limit);\r
+        else\r
+          buffer[limit] = end_line_char;\r
+\r
+        first = limit + 1;\r
+        loc = start;\r
+      }\r
+      else\r
+      {\r
+        if (!(name == 0))\r
+        {\r
+          cur_cmd = 0;\r
+          cur_chr = 0;\r
+          return;\r
+        }\r
+\r
+        if (input_ptr > 0)\r
+        {\r
+          end_file_reading();\r
+          goto restart;\r
+        }\r
+\r
+        if (selector < log_only)\r
+          open_log_file();\r
+\r
+        if (interaction > nonstop_mode)\r
+        {\r
+          if (end_line_char_inactive())\r
+            incr(limit);\r
+\r
+          if (limit == start)\r
+            print_nl("(Please type a command or say `\\end')");\r
+\r
+          print_ln();\r
+          first = start;\r
+          prompt_input("*");\r
+          limit = last;\r
+\r
+          if (end_line_char_inactive())\r
+            decr(limit);\r
+          else\r
+            buffer[limit]= end_line_char;\r
+\r
+          first = limit + 1;\r
+          loc = start;\r
+        }\r
+        else\r
+        {\r
+          fatal_error("*** (job aborted, no legal \\end found)");\r
+          return;\r
+        }\r
+      }\r
+\r
+      check_interrupt();\r
+      goto lab_switch;\r
+    }\r
+  }\r
+  else if (loc != 0)\r
+  {\r
+    t = info(loc);\r
+    loc = link(loc);\r
+\r
+    if (t >= cs_token_flag)\r
+    {\r
+      cur_cs = t - cs_token_flag;\r
+      cur_cmd = eq_type(cur_cs);\r
+      cur_chr = equiv(cur_cs);\r
+\r
+      if (cur_cmd >= outer_call)\r
+        if (cur_cmd == dont_expand)\r
+        {\r
+          cur_cs = info(loc) - cs_token_flag;\r
+          loc = 0;\r
+          cur_cmd = eq_type(cur_cs);\r
+          cur_chr = equiv(cur_cs);\r
+\r
+          if (cur_cmd > max_command)\r
+          {\r
+            cur_cmd = relax;\r
+            cur_chr = no_expand_flag;\r
+          }\r
+        }\r
+        else\r
+        {\r
+          check_outer_validity();\r
+        }\r
+    }\r
+    else\r
+    {\r
+      cur_cmd = t / 256;\r
+      cur_chr = t % 256;\r
+\r
+      switch (cur_cmd)\r
+      {\r
+        case left_brace:\r
+          incr(align_state);\r
+          break;\r
+\r
+        case right_brace:\r
+          decr(align_state);\r
+          break;\r
+\r
+        case out_param:\r
+          {\r
+            begin_token_list(param_stack[limit + cur_chr - 1], parameter);\r
+            goto restart;\r
+          }\r
+          break;\r
+\r
+        default:\r
+          break;\r
+      }\r
+    }\r
+  }\r
+  else\r
+  {\r
+    end_token_list();\r
+    goto restart;\r
+  }\r
+\r
+  if (cur_cmd <= car_ret)\r
+    if (cur_cmd >= tab_mark)\r
+      if (align_state == 0)\r
+      {\r
+        if ((scanner_status == aligning) && (cur_align == 0))\r
+        {\r
+          fatal_error("(interwoven alignment preambles are not allowed)");\r
+          return;\r
+        }\r
+\r
+        cur_cmd = extra_info(cur_align);\r
+        extra_info(cur_align) = cur_chr;\r
+\r
+        if (cur_cmd == omit)\r
+          begin_token_list(omit_template, v_template);\r
+        else\r
+          begin_token_list(v_part(cur_align), v_template);\r
+\r
+        align_state = 1000000L;\r
+        goto restart;\r
+      }\r
 }
\ No newline at end of file
index 6a8013c..8dbdc16 100644 (file)
-/* Copyright 2014 Clerk Ma
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301 USA.  */
-
-#define EXTERN extern
-
-#include "yandytex.h"
-
-/* sec 0440 */
-void scan_int (void)
-{
-  boolean negative;
-  integer m;
-  small_number d;
-  boolean vacuous;
-  boolean OK_so_far;
-
-  radix = 0;
-  OK_so_far = true;
-  negative = false;
-
-  do
-    {
-      do 
-        {
-          get_x_token();
-        }
-      while (!(cur_cmd != spacer));
-
-      if (cur_tok == other_token + '-')
-      {
-        negative = !negative;
-        cur_tok = other_token + '+';
-      }
-    }
-  while (!(cur_tok != other_token + '+'));
-
-  if (cur_tok == alpha_token)
-  {
-    get_token();
-
-    if (cur_tok < cs_token_flag)
-    {
-      cur_val = cur_chr;
-
-      if (cur_cmd <= right_brace)
-        if (cur_cmd == right_brace)
-          incr(align_state);
-        else
-          decr(align_state);
-    }
-    else if (cur_tok < cs_token_flag + single_base)
-      cur_val = cur_tok - cs_token_flag - active_base;
-    else
-      cur_val = cur_tok - cs_token_flag - single_base;
-
-    if (cur_val > 255)
-    {
-      print_err("Improper alphabetic constant");
-      help2("A one-character control sequence belongs after a ` mark.",
-        "So I'm essentially inserting \\0 here.");
-      cur_val = '0';
-      back_error();
-    }
-    else
-    {
-      get_x_token();
-
-      if (cur_cmd != spacer)
-        back_input();
-    }
-  }
-  else if ((cur_cmd >= min_internal) && (cur_cmd <= max_internal))
-  {
-    scan_something_internal(int_val, false);
-  }
-  else
-  {
-    radix = 10;
-    m = 214748364L;   /* 7FFFFFFF hex */
-
-    if (cur_tok == octal_token)
-    {
-      radix = 8;
-      m = 268435456L;   /* 2^28 */
-      get_x_token();
-    }
-    else if (cur_tok == hex_token)
-    {
-      radix = 16;
-      m = 134217728L;   /* 2^27 8000000 hex */
-      get_x_token();
-    }
-
-    vacuous = true;
-    cur_val = 0;
-
-    while (true)
-    {
-      if ((cur_tok < zero_token + radix) && (cur_tok >= zero_token) && (cur_tok <= zero_token + 9))
-        d = cur_tok - zero_token;
-      else if (radix == 16)
-        if ((cur_tok <= A_token + 5) && (cur_tok >= A_token))
-          d = cur_tok - A_token + 10;
-        else if ((cur_tok <= other_A_token + 5) && (cur_tok >= other_A_token))
-          d = cur_tok - other_A_token;
-        else
-          goto done;
-      else
-        goto done;
-
-      vacuous = false;
-
-      if ((cur_val >= m) && ((cur_val > m) || (d > 7) || (radix != 10)))
-      {
-        if (OK_so_far)
-        {
-          print_err("Number too big");
-          help2("I can only go up to 2147483647='17777777777=\"7FFFFFFF,",
-            "so I'm using that number instead of yours.");
-          error();
-          cur_val = 2147483647L;    /* 7FFFFFFF hex */
-          OK_so_far = false;
-        }
-      }
-      else
-        cur_val = cur_val * radix + d;
-
-      get_x_token();
-    }
-
-done:
-    if (vacuous)
-    {
-      print_err("Missing number, treated as zero");
-      help3("A number should have been here; I inserted `0'.",
-        "(If you can't figure out why I needed to see a number,",
-        "look up `weird error' in the index to The TeXbook.)");
-      back_error();
-    } 
-    else if (cur_cmd != spacer)
-      back_input();
-  }
-
-  if (negative)
-    cur_val = - (integer) cur_val;
-}
-/* sec 0448 */
-void scan_dimen (boolean mu, boolean inf, boolean shortcut)
-{
-  boolean negative;
-  integer f;
-  integer num, denom;
-  small_number k, kk;
-  halfword p, q;
-  scaled v;
-  integer save_cur_val;
-
-  f = 0;
-  arith_error = false;
-  cur_order = normal;
-  negative = false;
-
-  if (!shortcut)
-  {
-    negative = false;
-
-    do
-      {
-        do
-          {
-            get_x_token();
-          }
-        while (!(cur_cmd != spacer));
-
-        if (cur_tok == other_token + '-')
-        {
-          negative = ! negative;
-          cur_tok = other_token + '+';
-        }
-      }
-    while (!(cur_tok != other_token + '+'));
-
-    if ((cur_cmd >= min_internal) && (cur_cmd <= max_internal))
-    {
-      if (mu)
-      {
-        scan_something_internal(mu_val, false);
-
-        if (cur_val_level >= glue_val)
-        {
-          v = width(cur_val);
-          delete_glue_ref(cur_val);
-          cur_val = v;
-        }
-
-        if (cur_val_level == mu_val)
-          goto attach_sign;
-
-        if (cur_val_level != int_val)
-          mu_error();
-      }
-      else
-      {
-        scan_something_internal(dimen_val, false);
-
-        if (cur_val_level == dimen_val)
-          goto attach_sign;
-      }
-    }
-    else
-    {
-      back_input();
-
-      if (cur_tok == continental_point_token)
-        cur_tok = point_token;
-
-      if (cur_tok != point_token)
-      {
-        scan_int();
-      }
-      else
-      {
-        radix = 10;
-        cur_val = 0;
-      }
-
-      if (cur_tok == continental_point_token)
-        cur_tok = point_token;
-
-      if ((radix == 10) && (cur_tok == point_token))
-      {
-        k = 0;
-        p = 0;
-        get_token();
-
-        while (true)
-        {
-          get_x_token();
-
-          if ((cur_tok > zero_token + 9) || (cur_tok < zero_token))
-            goto done1;
-
-          if (k < 17)
-          {
-            q = get_avail();
-            link(q) = p;
-            info(q) = cur_tok - zero_token;
-            p = q;
-            incr(k);
-          }
-        }
-
-done1:
-        for (kk = k; kk >= 1; kk--)
-        {
-          dig[kk - 1] = info(p);
-          q = p;
-          p = link(p);
-          free_avail(q);
-        }
-
-        f = round_decimals(k);
-
-        if (cur_cmd != spacer)
-          back_input();
-        }
-      }
-  }
-
-  if (cur_val < 0)
-  {
-    negative = !negative;
-    cur_val = - (integer) cur_val;
-  }
-
-  if (inf)
-  {
-    if (scan_keyword("fil"))
-    {
-      cur_order = fil;
-
-      while (scan_keyword("l"))
-      {
-        if (cur_order == filll)
-        {
-          print_err("Illegal unit of measure (");
-          prints("replaced by filll)");
-          help1("I dddon't go any higher than filll.");
-          error();
-        }
-        else
-          incr(cur_order);
-      }
-
-      goto attach_fraction;
-    }
-  }
-
-  save_cur_val = cur_val;
-
-  do
-    {
-      get_x_token();
-    }
-  while (!(cur_cmd != spacer));
-
-  if ((cur_cmd < min_internal) || (cur_cmd > max_internal))
-    back_input();
-  else
-  {
-    if (mu)
-    {
-      scan_something_internal(mu_val, false);
-
-      if (cur_val_level >= glue_val)
-      {
-        v = width(cur_val);
-        delete_glue_ref(cur_val);
-        cur_val = v;
-      }
-
-      if (cur_val_level != mu_val)
-      {
-        mu_error();
-      }
-    }
-    else
-    {
-      scan_something_internal(dimen_val, false);
-    }
-
-    v = cur_val;
-    goto found;
-  }
-
-  if (mu)
-    goto not_found;
-
-  if (scan_keyword("em"))
-    v = quad(cur_font);
-  else if (scan_keyword("ex"))
-    v = x_height(cur_font);
-  else
-    goto not_found;
-
-  {
-    get_x_token();
-
-    if (cur_cmd != spacer)
-      back_input();
-  }
-
-found:
-  cur_val = nx_plus_y(save_cur_val, v, xn_over_d(v, f, 65536L));
-  goto attach_sign;
-
-not_found:
-  if (mu)
-  {
-    if (scan_keyword("mu"))
-      goto attach_fraction;
-    else
-    {
-      print_err("Illegal unit of measure (");
-      prints("mu inserted)");
-      help4("The unit of measurement in math glue must be mu.",
-          "To recover gracefully from this error, it's best to",
-          "delete the erroneous units; e.g., type `2' to delete",
-          "two letters. (See Chapter 27 of The TeXbook.)");
-      error();
-      goto attach_fraction;
-    }
-  }
-
-  if (scan_keyword("true"))
-  {
-    prepare_mag();
-
-    if (mag != 1000)
-    {
-      cur_val = xn_over_d(cur_val, 1000, mag);
-      f = (1000 * f + 65536L * tex_remainder) / mag;
-      cur_val = cur_val + (f / 65536L);
-      f = f % 65536L;
-    }
-  }
-
-  if (scan_keyword("pt"))
-    goto attach_fraction;
-
-  if (scan_keyword("in"))
-    set_conversion(7227, 100);
-  else if (scan_keyword("pc"))
-    set_conversion(12, 1);
-  else if (scan_keyword("cm"))
-    set_conversion(7227, 254);
-  else if (scan_keyword("mm"))
-    set_conversion(7227, 2540);
-  else if (scan_keyword("bp"))
-    set_conversion(7227, 7200);
-  else if (scan_keyword("dd"))
-    set_conversion(1238, 1157);
-  else if (scan_keyword("cc"))
-    set_conversion(14856, 1157);
-  else if (scan_keyword("Q"))
-    set_conversion(7227, 10160);
-  else if (scan_keyword("H"))
-    set_conversion(7227, 10160);
-  else if (scan_keyword("twip"))
-    set_conversion(1, 20);
-  else if (scan_keyword("sp"))
-    goto done;
-  else
-  {
-    print_err("Illegal unit of measure (");
-    prints("pt inserted)");
-    help6("Dimensions can be in units of em, ex, in, pt, pc,",
-      "cm, mm, dd, cc, bp, or sp; but yours is a new one!",
-      "I'll assume that you meant to say pt, for printer's points.",
-      "To recover gracefully from this error, it's best to",
-      "delete the erroneous units; e.g., type `2' to delete",
-      "two letters. (See Chapter 27 of The TeXbook.)");
-    error();
-    goto done2;
-  }
-
-  cur_val = xn_over_d(cur_val, num, denom);
-  f = (num * f + 65536L * tex_remainder) / denom;
-  cur_val = cur_val +(f / 65536L);
-  f = f % 65536L;
-
-done2:
-attach_fraction:
-  if (cur_val >= 16384)     /* 2^14 */
-    arith_error = true;
-  else
-    cur_val = cur_val * unity + f;
-
-done:
-  {
-    get_x_token();
-
-    if (cur_cmd != spacer)
-      back_input();
-  }
-
-attach_sign:
-  if (arith_error || (abs(cur_val) >= 1073741824L)) /* 2^30 */
-  {
-    print_err("Dimension too large");
-    help2("I can't work with sizes bigger than about 19 feet.",
-        "Continue and I'll use the largest value I can.");
-    error();
-    cur_val = max_dimen;
-    arith_error = false;
-  }
-
-  if (negative)
-    cur_val = - (integer) cur_val;
-}
-/* sec 0461 */
-void scan_glue (small_number level)
-{
-  boolean negative;
-  pointer q;
-  boolean mu;
-
-  mu = (level == mu_val);
-  negative = false;
-
-  do
-    {
-      do
-        {
-          get_x_token();
-        }
-      while (!(cur_cmd != spacer));
-
-      if (cur_tok == other_token + '-')
-      {
-        negative = !negative;
-        cur_tok = other_token + '+';
-      }
-    }
-  while (!(cur_tok != other_token + '+'));
-
-  if ((cur_cmd >= min_internal) && (cur_cmd <= max_internal))
-  {
-    scan_something_internal(level, negative);
-
-    if (cur_val_level >= glue_val)
-    {
-      if (cur_val_level != level)
-        mu_error();
-
-      return;
-    }
-
-    if (cur_val_level == int_val)
-      scan_dimen(mu, false, true);
-    else if (level == mu_val)
-      mu_error();
-  }
-  else
-  {
-    back_input();
-    scan_dimen(mu, false, false);
-
-    if (negative)
-      cur_val = - (integer) cur_val;
-  }
-
-  q = new_spec(zero_glue);
-  width(q) = cur_val;
-
-  if (scan_keyword("plus"))
-  {
-    scan_dimen(mu, true, false);
-    stretch(q) = cur_val;
-    stretch_order(q) = cur_order;
-  }
-
-  if (scan_keyword("minus"))
-  {
-    scan_dimen(mu, true, false);
-    shrink(q) = cur_val;
-    shrink_order(q) = cur_order;
-  }
-
-  cur_val = q;
-}
-/* sec 0463 */
-pointer scan_rule_spec (void)
-{
-  pointer q;
-
-  q = new_rule();
-
-  if (cur_cmd == vrule)
-    width(q) = default_rule;
-  else
-  {
-    height(q) = default_rule;
-    depth(q) = 0;
-  }
-
-reswitch:
-
-  if (scan_keyword("width"))
-  {
-    scan_dimen(false, false, false);
-    width(q) = cur_val;
-    goto reswitch;
-  }
-
-  if (scan_keyword("height"))
-  {
-    scan_dimen(false, false, false);
-    height(q) = cur_val;
-    goto reswitch;
-  }
-
-  if (scan_keyword("depth"))
-  {
-    scan_dimen(false, false, false);
-    depth(q) = cur_val;
-    goto reswitch;
-  }
-
-  return q;
-}
-/* sec 0464 */
-pointer str_toks (pool_pointer b)
-{
-  pointer p;
-  pointer q;
-  halfword t;
-  pool_pointer k;
-
-  str_room(1);
-  p = temp_head;
-  link(p) = 0;
-  k = b;
-
-  while (k < pool_ptr)
-  {
-    t = str_pool[k];
-
-    if (t == ' ')
-      t = space_token;
-    else
-      t = other_token + t;
-
-    fast_store_new_token(t);
-    incr(k);
-  }
-
-  pool_ptr = b;
-
-  return p;
-}
-/* sec 0465 */
-pointer the_toks (void)
-{
-  char old_setting;
-  pointer p, q, r;
-  pool_pointer b;
-
-  get_x_token();
-  scan_something_internal(tok_val, false);
-
-  if (cur_val_level >= ident_val)
-  {
-    p = temp_head;
-    link(p) = 0;
-
-    if (cur_val_level == ident_val)
-      store_new_token(cs_token_flag + cur_val);
-    else if (cur_val != 0)
-    {
-      r = link(cur_val);
-
-      while (r != 0)
-      {
-        fast_store_new_token(info(r));
-        r = link(r);
-      }
-    }
-
-    return p;
-  }
-  else
-  {
-    old_setting = selector;
-    selector = new_string;
-    b = pool_ptr;
-
-    switch (cur_val_level)
-    {
-      case int_val:
-        print_int(cur_val);
-        break;
-
-      case dimen_val:
-        {
-          print_scaled(cur_val);
-          prints("pt");
-        }
-        break;
-
-      case glue_val:
-        {
-          print_spec(cur_val, "pt");
-          delete_glue_ref(cur_val);
-        }
-        break;
-
-      case mu_val:
-        {
-          print_spec(cur_val, "mu");
-          delete_glue_ref(cur_val);
-        }
-        break;
-    }
-
-    selector = old_setting;
-    return str_toks(b);
-  }
-}
-/* sec 0467 */
-void ins_the_toks (void) 
-{ 
-  link(garbage) = the_toks();
-  ins_list(link(temp_head));
-}
-/* sec 0470 */
-void conv_toks (void)
-{
-  char old_setting;
-  char c;
-  small_number save_scanner_status;
-  pool_pointer b;
-
-  c = cur_chr;
-
-  switch (c)
-  {
-    case number_code:
-    case roman_numeral_code:
-      scan_int();
-      break;
-
-    case string_code:
-    case meaning_code:
-      save_scanner_status = scanner_status;
-      scanner_status = 0;
-      get_token();
-      scanner_status = save_scanner_status;
-      break;
-
-    case font_name_code:
-      scan_font_ident();
-      break;
-
-    case job_name_code:
-      if (job_name == 0)
-        open_log_file();
-      break;
-  }
-
-  old_setting = selector;
-  selector = new_string;
-  b = pool_ptr;
-
-  switch (c)
-  {
-    case number_code:
-      print_int(cur_val);
-      break;
-
-    case roman_numeral_code:
-      print_roman_int(cur_val);
-      break;
-
-    case string_code:
-      if (cur_cs != 0)
-        sprint_cs(cur_cs);
-      else
-        print_char(cur_chr);
-      break;
-
-    case meaning_code:
-      print_meaning();
-      break;
-
-    case font_name_code:
-      print(font_name[cur_val]);
-
-      if (font_size[cur_val] != font_dsize[cur_val])
-      {
-        prints(" at ");
-        print_scaled(font_size[cur_val]);
-        prints("pt");
-      }
-      break;
-
-    case job_name_code:
-      print(job_name);
-      break;
-  }
-
-  selector = old_setting;
-  link(garbage) = str_toks(b);
-  begin_token_list(link(temp_head), 4);
-}
-/* sec 0473 */
-pointer scan_toks (boolean macro_def, boolean xpand)
-{
-  halfword t;
-  halfword s;
-  pointer p;
-  pointer q;
-  halfword unbalance;
-  halfword hash_brace;
-
-  if (macro_def)
-    scanner_status = defining;
-  else
-    scanner_status = absorbing;
-
-  warning_index = cur_cs;
-  def_ref = get_avail();
-  token_ref_count(def_ref) = 0;
-  p = def_ref;
-  hash_brace = 0;
-  t = zero_token;
-
-  if (macro_def)
-  {
-    while (true)
-    {
-      get_token();
-
-      if (cur_tok < right_brace_limit)
-        goto done1;
-
-      if (cur_cmd == mac_param)
-      {
-        s = match_token + cur_chr;
-        get_token();
-
-        if (cur_cmd == left_brace)
-        {
-          hash_brace = cur_tok;
-          store_new_token(cur_tok);
-          store_new_token(end_match_token);
-          goto done;
-        }
-
-        if (t == zero_token + 9)
-        {
-          print_err("You already have nine parameters");
-          help1("I'm going to ignore the # sign you just used.");
-          error();
-        }
-        else
-        {
-          incr(t);
-
-          if (cur_tok != t)
-          {
-            print_err("Parameters must be numbered consecutively");
-            help2("I've inserted the digit you should have used after the #.",
-                "Type `1' to delete what you did use.");
-            back_error();
-          }
-
-          cur_tok = s;
-        }
-      }
-
-      store_new_token(cur_tok);
-    }
-
-done1:
-    store_new_token(end_match_token);
-
-    if (cur_cmd == right_brace)
-    {
-      print_err("Missing { inserted");
-      incr(align_state);
-      help2("Where was the left brace? You said something like `\\def\\a}',",
-          "which I'm going to interpret as `\\def\\a{}'.");
-      error();
-      goto found;
-    }
-done:;
-  }
-  else
-  {
-    scan_left_brace();
-  }
-
-  unbalance = 1;
-
-  while (true)
-  {
-    if (xpand)
-    {
-      while (true)
-      {
-        get_next();
-
-        if (cur_cmd <= max_command)
-          goto done2;
-
-        if (cur_cmd != the)
-        {
-          expand();
-        }
-        else
-        {
-          q = the_toks();
-
-          if (link(temp_head) != 0)
-          {
-            link(p) = link(temp_head);
-            p = q;
-          }
-        }
-      }
-done2:
-      x_token();
-    }
-    else
-      get_token();
-
-    if (cur_tok < right_brace_limit)
-      if (cur_cmd < right_brace)
-        incr(unbalance);
-      else
-      {
-        decr(unbalance);
-
-        if (unbalance == 0)
-          goto found;
-      }
-    else if (cur_cmd == mac_param)
-      if (macro_def)
-      {
-        s = cur_tok;
-
-        if (xpand)
-          get_x_token();
-        else
-          get_token();
-
-        if (cur_cmd != mac_param)
-          if ((cur_tok <= zero_token) || (cur_tok > t))
-          {
-            print_err("Illegal parameter number in definition of ");
-            sprint_cs(warning_index);
-            help3("You meant to type ## instead of #, right?",
-                "Or maybe a } was forgotten somewhere earlier, and things",
-                "are all screwed up? I'm going to assume that you meant ##.");
-            back_error();
-            cur_tok = s;
-          }
-          else
-            cur_tok = out_param_token - '0' + cur_chr;
-      }
-
-    store_new_token(cur_tok);
-  }
-
-found:
-  scanner_status = 0;
-
-  if (hash_brace != 0)
-    store_new_token(hash_brace);
-
-  return p;
-}
-/* sec 0482 */
-void read_toks (integer n, pointer r)
-{
-  pointer p;
-  pointer q;
-  integer s;
-  /* small_number m; */
-  int m;
-
-  scanner_status = defining;
-  warning_index = r;
-  def_ref = get_avail();
-  token_ref_count(def_ref) = 0;
-  p = def_ref;
-  store_new_token(end_match_token);
-
-  if ((n < 0) || (n > 15))
-    m = 16;
-  else
-    m = n;
-
-  s = align_state;
-  align_state = 1000000L;
-
-  do
-    {
-      begin_file_reading();
-      name = m + 1;
-
-      if (read_open[m] == closed)
-        if (interaction > nonstop_mode)
-          if (n < 0)
-            prompt_input("");
-          else
-          {
-            print_ln();
-            sprint_cs(r);
-            prompt_input("=");
-            n = -1;
-          }
-        else
-        {
-          fatal_error("*** (cannot \\read from terminal in nonstop modes)");
-          return;
-        }
-      else if (read_open[m] == just_open)
-        if (input_ln(read_file[m], false))
-          read_open[m] = normal;
-        else
-        {
-          a_close(read_file[m]);
-          read_open[m] = closed;
-        }
-      else
-      {
-        if (!input_ln(read_file[m], true))
-        {
-          a_close(read_file[m]);
-          read_open[m] = closed;
-
-          if (align_state != 1000000L)
-          {
-            runaway();
-            print_err("File ended within ");
-            print_esc("read");
-            help1("This \\read has unbalanced braces.");
-            align_state = 1000000L;
-            error();
-          }
-        }
-      }
-
-      limit = last;
-
-      if (end_line_char_inactive())
-        decr(limit);
-      else
-        buffer[limit] = end_line_char;
-
-      first = limit + 1;
-      loc = start;
-      state = new_line;
-
-      while (true)
-      {
-        get_token();
-
-        if (cur_tok == 0)
-          goto done;
-
-        if (align_state < 1000000L)
-        {
-          do
-            {
-              get_token();
-            }
-          while (!(cur_tok == 0));
-
-          align_state = 1000000L;
-          goto done;
-        }
-
-        store_new_token(cur_tok);
-      }
-
-done:
-      end_file_reading();
-    }
-  while (!(align_state == 1000000L));
-
-  cur_val = def_ref;
-  scanner_status = normal;
-  align_state = s;
-}
-/* sec 0494 */
-void pass_text (void)
-{
-  integer l;
-  small_number save_scanner_status;
-
-  save_scanner_status = scanner_status;
-  scanner_status = skipping;
-  l = 0;
-  skip_line = line;
-
-  while (true)
-  {
-    get_next();
-
-    if (cur_cmd == fi_or_else)
-    {
-      if (l == 0)
-        goto done;
-
-      if (cur_chr == fi_code)
-        decr(l);
-    }
-    else if (cur_cmd == if_test)
-      incr(l);
-  }
-
-done:
-  scanner_status = save_scanner_status;
-}
-/* sec 0497 */
-void change_if_limit (small_number l, pointer p)
-{
-  pointer q;
-
-  if (p == cond_ptr)
-    if_limit = l;
-  else
-  {
-    q = cond_ptr;
-
-    while (true)
-    {
-      if (q == 0)
-      {
-        confusion("if");
-        return;
-      }
-
-      if (link(q) == p)
-      {
-        type(p) = l;
-        return;
-      }
-
-      q = link(q);
-    }
-  }
-}
-/* sec 0498 */
-void conditional (void)
-{
-  boolean b;
-  char r;
-  integer m, n;
-  pointer p, q;
-  small_number save_scanner_status;
-  pointer save_cond_ptr;
-  small_number this_if;
-
-  {
-    p = get_node(if_node_size);
-    link(p) = cond_ptr;
-    type(p) = if_limit;
-    subtype(p) = cur_if;
-    if_line_field(p) = if_line;
-    cond_ptr = p;
-    cur_if = cur_chr;
-    if_limit = if_code;
-    if_line = line;
-  }
-
-  save_cond_ptr = cond_ptr;
-  this_if = cur_chr;
-
-  switch (this_if)
-  {
-    case if_char_code:
-    case if_cat_code:
-      {
-        get_x_token_or_active_char();
-
-        if ((cur_cmd > active_char) || (cur_chr > 255))
-        {
-          m = relax;
-          n = 256;
-        }
-        else
-        {
-          m = cur_cmd;
-          n = cur_chr;
-        }
-
-        get_x_token_or_active_char();
-
-        if ((cur_cmd > active_char) || (cur_chr > 255))
-        {
-          cur_cmd = relax;
-          cur_chr = 256;
-        }
-
-        if (this_if == if_char_code)
-          b = (n == cur_chr); 
-        else
-          b = (m == cur_cmd);
-      }
-      break;
-
-    case if_int_code:
-    case if_dim_code:
-      {
-        if (this_if == if_int_code)
-          scan_int();
-        else
-          scan_dimen(false, false, false);
-
-        n = cur_val;
-        
-        do
-          {
-            get_x_token();
-          }
-        while (!(cur_cmd != spacer));
-
-        if ((cur_tok >= other_token + '<') && (cur_tok <= other_token + '>'))
-          r = cur_tok - other_token;
-        else
-        {
-          print_err("Missing = inserted for ");
-          print_cmd_chr(if_test, this_if);
-          help1("I was expecting to see `<', `=', or `>'. Didn't.");
-          back_error();
-          r = '=';
-        }
-
-        if (this_if == if_int_code)
-          scan_int();
-        else 
-          scan_dimen(false, false, false);
-
-        switch (r)
-        {
-          case '<':
-            b = (n < cur_val);
-            break;
-
-          case '=':
-            b = (n == cur_val);
-            break;
-
-          case '>':
-            b = (n > cur_val);
-            break;
-        }
-      }
-      break;
-
-    case if_odd_code:
-      scan_int();
-      b = odd(cur_val);
-      break;
-
-    case if_vmode_code:
-      b = (abs(mode) == vmode);
-      break;
-
-    case if_hmode_code:
-      b = (abs(mode) == hmode);
-      break;
-
-    case if_mmode_code:
-      b = (abs(mode) == mmode);
-      break;
-
-    case if_inner_code:
-      b = (mode < 0);
-      break;
-
-    case if_void_code:
-    case if_hbox_code:
-    case if_vbox_code:
-      {
-        scan_eight_bit_int();
-        p = box(cur_val);
-
-        if (this_if == if_void_code)
-          b = (p == 0);
-        else if (p == 0)
-          b = false;
-        else if (this_if == if_hbox_code)
-          b = (type(p) == hlist_node);
-        else
-          b = (type(p) == vlist_node);
-      }
-      break;
-
-    case ifx_code:
-      {
-        save_scanner_status = scanner_status;
-        scanner_status = 0;
-        get_next();
-        n = cur_cs;
-        p = cur_cmd;
-        q = cur_chr;
-        get_next();
-
-        if (cur_cmd != p)
-          b = false;
-        else if (cur_cmd < call)
-          b = (cur_chr == q);
-        else
-        {
-          p = link(cur_chr);
-          q = link(equiv(n));
-
-          if (p == q)
-            b = true;
-          else
-          {
-            while ((p != 0) && (q != 0))
-              if (info(p) != info(q))
-                p = 0;
-              else
-              {
-                p = link(p);
-                q = link(q);
-              }
-
-            b = ((p == 0) && (q == 0));
-          }
-        }
-
-        scanner_status = save_scanner_status;
-      }
-      break;
-
-    case if_eof_code:
-      {
-        scan_four_bit_int();
-        b = (read_open[cur_val] == closed);
-      }
-      break;
-
-    case if_true_code:
-      b = true;
-      break;
-
-    case if_false_code:
-      b = false;
-      break;
-
-    case if_case_code:
-      {
-        scan_int();
-        n = cur_val;
-
-        if (tracing_commands > 1)
-        {
-          begin_diagnostic();
-          prints("{case ");
-          print_int(n); 
-          print_char('}');
-          end_diagnostic(false);
-        }
-
-        while (n != 0)
-        {
-          pass_text();
-
-          if (cond_ptr == save_cond_ptr)
-            if (cur_chr == or_code)
-              decr(n);
-            else 
-              goto common_ending;
-          else if (cur_chr == fi_code)
-          {
-            p = cond_ptr;
-            if_line = if_line_field(p);
-            cur_if = subtype(p);
-            if_limit = type(p);
-            cond_ptr = link(p);
-            free_node(p, if_node_size);
-          }
-        }
-
-        change_if_limit(or_code, save_cond_ptr);
-        return;
-      }
-      break;
-  }
-
-  if (tracing_commands > 1)
-  {
-    begin_diagnostic();
-
-    if (b)
-      prints("{true}");
-    else
-      prints("{false}");
-
-    end_diagnostic(false);
-  }
-
-  if (b)
-  {
-    change_if_limit(else_code, save_cond_ptr);
-    return;
-  }
-
-  while (true)
-  {
-    pass_text();
-
-    if (cond_ptr == save_cond_ptr)
-    {
-      if (cur_chr != or_code)
-        goto common_ending;
-
-      print_err("Extra ");
-      print_esc("or");
-      help1("I'm ignoring this; it doesn't match any \\if.");
-      error();
-    }
-    else if (cur_chr == fi_code)
-    {
-      p = cond_ptr;
-      if_line = if_line_field(p);
-      cur_if = subtype(p);
-      if_limit = type(p);
-      cond_ptr = link(p);
-      free_node(p, if_node_size);
-    }
-  }
-
-common_ending:
-  if (cur_chr == fi_code)
-  {
-    p = cond_ptr;
-    if_line = if_line_field(p);
-    cur_if = subtype(p);
-    if_limit = type(p);
-    cond_ptr = link(p);
-    free_node(p, if_node_size);
-  }
-  else
-    if_limit = fi_code;
-}
-/* sec 0515 */
-void begin_name (void)
-{
-  area_delimiter = 0;
-  ext_delimiter = 0;
-}
-/* sec 0516 */
-boolean more_name (ASCII_code c)
-{
-  if (quoted_file_name == false && c == ' ')
-    return false;
-  else if (quoted_file_name != false && c == '"')
-  {
-    quoted_file_name = false; /* catch next space character */
-    return true;     /* accept ending quote, but throw away */
-  }
-  else
-  {   
-    str_room(1);
-    append_char(c);
-
-    //  for DOS/Windows
-    if ((c == '/' || c == '\\' || c == ':')) 
-    {
-      area_delimiter = cur_length;
-      ext_delimiter = 0;
-    } 
-    else if (c == '.')
-      ext_delimiter = cur_length;
-
-    return true;
-  }
-}
-
-/* sec 0517 */
-void end_name (void) 
-{
-#ifdef ALLOCATESTRING
-  if (str_ptr + 3 > current_max_strings)
-    str_start = realloc_str_start(increment_max_strings + 3);
-
-  if (str_ptr + 3 > current_max_strings)
-  {
-    overflow("number of strings", current_max_strings - init_str_ptr);
-    return;
-  }
-#else
-  if (str_ptr + 3 > max_strings)
-  {
-    overflow("number of strings", max_strings - init_str_ptr);
-    return;
-  }
-#endif
-
-  if (area_delimiter == 0) // no area delimiter ':' '/' or '\' found
-    cur_area = 335;        // "" default area 
-  else
-  {
-    cur_area = str_ptr;
-    str_start[str_ptr + 1] = str_start[str_ptr] + area_delimiter;
-    incr(str_ptr);
-  }
-
-  if (ext_delimiter == 0) // no extension delimiter '.' found
-  {
-    cur_ext = 335;        // "" default extension 
-    cur_name = make_string();
-  } 
-  else
-  {
-    cur_name = str_ptr;
-    str_start[str_ptr + 1] = str_start[str_ptr] + ext_delimiter - area_delimiter - 1;
-    incr(str_ptr);
-    cur_ext = make_string();
-  }
-}
-/* sec 0519 */
-void pack_file_name (str_number n, str_number a, str_number e)
-{
-  integer k;
-  ASCII_code c;
-  pool_pointer j;
-
-  k = 0;
-
-  for (j = str_start[a]; j <= str_start[a + 1] - 1; j++)
-    append_to_name(str_pool[j]);
-
-  for (j = str_start[n]; j <= str_start[n + 1] - 1; j++)
-    append_to_name(str_pool[j]);
-
-  for (j = str_start[e]; j <= str_start[e + 1] - 1; j++)
-    append_to_name(str_pool[j]);
-
-  if (k < file_name_size)
-    name_length = k;
-  else
-    name_length = file_name_size - 1;
-
-  for (k = name_length + 1; k <= file_name_size; k++)
-    name_of_file[k] = ' ';
-
-  name_of_file[file_name_size] = '\0'; /* paranoia */
-
-  {
-    name_of_file [name_length + 1] = '\0';
-
-    if (trace_flag)
-      printf(" pack_file_name `%s' (%lld) ", name_of_file + 1, name_length);
-
-    name_of_file [name_length + 1] = ' ';
-  }
-}
-/* Called only from two places tex9.c for format name - specified and default */
-/* for specified format name args are 0, a, b name in buffer[a] --- buffer[b] */
-/* for default args are format_default_length-4, 1, 0 */
-/* sec 0523 */
-void pack_buffered_name_(small_number n, integer a, integer b)
-{
-  integer k;
-  ASCII_code c;
-  integer j;
-
-  if (n + b - a + 5 > file_name_size)
-    b = a + file_name_size - n - 5;
-
-  k = 0;
-
-  for (j = 1; j <= n; j++)
-    append_to_name(xord[TEX_format_default[j]]);
-
-  for (j = a; j <= b; j++)
-    append_to_name(buffer[j]);
-
-  for (j = format_default_length - 3; j <= format_default_length; j++)
-    append_to_name(xord[TEX_format_default[j]]);
-
-  if (k < file_name_size)
-    name_length = k;
-  else
-    name_length = file_name_size - 1;
-
-  for (k = name_length + 1; k <= file_name_size; k++)
-    name_of_file[k]= ' ';
-
-  name_of_file[file_name_size] = '\0';
-}
-/* sec 0525 */
-str_number make_name_string (void)
-{
-  integer k;
-
-#ifdef ALLOCATESTRING
-  if (pool_ptr + name_length > current_pool_size)
-    str_pool = realloc_str_pool(increment_pool_size + name_length);
-
-  if (str_ptr == current_max_strings)
-    str_start = realloc_str_start(increment_max_strings);
-
-  if ((pool_ptr + name_length > current_pool_size) || (str_ptr == current_max_strings) || (cur_length > 0))
-#else
-  if ((pool_ptr + name_length > pool_size) || (str_ptr == max_strings) || (cur_length > 0))
-#endif
-  {
-    return '?';
-  }
-  else
-  {
-    for (k = 1; k <= name_length; k++)
-      append_char(xord[name_of_file[k]]);
-
-    return make_string();
-  }
-}
-/* sec 0525 */
-//str_number a_make_name_string (alpha_file * f)
-str_number a_make_name_string_(void)
-{
-  return make_name_string();
-}
-/* sec 0525 */
-//str_number b_make_name_string_(byte_file * f)
-str_number b_make_name_string_(void)
-{
-  return make_name_string(); 
-}
-/* sec 0525 */
-//str_number w_make_name_string_(word_file * f)
-str_number w_make_name_string_(void)
-{
-  return make_name_string();
-}
-/* sec 0526 */
-void scan_file_name (void)
-{
-  name_in_progress = true;
-  begin_name();
-
-  do
-    {
-      get_x_token(); 
-    }
-  while (!(cur_cmd != spacer));
-
-  quoted_file_name = false;
-
-  if (allow_quoted_names)
-  {
-    if (cur_chr == '"')
-    {
-      quoted_file_name = true;
-      get_x_token();
-    }
-  }
-
-  while (true)
-  {
-    if ((cur_cmd > other_char) || (cur_chr > 255)) 
-    {
-      back_input();
-      goto done; 
-    } 
-
-    if (!more_name(cur_chr))
-      goto done;
-
-    get_x_token();
-  }
-
-done:
-  end_name();
-  name_in_progress = false;
-}
-/* argument is string .fmt, .log, .pdf, or .dvi */
-/* sec 0529 */
-void pack_job_name_(str_number s)
-{
-  cur_area = 335; /* "" */
-  cur_ext  = s;
-  cur_name = job_name;
-  pack_file_name(cur_name, cur_area, cur_ext);
-}
-/* sec 0530 */
-void prompt_file_name_(const char * s, str_number e) 
-{
-  integer k;
-
-  if (interaction == scroll_mode)
-    do_nothing();
-
-  if (!strcmp("input file name", s))
-    print_err("I can't find file `");
-  else
-    print_err("I can't write on file `");
-
-  print_file_name(cur_name, cur_area, cur_ext);
-  prints("'.");
-
-  if (e == 785)    /* .tex */
-    show_context();
-
-  print_nl("Please type another ");
-  prints(s); 
-
-  if (interaction < scroll_mode)
-  {
-    fatal_error("*** (job aborted, file error in nonstop mode)");
-    return;
-  }
-
-  if (!knuth_flag)
-    show_line(" (or Ctrl-Z to exit)", 0);
-
-  prompt_input(": ");
-
-  {
-    begin_name();
-    k = first;
-
-    while ((buffer[k] == ' ') && (k < last))
-      incr(k);
-
-    quoted_file_name = false;
-
-    if (allow_quoted_names && k < last) /* check whether quoted name */
-    {
-      if (buffer[k]== '"')
-      {
-        quoted_file_name = true;
-        incr(k);
-      }
-    }
-
-    while (true)
-    {
-      if (k == last)
-        goto done;
-
-      /* convert tilde '~' to pseudo tilde */
-      if (pseudo_tilde != 0 && buffer[k]== '~')
-        buffer[k] = pseudo_tilde;
-
-      /* convert space ' ' to pseudo space */
-      if (pseudo_space != 0 && buffer[k]== ' ')
-        buffer[k] = pseudo_space;
-
-      if (!more_name(buffer[k]))
-        goto done;
-
-      incr(k);
-    }
-
-done:
-    end_name();
-  }
-
-  if (cur_ext == 335) /* "" */
-    cur_ext = e;      /* use default extension */
-
-  pack_file_name(cur_name, cur_area, cur_ext);
-}
-/* sec 0534 */
-void open_log_file (void)
-{
-  char old_setting;
-  integer k;
-  integer l;
-  char * months;
-
-  old_setting = selector;
-
-  if (job_name == 0)
-    job_name = get_job_name(790);
-    //job_name = 790;
-
-  pack_job_name(".log");
-
-  while (!a_open_out(log_file))
-  {
-    selector = term_only;
-    prompt_file_name("transcript file name", ".log");
-  }
-
-  log_name = a_make_name_string(log_file);
-  selector = log_only;
-  log_opened = true;
-
-  {
-    fprintf(log_file, "%s (%s %s)", banner, application, yandyversion);
-
-    if (format_ident > 0)
-      slow_print(format_ident);
-
-    prints("  ");
-
-    if (civilize_flag)
-      print_int(year);
-    else
-      print_int(day);
-
-    print_char(' ');
-    months = " JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC";
-
-    for (k = 3 * month - 2; k <= 3 * month; k++)
-      putc(months[k], log_file);
-
-    print_char(' ');
-
-    if (civilize_flag)
-      print_int(day);
-    else
-      print_int(year);
-
-    print_char(' ');
-    print_two(tex_time / 60);
-    print_char(':');
-    print_two(tex_time % 60);
-  }
-
-  input_stack[input_ptr] = cur_input;
-  print_nl("**");
-  l = input_stack[0].limit_field;
-
-  if (buffer[l] == end_line_char)
-    decr(l);
-
-  for (k = 1; k <= l; k++)
-    print(buffer[k]);
-
-  print_ln(); 
-
-  if (show_fmt_flag)
-  {
-    if (format_file != NULL)
-    {
-      fprintf(log_file, "(%s)\n", format_file);
-      free(format_file);
-      format_file = NULL;
-    }
-  }
-
-  selector = old_setting + 2;
-}
-/* sec 0537 */
-void start_input (void)
-{
-  scan_file_name();
-  pack_file_name(cur_name, cur_area, cur_ext); 
-
-  while (true)
-  {
-    begin_file_reading();
-    
-    if (a_open_in(cur_file, kpse_tex_format))
-      goto done;
-
-    end_file_reading();
-    prompt_file_name("input file name", ".tex");
-  }
-
-done: 
-  name = a_make_name_string(cur_file);
-
-  if (job_name == 0)
-  {
-    job_name = get_job_name(cur_name);
-    //job_name = cur_name;
-    open_log_file();
-  }
-
-  if (term_offset + length(name) > max_print_line - 2)
-    print_ln();
-  else if ((term_offset > 0) || (file_offset > 0))
-    print_char(' ');
-
-  print_char('(');
-  incr(open_parens);
-
-  if (open_parens > max_open_parens)
-    max_open_parens = open_parens;
-
-  slow_print(name);
-  update_terminal();
-  state = new_line;
-
-  {
-    line = 1;
-
-    if (input_ln(cur_file, false))
-      do_nothing();
-
-    firm_up_the_line();
-
-    if (end_line_char_inactive())
-      decr(limit);
-    else
-      buffer[limit] = end_line_char;
-
-    first = limit + 1;
-    loc = start;
-  }
-}
-/* sec 0560 */
-internal_font_number read_font_info (pointer u, str_number nom, str_number aire, scaled s)
-{
-  font_index k;
-  boolean file_opened;
-  halfword lf, lh, nw, nh, nd, ni, nl, nk, ne, np;
-  int bc, ec;
-  internal_font_number f;
-  internal_font_number g;
-  eight_bits a, b, c, d;
-  four_quarters qw;
-  scaled sw;
-  integer bch_label;
-  short bchar;
-  scaled z;
-  integer alpha;
-  char beta;
-
-  g = 0;
-  file_opened = false;
-  pack_file_name(nom, aire, 805); /* .tfm */
-
-  if (!b_open_in(tfm_file))
-    goto bad_tfm;
-
-  file_opened = true;
-
-  {
-    read_sixteen(lf);
-    fget();
-    read_sixteen(lh);
-    fget();
-    read_sixteen(bc);
-    fget();
-    read_sixteen(ec);
-
-    if ((bc > ec + 1) || (ec > 255))
-      goto bad_tfm;
-
-    if (bc > 255)
-    {
-      bc = 1;
-      ec = 0;
-    }
-
-    fget();
-    read_sixteen(nw);
-    fget();
-    read_sixteen(nh);
-    fget();
-    read_sixteen(nd);
-    fget();
-    read_sixteen(ni);
-    fget();
-    read_sixteen(nl);
-    fget();
-    read_sixteen(nk);
-    fget();
-    read_sixteen(ne);
-    fget();
-    read_sixteen(np);
-
-    if (lf != 6 + lh + (ec - bc + 1) + nw + nh + nd + ni + nl + nk + ne + np)
-      goto bad_tfm;
-
-    if ((nw == 0) || (nh == 0) || (nd == 0) || (ni == 0))
-      goto bad_tfm;
-  }
-
-  lf = lf - 6 - lh;
-
-  if (np < 7)
-    lf = lf + 7 - np;
-
-#ifdef ALLOCATEFONT
-  if ((fmem_ptr + lf > current_font_mem_size))
-    font_info = realloc_font_info (increment_font_mem_size + lf);
-
-  if ((font_ptr == font_max) || (fmem_ptr + lf > current_font_mem_size))
-#else
-  if ((font_ptr == font_max) || (fmem_ptr + lf > font_mem_size))
-#endif
-  {
-    if (trace_flag)
-      printf("font_ptr %lld font_max %d fmem_ptr %lld lf %d font_mem_size %ld\n",
-          font_ptr, font_max, fmem_ptr, lf, font_mem_size);
-
-    start_font_error_message();
-    prints(" not loaded: Not enough room left");
-    help4("I'm afraid I won't be able to make use of this font,",
-        "because my memory for character-size data is too small.",
-        "If you're really stuck, ask a wizard to enlarge me.",
-        "Or maybe try `I\\font<same font id>=<name of loaded font>'.");
-    error();
-    goto done;
-  }
-
-  f = font_ptr + 1;
-  char_base[f] = fmem_ptr - bc;
-  width_base[f] = char_base[f] + ec + 1;
-  height_base[f] = width_base[f] + nw;
-  depth_base[f] = height_base[f] + nh;
-  italic_base[f] = depth_base[f] + nd;
-  lig_kern_base[f] = italic_base[f] + ni;
-  kern_base[f] = lig_kern_base[f] + nl - kern_base_offset;
-  exten_base[f] = kern_base[f] + kern_base_offset + nk;
-  param_base[f] = exten_base[f] + ne;
-
-  {
-    if (lh < 2)
-      goto bad_tfm;
-    
-    store_four_quarters(font_check[f]);
-    fget();
-    read_sixteen(z);
-    fget();
-    z = z * 256 + fbyte;
-    fget();
-    z = (z * 16) + (fbyte / 16);
-
-    if (z < unity)
-      goto bad_tfm; 
-
-    while (lh > 2)
-    {
-      fget();
-      fget();
-      fget();
-      fget();
-      decr(lh);
-    }
-
-    font_dsize[f] = z;
-
-    if (s != -1000)
-      if (s >= 0)
-        z = s;
-      else
-        z = xn_over_d(z, - (integer) s, 1000);
-
-    font_size[f] = z;
-  }
-
-  for (k = fmem_ptr; k <= width_base[f] - 1; k++)
-  {
-    store_four_quarters(font_info[k].qqqq);
-
-    if ((a >= nw) || (b / 16 >= nh) || (b % 16 >= nd) || (c / 4 >= ni))
-      goto bad_tfm;
-
-    switch (c % 4)
-    {
-      case lig_tag:
-        if (d >= nl)
-          goto bad_tfm;
-        break;
-
-      case ext_tag:
-        if (d >= ne)
-          goto bad_tfm;
-        break;
-
-      case list_tag:
-        {
-          check_byte_range(d);
-
-          while (d < k + bc - fmem_ptr)
-          {
-            qw = char_info(f, d);
-            if (char_tag(qw) != list_tag)
-              goto not_found;
-
-            d = rem_byte(qw);
-          }
-
-          if (d == k + bc - fmem_ptr)
-            goto bad_tfm;
-not_found:;
-        }
-        break;
-
-      default:
-        break;
-    }
-  }
-
-  {
-    {
-      alpha = 16;
-
-      while (z >= 8388608L)   /* 2^23 */
-      {
-        z = z / 2;
-        alpha = alpha + alpha;
-      }
-
-      beta = (char) (256 / alpha);
-      alpha = alpha * z;
-    }
-
-    for (k = width_base[f]; k <= lig_kern_base[f] - 1; k++)
-      store_scaled(font_info[k].cint);
-
-    if (font_info[width_base[f]].cint != 0)
-      goto bad_tfm;
-
-    if (font_info[height_base[f]].cint != 0)
-      goto bad_tfm;
-
-    if (font_info[depth_base[f]].cint != 0)
-      goto bad_tfm;
-
-    if (font_info[italic_base[f]].cint != 0)
-      goto bad_tfm;
-  }
-
-  bch_label = 32767;     /* '77777 */
-  bchar = 256;
-
-  if (nl > 0)
-  {
-    for (k = lig_kern_base[f]; k <= kern_base[f] + kern_base_offset - 1; k++)
-    {
-      store_four_quarters(font_info[k].qqqq);
-
-      if (a > 128)
-      {
-        if (256 * c + d >= nl)
-          goto bad_tfm;
-
-        if (a == 255)
-          if (k == lig_kern_base[f])
-            bchar = b;
-      }
-      else
-      {
-        if (b != bchar)
-          check_existence(b);
-
-        if (c < 128)
-          check_existence(d);
-        else if (256 * (c - 128) + d >= nk)
-          goto bad_tfm;
-
-        if (a < 128)
-          if (k - lig_kern_base[f] + a + 1 >= nl)
-            goto bad_tfm;
-      }
-    }
-
-    if (a == 255)
-      bch_label = 256 * c + d;
-  }
-
-  for (k = kern_base[f] + kern_base_offset; k <= exten_base[f] - 1; k++)
-    store_scaled(font_info[k].cint);
-
-  for (k = exten_base[f]; k <= param_base[f] - 1; k++)
-  {
-    store_four_quarters(font_info[k].qqqq);
-
-    if (a != 0)
-      check_existence(a);
-
-    if (b != 0)
-      check_existence(b);
-
-    if (c != 0)
-      check_existence(c);
-
-    check_existence(d);
-  }
-
-  {
-    for (k = 1; k <= np; k++)
-      if (k == 1)
-      {
-        fget();
-        sw = fbyte;
-
-        if (sw > 127)
-          sw = sw - 256;
-
-        fget();
-        sw = sw * 256 + fbyte;
-        fget();
-        sw = sw * 256 + fbyte;
-        fget();
-        font_info[param_base[f]].cint = (sw * 16) + (fbyte / 16);
-      }
-      else
-        store_scaled(font_info[param_base[f] + k - 1].cint);
-
-    if (feof(tfm_file))
-      goto bad_tfm;
-
-    for (k = np + 1; k <= 7; k++)
-      font_info[param_base[f] + k - 1].cint = 0;
-  }
-
-  if (np >= 7)
-    font_params[f] = np;
-  else
-    font_params[f] = 7;
-
-  hyphen_char[f] = default_hyphen_char;
-  skew_char[f] = default_skew_char;
-
-  if (bch_label < nl)
-    bchar_label[f] = bch_label + lig_kern_base[f];
-  else
-    bchar_label[f] = non_address;
-
-  font_bchar[f] = bchar;
-  font_false_bchar[f] = bchar;
-
-  if (bchar <= ec)
-    if (bchar >= bc)
-    {
-      qw = char_info(f, bchar);
-
-      if (char_exists(qw))
-        font_false_bchar[f] = 256;
-    }
-
-  font_name[f] = nom;
-  font_area[f] = aire;
-  font_bc[f] = bc;
-  font_ec[f] = ec;
-  font_glue[f] = 0;
-  adjust(char_base);
-  adjust(width_base);
-  adjust(lig_kern_base);
-  adjust(kern_base);
-  adjust(exten_base);
-  decr(param_base[f]);
-  fmem_ptr = fmem_ptr + lf;
-  font_ptr = f;
-  g = f;
-  goto done;
-
-bad_tfm:
-  start_font_error_message();
-
-  if (file_opened)
-    prints(" not loadable: Bad metric (TFM) file");
-  else
-    prints(" not loadable: Metric (TFM) file not found");
-
-  help5("I wasn't able to read the size data for this font,",
-      "so I will ignore the font specification.",
-      "[Wizards can fix TFM files using TFtoPL/PLtoTF.]",
-      "You might try inserting a different font spec;",
-      "e.g., type `I\\font<same font id>=<substitute font name>'.");
-  error();
-
-done:
-  if (file_opened)
-    b_close(tfm_file);
-
-  return g;
+/* Copyright 2014 Clerk Ma\r
+\r
+   This program is free software; you can redistribute it and/or modify\r
+   it under the terms of the GNU General Public License as published by\r
+   the Free Software Foundation; either version 2 of the License, or\r
+   (at your option) any later version.\r
+\r
+   This program is distributed in the hope that it will be useful, but\r
+   WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+   General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with this program; if not, write to the Free Software\r
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA\r
+   02110-1301 USA.  */\r
+\r
+#define EXTERN extern\r
+\r
+#include "yandytex.h"\r
+\r
+/* sec 0440 */\r
+void scan_int (void)\r
+{\r
+  boolean negative;\r
+  integer m;\r
+  small_number d;\r
+  boolean vacuous;\r
+  boolean OK_so_far;\r
+\r
+  radix = 0;\r
+  OK_so_far = true;\r
+  negative = false;\r
+\r
+  do\r
+    {\r
+      do \r
+        {\r
+          get_x_token();\r
+        }\r
+      while (!(cur_cmd != spacer));\r
+\r
+      if (cur_tok == other_token + '-')\r
+      {\r
+        negative = !negative;\r
+        cur_tok = other_token + '+';\r
+      }\r
+    }\r
+  while (!(cur_tok != other_token + '+'));\r
+\r
+  if (cur_tok == alpha_token)\r
+  {\r
+    get_token();\r
+\r
+    if (cur_tok < cs_token_flag)\r
+    {\r
+      cur_val = cur_chr;\r
+\r
+      if (cur_cmd <= right_brace)\r
+        if (cur_cmd == right_brace)\r
+          incr(align_state);\r
+        else\r
+          decr(align_state);\r
+    }\r
+    else if (cur_tok < cs_token_flag + single_base)\r
+      cur_val = cur_tok - cs_token_flag - active_base;\r
+    else\r
+      cur_val = cur_tok - cs_token_flag - single_base;\r
+\r
+    if (cur_val > 255)\r
+    {\r
+      print_err("Improper alphabetic constant");\r
+      help2("A one-character control sequence belongs after a ` mark.",\r
+        "So I'm essentially inserting \\0 here.");\r
+      cur_val = '0';\r
+      back_error();\r
+    }\r
+    else\r
+    {\r
+      get_x_token();\r
+\r
+      if (cur_cmd != spacer)\r
+        back_input();\r
+    }\r
+  }\r
+  else if ((cur_cmd >= min_internal) && (cur_cmd <= max_internal))\r
+  {\r
+    scan_something_internal(int_val, false);\r
+  }\r
+  else\r
+  {\r
+    radix = 10;\r
+    m = 214748364L;   /* 7FFFFFFF hex */\r
+\r
+    if (cur_tok == octal_token)\r
+    {\r
+      radix = 8;\r
+      m = 268435456L;   /* 2^28 */\r
+      get_x_token();\r
+    }\r
+    else if (cur_tok == hex_token)\r
+    {\r
+      radix = 16;\r
+      m = 134217728L;   /* 2^27 8000000 hex */\r
+      get_x_token();\r
+    }\r
+\r
+    vacuous = true;\r
+    cur_val = 0;\r
+\r
+    while (true)\r
+    {\r
+      if ((cur_tok < zero_token + radix) && (cur_tok >= zero_token) && (cur_tok <= zero_token + 9))\r
+        d = cur_tok - zero_token;\r
+      else if (radix == 16)\r
+        if ((cur_tok <= A_token + 5) && (cur_tok >= A_token))\r
+          d = cur_tok - A_token + 10;\r
+        else if ((cur_tok <= other_A_token + 5) && (cur_tok >= other_A_token))\r
+          d = cur_tok - other_A_token;\r
+        else\r
+          goto done;\r
+      else\r
+        goto done;\r
+\r
+      vacuous = false;\r
+\r
+      if ((cur_val >= m) && ((cur_val > m) || (d > 7) || (radix != 10)))\r
+      {\r
+        if (OK_so_far)\r
+        {\r
+          print_err("Number too big");\r
+          help2("I can only go up to 2147483647='17777777777=\"7FFFFFFF,",\r
+            "so I'm using that number instead of yours.");\r
+          error();\r
+          cur_val = 2147483647L;    /* 7FFFFFFF hex */\r
+          OK_so_far = false;\r
+        }\r
+      }\r
+      else\r
+        cur_val = cur_val * radix + d;\r
+\r
+      get_x_token();\r
+    }\r
+\r
+done:\r
+    if (vacuous)\r
+    {\r
+      print_err("Missing number, treated as zero");\r
+      help3("A number should have been here; I inserted `0'.",\r
+        "(If you can't figure out why I needed to see a number,",\r
+        "look up `weird error' in the index to The TeXbook.)");\r
+      back_error();\r
+    } \r
+    else if (cur_cmd != spacer)\r
+      back_input();\r
+  }\r
+\r
+  if (negative)\r
+    cur_val = - (integer) cur_val;\r
+}\r
+/* sec 0448 */\r
+void scan_dimen (boolean mu, boolean inf, boolean shortcut)\r
+{\r
+  boolean negative;\r
+  integer f;\r
+  integer num, denom;\r
+  small_number k, kk;\r
+  halfword p, q;\r
+  scaled v;\r
+  integer save_cur_val;\r
+\r
+  f = 0;\r
+  arith_error = false;\r
+  cur_order = normal;\r
+  negative = false;\r
+\r
+  if (!shortcut)\r
+  {\r
+    negative = false;\r
+\r
+    do\r
+      {\r
+        do\r
+          {\r
+            get_x_token();\r
+          }\r
+        while (!(cur_cmd != spacer));\r
+\r
+        if (cur_tok == other_token + '-')\r
+        {\r
+          negative = ! negative;\r
+          cur_tok = other_token + '+';\r
+        }\r
+      }\r
+    while (!(cur_tok != other_token + '+'));\r
+\r
+    if ((cur_cmd >= min_internal) && (cur_cmd <= max_internal))\r
+    {\r
+      if (mu)\r
+      {\r
+        scan_something_internal(mu_val, false);\r
+\r
+        if (cur_val_level >= glue_val)\r
+        {\r
+          v = width(cur_val);\r
+          delete_glue_ref(cur_val);\r
+          cur_val = v;\r
+        }\r
+\r
+        if (cur_val_level == mu_val)\r
+          goto attach_sign;\r
+\r
+        if (cur_val_level != int_val)\r
+          mu_error();\r
+      }\r
+      else\r
+      {\r
+        scan_something_internal(dimen_val, false);\r
+\r
+        if (cur_val_level == dimen_val)\r
+          goto attach_sign;\r
+      }\r
+    }\r
+    else\r
+    {\r
+      back_input();\r
+\r
+      if (cur_tok == continental_point_token)\r
+        cur_tok = point_token;\r
+\r
+      if (cur_tok != point_token)\r
+      {\r
+        scan_int();\r
+      }\r
+      else\r
+      {\r
+        radix = 10;\r
+        cur_val = 0;\r
+      }\r
+\r
+      if (cur_tok == continental_point_token)\r
+        cur_tok = point_token;\r
+\r
+      if ((radix == 10) && (cur_tok == point_token))\r
+      {\r
+        k = 0;\r
+        p = 0;\r
+        get_token();\r
+\r
+        while (true)\r
+        {\r
+          get_x_token();\r
+\r
+          if ((cur_tok > zero_token + 9) || (cur_tok < zero_token))\r
+            goto done1;\r
+\r
+          if (k < 17)\r
+          {\r
+            q = get_avail();\r
+            link(q) = p;\r
+            info(q) = cur_tok - zero_token;\r
+            p = q;\r
+            incr(k);\r
+          }\r
+        }\r
+\r
+done1:\r
+        for (kk = k; kk >= 1; kk--)\r
+        {\r
+          dig[kk - 1] = info(p);\r
+          q = p;\r
+          p = link(p);\r
+          free_avail(q);\r
+        }\r
+\r
+        f = round_decimals(k);\r
+\r
+        if (cur_cmd != spacer)\r
+          back_input();\r
+        }\r
+      }\r
+  }\r
+\r
+  if (cur_val < 0)\r
+  {\r
+    negative = !negative;\r
+    cur_val = - (integer) cur_val;\r
+  }\r
+\r
+  if (inf)\r
+  {\r
+    if (scan_keyword("fil"))\r
+    {\r
+      cur_order = fil;\r
+\r
+      while (scan_keyword("l"))\r
+      {\r
+        if (cur_order == filll)\r
+        {\r
+          print_err("Illegal unit of measure (");\r
+          prints("replaced by filll)");\r
+          help1("I dddon't go any higher than filll.");\r
+          error();\r
+        }\r
+        else\r
+          incr(cur_order);\r
+      }\r
+\r
+      goto attach_fraction;\r
+    }\r
+  }\r
+\r
+  save_cur_val = cur_val;\r
+\r
+  do\r
+    {\r
+      get_x_token();\r
+    }\r
+  while (!(cur_cmd != spacer));\r
+\r
+  if ((cur_cmd < min_internal) || (cur_cmd > max_internal))\r
+    back_input();\r
+  else\r
+  {\r
+    if (mu)\r
+    {\r
+      scan_something_internal(mu_val, false);\r
+\r
+      if (cur_val_level >= glue_val)\r
+      {\r
+        v = width(cur_val);\r
+        delete_glue_ref(cur_val);\r
+        cur_val = v;\r
+      }\r
+\r
+      if (cur_val_level != mu_val)\r
+      {\r
+        mu_error();\r
+      }\r
+    }\r
+    else\r
+    {\r
+      scan_something_internal(dimen_val, false);\r
+    }\r
+\r
+    v = cur_val;\r
+    goto found;\r
+  }\r
+\r
+  if (mu)\r
+    goto not_found;\r
+\r
+  if (scan_keyword("em"))\r
+    v = quad(cur_font);\r
+  else if (scan_keyword("ex"))\r
+    v = x_height(cur_font);\r
+  else\r
+    goto not_found;\r
+\r
+  {\r
+    get_x_token();\r
+\r
+    if (cur_cmd != spacer)\r
+      back_input();\r
+  }\r
+\r
+found:\r
+  cur_val = nx_plus_y(save_cur_val, v, xn_over_d(v, f, 65536L));\r
+  goto attach_sign;\r
+\r
+not_found:\r
+  if (mu)\r
+  {\r
+    if (scan_keyword("mu"))\r
+      goto attach_fraction;\r
+    else\r
+    {\r
+      print_err("Illegal unit of measure (");\r
+      prints("mu inserted)");\r
+      help4("The unit of measurement in math glue must be mu.",\r
+          "To recover gracefully from this error, it's best to",\r
+          "delete the erroneous units; e.g., type `2' to delete",\r
+          "two letters. (See Chapter 27 of The TeXbook.)");\r
+      error();\r
+      goto attach_fraction;\r
+    }\r
+  }\r
+\r
+  if (scan_keyword("true"))\r
+  {\r
+    prepare_mag();\r
+\r
+    if (mag != 1000)\r
+    {\r
+      cur_val = xn_over_d(cur_val, 1000, mag);\r
+      f = (1000 * f + 65536L * tex_remainder) / mag;\r
+      cur_val = cur_val + (f / 65536L);\r
+      f = f % 65536L;\r
+    }\r
+  }\r
+\r
+  if (scan_keyword("pt"))\r
+    goto attach_fraction;\r
+\r
+  if (scan_keyword("in"))\r
+    set_conversion(7227, 100);\r
+  else if (scan_keyword("pc"))\r
+    set_conversion(12, 1);\r
+  else if (scan_keyword("cm"))\r
+    set_conversion(7227, 254);\r
+  else if (scan_keyword("mm"))\r
+    set_conversion(7227, 2540);\r
+  else if (scan_keyword("bp"))\r
+    set_conversion(7227, 7200);\r
+  else if (scan_keyword("dd"))\r
+    set_conversion(1238, 1157);\r
+  else if (scan_keyword("cc"))\r
+    set_conversion(14856, 1157);\r
+  else if (scan_keyword("Q"))\r
+    set_conversion(7227, 10160);\r
+  else if (scan_keyword("H"))\r
+    set_conversion(7227, 10160);\r
+  else if (scan_keyword("twip"))\r
+    set_conversion(1, 20);\r
+  else if (scan_keyword("sp"))\r
+    goto done;\r
+  else\r
+  {\r
+    print_err("Illegal unit of measure (");\r
+    prints("pt inserted)");\r
+    help6("Dimensions can be in units of em, ex, in, pt, pc,",\r
+      "cm, mm, dd, cc, bp, or sp; but yours is a new one!",\r
+      "I'll assume that you meant to say pt, for printer's points.",\r
+      "To recover gracefully from this error, it's best to",\r
+      "delete the erroneous units; e.g., type `2' to delete",\r
+      "two letters. (See Chapter 27 of The TeXbook.)");\r
+    error();\r
+    goto done2;\r
+  }\r
+\r
+  cur_val = xn_over_d(cur_val, num, denom);\r
+  f = (num * f + 65536L * tex_remainder) / denom;\r
+  cur_val = cur_val +(f / 65536L);\r
+  f = f % 65536L;\r
+\r
+done2:\r
+attach_fraction:\r
+  if (cur_val >= 16384)     /* 2^14 */\r
+    arith_error = true;\r
+  else\r
+    cur_val = cur_val * unity + f;\r
+\r
+done:\r
+  {\r
+    get_x_token();\r
+\r
+    if (cur_cmd != spacer)\r
+      back_input();\r
+  }\r
+\r
+attach_sign:\r
+  if (arith_error || (abs(cur_val) >= 1073741824L)) /* 2^30 */\r
+  {\r
+    print_err("Dimension too large");\r
+    help2("I can't work with sizes bigger than about 19 feet.",\r
+        "Continue and I'll use the largest value I can.");\r
+    error();\r
+    cur_val = max_dimen;\r
+    arith_error = false;\r
+  }\r
+\r
+  if (negative)\r
+    cur_val = - (integer) cur_val;\r
+}\r
+/* sec 0461 */\r
+void scan_glue (small_number level)\r
+{\r
+  boolean negative;\r
+  pointer q;\r
+  boolean mu;\r
+\r
+  mu = (level == mu_val);\r
+  negative = false;\r
+\r
+  do\r
+    {\r
+      do\r
+        {\r
+          get_x_token();\r
+        }\r
+      while (!(cur_cmd != spacer));\r
+\r
+      if (cur_tok == other_token + '-')\r
+      {\r
+        negative = !negative;\r
+        cur_tok = other_token + '+';\r
+      }\r
+    }\r
+  while (!(cur_tok != other_token + '+'));\r
+\r
+  if ((cur_cmd >= min_internal) && (cur_cmd <= max_internal))\r
+  {\r
+    scan_something_internal(level, negative);\r
+\r
+    if (cur_val_level >= glue_val)\r
+    {\r
+      if (cur_val_level != level)\r
+        mu_error();\r
+\r
+      return;\r
+    }\r
+\r
+    if (cur_val_level == int_val)\r
+      scan_dimen(mu, false, true);\r
+    else if (level == mu_val)\r
+      mu_error();\r
+  }\r
+  else\r
+  {\r
+    back_input();\r
+    scan_dimen(mu, false, false);\r
+\r
+    if (negative)\r
+      cur_val = - (integer) cur_val;\r
+  }\r
+\r
+  q = new_spec(zero_glue);\r
+  width(q) = cur_val;\r
+\r
+  if (scan_keyword("plus"))\r
+  {\r
+    scan_dimen(mu, true, false);\r
+    stretch(q) = cur_val;\r
+    stretch_order(q) = cur_order;\r
+  }\r
+\r
+  if (scan_keyword("minus"))\r
+  {\r
+    scan_dimen(mu, true, false);\r
+    shrink(q) = cur_val;\r
+    shrink_order(q) = cur_order;\r
+  }\r
+\r
+  cur_val = q;\r
+}\r
+/* sec 0463 */\r
+pointer scan_rule_spec (void)\r
+{\r
+  pointer q;\r
+\r
+  q = new_rule();\r
+\r
+  if (cur_cmd == vrule)\r
+    width(q) = default_rule;\r
+  else\r
+  {\r
+    height(q) = default_rule;\r
+    depth(q) = 0;\r
+  }\r
+\r
+reswitch:\r
+\r
+  if (scan_keyword("width"))\r
+  {\r
+    scan_dimen(false, false, false);\r
+    width(q) = cur_val;\r
+    goto reswitch;\r
+  }\r
+\r
+  if (scan_keyword("height"))\r
+  {\r
+    scan_dimen(false, false, false);\r
+    height(q) = cur_val;\r
+    goto reswitch;\r
+  }\r
+\r
+  if (scan_keyword("depth"))\r
+  {\r
+    scan_dimen(false, false, false);\r
+    depth(q) = cur_val;\r
+    goto reswitch;\r
+  }\r
+\r
+  return q;\r
+}\r
+/* sec 0464 */\r
+pointer str_toks (pool_pointer b)\r
+{\r
+  pointer p;\r
+  pointer q;\r
+  halfword t;\r
+  pool_pointer k;\r
+\r
+  str_room(1);\r
+  p = temp_head;\r
+  link(p) = 0;\r
+  k = b;\r
+\r
+  while (k < pool_ptr)\r
+  {\r
+    t = str_pool[k];\r
+\r
+    if (t == ' ')\r
+      t = space_token;\r
+    else\r
+      t = other_token + t;\r
+\r
+    fast_store_new_token(t);\r
+    incr(k);\r
+  }\r
+\r
+  pool_ptr = b;\r
+\r
+  return p;\r
+}\r
+/* sec 0465 */\r
+pointer the_toks (void)\r
+{\r
+  char old_setting;\r
+  pointer p, q, r;\r
+  pool_pointer b;\r
+\r
+  get_x_token();\r
+  scan_something_internal(tok_val, false);\r
+\r
+  if (cur_val_level >= ident_val)\r
+  {\r
+    p = temp_head;\r
+    link(p) = 0;\r
+\r
+    if (cur_val_level == ident_val)\r
+      store_new_token(cs_token_flag + cur_val);\r
+    else if (cur_val != 0)\r
+    {\r
+      r = link(cur_val);\r
+\r
+      while (r != 0)\r
+      {\r
+        fast_store_new_token(info(r));\r
+        r = link(r);\r
+      }\r
+    }\r
+\r
+    return p;\r
+  }\r
+  else\r
+  {\r
+    old_setting = selector;\r
+    selector = new_string;\r
+    b = pool_ptr;\r
+\r
+    switch (cur_val_level)\r
+    {\r
+      case int_val:\r
+        print_int(cur_val);\r
+        break;\r
+\r
+      case dimen_val:\r
+        {\r
+          print_scaled(cur_val);\r
+          prints("pt");\r
+        }\r
+        break;\r
+\r
+      case glue_val:\r
+        {\r
+          print_spec(cur_val, "pt");\r
+          delete_glue_ref(cur_val);\r
+        }\r
+        break;\r
+\r
+      case mu_val:\r
+        {\r
+          print_spec(cur_val, "mu");\r
+          delete_glue_ref(cur_val);\r
+        }\r
+        break;\r
+    }\r
+\r
+    selector = old_setting;\r
+    return str_toks(b);\r
+  }\r
+}\r
+/* sec 0467 */\r
+void ins_the_toks (void) \r
+{ \r
+  link(garbage) = the_toks();\r
+  ins_list(link(temp_head));\r
+}\r
+/* sec 0470 */\r
+void conv_toks (void)\r
+{\r
+  char old_setting;\r
+  char c;\r
+  small_number save_scanner_status;\r
+  pool_pointer b;\r
+\r
+  c = cur_chr;\r
+\r
+  switch (c)\r
+  {\r
+    case number_code:\r
+    case roman_numeral_code:\r
+      scan_int();\r
+      break;\r
+\r
+    case string_code:\r
+    case meaning_code:\r
+      save_scanner_status = scanner_status;\r
+      scanner_status = 0;\r
+      get_token();\r
+      scanner_status = save_scanner_status;\r
+      break;\r
+\r
+    case font_name_code:\r
+      scan_font_ident();\r
+      break;\r
+\r
+    case job_name_code:\r
+      if (job_name == 0)\r
+        open_log_file();\r
+      break;\r
+  }\r
+\r
+  old_setting = selector;\r
+  selector = new_string;\r
+  b = pool_ptr;\r
+\r
+  switch (c)\r
+  {\r
+    case number_code:\r
+      print_int(cur_val);\r
+      break;\r
+\r
+    case roman_numeral_code:\r
+      print_roman_int(cur_val);\r
+      break;\r
+\r
+    case string_code:\r
+      if (cur_cs != 0)\r
+        sprint_cs(cur_cs);\r
+      else\r
+        print_char(cur_chr);\r
+      break;\r
+\r
+    case meaning_code:\r
+      print_meaning();\r
+      break;\r
+\r
+    case font_name_code:\r
+      print(font_name[cur_val]);\r
+\r
+      if (font_size[cur_val] != font_dsize[cur_val])\r
+      {\r
+        prints(" at ");\r
+        print_scaled(font_size[cur_val]);\r
+        prints("pt");\r
+      }\r
+      break;\r
+\r
+    case job_name_code:\r
+      print(job_name);\r
+      break;\r
+  }\r
+\r
+  selector = old_setting;\r
+  link(garbage) = str_toks(b);\r
+  begin_token_list(link(temp_head), 4);\r
+}\r
+/* sec 0473 */\r
+pointer scan_toks (boolean macro_def, boolean xpand)\r
+{\r
+  halfword t;\r
+  halfword s;\r
+  pointer p;\r
+  pointer q;\r
+  halfword unbalance;\r
+  halfword hash_brace;\r
+\r
+  if (macro_def)\r
+    scanner_status = defining;\r
+  else\r
+    scanner_status = absorbing;\r
+\r
+  warning_index = cur_cs;\r
+  def_ref = get_avail();\r
+  token_ref_count(def_ref) = 0;\r
+  p = def_ref;\r
+  hash_brace = 0;\r
+  t = zero_token;\r
+\r
+  if (macro_def)\r
+  {\r
+    while (true)\r
+    {\r
+      get_token();\r
+\r
+      if (cur_tok < right_brace_limit)\r
+        goto done1;\r
+\r
+      if (cur_cmd == mac_param)\r
+      {\r
+        s = match_token + cur_chr;\r
+        get_token();\r
+\r
+        if (cur_cmd == left_brace)\r
+        {\r
+          hash_brace = cur_tok;\r
+          store_new_token(cur_tok);\r
+          store_new_token(end_match_token);\r
+          goto done;\r
+        }\r
+\r
+        if (t == zero_token + 9)\r
+        {\r
+          print_err("You already have nine parameters");\r
+          help1("I'm going to ignore the # sign you just used.");\r
+          error();\r
+        }\r
+        else\r
+        {\r
+          incr(t);\r
+\r
+          if (cur_tok != t)\r
+          {\r
+            print_err("Parameters must be numbered consecutively");\r
+            help2("I've inserted the digit you should have used after the #.",\r
+                "Type `1' to delete what you did use.");\r
+            back_error();\r
+          }\r
+\r
+          cur_tok = s;\r
+        }\r
+      }\r
+\r
+      store_new_token(cur_tok);\r
+    }\r
+\r
+done1:\r
+    store_new_token(end_match_token);\r
+\r
+    if (cur_cmd == right_brace)\r
+    {\r
+      print_err("Missing { inserted");\r
+      incr(align_state);\r
+      help2("Where was the left brace? You said something like `\\def\\a}',",\r
+          "which I'm going to interpret as `\\def\\a{}'.");\r
+      error();\r
+      goto found;\r
+    }\r
+done:;\r
+  }\r
+  else\r
+  {\r
+    scan_left_brace();\r
+  }\r
+\r
+  unbalance = 1;\r
+\r
+  while (true)\r
+  {\r
+    if (xpand)\r
+    {\r
+      while (true)\r
+      {\r
+        get_next();\r
+\r
+        if (cur_cmd <= max_command)\r
+          goto done2;\r
+\r
+        if (cur_cmd != the)\r
+        {\r
+          expand();\r
+        }\r
+        else\r
+        {\r
+          q = the_toks();\r
+\r
+          if (link(temp_head) != 0)\r
+          {\r
+            link(p) = link(temp_head);\r
+            p = q;\r
+          }\r
+        }\r
+      }\r
+done2:\r
+      x_token();\r
+    }\r
+    else\r
+      get_token();\r
+\r
+    if (cur_tok < right_brace_limit)\r
+      if (cur_cmd < right_brace)\r
+        incr(unbalance);\r
+      else\r
+      {\r
+        decr(unbalance);\r
+\r
+        if (unbalance == 0)\r
+          goto found;\r
+      }\r
+    else if (cur_cmd == mac_param)\r
+      if (macro_def)\r
+      {\r
+        s = cur_tok;\r
+\r
+        if (xpand)\r
+          get_x_token();\r
+        else\r
+          get_token();\r
+\r
+        if (cur_cmd != mac_param)\r
+          if ((cur_tok <= zero_token) || (cur_tok > t))\r
+          {\r
+            print_err("Illegal parameter number in definition of ");\r
+            sprint_cs(warning_index);\r
+            help3("You meant to type ## instead of #, right?",\r
+                "Or maybe a } was forgotten somewhere earlier, and things",\r
+                "are all screwed up? I'm going to assume that you meant ##.");\r
+            back_error();\r
+            cur_tok = s;\r
+          }\r
+          else\r
+            cur_tok = out_param_token - '0' + cur_chr;\r
+      }\r
+\r
+    store_new_token(cur_tok);\r
+  }\r
+\r
+found:\r
+  scanner_status = 0;\r
+\r
+  if (hash_brace != 0)\r
+    store_new_token(hash_brace);\r
+\r
+  return p;\r
+}\r
+/* sec 0482 */\r
+void read_toks (integer n, pointer r)\r
+{\r
+  pointer p;\r
+  pointer q;\r
+  integer s;\r
+  /* small_number m; */\r
+  int m;\r
+\r
+  scanner_status = defining;\r
+  warning_index = r;\r
+  def_ref = get_avail();\r
+  token_ref_count(def_ref) = 0;\r
+  p = def_ref;\r
+  store_new_token(end_match_token);\r
+\r
+  if ((n < 0) || (n > 15))\r
+    m = 16;\r
+  else\r
+    m = n;\r
+\r
+  s = align_state;\r
+  align_state = 1000000L;\r
+\r
+  do\r
+    {\r
+      begin_file_reading();\r
+      name = m + 1;\r
+\r
+      if (read_open[m] == closed)\r
+        if (interaction > nonstop_mode)\r
+          if (n < 0)\r
+            prompt_input("");\r
+          else\r
+          {\r
+            print_ln();\r
+            sprint_cs(r);\r
+            prompt_input("=");\r
+            n = -1;\r
+          }\r
+        else\r
+        {\r
+          fatal_error("*** (cannot \\read from terminal in nonstop modes)");\r
+          return;\r
+        }\r
+      else if (read_open[m] == just_open)\r
+        if (input_ln(read_file[m], false))\r
+          read_open[m] = normal;\r
+        else\r
+        {\r
+          a_close(read_file[m]);\r
+          read_open[m] = closed;\r
+        }\r
+      else\r
+      {\r
+        if (!input_ln(read_file[m], true))\r
+        {\r
+          a_close(read_file[m]);\r
+          read_open[m] = closed;\r
+\r
+          if (align_state != 1000000L)\r
+          {\r
+            runaway();\r
+            print_err("File ended within ");\r
+            print_esc("read");\r
+            help1("This \\read has unbalanced braces.");\r
+            align_state = 1000000L;\r
+            error();\r
+          }\r
+        }\r
+      }\r
+\r
+      limit = last;\r
+\r
+      if (end_line_char_inactive())\r
+        decr(limit);\r
+      else\r
+        buffer[limit] = end_line_char;\r
+\r
+      first = limit + 1;\r
+      loc = start;\r
+      state = new_line;\r
+\r
+      while (true)\r
+      {\r
+        get_token();\r
+\r
+        if (cur_tok == 0)\r
+          goto done;\r
+\r
+        if (align_state < 1000000L)\r
+        {\r
+          do\r
+            {\r
+              get_token();\r
+            }\r
+          while (!(cur_tok == 0));\r
+\r
+          align_state = 1000000L;\r
+          goto done;\r
+        }\r
+\r
+        store_new_token(cur_tok);\r
+      }\r
+\r
+done:\r
+      end_file_reading();\r
+    }\r
+  while (!(align_state == 1000000L));\r
+\r
+  cur_val = def_ref;\r
+  scanner_status = normal;\r
+  align_state = s;\r
+}\r
+/* sec 0494 */\r
+void pass_text (void)\r
+{\r
+  integer l;\r
+  small_number save_scanner_status;\r
+\r
+  save_scanner_status = scanner_status;\r
+  scanner_status = skipping;\r
+  l = 0;\r
+  skip_line = line;\r
+\r
+  while (true)\r
+  {\r
+    get_next();\r
+\r
+    if (cur_cmd == fi_or_else)\r
+    {\r
+      if (l == 0)\r
+        goto done;\r
+\r
+      if (cur_chr == fi_code)\r
+        decr(l);\r
+    }\r
+    else if (cur_cmd == if_test)\r
+      incr(l);\r
+  }\r
+\r
+done:\r
+  scanner_status = save_scanner_status;\r
+}\r
+/* sec 0497 */\r
+void change_if_limit (small_number l, pointer p)\r
+{\r
+  pointer q;\r
+\r
+  if (p == cond_ptr)\r
+    if_limit = l;\r
+  else\r
+  {\r
+    q = cond_ptr;\r
+\r
+    while (true)\r
+    {\r
+      if (q == 0)\r
+      {\r
+        confusion("if");\r
+        return;\r
+      }\r
+\r
+      if (link(q) == p)\r
+      {\r
+        type(p) = l;\r
+        return;\r
+      }\r
+\r
+      q = link(q);\r
+    }\r
+  }\r
+}\r
+/* sec 0498 */\r
+void conditional (void)\r
+{\r
+  boolean b;\r
+  char r;\r
+  integer m, n;\r
+  pointer p, q;\r
+  small_number save_scanner_status;\r
+  pointer save_cond_ptr;\r
+  small_number this_if;\r
+\r
+  {\r
+    p = get_node(if_node_size);\r
+    link(p) = cond_ptr;\r
+    type(p) = if_limit;\r
+    subtype(p) = cur_if;\r
+    if_line_field(p) = if_line;\r
+    cond_ptr = p;\r
+    cur_if = cur_chr;\r
+    if_limit = if_code;\r
+    if_line = line;\r
+  }\r
+\r
+  save_cond_ptr = cond_ptr;\r
+  this_if = cur_chr;\r
+\r
+  switch (this_if)\r
+  {\r
+    case if_char_code:\r
+    case if_cat_code:\r
+      {\r
+        get_x_token_or_active_char();\r
+\r
+        if ((cur_cmd > active_char) || (cur_chr > 255))\r
+        {\r
+          m = relax;\r
+          n = 256;\r
+        }\r
+        else\r
+        {\r
+          m = cur_cmd;\r
+          n = cur_chr;\r
+        }\r
+\r
+        get_x_token_or_active_char();\r
+\r
+        if ((cur_cmd > active_char) || (cur_chr > 255))\r
+        {\r
+          cur_cmd = relax;\r
+          cur_chr = 256;\r
+        }\r
+\r
+        if (this_if == if_char_code)\r
+          b = (n == cur_chr); \r
+        else\r
+          b = (m == cur_cmd);\r
+      }\r
+      break;\r
+\r
+    case if_int_code:\r
+    case if_dim_code:\r
+      {\r
+        if (this_if == if_int_code)\r
+          scan_int();\r
+        else\r
+          scan_dimen(false, false, false);\r
+\r
+        n = cur_val;\r
+        \r
+        do\r
+          {\r
+            get_x_token();\r
+          }\r
+        while (!(cur_cmd != spacer));\r
+\r
+        if ((cur_tok >= other_token + '<') && (cur_tok <= other_token + '>'))\r
+          r = cur_tok - other_token;\r
+        else\r
+        {\r
+          print_err("Missing = inserted for ");\r
+          print_cmd_chr(if_test, this_if);\r
+          help1("I was expecting to see `<', `=', or `>'. Didn't.");\r
+          back_error();\r
+          r = '=';\r
+        }\r
+\r
+        if (this_if == if_int_code)\r
+          scan_int();\r
+        else \r
+          scan_dimen(false, false, false);\r
+\r
+        switch (r)\r
+        {\r
+          case '<':\r
+            b = (n < cur_val);\r
+            break;\r
+\r
+          case '=':\r
+            b = (n == cur_val);\r
+            break;\r
+\r
+          case '>':\r
+            b = (n > cur_val);\r
+            break;\r
+        }\r
+      }\r
+      break;\r
+\r
+    case if_odd_code:\r
+      scan_int();\r
+      b = odd(cur_val);\r
+      break;\r
+\r
+    case if_vmode_code:\r
+      b = (abs(mode) == vmode);\r
+      break;\r
+\r
+    case if_hmode_code:\r
+      b = (abs(mode) == hmode);\r
+      break;\r
+\r
+    case if_mmode_code:\r
+      b = (abs(mode) == mmode);\r
+      break;\r
+\r
+    case if_inner_code:\r
+      b = (mode < 0);\r
+      break;\r
+\r
+    case if_void_code:\r
+    case if_hbox_code:\r
+    case if_vbox_code:\r
+      {\r
+        scan_eight_bit_int();\r
+        p = box(cur_val);\r
+\r
+        if (this_if == if_void_code)\r
+          b = (p == 0);\r
+        else if (p == 0)\r
+          b = false;\r
+        else if (this_if == if_hbox_code)\r
+          b = (type(p) == hlist_node);\r
+        else\r
+          b = (type(p) == vlist_node);\r
+      }\r
+      break;\r
+\r
+    case ifx_code:\r
+      {\r
+        save_scanner_status = scanner_status;\r
+        scanner_status = 0;\r
+        get_next();\r
+        n = cur_cs;\r
+        p = cur_cmd;\r
+        q = cur_chr;\r
+        get_next();\r
+\r
+        if (cur_cmd != p)\r
+          b = false;\r
+        else if (cur_cmd < call)\r
+          b = (cur_chr == q);\r
+        else\r
+        {\r
+          p = link(cur_chr);\r
+          q = link(equiv(n));\r
+\r
+          if (p == q)\r
+            b = true;\r
+          else\r
+          {\r
+            while ((p != 0) && (q != 0))\r
+              if (info(p) != info(q))\r
+                p = 0;\r
+              else\r
+              {\r
+                p = link(p);\r
+                q = link(q);\r
+              }\r
+\r
+            b = ((p == 0) && (q == 0));\r
+          }\r
+        }\r
+\r
+        scanner_status = save_scanner_status;\r
+      }\r
+      break;\r
+\r
+    case if_eof_code:\r
+      {\r
+        scan_four_bit_int();\r
+        b = (read_open[cur_val] == closed);\r
+      }\r
+      break;\r
+\r
+    case if_true_code:\r
+      b = true;\r
+      break;\r
+\r
+    case if_false_code:\r
+      b = false;\r
+      break;\r
+\r
+    case if_case_code:\r
+      {\r
+        scan_int();\r
+        n = cur_val;\r
+\r
+        if (tracing_commands > 1)\r
+        {\r
+          begin_diagnostic();\r
+          prints("{case ");\r
+          print_int(n); \r
+          print_char('}');\r
+          end_diagnostic(false);\r
+        }\r
+\r
+        while (n != 0)\r
+        {\r
+          pass_text();\r
+\r
+          if (cond_ptr == save_cond_ptr)\r
+            if (cur_chr == or_code)\r
+              decr(n);\r
+            else \r
+              goto common_ending;\r
+          else if (cur_chr == fi_code)\r
+          {\r
+            p = cond_ptr;\r
+            if_line = if_line_field(p);\r
+            cur_if = subtype(p);\r
+            if_limit = type(p);\r
+            cond_ptr = link(p);\r
+            free_node(p, if_node_size);\r
+          }\r
+        }\r
+\r
+        change_if_limit(or_code, save_cond_ptr);\r
+        return;\r
+      }\r
+      break;\r
+  }\r
+\r
+  if (tracing_commands > 1)\r
+  {\r
+    begin_diagnostic();\r
+\r
+    if (b)\r
+      prints("{true}");\r
+    else\r
+      prints("{false}");\r
+\r
+    end_diagnostic(false);\r
+  }\r
+\r
+  if (b)\r
+  {\r
+    change_if_limit(else_code, save_cond_ptr);\r
+    return;\r
+  }\r
+\r
+  while (true)\r
+  {\r
+    pass_text();\r
+\r
+    if (cond_ptr == save_cond_ptr)\r
+    {\r
+      if (cur_chr != or_code)\r
+        goto common_ending;\r
+\r
+      print_err("Extra ");\r
+      print_esc("or");\r
+      help1("I'm ignoring this; it doesn't match any \\if.");\r
+      error();\r
+    }\r
+    else if (cur_chr == fi_code)\r
+    {\r
+      p = cond_ptr;\r
+      if_line = if_line_field(p);\r
+      cur_if = subtype(p);\r
+      if_limit = type(p);\r
+      cond_ptr = link(p);\r
+      free_node(p, if_node_size);\r
+    }\r
+  }\r
+\r
+common_ending:\r
+  if (cur_chr == fi_code)\r
+  {\r
+    p = cond_ptr;\r
+    if_line = if_line_field(p);\r
+    cur_if = subtype(p);\r
+    if_limit = type(p);\r
+    cond_ptr = link(p);\r
+    free_node(p, if_node_size);\r
+  }\r
+  else\r
+    if_limit = fi_code;\r
+}\r
+/* sec 0515 */\r
+void begin_name (void)\r
+{\r
+  area_delimiter = 0;\r
+  ext_delimiter = 0;\r
+}\r
+/* sec 0516 */\r
+boolean more_name (ASCII_code c)\r
+{\r
+  if (quoted_file_name == false && c == ' ')\r
+    return false;\r
+  else if (quoted_file_name != false && c == '"')\r
+  {\r
+    quoted_file_name = false; /* catch next space character */\r
+    return true;     /* accept ending quote, but throw away */\r
+  }\r
+  else\r
+  {   \r
+    str_room(1);\r
+    append_char(c);\r
+\r
+    //  for DOS/Windows\r
+    if ((c == '/' || c == '\\' || c == ':')) \r
+    {\r
+      area_delimiter = cur_length;\r
+      ext_delimiter = 0;\r
+    } \r
+    else if (c == '.')\r
+      ext_delimiter = cur_length;\r
+\r
+    return true;\r
+  }\r
+}\r
+\r
+/* sec 0517 */\r
+void end_name (void) \r
+{\r
+#ifdef ALLOCATESTRING\r
+  if (str_ptr + 3 > current_max_strings)\r
+    str_start = realloc_str_start(increment_max_strings + 3);\r
+\r
+  if (str_ptr + 3 > current_max_strings)\r
+  {\r
+    overflow("number of strings", current_max_strings - init_str_ptr);\r
+    return;\r
+  }\r
+#else\r
+  if (str_ptr + 3 > max_strings)\r
+  {\r
+    overflow("number of strings", max_strings - init_str_ptr);\r
+    return;\r
+  }\r
+#endif\r
+\r
+  if (area_delimiter == 0) // no area delimiter ':' '/' or '\' found\r
+    cur_area = 335;        // "" default area \r
+  else\r
+  {\r
+    cur_area = str_ptr;\r
+    str_start[str_ptr + 1] = str_start[str_ptr] + area_delimiter;\r
+    incr(str_ptr);\r
+  }\r
+\r
+  if (ext_delimiter == 0) // no extension delimiter '.' found\r
+  {\r
+    cur_ext = 335;        // "" default extension \r
+    cur_name = make_string();\r
+  } \r
+  else\r
+  {\r
+    cur_name = str_ptr;\r
+    str_start[str_ptr + 1] = str_start[str_ptr] + ext_delimiter - area_delimiter - 1;\r
+    incr(str_ptr);\r
+    cur_ext = make_string();\r
+  }\r
+}\r
+/* sec 0519 */\r
+void pack_file_name (str_number n, str_number a, str_number e)\r
+{\r
+  integer k;\r
+  ASCII_code c;\r
+  pool_pointer j;\r
+\r
+  k = 0;\r
+\r
+  for (j = str_start[a]; j <= str_start[a + 1] - 1; j++)\r
+    append_to_name(str_pool[j]);\r
+\r
+  for (j = str_start[n]; j <= str_start[n + 1] - 1; j++)\r
+    append_to_name(str_pool[j]);\r
+\r
+  for (j = str_start[e]; j <= str_start[e + 1] - 1; j++)\r
+    append_to_name(str_pool[j]);\r
+\r
+  if (k < file_name_size)\r
+    name_length = k;\r
+  else\r
+    name_length = file_name_size - 1;\r
+\r
+  for (k = name_length + 1; k <= file_name_size; k++)\r
+    name_of_file[k] = ' ';\r
+\r
+  name_of_file[file_name_size] = '\0'; /* paranoia */\r
+\r
+  {\r
+    name_of_file [name_length + 1] = '\0';\r
+\r
+    if (trace_flag)\r
+      printf(" pack_file_name `%s' (%lld) ", name_of_file + 1, name_length);\r
+\r
+    name_of_file [name_length + 1] = ' ';\r
+  }\r
+}\r
+/* Called only from two places tex9.c for format name - specified and default */\r
+/* for specified format name args are 0, a, b name in buffer[a] --- buffer[b] */\r
+/* for default args are format_default_length-4, 1, 0 */\r
+/* sec 0523 */\r
+void pack_buffered_name_(small_number n, integer a, integer b)\r
+{\r
+  integer k;\r
+  ASCII_code c;\r
+  integer j;\r
+\r
+  if (n + b - a + 5 > file_name_size)\r
+    b = a + file_name_size - n - 5;\r
+\r
+  k = 0;\r
+\r
+  for (j = 1; j <= n; j++)\r
+    append_to_name(xord[TEX_format_default[j]]);\r
+\r
+  for (j = a; j <= b; j++)\r
+    append_to_name(buffer[j]);\r
+\r
+  for (j = format_default_length - 3; j <= format_default_length; j++)\r
+    append_to_name(xord[TEX_format_default[j]]);\r
+\r
+  if (k < file_name_size)\r
+    name_length = k;\r
+  else\r
+    name_length = file_name_size - 1;\r
+\r
+  for (k = name_length + 1; k <= file_name_size; k++)\r
+    name_of_file[k]= ' ';\r
+\r
+  name_of_file[file_name_size] = '\0';\r
+}\r
+/* sec 0525 */\r
+str_number make_name_string (void)\r
+{\r
+  integer k;\r
+\r
+#ifdef ALLOCATESTRING\r
+  if (pool_ptr + name_length > current_pool_size)\r
+    str_pool = realloc_str_pool(increment_pool_size + name_length);\r
+\r
+  if (str_ptr == current_max_strings)\r
+    str_start = realloc_str_start(increment_max_strings);\r
+\r
+  if ((pool_ptr + name_length > current_pool_size) || (str_ptr == current_max_strings) || (cur_length > 0))\r
+#else\r
+  if ((pool_ptr + name_length > pool_size) || (str_ptr == max_strings) || (cur_length > 0))\r
+#endif\r
+  {\r
+    return '?';\r
+  }\r
+  else\r
+  {\r
+    for (k = 1; k <= name_length; k++)\r
+      append_char(xord[name_of_file[k]]);\r
+\r
+    return make_string();\r
+  }\r
+}\r
+/* sec 0525 */\r
+//str_number a_make_name_string (alpha_file * f)\r
+str_number a_make_name_string_(void)\r
+{\r
+  return make_name_string();\r
+}\r
+/* sec 0525 */\r
+//str_number b_make_name_string_(byte_file * f)\r
+str_number b_make_name_string_(void)\r
+{\r
+  return make_name_string(); \r
+}\r
+/* sec 0525 */\r
+//str_number w_make_name_string_(word_file * f)\r
+str_number w_make_name_string_(void)\r
+{\r
+  return make_name_string();\r
+}\r
+/* sec 0526 */\r
+void scan_file_name (void)\r
+{\r
+  name_in_progress = true;\r
+  begin_name();\r
+\r
+  do\r
+    {\r
+      get_x_token(); \r
+    }\r
+  while (!(cur_cmd != spacer));\r
+\r
+  quoted_file_name = false;\r
+\r
+  if (allow_quoted_names)\r
+  {\r
+    if (cur_chr == '"')\r
+    {\r
+      quoted_file_name = true;\r
+      get_x_token();\r
+    }\r
+  }\r
+\r
+  while (true)\r
+  {\r
+    if ((cur_cmd > other_char) || (cur_chr > 255)) \r
+    {\r
+      back_input();\r
+      goto done; \r
+    } \r
+\r
+    if (!more_name(cur_chr))\r
+      goto done;\r
+\r
+    get_x_token();\r
+  }\r
+\r
+done:\r
+  end_name();\r
+  name_in_progress = false;\r
+}\r
+/* argument is string .fmt, .log, .pdf, or .dvi */\r
+/* sec 0529 */\r
+void pack_job_name_(str_number s)\r
+{\r
+  cur_area = 335; /* "" */\r
+  cur_ext  = s;\r
+  cur_name = job_name;\r
+  pack_file_name(cur_name, cur_area, cur_ext);\r
+}\r
+/* sec 0530 */\r
+void prompt_file_name_(const char * s, str_number e) \r
+{\r
+  integer k;\r
+\r
+  if (interaction == scroll_mode)\r
+    do_nothing();\r
+\r
+  if (!strcmp("input file name", s))\r
+    print_err("I can't find file `");\r
+  else\r
+    print_err("I can't write on file `");\r
+\r
+  print_file_name(cur_name, cur_area, cur_ext);\r
+  prints("'.");\r
+\r
+  if (e == 785)    /* .tex */\r
+    show_context();\r
+\r
+  print_nl("Please type another ");\r
+  prints(s); \r
+\r
+  if (interaction < scroll_mode)\r
+  {\r
+    fatal_error("*** (job aborted, file error in nonstop mode)");\r
+    return;\r
+  }\r
+\r
+  if (!knuth_flag)\r
+    show_line(" (or Ctrl-Z to exit)", 0);\r
+\r
+  prompt_input(": ");\r
+\r
+  {\r
+    begin_name();\r
+    k = first;\r
+\r
+    while ((buffer[k] == ' ') && (k < last))\r
+      incr(k);\r
+\r
+    quoted_file_name = false;\r
+\r
+    if (allow_quoted_names && k < last) /* check whether quoted name */\r
+    {\r
+      if (buffer[k]== '"')\r
+      {\r
+        quoted_file_name = true;\r
+        incr(k);\r
+      }\r
+    }\r
+\r
+    while (true)\r
+    {\r
+      if (k == last)\r
+        goto done;\r
+\r
+      /* convert tilde '~' to pseudo tilde */\r
+      if (pseudo_tilde != 0 && buffer[k]== '~')\r
+        buffer[k] = pseudo_tilde;\r
+\r
+      /* convert space ' ' to pseudo space */\r
+      if (pseudo_space != 0 && buffer[k]== ' ')\r
+        buffer[k] = pseudo_space;\r
+\r
+      if (!more_name(buffer[k]))\r
+        goto done;\r
+\r
+      incr(k);\r
+    }\r
+\r
+done:\r
+    end_name();\r
+  }\r
+\r
+  if (cur_ext == 335) /* "" */\r
+    cur_ext = e;      /* use default extension */\r
+\r
+  pack_file_name(cur_name, cur_area, cur_ext);\r
+}\r
+/* sec 0534 */\r
+void open_log_file (void)\r
+{\r
+  char old_setting;\r
+  integer k;\r
+  integer l;\r
+  char * months;\r
+\r
+  old_setting = selector;\r
+\r
+  if (job_name == 0)\r
+    job_name = get_job_name(790);\r
+    //job_name = 790;\r
+\r
+  pack_job_name(".log");\r
+\r
+  while (!a_open_out(log_file))\r
+  {\r
+    selector = term_only;\r
+    prompt_file_name("transcript file name", ".log");\r
+  }\r
+\r
+  log_name = a_make_name_string(log_file);\r
+  selector = log_only;\r
+  log_opened = true;\r
+\r
+  {\r
+    fprintf(log_file, "%s (%s %s)", banner, application, yandyversion);\r
+\r
+    if (format_ident > 0)\r
+      slow_print(format_ident);\r
+\r
+    prints("  ");\r
+\r
+    if (civilize_flag)\r
+      print_int(year);\r
+    else\r
+      print_int(day);\r
+\r
+    print_char(' ');\r
+    months = " JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC";\r
+\r
+    for (k = 3 * month - 2; k <= 3 * month; k++)\r
+      putc(months[k], log_file);\r
+\r
+    print_char(' ');\r
+\r
+    if (civilize_flag)\r
+      print_int(day);\r
+    else\r
+      print_int(year);\r
+\r
+    print_char(' ');\r
+    print_two(tex_time / 60);\r
+    print_char(':');\r
+    print_two(tex_time % 60);\r
+  }\r
+\r
+  input_stack[input_ptr] = cur_input;\r
+  print_nl("**");\r
+  l = input_stack[0].limit_field;\r
+\r
+  if (buffer[l] == end_line_char)\r
+    decr(l);\r
+\r
+  for (k = 1; k <= l; k++)\r
+    print(buffer[k]);\r
+\r
+  print_ln(); \r
+\r
+  if (show_fmt_flag)\r
+  {\r
+    if (format_file != NULL)\r
+    {\r
+      fprintf(log_file, "(%s)\n", format_file);\r
+      free(format_file);\r
+      format_file = NULL;\r
+    }\r
+  }\r
+\r
+  selector = old_setting + 2;\r
+}\r
+/* sec 0537 */\r
+void start_input (void)\r
+{\r
+  scan_file_name();\r
+  pack_file_name(cur_name, cur_area, cur_ext); \r
+\r
+  while (true)\r
+  {\r
+    begin_file_reading();\r
+    \r
+    if (a_open_in(cur_file, kpse_tex_format))\r
+      goto done;\r
+\r
+    end_file_reading();\r
+    prompt_file_name("input file name", ".tex");\r
+  }\r
+\r
+done: \r
+  name = a_make_name_string(cur_file);\r
+\r
+  if (job_name == 0)\r
+  {\r
+    job_name = get_job_name(cur_name);\r
+    //job_name = cur_name;\r
+    open_log_file();\r
+  }\r
+\r
+  if (term_offset + length(name) > max_print_line - 2)\r
+    print_ln();\r
+  else if ((term_offset > 0) || (file_offset > 0))\r
+    print_char(' ');\r
+\r
+  print_char('(');\r
+  incr(open_parens);\r
+\r
+  if (open_parens > max_open_parens)\r
+    max_open_parens = open_parens;\r
+\r
+  slow_print(name);\r
+  update_terminal();\r
+  state = new_line;\r
+\r
+  {\r
+    line = 1;\r
+\r
+    if (input_ln(cur_file, false))\r
+      do_nothing();\r
+\r
+    firm_up_the_line();\r
+\r
+    if (end_line_char_inactive())\r
+      decr(limit);\r
+    else\r
+      buffer[limit] = end_line_char;\r
+\r
+    first = limit + 1;\r
+    loc = start;\r
+  }\r
+}\r
+/* sec 0560 */\r
+internal_font_number read_font_info (pointer u, str_number nom, str_number aire, scaled s)\r
+{\r
+  font_index k;\r
+  boolean file_opened;\r
+  halfword lf, lh, nw, nh, nd, ni, nl, nk, ne, np;\r
+  int bc, ec;\r
+  internal_font_number f;\r
+  internal_font_number g;\r
+  eight_bits a, b, c, d;\r
+  four_quarters qw;\r
+  scaled sw;\r
+  integer bch_label;\r
+  short bchar;\r
+  scaled z;\r
+  integer alpha;\r
+  char beta;\r
+\r
+  g = 0;\r
+  file_opened = false;\r
+  pack_file_name(nom, aire, 805); /* .tfm */\r
+\r
+  if (!b_open_in(tfm_file))\r
+    goto bad_tfm;\r
+\r
+  file_opened = true;\r
+\r
+  {\r
+    read_sixteen(lf);\r
+    fget();\r
+    read_sixteen(lh);\r
+    fget();\r
+    read_sixteen(bc);\r
+    fget();\r
+    read_sixteen(ec);\r
+\r
+    if ((bc > ec + 1) || (ec > 255))\r
+      goto bad_tfm;\r
+\r
+    if (bc > 255)\r
+    {\r
+      bc = 1;\r
+      ec = 0;\r
+    }\r
+\r
+    fget();\r
+    read_sixteen(nw);\r
+    fget();\r
+    read_sixteen(nh);\r
+    fget();\r
+    read_sixteen(nd);\r
+    fget();\r
+    read_sixteen(ni);\r
+    fget();\r
+    read_sixteen(nl);\r
+    fget();\r
+    read_sixteen(nk);\r
+    fget();\r
+    read_sixteen(ne);\r
+    fget();\r
+    read_sixteen(np);\r
+\r
+    if (lf != 6 + lh + (ec - bc + 1) + nw + nh + nd + ni + nl + nk + ne + np)\r
+      goto bad_tfm;\r
+\r
+    if ((nw == 0) || (nh == 0) || (nd == 0) || (ni == 0))\r
+      goto bad_tfm;\r
+  }\r
+\r
+  lf = lf - 6 - lh;\r
+\r
+  if (np < 7)\r
+    lf = lf + 7 - np;\r
+\r
+#ifdef ALLOCATEFONT\r
+  if ((fmem_ptr + lf > current_font_mem_size))\r
+    font_info = realloc_font_info (increment_font_mem_size + lf);\r
+\r
+  if ((font_ptr == font_max) || (fmem_ptr + lf > current_font_mem_size))\r
+#else\r
+  if ((font_ptr == font_max) || (fmem_ptr + lf > font_mem_size))\r
+#endif\r
+  {\r
+    if (trace_flag)\r
+      printf("font_ptr %lld font_max %d fmem_ptr %lld lf %d font_mem_size %ld\n",\r
+          font_ptr, font_max, fmem_ptr, lf, font_mem_size);\r
+\r
+    start_font_error_message();\r
+    prints(" not loaded: Not enough room left");\r
+    help4("I'm afraid I won't be able to make use of this font,",\r
+        "because my memory for character-size data is too small.",\r
+        "If you're really stuck, ask a wizard to enlarge me.",\r
+        "Or maybe try `I\\font<same font id>=<name of loaded font>'.");\r
+    error();\r
+    goto done;\r
+  }\r
+\r
+  f = font_ptr + 1;\r
+  char_base[f] = fmem_ptr - bc;\r
+  width_base[f] = char_base[f] + ec + 1;\r
+  height_base[f] = width_base[f] + nw;\r
+  depth_base[f] = height_base[f] + nh;\r
+  italic_base[f] = depth_base[f] + nd;\r
+  lig_kern_base[f] = italic_base[f] + ni;\r
+  kern_base[f] = lig_kern_base[f] + nl - kern_base_offset;\r
+  exten_base[f] = kern_base[f] + kern_base_offset + nk;\r
+  param_base[f] = exten_base[f] + ne;\r
+\r
+  {\r
+    if (lh < 2)\r
+      goto bad_tfm;\r
+    \r
+    store_four_quarters(font_check[f]);\r
+    fget();\r
+    read_sixteen(z);\r
+    fget();\r
+    z = z * 256 + fbyte;\r
+    fget();\r
+    z = (z * 16) + (fbyte / 16);\r
+\r
+    if (z < unity)\r
+      goto bad_tfm; \r
+\r
+    while (lh > 2)\r
+    {\r
+      fget();\r
+      fget();\r
+      fget();\r
+      fget();\r
+      decr(lh);\r
+    }\r
+\r
+    font_dsize[f] = z;\r
+\r
+    if (s != -1000)\r
+      if (s >= 0)\r
+        z = s;\r
+      else\r
+        z = xn_over_d(z, - (integer) s, 1000);\r
+\r
+    font_size[f] = z;\r
+  }\r
+\r
+  for (k = fmem_ptr; k <= width_base[f] - 1; k++)\r
+  {\r
+    store_four_quarters(font_info[k].qqqq);\r
+\r
+    if ((a >= nw) || (b / 16 >= nh) || (b % 16 >= nd) || (c / 4 >= ni))\r
+      goto bad_tfm;\r
+\r
+    switch (c % 4)\r
+    {\r
+      case lig_tag:\r
+        if (d >= nl)\r
+          goto bad_tfm;\r
+        break;\r
+\r
+      case ext_tag:\r
+        if (d >= ne)\r
+          goto bad_tfm;\r
+        break;\r
+\r
+      case list_tag:\r
+        {\r
+          check_byte_range(d);\r
+\r
+          while (d < k + bc - fmem_ptr)\r
+          {\r
+            qw = char_info(f, d);\r
\r
+            if (char_tag(qw) != list_tag)\r
+              goto not_found;\r
+\r
+            d = rem_byte(qw);\r
+          }\r
+\r
+          if (d == k + bc - fmem_ptr)\r
+            goto bad_tfm;\r
+not_found:;\r
+        }\r
+        break;\r
+\r
+      default:\r
+        break;\r
+    }\r
+  }\r
+\r
+  {\r
+    {\r
+      alpha = 16;\r
+\r
+      while (z >= 8388608L)   /* 2^23 */\r
+      {\r
+        z = z / 2;\r
+        alpha = alpha + alpha;\r
+      }\r
+\r
+      beta = (char) (256 / alpha);\r
+      alpha = alpha * z;\r
+    }\r
+\r
+    for (k = width_base[f]; k <= lig_kern_base[f] - 1; k++)\r
+      store_scaled(font_info[k].cint);\r
+\r
+    if (font_info[width_base[f]].cint != 0)\r
+      goto bad_tfm;\r
+\r
+    if (font_info[height_base[f]].cint != 0)\r
+      goto bad_tfm;\r
+\r
+    if (font_info[depth_base[f]].cint != 0)\r
+      goto bad_tfm;\r
+\r
+    if (font_info[italic_base[f]].cint != 0)\r
+      goto bad_tfm;\r
+  }\r
+\r
+  bch_label = 32767;     /* '77777 */\r
+  bchar = 256;\r
+\r
+  if (nl > 0)\r
+  {\r
+    for (k = lig_kern_base[f]; k <= kern_base[f] + kern_base_offset - 1; k++)\r
+    {\r
+      store_four_quarters(font_info[k].qqqq);\r
+\r
+      if (a > 128)\r
+      {\r
+        if (256 * c + d >= nl)\r
+          goto bad_tfm;\r
+\r
+        if (a == 255)\r
+          if (k == lig_kern_base[f])\r
+            bchar = b;\r
+      }\r
+      else\r
+      {\r
+        if (b != bchar)\r
+          check_existence(b);\r
+\r
+        if (c < 128)\r
+          check_existence(d);\r
+        else if (256 * (c - 128) + d >= nk)\r
+          goto bad_tfm;\r
+\r
+        if (a < 128)\r
+          if (k - lig_kern_base[f] + a + 1 >= nl)\r
+            goto bad_tfm;\r
+      }\r
+    }\r
+\r
+    if (a == 255)\r
+      bch_label = 256 * c + d;\r
+  }\r
+\r
+  for (k = kern_base[f] + kern_base_offset; k <= exten_base[f] - 1; k++)\r
+    store_scaled(font_info[k].cint);\r
+\r
+  for (k = exten_base[f]; k <= param_base[f] - 1; k++)\r
+  {\r
+    store_four_quarters(font_info[k].qqqq);\r
+\r
+    if (a != 0)\r
+      check_existence(a);\r
+\r
+    if (b != 0)\r
+      check_existence(b);\r
+\r
+    if (c != 0)\r
+      check_existence(c);\r
+\r
+    check_existence(d);\r
+  }\r
+\r
+  {\r
+    for (k = 1; k <= np; k++)\r
+      if (k == 1)\r
+      {\r
+        fget();\r
+        sw = fbyte;\r
+\r
+        if (sw > 127)\r
+          sw = sw - 256;\r
+\r
+        fget();\r
+        sw = sw * 256 + fbyte;\r
+        fget();\r
+        sw = sw * 256 + fbyte;\r
+        fget();\r
+        font_info[param_base[f]].cint = (sw * 16) + (fbyte / 16);\r
+      }\r
+      else\r
+        store_scaled(font_info[param_base[f] + k - 1].cint);\r
+\r
+    if (feof(tfm_file))\r
+      goto bad_tfm;\r
+\r
+    for (k = np + 1; k <= 7; k++)\r
+      font_info[param_base[f] + k - 1].cint = 0;\r
+  }\r
+\r
+  if (np >= 7)\r
+    font_params[f] = np;\r
+  else\r
+    font_params[f] = 7;\r
+\r
+  hyphen_char[f] = default_hyphen_char;\r
+  skew_char[f] = default_skew_char;\r
+\r
+  if (bch_label < nl)\r
+    bchar_label[f] = bch_label + lig_kern_base[f];\r
+  else\r
+    bchar_label[f] = non_address;\r
+\r
+  font_bchar[f] = bchar;\r
+  font_false_bchar[f] = bchar;\r
+\r
+  if (bchar <= ec)\r
+    if (bchar >= bc)\r
+    {\r
+      qw = char_info(f, bchar);\r
+\r
+      if (char_exists(qw))\r
+        font_false_bchar[f] = 256;\r
+    }\r
+\r
+  font_name[f] = nom;\r
+  font_area[f] = aire;\r
+  font_bc[f] = bc;\r
+  font_ec[f] = ec;\r
+  font_glue[f] = 0;\r
+  adjust(char_base);\r
+  adjust(width_base);\r
+  adjust(lig_kern_base);\r
+  adjust(kern_base);\r
+  adjust(exten_base);\r
+  decr(param_base[f]);\r
+  fmem_ptr = fmem_ptr + lf;\r
+  font_ptr = f;\r
+  g = f;\r
+  goto done;\r
+\r
+bad_tfm:\r
+  start_font_error_message();\r
+\r
+  if (file_opened)\r
+    prints(" not loadable: Bad metric (TFM) file");\r
+  else\r
+    prints(" not loadable: Metric (TFM) file not found");\r
+\r
+  help5("I wasn't able to read the size data for this font,",\r
+      "so I will ignore the font specification.",\r
+      "[Wizards can fix TFM files using TFtoPL/PLtoTF.]",\r
+      "You might try inserting a different font spec;",\r
+      "e.g., type `I\\font<same font id>=<substitute font name>'.");\r
+  error();\r
+\r
+done:\r
+  if (file_opened)\r
+    b_close(tfm_file);\r
+\r
+  return g;\r
 }
\ No newline at end of file
index 9149cd6..e79d168 100644 (file)
-/* Copyright 2014 Clerk Ma
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301 USA.  */
-
-#define EXTERN extern
-
-#include "yandytex.h"
-
-/* sec 0581 */
-void char_warning_(internal_font_number f, eight_bits c)
-{ 
-  if (tracing_lost_chars > 0)
-  {
-    if (show_missing == 0)
-      begin_diagnostic();
-
-    if (show_missing)
-    {
-      print_nl("! ");
-      prints("Missing character: there is no ");
-    }
-    else
-      print_nl("Missing character: there is no ");
-
-    print(c);
-
-    if (show_numeric)
-    {
-      print_char(' ');
-      print_char('(');
-
-      if (c / 100 > 0)
-      {
-        print_char('0' + c / 100);
-        c = c - (c / 100) * 100;
-        print_char('0' + c / 10);
-      }
-      else
-      {
-        c = c - (c / 100) * 100;
-
-        if (c / 10 > 0)
-          print_char('0' + c / 10);
-      }
-
-      print_char('0' + c % 10);
-      print_char(')');
-    }
-
-    prints(" in font ");
-    slow_print(font_name[f]);
-    print_char('!');
-
-    if (show_missing)
-    {
-      if (f != null_font)
-        show_context();
-    }
-
-    if (show_missing == 0)
-      end_diagnostic(false);
-
-    missing_characters++;
-  }
-}
-/* sec 0582 */
-pointer new_character_(internal_font_number f, eight_bits c)
-{
-  pointer p;
-
-  if (font_bc[f] <= c)
-    if (font_ec[f] >= c)
-      if (char_exists(char_info(f, c)))
-      {
-        p = get_avail();
-        font(p) = f;
-        character(p) = c;
-        return p;
-      }
-
-  char_warning(f, c);
-  return 0;
-}
-/* sec 0598 */
-void dvi_swap (void)
-{ 
-  if (trace_flag)
-  {
-    wterm_cr();
-    printf("dvi_swap() %lld", dvi_gone);
-  }
-
-  if (dvi_limit == dvi_buf_size)
-  {
-    write_dvi(0, half_buf - 1);
-    dvi_limit = half_buf;
-    dvi_offset = dvi_offset + dvi_buf_size;
-    dvi_ptr = 0;
-  }
-  else
-  {
-    write_dvi(half_buf, dvi_buf_size - 1);
-    dvi_limit = dvi_buf_size;
-  }
-
-  dvi_gone = dvi_gone + half_buf;
-}
-/* sec 0600 */
-void dvi_four_(integer x)
-{ 
-  if (x >= 0)
-    dvi_out(x / 0100000000);
-  else
-  {
-    x = x + 010000000000;
-    x = x + 010000000000;
-    dvi_out((x / 0100000000) + 128);
-  }
-
-  x = x % 0100000000;
-  dvi_out(x / 0200000);
-  x = x % 0200000;
-  dvi_out(x / 0400);
-  dvi_out(x % 0400);
-}
-/* sec 0601 */
-void dvi_pop_(integer l)
-{
-  if ((l == dvi_offset + dvi_ptr) && (dvi_ptr > 0))
-    decr(dvi_ptr);
-  else
-    dvi_out(pop);
-}
-/* sec 0602 */
-void dvi_font_def (internal_font_number f)
-{
-  pool_pointer k;
-
-#ifdef INCREASEFONTS
-  if (f <= 256)
-  {
-    dvi_out(fnt_def1);
-    dvi_out(f - 1);
-  }
-  else
-  {
-    dvi_out(fnt_def2);
-    dvi_out(((f - 1) >> 8));
-    dvi_out(((f - 1) & 255));
-  }
-#else
-  dvi_out(fnt_def1);
-  dvi_out(f - 1);
-#endif
-
-  dvi_out(font_check[f].b0);
-  dvi_out(font_check[f].b1);
-  dvi_out(font_check[f].b2);
-  dvi_out(font_check[f].b3);
-  dvi_four(font_size[f]); 
-  dvi_four(font_dsize[f]);
-  dvi_out(length(font_area[f]));
-  dvi_out(length(font_name[f]));
-
-  for (k = str_start[font_area[f]]; k <= str_start[font_area[f] + 1] - 1; k++)
-    dvi_out(str_pool[k]);
-
-  for (k = str_start[font_name[f]]; k <= str_start[font_name[f] + 1] - 1; k++)
-    dvi_out(str_pool[k]);
-}
-/* sec 0607 */
-void movement (scaled w, eight_bits o)
-{
-  small_number mstate;
-  pointer p, q;
-  integer k;
-
-  q = get_node(movement_node_size);
-  width(q) = w;
-  location(q) = dvi_offset + dvi_ptr;
-
-  if (o == down1)
-  {
-    link(q) = down_ptr;
-    down_ptr = q;
-  }
-  else
-  {
-    link(q) = right_ptr;
-    right_ptr = q;
-  }
-
-  p = link(q);
-  mstate = none_seen;
-
-  while (p != 0)
-  {
-    if (width(p) == w)
-      switch (mstate + info(p))
-      {
-        case none_seen + yz_OK:
-        case none_seen + y_OK:
-        case z_seen + yz_OK:
-        case z_seen + y_OK:
-          if (location(p) < dvi_gone)
-            goto not_found;
-          else
-          {
-            k = location(p) - dvi_offset;
-
-            if (k < 0)
-              k = k + dvi_buf_size;
-
-            dvi_buf[k] = dvi_buf[k] + y1 - down1;
-            info(p) = y_here;
-            goto found;
-          }
-          break;
-
-        case none_seen + z_OK:
-        case y_seen + yz_OK:
-        case y_seen + z_OK:
-          if (location(p) < dvi_gone)
-            goto not_found;
-          else
-          {
-            k = location(p) - dvi_offset;
-
-            if (k < 0)
-              k = k + dvi_buf_size;
-
-            dvi_buf[k] = dvi_buf[k] + z1 - down1;
-            info(p) = z_here;
-            goto found;
-          }
-          break;
-
-        case none_seen + y_here:
-        case none_seen + z_here:
-        case y_seen + z_here:
-        case z_seen + y_here:
-          goto found;
-          break;
-
-        default:
-          break;
-      }
-    else
-      switch (mstate + info(p))
-      {
-        case none_seen + y_here:
-          mstate = y_seen;
-          break;
-
-        case none_seen + z_here:
-          mstate = z_seen;
-          break;
-
-        case y_seen + z_here:
-        case z_seen + y_here:
-          goto not_found;
-          break;
-
-        default:
-          break;
-      }
-
-    p = link(p);
-  }
-
-not_found:
-
-  info(q) = yz_OK;
-
-  if (abs(w) >= 8388608L) /* 2^23 */
-  {
-    dvi_out(o + 3);
-    dvi_four(w);
-    return;
-  }
-
-  if (abs(w) >= 32768L)
-  {
-    dvi_out(o + 2);
-
-    if (w < 0)
-      w = w + 16777216L;  /* 2^24 */
-    //dvi_out(w / 65536L);
-    dvi_out((w >> 16));
-    //w = w % 65536L;
-    w = w & 65535L;
-    goto lab2;
-  }
-
-  if (abs(w) >= 128)
-  {
-    dvi_out(o + 1);
-
-    if (w < 0)
-      w = w + 65536L;
-
-    goto lab2;
-  }
-
-  dvi_out(o);
-
-  if (w < 0)
-    w = w + 256;
-
-  goto lab1;
-
-lab2:
-  dvi_out(w / 256);
-
-lab1:
-  dvi_out(w % 256);
-  return;
-
-found:
-  info(q) = info(p);
-
-  if (info(q) == y_here)
-  {
-    dvi_out(o + y0 - down1);
-
-    while (link(q) != p)
-    {
-      q = link(q);
-
-      switch (info(q))
-      {
-        case yz_OK:
-          info(q) = z_OK;
-          break;
-
-        case y_OK:
-          info(q) = d_fixed;
-          break;
-
-        default:
-          break;
-      }
-    }
-  }
-  else
-  {
-    dvi_out(o + z0 - down1);
-
-    while (link(q) != p)
-    {
-      q = link(q);
-
-      switch (info(q))
-      {
-        case yz_OK:
-          info(q) = y_OK;
-          break;
-
-        case z_OK:
-          info(q) = d_fixed;
-          break;
-
-        default:
-          break;
-      }
-    }
-  }
-}
-/* sec 0615 */
-void prune_movements (integer l)
-{
-  pointer p;
-
-  while (down_ptr != 0)
-  {
-    if (location(down_ptr) < l)
-      goto done;
-
-    p = down_ptr;
-    down_ptr = link(p);
-    free_node(p, movement_node_size);
-  }
-
-done:
-  while (right_ptr != 0)
-  {
-    if (location(right_ptr) < l)
-      return;
-
-    p = right_ptr;
-    right_ptr = link(p);
-    free_node(p, movement_node_size);
-  }
-}
-/* sec 1368 */
-void special_out (pointer p)
-{
-  char old_setting;
-  pool_pointer k;
-
-  synch_h();
-  synch_v();
-  old_setting = selector;
-  selector = new_string;
-
-#ifdef ALLOCATESTRING
-  if (pool_ptr + 32000 > current_pool_size)
-    str_pool = realloc_str_pool (increment_pool_size);
-
-  show_token_list(link(write_tokens(p)), 0, 10000000L);
-#else
-  show_token_list(link(write_tokens(p)), 0, pool_size - pool_ptr);
-#endif
-
-  selector = old_setting;
-  str_room(1);
-  graphics_mode();
-  spc_exec_special(str_pool + str_start[str_ptr], cur_length, cur_h * 0.000015202, -cur_v * 0.000015202, 1.0);
-/*
-  if (cur_length < 256)
-  {
-    dvi_out(xxx1);
-    dvi_out(cur_length);
-  }
-  else
-  {Mag
-    dvi_out(xxx4);
-    dvi_four(cur_length); 
-  } 
-
-  for (k = str_start[str_ptr]; k <= pool_ptr - 1; k++)
-    dvi_out(str_pool[k]);
-*/
-  pool_ptr = str_start[str_ptr];
-}
-/* sec 1370 */
-void write_out (pointer p)
-{
-  char old_setting;
-  /* integer old_mode; */
-  int old_mode;
-  /* small_number j; */
-  int j;
-  pointer q, r;
-
-  q = get_avail();
-  info(q) = right_brace_token + '}';
-  r = get_avail();
-  link(q) = r;
-  info(r) = end_write_token;
-  ins_list(q);
-  begin_token_list(write_tokens(p), write_text);
-  q = get_avail();
-  info(q) = left_brace_token + '{';
-  ins_list(q);
-  old_mode = mode;
-  mode = 0;
-  cur_cs = write_loc;
-  q = scan_toks(false, true);
-  get_token();
-
-  if (cur_tok != end_write_token)
-  {
-    print_err("Unbalanced write command");
-    help2("On this page there's a \\write with fewer real {'s than }'s.",
-        "I can't handle that very well; good luck.");
-    error();
-
-    do
-      {
-        get_token();
-      }
-    while (!(cur_tok == end_write_token));
-  }
-
-  mode = old_mode;
-  end_token_list();
-  old_setting = selector;
-  j = write_stream(p);
-
-  if (write_open[j])
-    selector = j;
-  else
-  {
-    if ((j == 17) && (selector == term_and_log))
-      selector = log_only;
-
-    print_nl("");
-  }
-
-  token_show(def_ref);
-  print_ln();
-  flush_list(def_ref);
-  selector = old_setting;
-}
-/* sec 1373 */
-void out_what (pointer p)
-{
-  /* small_number j; */
-  int j;
-
-  switch (subtype(p))
-  {
-    case open_node:
-    case write_node:
-    case close_node:
-      if (!doing_leaders)
-      {
-        j = write_stream(p);
-
-        if (subtype(p) == write_node)
-          write_out(p);
-        else
-        {
-          if (write_open[j])
-            a_close(write_file[j]); 
-
-          if (subtype(p) == close_node)
-            write_open[j]= false;
-          else if (j < 16)
-          {
-            cur_name = open_name(p);
-            cur_area = open_area(p);
-            cur_ext = open_ext(p); 
-
-            if (cur_ext == 335) /* "" */
-              cur_ext = 785;    /* ".tex" */
-
-            pack_file_name(cur_name, cur_area, cur_ext);
-
-            while (!a_open_out(write_file[j]))
-              prompt_file_name("output file name", ".tex");
-
-            write_open[j] = true;
-          }
-        }
-      }
-      break;
-
-    case special_node:
-      special_out(p); 
-      break;
-
-    case language_node:
-      do_nothing();
-      break;
-
-    default:
-      {
-        confusion("ext4");
-        return;
-      }
-      break;
-  }
-}
-/* sec 0619 */
-void hlist_out (void)
-{
-  scaled base_line;
-  scaled left_edge;
-  scaled save_h, save_v;
-  pointer this_box;
-  /* glue_ord g_order; */
-  int g_order;
-  /* char g_sign; */
-  int g_sign;
-  pointer p;
-  integer save_loc;
-  pointer leader_box;
-  scaled leader_wd;
-  scaled lx;
-  boolean outer_doing_leaders;
-  scaled edge;
-  real glue_temp;
-  real cur_glue;
-  scaled cur_g;
-
-  cur_g = 0;
-  cur_glue = 0.0;
-  this_box = temp_ptr;
-  g_order = glue_order(this_box);
-  g_sign = glue_sign(this_box);
-  p = list_ptr(this_box);
-  incr(cur_s);
-
-  if (cur_s > 0)
-    dvi_out(push);
-
-  if (cur_s > max_push)
-    max_push = cur_s;
-
-  save_loc = dvi_offset + dvi_ptr;
-  base_line = cur_v;
-  left_edge = cur_h;
-
-  while (p != 0)
-reswitch:
-    if (is_char_node(p))
-    {
-      synch_h();
-      synch_v();
-
-      do
-        {
-          f = font(p);
-          c = character(p);
-
-          if (f != dvi_f)
-          {
-            if (!font_used[f])
-            {
-              dvi_font_def(f);
-              font_used[f] = true;
-            }
-
-            if (f <= 64 + font_base)
-              dvi_out(f - font_base - 1 + fnt_num_0);
-#ifdef INCREASEFONTS
-            else if (f <= 256)
-            {
-              dvi_out(fnt1);
-              dvi_out(f - 1);
-            }
-            else
-            {
-              dvi_out(fnt2);
-              dvi_out(((f - 1) >> 8));
-              dvi_out(((f - 1) & 255));
-            }
-#else
-            else
-            {
-              dvi_out(fnt1);
-              dvi_out(f - 1);
-            }
-#endif
-
-            dvi_f = f;
-          }
-
-          if (c >= 128)
-            dvi_out(set1);
-
-          dvi_out(c);
-          cur_h = cur_h + char_width(f, char_info(f, c));
-          p = link(p);
-        }
-      while (!(!is_char_node(p)));
-
-      dvi_h = cur_h;
-  }
-  else
-  {
-    switch (type(p))
-    {
-      case hlist_node:
-      case vlist_node:
-        if (list_ptr(p) == 0)
-          cur_h = cur_h + width(p);
-        else
-        {
-          save_h = dvi_h;
-          save_v = dvi_v;
-          cur_v = base_line + shift_amount(p);
-          temp_ptr = p;
-          edge = cur_h;
-
-          if (type(p) == vlist_node)
-            vlist_out();
-          else
-            hlist_out();
-
-          dvi_h = save_h;
-          dvi_v = save_v;
-          cur_h = edge + width(p);
-          cur_v = base_line;
-        }
-        break;
-
-      case rule_node:
-        {
-          rule_ht = height(p);
-          rule_dp = depth(p);
-          rule_wd = width(p);
-          goto fin_rule;
-        }
-        break;
-
-      case whatsit_node:
-        out_what(p);
-        break;
-
-      case glue_node:
-        {
-          g = glue_ptr(p);
-          rule_wd = width(g) - cur_g;
-
-          if (g_sign != normal)
-          {
-            if (g_sign == stretching)
-            {
-              if (stretch_order(g) == g_order)
-              {
-                cur_glue = cur_glue + stretch(g);
-                vet_glue(glue_set(this_box) * cur_glue);
-                cur_g = round(glue_temp);
-              }
-            }
-            else if (shrink_order(g) == g_order)
-            {
-              cur_glue = cur_glue - shrink(g);
-              vet_glue(glue_set(this_box) * cur_glue);
-              cur_g = round(glue_temp);
-            }
-          }
-
-          rule_wd = rule_wd + cur_g;
-
-          if (subtype(p) >= a_leaders)
-          {
-            leader_box = leader_ptr(p);
-
-            if (type(leader_box) == rule_node)
-            {
-              rule_ht = height(leader_box);
-              rule_dp = depth(leader_box);
-              goto fin_rule;
-            }
-
-            leader_wd = width(leader_box);
-
-            if ((leader_wd > 0) && (rule_wd > 0))
-            {
-              rule_wd = rule_wd + 10;
-              edge = cur_h + rule_wd;
-              lx = 0;
-
-              if (subtype(p) == a_leaders)
-              {
-                save_h = cur_h;
-                cur_h = left_edge + leader_wd * ((cur_h - left_edge) / leader_wd);
-
-                if (cur_h < save_h)
-                  cur_h = cur_h + leader_wd;
-              }
-              else
-              {
-                lq = rule_wd / leader_wd;
-                lr = rule_wd % leader_wd;
-
-                if (subtype(p) == c_leaders)
-                  cur_h = cur_h + (lr / 2);
-                else
-                {
-                  lx = (2 * lr + lq + 1) / (2 * lq + 2);
-                  cur_h = cur_h + ((lr - (lq - 1)* lx) / 2);
-                }
-              }
-
-              while (cur_h + leader_wd <= edge)
-              {
-                cur_v = base_line + shift_amount(leader_box);
-                synch_v();
-                save_v = dvi_v;
-                synch_h();
-                save_h = dvi_h;
-                temp_ptr = leader_box;
-                outer_doing_leaders = doing_leaders;
-                doing_leaders = true;
-
-                if (type(leader_box) == vlist_node)
-                  vlist_out();
-                else
-                  hlist_out();
-
-                doing_leaders = outer_doing_leaders;
-                dvi_v = save_v;
-                dvi_h = save_h;
-                cur_v = base_line;
-                cur_h = save_h + leader_wd + lx;
-              }
-
-              cur_h = edge - 10;
-              goto next_p;
-            }
-          }
-
-          goto move_past;
-        }
-        break;
-
-      case kern_node:
-      case math_node:
-        cur_h = cur_h + width(p);
-        break;
-
-      case ligature_node:
-        {
-          mem[lig_trick] = mem[lig_char(p)];
-          link(lig_trick) = link(p);
-          p = lig_trick;
-          goto reswitch;
-        }
-        break;
-
-      default:
-        break;
-    }
-
-    goto next_p;
-
-fin_rule:
-    if (is_running(rule_ht))
-      rule_ht = height(this_box);
-
-    if (is_running(rule_dp))
-      rule_dp = depth(this_box);
-
-    rule_ht = rule_ht + rule_dp;
-
-    if ((rule_ht > 0) && (rule_wd > 0))
-    {
-      synch_h();
-      cur_v = base_line + rule_dp;
-      synch_v();
-      dvi_out(set_rule);
-      dvi_four(rule_ht);
-      dvi_four(rule_wd);
-      cur_v = base_line;
-      dvi_h = dvi_h + rule_wd;
-    }
-
-move_past:
-    cur_h = cur_h + rule_wd;
-
-next_p:
-    p = link(p);
-  }
-
-  prune_movements(save_loc);
-
-  if (cur_s > 0)
-    dvi_pop(save_loc);
-
-  decr(cur_s);
-}
-/* sec 0629 */
-void vlist_out (void)
-{
-  scaled left_edge;
-  scaled top_edge;
-  scaled save_h, save_v;
-  pointer this_box;
-  /* glue_ord g_order; */
-  int g_order;
-  /* char g_sign; */
-  int g_sign;
-  pointer p;
-  integer save_loc;
-  pointer leader_box;
-  scaled leader_ht;
-  scaled lx;
-  boolean outer_doing_leaders;
-  scaled edge;
-  real glue_temp;
-  real cur_glue;
-  scaled cur_g;
-
-  cur_g = 0;
-  cur_glue = 0.0;
-  this_box = temp_ptr;
-  g_order = glue_order(this_box);
-  g_sign = glue_sign(this_box);
-  p = list_ptr(this_box);
-  incr(cur_s);
-
-  if (cur_s > 0)
-    dvi_out(push);
-
-  if (cur_s > max_push)
-    max_push = cur_s;
-
-  save_loc = dvi_offset + dvi_ptr;
-  left_edge = cur_h;
-  cur_v = cur_v - height(this_box);
-  top_edge = cur_v;
-
-  while (p != 0)
-  {
-    if (is_char_node(p))
-    {
-      confusion("vlistout");
-      return;
-    }
-    else
-    {
-      switch (type(p))
-      {
-        case hlist_node:
-        case vlist_node:
-          if (list_ptr(p) == 0)
-            cur_v = cur_v + height(p) + depth(p);
-          else
-          {
-            cur_v = cur_v + height(p);
-            synch_v();
-            save_h = dvi_h;
-            save_v = dvi_v;
-            cur_h = left_edge + shift_amount(p);
-            temp_ptr = p;
-
-            if (type(p) == vlist_node)
-              vlist_out();
-            else
-              hlist_out();
-
-            dvi_h = save_h;
-            dvi_v = save_v;
-            cur_v = save_v + depth(p);
-            cur_h = left_edge;
-          }
-          break;
-
-        case rule_node:
-          {
-            rule_ht = height(p);
-            rule_dp = depth(p);
-            rule_wd = width(p);
-            goto fin_rule;
-          }
-          break;
-
-        case whatsit_node:
-          out_what(p);
-          break;
-
-        case glue_node:
-          {
-            g = glue_ptr(p);
-            rule_ht = width(g) - cur_g;
-
-            if (g_sign != normal)
-            {
-              if (g_sign == stretching)
-              {
-                if (stretch_order(g) == g_order)
-                {
-                  cur_glue = cur_glue + stretch(g);
-                  vet_glue(glue_set(this_box) * cur_glue);
-                  cur_g = round(glue_temp);
-                }
-              }
-              else if (shrink_order(g) == g_order)   /* BUG FIX !!! */
-              {
-                cur_glue = cur_glue - shrink(g);
-                vet_glue(glue_set(this_box) * cur_glue);
-                cur_g = round(glue_temp);
-              }
-            }
-
-            rule_ht = rule_ht + cur_g;
-
-            if (subtype(p) >= a_leaders)
-            {
-              leader_box = leader_ptr(p);
-
-              if (type(leader_box) == rule_node)
-              {
-                rule_wd = width(leader_box);
-                rule_dp = 0;
-                goto fin_rule;
-              }
-
-              leader_ht = height(leader_box) + depth(leader_box);
-
-              if ((leader_ht > 0) && (rule_ht > 0))
-              {
-                rule_ht = rule_ht + 10;
-                edge = cur_v + rule_ht;
-                lx = 0;
-
-                if (subtype(p) == a_leaders)
-                {
-                  save_v = cur_v;
-                  cur_v = top_edge + leader_ht * ((cur_v - top_edge) / leader_ht);
-
-                  if (cur_v < save_v)
-                    cur_v = cur_v + leader_ht;
-                }
-                else
-                {
-                  lq = rule_ht / leader_ht;
-                  lr = rule_ht % leader_ht;
-
-                  if (subtype(p) == c_leaders)
-                    cur_v = cur_v + (lr / 2);
-                  else
-                  {
-                    lx = (2 * lr + lq + 1) / (2 * lq + 2);
-                    cur_v = cur_v + ((lr - (lq - 1) * lx) / 2);
-                  }
-                }
-
-                while (cur_v + leader_ht <= edge)
-                {
-                  cur_h = left_edge + shift_amount(leader_box);
-                  synch_h();
-                  save_h = dvi_h;
-                  cur_v = cur_v + height(leader_box);
-                  synch_v();
-                  save_v = dvi_v;
-                  temp_ptr = leader_box;
-                  outer_doing_leaders = doing_leaders;
-                  doing_leaders = true;
-
-                  if (type(leader_box) == vlist_node)
-                    vlist_out();
-                  else
-                    hlist_out();
-
-                  doing_leaders = outer_doing_leaders;
-                  dvi_v = save_v;
-                  dvi_h = save_h;
-                  cur_h = left_edge;
-                  cur_v = save_v - height(leader_box) + leader_ht + lx;
-                }
-
-                cur_v = edge - 10;
-                goto next_p;
-              }
-            }
-
-            goto move_past;
-          }
-          break;
-
-        case kern_node:
-          cur_v = cur_v + width(p);
-          break;
-
-        default:
-          break;
-      }
-
-      goto next_p;
-
-fin_rule:
-      if (is_running(rule_wd))
-        rule_wd = width(this_box);
-
-      rule_ht = rule_ht + rule_dp;
-      cur_v = cur_v + rule_ht;
-
-      if ((rule_ht > 0) && (rule_wd > 0))
-      {
-        synch_h();
-        synch_v();
-        dvi_out(put_rule);
-        dvi_four(rule_ht);
-        dvi_four(rule_wd);
-      }
-
-      goto next_p;
-
-move_past:
-      cur_v = cur_v + rule_ht;
-    }
-
-next_p:
-    p = link(p);
-  }
-
-  prune_movements(save_loc);
-
-  if (cur_s > 0)
-    dvi_pop(save_loc);
-
-  decr(cur_s);
-}
-/* sec 0638 */
-void dvi_ship_out_(pointer p)
-{
-  integer page_loc;
-  char j, k;
-  pool_pointer s;
-  char old_setting;
-
-  if (tracing_output > 0)
-  {
-    print_nl("");
-    print_ln();
-    prints("Completed box being shipped out");
-  }
-
-  if (term_offset > max_print_line - 9)
-    print_ln();
-  else if ((term_offset > 0) || (file_offset > 0))
-    print_char(' ');
-
-  print_char('[');
-  j = 9;
-
-  while ((count(j) == 0) && (j > 0))
-    decr(j);
-
-  for (k = 0; k <= j; k++)
-  {
-    print_int(count(k));
-
-    if (k < j)
-      print_char('.');
-  }
-  
-  update_terminal();
-
-  if (tracing_output > 0)
-  {
-    print_char(']');
-    begin_diagnostic();
-    show_box(p);
-    end_diagnostic(true);
-  }
-
-  if ((height(p) > max_dimen) || (depth(p) > max_dimen) ||
-      (height(p) + depth(p) + v_offset > max_dimen) ||
-      (width(p) + h_offset > max_dimen))
-  {
-    print_err("Huge page cannot be shipped out");
-    help2("The page just created is more than 18 feet tall or",
-        "more than 18 feet wide, so I suspect something went wrong.");
-    error();
-
-    if (tracing_output <= 0)
-    {
-      begin_diagnostic();
-      print_nl("The following box has been deleted:");
-      show_box(p);
-      end_diagnostic(true);
-    }
-
-    goto done;
-  }
-
-  if (height(p) + depth(p) + v_offset > max_v)
-    max_v = height(p) + depth(p) + v_offset;
-
-  if (width(p) + h_offset > max_h)
-    max_h = width(p) + h_offset;
-
-  dvi_h = 0;
-  dvi_v = 0;
-  cur_h = h_offset;
-  dvi_f = null_font;
-  ensure_dvi_open();
-
-  if (total_pages == 0)
-  {
-    dvi_out(pre);
-    dvi_out(id_byte);
-    dvi_four(25400000L);
-    dvi_four(473628672L);
-    prepare_mag();
-    dvi_four(mag);
-    old_setting = selector;
-    selector = new_string;
-    prints(" TeX output ");
-    print_int(year);
-    print_char('.');
-    print_two(month);
-    print_char('.');
-    print_two(day);
-    print_char(':');
-    print_two(tex_time / 60);
-    print_two(tex_time % 60);
-    selector = old_setting;
-    dvi_out(cur_length);
-
-    for (s = str_start[str_ptr]; s <= pool_ptr - 1; s++)
-      dvi_out(str_pool[s]);
-
-    pool_ptr = str_start[str_ptr];
-  }
-
-  page_loc = dvi_offset + dvi_ptr;
-  dvi_out(bop);
-
-  for (k = 0; k <= 9; k++)
-    dvi_four(count(k));
-
-  dvi_four(last_bop);
-  last_bop = page_loc;
-  cur_v = height(p) + v_offset;
-  temp_ptr = p;
-
-  if (type(p) == vlist_node)
-    vlist_out();
-  else
-    hlist_out();
-
-  dvi_out(eop);
-  incr(total_pages);
-  cur_s = -1;
-
-done:
-  if (tracing_output <= 0)
-    print_char(']');
-
-  dead_cycles = 0;
-  update_terminal();
-
-#ifdef STAT
-  if (tracing_stats > 1)
-  {
-    print_nl("Memory usage before: ");
-    print_int(var_used);
-    print_char('&');
-    print_int(dyn_used);
-    print_char(';');
-  }
-#endif
-
-  flush_node_list(p);
-
-#ifdef STAT
-  if (tracing_stats > 1)
-  {
-    prints(" after: ");
-    print_int(var_used);
-    print_char('&');
-    print_int(dyn_used);
-    prints("; still utouched: ");
-    print_int(hi_mem_min - lo_mem_max - 1);
-    print_ln();
-  }
-#endif
-}
-void ship_out (pointer p)
-{
-  //printf("init pdf devices.");
-  //dvi_ship_out_(p);
-  //printf("DPX test");
-  pdf_ship_out(p);
-  /*
-  switch (shipout_flag)
-  {
-    case out_dvi_flag:
-    case out_xdv_flag:
-      dvi_ship_out_(p);
-      break;
-    case out_pdf_flag:
-      //pdf_ship_out(p);
-      break;
-  }*/
-}
-/* sec 0645 */
-void scan_spec (group_code c, boolean three_codes)
-{
-  integer s;
-  char spec_code;
-
-  if (three_codes)
-    s = saved(0);
-
-  if (scan_keyword("to"))
-    spec_code = exactly;
-  else if (scan_keyword("spread"))
-    spec_code = additional;
-  else
-  {
-    spec_code = additional;
-    cur_val = 0;
-    goto found;
-  }
-
-  scan_dimen(false, false, false);
-
-found:
-  if (three_codes)
-  {
-    saved(0) = s;
-    incr(save_ptr);
-  }
-
-  saved(0) = spec_code;
-  saved(1) = cur_val;
-  save_ptr = save_ptr + 2;
-  new_save_level(c);
-  scan_left_brace();
-}
-/* sec 0649 */
-pointer hpack_(pointer p, scaled w, small_number m)
-{
-  pointer r;
-  pointer q;
-  scaled h, d, x;
-  scaled s;
-  pointer g;
-  /* glue_ord o; */
-  int o;
-  internal_font_number f;
-  four_quarters i;
-  eight_bits hd;
-
-  last_badness = 0;
-  r = get_node(box_node_size);
-  type(r) = hlist_node;
-  subtype(r) = 0;
-  shift_amount(r) = 0;
-  q = r + list_offset;
-  link(q) = p;
-  h = 0;
-  d = 0;
-  x = 0;
-  total_stretch[normal] = 0;
-  total_shrink[normal] = 0;
-  total_stretch[fil] = 0;
-  total_shrink[fil] = 0;
-  total_stretch[fill] = 0;
-  total_shrink[fill] = 0;
-  total_stretch[filll] = 0;
-  total_shrink[filll] = 0;
-
-  while (p != 0)
-  {
-reswitch:
-
-    while (is_char_node(p))
-    {
-      f = font(p);
-      i = char_info(f, character(p));
-      hd = height_depth(i);
-      x = x + char_width(f, i);
-      s = char_height(f, hd);
-
-      if (s > h)
-        h = s;
-
-      s = char_depth(f, hd);
-
-      if (s > d)
-        d = s;
-
-      p = link(p);
-    }
-
-    if (p != 0)
-    {
-      switch (type(p))
-      {
-        case hlist_node:
-        case vlist_node:
-        case rule_node:
-        case unset_node:
-          {
-            x = x + width(p);
-
-            if (type(p) >= rule_node)
-              s = 0;
-            else
-              s = shift_amount(p);
-
-            if (height(p) - s > h)
-              h = height(p) - s;
-
-            if (depth(p) + s > d)
-              d = depth(p) + s;
-          }
-          break;
-
-        case ins_node:
-        case mark_node:
-        case adjust_node:
-          if (adjust_tail != 0)
-          {
-            while (link(q) != p)
-              q = link(q);
-
-            if (type(p) == adjust_node)
-            {
-              link(adjust_tail) = adjust_ptr(p);
-
-              while (link(adjust_tail) != 0)
-                adjust_tail = link(adjust_tail);
-
-              p = link(p);
-              free_node(link(q), small_node_size);
-            }
-            else
-            {
-              link(adjust_tail) = p;
-              adjust_tail = p;
-              p = link(p);
-            }
-
-            link(q) = p;
-            p = q;
-          }
-          break;
-
-        case whatsit_node:
-          break;
-
-        case glue_node:
-          {
-            g = glue_ptr(p);
-            x = x + width(g);
-            o = stretch_order(g);
-            total_stretch[o] = total_stretch[o] + stretch(g);
-            o = shrink_order(g);
-            total_shrink[o] = total_shrink[o] + shrink(g);
-
-            if (subtype(p) >= a_leaders)
-            {
-              g = leader_ptr(p);
-
-              if (height(g) > h)
-                h = height(g);
-
-              if (depth(g) > d)
-                d = depth(g);
-            }
-          }
-          break;
-
-        case kern_node:
-        case math_node:
-          x = x + width(p);
-          break;
-
-        case ligature_node:
-          {
-            mem[lig_trick] = mem[lig_char(p)];
-            link(lig_trick) = link(p);
-            p = lig_trick;
-            goto reswitch;
-          }
-          break;
-
-        default:
-          break;
-      }
-      p = link(p);
-    }
-  }
-
-  if (adjust_tail != 0)
-    link(adjust_tail) = 0;
-
-  height(r) = h;
-  depth(r) = d;
-
-  if (m == additional)
-    w = x + w;
-
-  width(r) = w;
-  x = w - x;
-
-  if (x == 0)
-  {
-    glue_sign(r) = normal;
-    glue_order(r) = normal;
-    glue_set(r) = 0.0;
-    goto exit;
-  }
-  else if (x > 0)
-  {
-    if (total_stretch[filll] != 0)
-      o = filll;
-    else if (total_stretch[fill] != 0)
-      o = fill;
-    else if (total_stretch[fil] != 0)
-      o = fil;
-    else
-      o = normal;
-
-    glue_order(r) = o;
-    glue_sign(r) = stretching;
-
-    if (total_stretch[o] != 0)
-      glue_set(r) = x / ((double) total_stretch[o]);
-    else
-    {
-      glue_sign(r) = normal;
-      glue_set(r) = 0.0;
-    }
-
-    if (o == normal)
-      if (list_ptr(r) != 0)
-      {
-        last_badness = badness(x, total_stretch[normal]);
-
-        if (last_badness > hbadness)
-        {
-          print_ln();
-
-          if (last_badness > 100)
-            print_nl("Underfull");
-          else
-            print_nl("Loose");
-
-          prints(" \\hbox (badness ");
-          print_int(last_badness);
-
-          if (last_badness > 100)
-            underfull_hbox++;
-
-          goto common_ending;
-        }
-      }
-
-    goto exit;
-  }
-  else
-  {
-    if (total_shrink[filll] != 0)
-      o = filll;
-    else if (total_shrink[fill] != 0)
-      o = fill;
-    else if (total_shrink[fil] != 0)
-      o = fil;
-    else
-      o = normal;
-
-    glue_order(r) = o;
-    glue_sign(r) = shrinking;
-
-    if (total_shrink[o] != 0)
-      glue_set(r) = ((- (integer) x) / ((double) total_shrink[o]));
-    else
-    {
-      glue_sign(r) = normal;
-      glue_set(r) = 0.0;
-    }
-
-    if ((total_shrink[o] < - (integer) x) && (o == 0) && (list_ptr(r) != 0))
-    {
-      last_badness = 1000000L;
-      glue_set(r) = 1.0;
-
-      if ((- (integer) x - total_shrink[normal] > hfuzz) || (hbadness < 100))
-      {
-        if ((overfull_rule > 0) && (- (integer) x - total_shrink[0] > hfuzz))
-        {
-          while (link(q) != 0)
-            q = link(q);
-          
-          link(q) = new_rule();
-          width(link(q)) = overfull_rule;
-        }
-        
-        print_ln();
-        print_nl("Overfull \\hbox (");
-        print_scaled(- (integer) x - total_shrink[normal]);
-        prints("pt too wide");
-        
-        overfull_hbox++;
-        goto common_ending;
-      }
-    }
-    else if (o == normal)
-      if (list_ptr(r) != 0)
-      {
-        last_badness = badness(- (integer) x, total_shrink[normal]);
-
-        if (last_badness > hbadness)
-        {
-          print_ln();
-          print_nl("Tight \\hbox (badness ");
-          print_int(last_badness);
-          goto common_ending;
-        }
-      }
-
-    goto exit;
-  }
-
-common_ending:
-
-  if (output_active)
-    prints(") has occurred while \\output is active");
-  else
-  {
-    if (pack_begin_line != 0)
-    {
-      if (pack_begin_line > 0)
-        prints(") in paragraph at lines ");
-      else
-        prints(") in alignment at lines ");
-
-      print_int(abs(pack_begin_line));
-      prints("--");
-    }
-    else
-      prints(") detected at line ");
-
-    print_int(line);
-  }
-
-  print_ln();
-  font_in_short_display = null_font;
-  short_display(list_ptr(r));
-  print_ln();
-  begin_diagnostic();
-  show_box(r);
-  end_diagnostic(true);
-
-exit:
-  return r;
-}
-/* sec 0668 */
-pointer vpackage_(pointer p, scaled h, small_number m, scaled l)
-{
-  pointer r;
-  scaled w, d, x;
-  scaled s;
-  pointer g;
-  /* glue_ord o; */
-  int o;
-
-  last_badness = 0;
-  r = get_node(box_node_size);
-  type(r) = vlist_node;
-  subtype(r) = min_quarterword;
-  shift_amount(r) = 0;
-  list_ptr(r) = p;
-  w = 0;
-  d = 0;
-  x = 0;
-  total_stretch[normal] = 0;
-  total_shrink[normal] = 0;
-  total_stretch[fil] = 0;
-  total_shrink[fil] = 0;
-  total_stretch[fill] = 0;
-  total_shrink[fill] = 0;
-  total_stretch[filll] = 0;
-  total_shrink[filll] = 0;
-
-  while (p != 0)
-  {
-    if (is_char_node(p))
-    {
-      confusion("vpack");
-      return 0;
-    }
-    else switch (type(p))
-    {
-      case hlist_node:
-      case vlist_node:
-      case rule_node:
-      case unset_node:
-        {
-          x = x + d + height(p);
-          d = depth(p);
-
-          if (type(p) >= rule_node)
-            s = 0;
-          else
-            s = shift_amount(p);
-
-          if (width(p) + s > w)
-            w = width(p) + s;
-        }
-        break;
-
-      case whatsit_node:
-        break;
-
-      case glue_node:
-        {
-          x = x + d;
-          d = 0;
-          g = glue_ptr(p);
-          x = x + width(g);
-          o = stretch_order(g);
-          total_stretch[o] = total_stretch[o] + stretch(g);
-          o = shrink_order(g);
-          total_shrink[o] = total_shrink[o] + shrink(g);
-
-          if (subtype(p) >= a_leaders)
-          {
-            g = leader_ptr(p);
-
-            if (width(g) > w)
-              w = width(g);
-          }
-        }
-        break;
-
-      case kern_node:
-        {
-          x = x + d + width(p);
-          d = 0;
-        }
-        break;
-
-      default:
-        break;
-    }
-
-    p = link(p);
-  }
-
-  width(r) = w;
-
-  if (d > l)
-  {
-    x = x + d - l;
-    depth(r) = l;
-  }
-  else
-    depth(r) = d;
-
-  if (m == additional)
-    h = x + h;
-
-  height(r) = h;
-  x = h - x;
-
-  if (x == 0)
-  {
-    glue_sign(r) = normal;
-    glue_order(r) = normal;
-    glue_set(r) = 0.0;
-    goto exit;
-  }
-  else if (x > 0)
-  {
-    if (total_stretch[filll] != 0)
-      o = filll;
-    else if (total_stretch[fill] != 0)
-      o = fill;
-    else if (total_stretch[fil] != 0)
-      o = fil;
-    else
-      o = normal;
-
-    glue_order(r) = o;
-    glue_sign(r) = stretching;
-
-    if (total_stretch[o] != 0)
-      glue_set(r) = x / ((double) total_stretch[o]);
-    else
-    {
-      glue_sign(r) = normal;
-      glue_set(r) = 0.0;
-    }
-
-    if (o == normal)
-      if (list_ptr(r) != 0)
-      {
-        last_badness = badness(x, total_stretch[normal]);
-
-        if (last_badness > vbadness)
-        {
-          print_ln();
-
-          if (last_badness > 100)
-            print_nl("Underfull");
-          else
-            print_nl("Loose");
-
-          prints(" \\vbox (badness ");
-          print_int(last_badness);
-
-          if (last_badness > 100)
-            underfull_vbox++;
-
-          goto common_ending;
-        }
-      }
-
-    goto exit;
-  }
-  else
-  {
-    if (total_shrink[filll] != 0)
-      o = filll;
-    else if (total_shrink[fill] != 0)
-      o = fill;
-    else if (total_shrink[fil] != 0)
-      o = fil;
-    else
-      o = normal;
-
-    glue_order(r) = o;
-    glue_sign(r) = shrinking;
-
-    if (total_shrink[o] != 0)
-      glue_set(r) = (- (integer) x) / ((double) total_shrink[o]);
-    else
-    {
-      glue_sign(r) = normal;
-      glue_set(r) = 0.0;
-    }
-
-    if ((total_shrink[o] < - (integer) x) && (o == 0) && (list_ptr(r) != 0))
-    {
-      last_badness = 1000000L;
-      glue_set(r) = 1.0;
-
-      if ((- (integer) x - total_shrink[0] > vfuzz) || (vbadness < 100))
-      {
-        print_ln();
-        print_nl("Overfull \\vbox (");
-        print_scaled(- (integer) x - total_shrink[0]);
-        prints("pt too high");
-
-        overfull_vbox++;
-
-        goto common_ending;
-      }
-    }
-    else if (o == 0)
-      if (list_ptr(r) != 0)
-      {
-        last_badness = badness(- (integer) x, total_shrink[normal]);
-        if (last_badness > vbadness)
-        {
-          print_ln();
-          print_nl("Tight \\vbox (badness ");
-          print_int(last_badness);
-          goto common_ending;
-        }
-      }
-
-    goto exit;
-  }
-
-common_ending:
-
-  if (output_active)
-    prints(") has occurred while \\output is active");
-  else
-  {
-    if (pack_begin_line != 0)
-    {
-      prints(") in alignment at lines ");
-      print_int(abs(pack_begin_line));
-      prints("--");
-    }
-    else
-      prints(") detected at line ");
-
-    print_int(line);
-    print_ln();
-  }
-
-  begin_diagnostic();
-  show_box(r);
-  end_diagnostic(true);
-
-exit:
-  return r;
-}
-/* sec 0679 */
-void append_to_vlist (pointer b)
-{
-  scaled d;
-  pointer p;
-
-  if (prev_depth > ignore_depth)
-  {
-    d = width(baseline_skip) - prev_depth - height(b);
-
-    if (d < line_skip_limit)
-      p = new_param_glue(line_skip_code);
-    else
-    {
-      p = new_skip_param(baseline_skip_code);
-      width(temp_ptr) = d;
-    }
-
-    link(tail) = p;
-    tail = p;
-  }
-
-  link(tail) = b;
-  tail = b;
-  prev_depth = depth(b);
-}
-/* sec 0686 */
-pointer new_noad (void)
-{
-  pointer p;
-
-  p = get_node(noad_size);
-  type(p) = ord_noad;
-  subtype(p) = normal;
-  mem[nucleus(p)].hh = empty_field;
-  mem[subscr(p)].hh = empty_field;
-  mem[supscr(p)].hh = empty_field;
-
-  return p;
-}
-/* sec 0688 */
-pointer new_style (small_number s)
-{
-  pointer p;
-
-  p = get_node(style_node_size);
-  type(p) = style_node;
-  subtype(p) = s;
-  width(p) = 0;
-  depth(p) = 0;
-
-  return p;
-}
-/* sec 0689 */
-pointer new_choice (void)
-{
-  pointer p;
-
-  p = get_node(style_node_size);
-  type(p) = choice_node;
-  subtype(p) = 0;
-  display_mlist(p) = 0;
-  text_mlist(p) = 0;
-  script_mlist(p) = 0;
-  script_script_mlist(p) = 0;
-
-  return p;
-}
-/* sec 0693 */
-void show_info (void)
-{
-  show_node_list(info(temp_ptr));
-}
-/* sec 0704 */
-pointer fraction_rule (scaled t)
-{
-  pointer p;
-
-  p = new_rule();
-  height(p) = t;
-  depth(p) = 0;
-
-  return p;
-}
-/* sec 0705 */
-pointer overbar (pointer b, scaled k, scaled t)
-{
-  pointer p, q;
-
-  p = new_kern(k);
-  link(p) = b;
-  q = fraction_rule(t);
-  link(q) = p;
-  p = new_kern(t);
-  link(p) = q;
-
-  return vpackage(p, 0, 1, max_dimen);
-}
-/* sec 0709 */
-pointer char_box (internal_font_number f, quarterword c)
-{
-  four_quarters q;
-  eight_bits hd;
-  pointer b, p;
-
-  q = char_info(f, c);
-  hd = height_depth(q);
-  b = new_null_box();
-  width(b) = char_width(f, q) + char_italic(f, q);
-  height(b) = char_height(f, hd);
-  depth(b) = char_depth(f, hd);
-  p = get_avail();
-  character(p) = c;
-  font(p) = f;
-  list_ptr(b) = p;
-
-  return b;
-}
-/* sec 0711 */
-void stack_into_box (pointer b, internal_font_number f, quarterword c)
-{
-  pointer p;
-
-  p = char_box(f, c);
-  link(p) = list_ptr(b);
-  list_ptr(b) = p;
-  height(b) = height(p);
-}
-/* sec 0712 */
-scaled height_plus_depth (internal_font_number f, quarterword c)
-{
-  four_quarters q;
-  eight_bits hd;
-
-  q = char_info(f, c);
-  hd = height_depth(q);
-
-  return char_height(f, hd) + char_depth(f, hd);
-}
-/* sec 0706 */
-pointer var_delimiter (pointer d, small_number s, scaled v)
-{
-  pointer b;
-  internal_font_number f, g;
-  quarterword c, x, y;
-  integer m, n;
-  scaled u;
-  scaled w;
-  four_quarters q;
-  four_quarters r;
-  eight_bits hd;
-  /* small_number z; */
-  int z;
-  boolean large_attempt;
-
-  f = null_font;
-  w = 0;
-  large_attempt = false;
-  z = small_fam(d);
-  x = small_char(d);
-
-  while (true)
-  {
-    if ((z != 0) || (x != 0))
-    {
-      z = z + s + 16;
-
-      do
-        {
-          z = z - 16;
-          g = fam_fnt(z);
-
-          if (g != null_font)
-          {
-            y = x;
-
-            if ((y >= font_bc[g]) && (y <= font_ec[g]))
-            {
-continu:
-              q = char_info(g, y);
-              
-              if (char_exists(q))
-              {
-                if (char_tag(q) == ext_tag)
-                {
-                  f = g;
-                  c = y;
-                  goto found;
-                }
-
-                hd = height_depth(q);
-                u = char_height(g, hd) + char_depth(g, hd);
-
-                if (u > w)
-                {
-                  f = g;
-                  c = y;
-                  w = u;
-
-                  if (u >= v)
-                    goto found;
-                }
-
-                if (char_tag(q) == list_tag)
-                {
-                  y = rem_byte(q);
-                  goto continu;
-                }
-              }
-            }
-          }
-        }
-      while (!(z < 16));
-    }
-
-    if (large_attempt)
-      goto found;
-
-    large_attempt = true;
-    z = large_fam(d);
-    x = large_char(d);
-  }
-
-found:
-  if (f != null_font)
-    if (char_tag(q) == ext_tag)
-    {
-      b = new_null_box();
-      type(b) = vlist_node;
-      r = font_info[exten_base[f] + rem_byte(q)].qqqq;
-      c = ext_rep(r);
-      u = height_plus_depth(f, c);
-      w = 0;
-      q = char_info(f, c);
-      width(b) = char_width(f, q) + char_italic(f, q);
-      c = ext_bot(r);
-
-      if (c != min_quarterword)
-        w = w + height_plus_depth(f, c);
-
-      c = ext_mid(r);
-
-      if (c != min_quarterword)
-        w = w + height_plus_depth(f, c);
-
-      c = ext_top(r);
-
-      if (c != min_quarterword)
-        w = w + height_plus_depth(f, c);
-
-      n = 0;
-
-      if (u > 0)
-        while (w < v)
-        {
-          w = w + u;
-          incr(n);
-
-          if (ext_mid(r) != min_quarterword)
-            w = w + u;
-        }
-
-      c = ext_bot(r);
-
-      if (c != min_quarterword)
-        stack_into_box(b, f, c);
-
-      c = ext_rep(r);
-
-      for (m = 1; m <= n; m++)
-        stack_into_box(b, f, c);
-
-      c = ext_mid(r);
-
-      if (c != min_quarterword)
-      {
-        stack_into_box(b, f, c);
-        c = ext_rep(r);
-
-        for (m = 1; m <= n; m++)
-          stack_into_box(b, f, c);
-      }
-
-      c = ext_top(r);
-
-      if (c != 0)
-        stack_into_box(b, f, c);
-      
-      depth(b) = w - height(b);
-    }
-    else
-      b = char_box(f, c);
-  else
-  {
-    b = new_null_box();
-    width(b) = null_delimiter_space;
-  }
-
-  shift_amount(b) = half(height(b) - depth(b)) - axis_height(s);
-
-  return b;
-}
+/* Copyright 2014 Clerk Ma\r
+\r
+   This program is free software; you can redistribute it and/or modify\r
+   it under the terms of the GNU General Public License as published by\r
+   the Free Software Foundation; either version 2 of the License, or\r
+   (at your option) any later version.\r
+\r
+   This program is distributed in the hope that it will be useful, but\r
+   WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+   General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with this program; if not, write to the Free Software\r
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA\r
+   02110-1301 USA.  */\r
+\r
+#define EXTERN extern\r
+\r
+#include "yandytex.h"\r
+\r
+/* sec 0581 */\r
+void char_warning_(internal_font_number f, eight_bits c)\r
+{ \r
+  if (tracing_lost_chars > 0)\r
+  {\r
+    if (show_missing == 0)\r
+      begin_diagnostic();\r
+\r
+    if (show_missing)\r
+    {\r
+      print_nl("! ");\r
+      prints("Missing character: there is no ");\r
+    }\r
+    else\r
+      print_nl("Missing character: there is no ");\r
+\r
+    print(c);\r
+\r
+    if (show_numeric)\r
+    {\r
+      print_char(' ');\r
+      print_char('(');\r
+\r
+      if (c / 100 > 0)\r
+      {\r
+        print_char('0' + c / 100);\r
+        c = c - (c / 100) * 100;\r
+        print_char('0' + c / 10);\r
+      }\r
+      else\r
+      {\r
+        c = c - (c / 100) * 100;\r
+\r
+        if (c / 10 > 0)\r
+          print_char('0' + c / 10);\r
+      }\r
+\r
+      print_char('0' + c % 10);\r
+      print_char(')');\r
+    }\r
+\r
+    prints(" in font ");\r
+    slow_print(font_name[f]);\r
+    print_char('!');\r
+\r
+    if (show_missing)\r
+    {\r
+      if (f != null_font)\r
+        show_context();\r
+    }\r
+\r
+    if (show_missing == 0)\r
+      end_diagnostic(false);\r
+\r
+    missing_characters++;\r
+  }\r
+}\r
+/* sec 0582 */\r
+pointer new_character_(internal_font_number f, eight_bits c)\r
+{\r
+  pointer p;\r
+\r
+  if (font_bc[f] <= c)\r
+    if (font_ec[f] >= c)\r
+      if (char_exists(char_info(f, c)))\r
+      {\r
+        p = get_avail();\r
+        font(p) = f;\r
+        character(p) = c;\r
+        return p;\r
+      }\r
+\r
+  char_warning(f, c);\r
+  return 0;\r
+}\r
+/* sec 0598 */\r
+void dvi_swap (void)\r
+{ \r
+  if (trace_flag)\r
+  {\r
+    wterm_cr();\r
+    printf("dvi_swap() %lld", dvi_gone);\r
+  }\r
+\r
+  if (dvi_limit == dvi_buf_size)\r
+  {\r
+    write_dvi(0, half_buf - 1);\r
+    dvi_limit = half_buf;\r
+    dvi_offset = dvi_offset + dvi_buf_size;\r
+    dvi_ptr = 0;\r
+  }\r
+  else\r
+  {\r
+    write_dvi(half_buf, dvi_buf_size - 1);\r
+    dvi_limit = dvi_buf_size;\r
+  }\r
+\r
+  dvi_gone = dvi_gone + half_buf;\r
+}\r
+/* sec 0600 */\r
+void dvi_four_(integer x)\r
+{ \r
+  if (x >= 0)\r
+    dvi_out(x / 0100000000);\r
+  else\r
+  {\r
+    x = x + 010000000000;\r
+    x = x + 010000000000;\r
+    dvi_out((x / 0100000000) + 128);\r
+  }\r
+\r
+  x = x % 0100000000;\r
+  dvi_out(x / 0200000);\r
+  x = x % 0200000;\r
+  dvi_out(x / 0400);\r
+  dvi_out(x % 0400);\r
+}\r
+/* sec 0601 */\r
+void dvi_pop_(integer l)\r
+{\r
+  if ((l == dvi_offset + dvi_ptr) && (dvi_ptr > 0))\r
+    decr(dvi_ptr);\r
+  else\r
+    dvi_out(pop);\r
+}\r
+/* sec 0602 */\r
+void dvi_font_def (internal_font_number f)\r
+{\r
+  pool_pointer k;\r
+\r
+#ifdef INCREASEFONTS\r
+  if (f <= 256)\r
+  {\r
+    dvi_out(fnt_def1);\r
+    dvi_out(f - 1);\r
+  }\r
+  else\r
+  {\r
+    dvi_out(fnt_def2);\r
+    dvi_out(((f - 1) >> 8));\r
+    dvi_out(((f - 1) & 255));\r
+  }\r
+#else\r
+  dvi_out(fnt_def1);\r
+  dvi_out(f - 1);\r
+#endif\r
+\r
+  dvi_out(font_check[f].b0);\r
+  dvi_out(font_check[f].b1);\r
+  dvi_out(font_check[f].b2);\r
+  dvi_out(font_check[f].b3);\r
+  dvi_four(font_size[f]); \r
+  dvi_four(font_dsize[f]);\r
+  dvi_out(length(font_area[f]));\r
+  dvi_out(length(font_name[f]));\r
+\r
+  for (k = str_start[font_area[f]]; k <= str_start[font_area[f] + 1] - 1; k++)\r
+    dvi_out(str_pool[k]);\r
+\r
+  for (k = str_start[font_name[f]]; k <= str_start[font_name[f] + 1] - 1; k++)\r
+    dvi_out(str_pool[k]);\r
+}\r
+/* sec 0607 */\r
+void movement (scaled w, eight_bits o)\r
+{\r
+  small_number mstate;\r
+  pointer p, q;\r
+  integer k;\r
+\r
+  q = get_node(movement_node_size);\r
+  width(q) = w;\r
+  location(q) = dvi_offset + dvi_ptr;\r
+\r
+  if (o == down1)\r
+  {\r
+    link(q) = down_ptr;\r
+    down_ptr = q;\r
+  }\r
+  else\r
+  {\r
+    link(q) = right_ptr;\r
+    right_ptr = q;\r
+  }\r
+\r
+  p = link(q);\r
+  mstate = none_seen;\r
+\r
+  while (p != 0)\r
+  {\r
+    if (width(p) == w)\r
+      switch (mstate + info(p))\r
+      {\r
+        case none_seen + yz_OK:\r
+        case none_seen + y_OK:\r
+        case z_seen + yz_OK:\r
+        case z_seen + y_OK:\r
+          if (location(p) < dvi_gone)\r
+            goto not_found;\r
+          else\r
+          {\r
+            k = location(p) - dvi_offset;\r
+\r
+            if (k < 0)\r
+              k = k + dvi_buf_size;\r
+\r
+            dvi_buf[k] = dvi_buf[k] + y1 - down1;\r
+            info(p) = y_here;\r
+            goto found;\r
+          }\r
+          break;\r
+\r
+        case none_seen + z_OK:\r
+        case y_seen + yz_OK:\r
+        case y_seen + z_OK:\r
+          if (location(p) < dvi_gone)\r
+            goto not_found;\r
+          else\r
+          {\r
+            k = location(p) - dvi_offset;\r
+\r
+            if (k < 0)\r
+              k = k + dvi_buf_size;\r
+\r
+            dvi_buf[k] = dvi_buf[k] + z1 - down1;\r
+            info(p) = z_here;\r
+            goto found;\r
+          }\r
+          break;\r
+\r
+        case none_seen + y_here:\r
+        case none_seen + z_here:\r
+        case y_seen + z_here:\r
+        case z_seen + y_here:\r
+          goto found;\r
+          break;\r
+\r
+        default:\r
+          break;\r
+      }\r
+    else\r
+      switch (mstate + info(p))\r
+      {\r
+        case none_seen + y_here:\r
+          mstate = y_seen;\r
+          break;\r
+\r
+        case none_seen + z_here:\r
+          mstate = z_seen;\r
+          break;\r
+\r
+        case y_seen + z_here:\r
+        case z_seen + y_here:\r
+          goto not_found;\r
+          break;\r
+\r
+        default:\r
+          break;\r
+      }\r
+\r
+    p = link(p);\r
+  }\r
+\r
+not_found:\r
+\r
+  info(q) = yz_OK;\r
+\r
+  if (abs(w) >= 8388608L) /* 2^23 */\r
+  {\r
+    dvi_out(o + 3);\r
+    dvi_four(w);\r
+    return;\r
+  }\r
+\r
+  if (abs(w) >= 32768L)\r
+  {\r
+    dvi_out(o + 2);\r
+\r
+    if (w < 0)\r
+      w = w + 16777216L;  /* 2^24 */\r
+    //dvi_out(w / 65536L);\r
+    dvi_out((w >> 16));\r
+    //w = w % 65536L;\r
+    w = w & 65535L;\r
+    goto lab2;\r
+  }\r
+\r
+  if (abs(w) >= 128)\r
+  {\r
+    dvi_out(o + 1);\r
+\r
+    if (w < 0)\r
+      w = w + 65536L;\r
+\r
+    goto lab2;\r
+  }\r
+\r
+  dvi_out(o);\r
+\r
+  if (w < 0)\r
+    w = w + 256;\r
+\r
+  goto lab1;\r
+\r
+lab2:\r
+  dvi_out(w / 256);\r
+\r
+lab1:\r
+  dvi_out(w % 256);\r
+  return;\r
+\r
+found:\r
+  info(q) = info(p);\r
+\r
+  if (info(q) == y_here)\r
+  {\r
+    dvi_out(o + y0 - down1);\r
+\r
+    while (link(q) != p)\r
+    {\r
+      q = link(q);\r
+\r
+      switch (info(q))\r
+      {\r
+        case yz_OK:\r
+          info(q) = z_OK;\r
+          break;\r
+\r
+        case y_OK:\r
+          info(q) = d_fixed;\r
+          break;\r
+\r
+        default:\r
+          break;\r
+      }\r
+    }\r
+  }\r
+  else\r
+  {\r
+    dvi_out(o + z0 - down1);\r
+\r
+    while (link(q) != p)\r
+    {\r
+      q = link(q);\r
+\r
+      switch (info(q))\r
+      {\r
+        case yz_OK:\r
+          info(q) = y_OK;\r
+          break;\r
+\r
+        case z_OK:\r
+          info(q) = d_fixed;\r
+          break;\r
+\r
+        default:\r
+          break;\r
+      }\r
+    }\r
+  }\r
+}\r
+/* sec 0615 */\r
+void prune_movements (integer l)\r
+{\r
+  pointer p;\r
+\r
+  while (down_ptr != 0)\r
+  {\r
+    if (location(down_ptr) < l)\r
+      goto done;\r
+\r
+    p = down_ptr;\r
+    down_ptr = link(p);\r
+    free_node(p, movement_node_size);\r
+  }\r
+\r
+done:\r
+  while (right_ptr != 0)\r
+  {\r
+    if (location(right_ptr) < l)\r
+      return;\r
+\r
+    p = right_ptr;\r
+    right_ptr = link(p);\r
+    free_node(p, movement_node_size);\r
+  }\r
+}\r
+/* sec 1368 */\r
+void special_out (pointer p)\r
+{\r
+  char old_setting;\r
+  pool_pointer k;\r
+\r
+  synch_h();\r
+  synch_v();\r
+  old_setting = selector;\r
+  selector = new_string;\r
+\r
+#ifdef ALLOCATESTRING\r
+  if (pool_ptr + 32000 > current_pool_size)\r
+    str_pool = realloc_str_pool (increment_pool_size);\r
+\r
+  show_token_list(link(write_tokens(p)), 0, 10000000L);\r
+#else\r
+  show_token_list(link(write_tokens(p)), 0, pool_size - pool_ptr);\r
+#endif\r
+\r
+  selector = old_setting;\r
+  str_room(1);\r
+  graphics_mode();\r
+  spc_exec_special(str_pool + str_start[str_ptr], cur_length, cur_h * 0.000015202, -cur_v * 0.000015202, 1.0);\r
+/*\r
+  if (cur_length < 256)\r
+  {\r
+    dvi_out(xxx1);\r
+    dvi_out(cur_length);\r
+  }\r
+  else\r
+  {Mag\r
+    dvi_out(xxx4);\r
+    dvi_four(cur_length); \r
+  } \r
+\r
+  for (k = str_start[str_ptr]; k <= pool_ptr - 1; k++)\r
+    dvi_out(str_pool[k]);\r
+*/\r
+  pool_ptr = str_start[str_ptr];\r
+}\r
+/* sec 1370 */\r
+void write_out (pointer p)\r
+{\r
+  char old_setting;\r
+  /* integer old_mode; */\r
+  int old_mode;\r
+  /* small_number j; */\r
+  int j;\r
+  pointer q, r;\r
+\r
+  q = get_avail();\r
+  info(q) = right_brace_token + '}';\r
+  r = get_avail();\r
+  link(q) = r;\r
+  info(r) = end_write_token;\r
+  ins_list(q);\r
+  begin_token_list(write_tokens(p), write_text);\r
+  q = get_avail();\r
+  info(q) = left_brace_token + '{';\r
+  ins_list(q);\r
+  old_mode = mode;\r
+  mode = 0;\r
+  cur_cs = write_loc;\r
+  q = scan_toks(false, true);\r
+  get_token();\r
+\r
+  if (cur_tok != end_write_token)\r
+  {\r
+    print_err("Unbalanced write command");\r
+    help2("On this page there's a \\write with fewer real {'s than }'s.",\r
+        "I can't handle that very well; good luck.");\r
+    error();\r
+\r
+    do\r
+      {\r
+        get_token();\r
+      }\r
+    while (!(cur_tok == end_write_token));\r
+  }\r
+\r
+  mode = old_mode;\r
+  end_token_list();\r
+  old_setting = selector;\r
+  j = write_stream(p);\r
+\r
+  if (write_open[j])\r
+    selector = j;\r
+  else\r
+  {\r
+    if ((j == 17) && (selector == term_and_log))\r
+      selector = log_only;\r
+\r
+    print_nl("");\r
+  }\r
+\r
+  token_show(def_ref);\r
+  print_ln();\r
+  flush_list(def_ref);\r
+  selector = old_setting;\r
+}\r
+/* sec 1373 */\r
+void out_what (pointer p)\r
+{\r
+  /* small_number j; */\r
+  int j;\r
+\r
+  switch (subtype(p))\r
+  {\r
+    case open_node:\r
+    case write_node:\r
+    case close_node:\r
+      if (!doing_leaders)\r
+      {\r
+        j = write_stream(p);\r
+\r
+        if (subtype(p) == write_node)\r
+          write_out(p);\r
+        else\r
+        {\r
+          if (write_open[j])\r
+            a_close(write_file[j]); \r
+\r
+          if (subtype(p) == close_node)\r
+            write_open[j]= false;\r
+          else if (j < 16)\r
+          {\r
+            cur_name = open_name(p);\r
+            cur_area = open_area(p);\r
+            cur_ext = open_ext(p); \r
+\r
+            if (cur_ext == 335) /* "" */\r
+              cur_ext = 785;    /* ".tex" */\r
+\r
+            pack_file_name(cur_name, cur_area, cur_ext);\r
+\r
+            while (!a_open_out(write_file[j]))\r
+              prompt_file_name("output file name", ".tex");\r
+\r
+            write_open[j] = true;\r
+          }\r
+        }\r
+      }\r
+      break;\r
+\r
+    case special_node:\r
+      special_out(p); \r
+      break;\r
+\r
+    case language_node:\r
+      do_nothing();\r
+      break;\r
+\r
+    default:\r
+      {\r
+        confusion("ext4");\r
+        return;\r
+      }\r
+      break;\r
+  }\r
+}\r
+/* sec 0619 */\r
+void hlist_out (void)\r
+{\r
+  scaled base_line;\r
+  scaled left_edge;\r
+  scaled save_h, save_v;\r
+  pointer this_box;\r
+  /* glue_ord g_order; */\r
+  int g_order;\r
+  /* char g_sign; */\r
+  int g_sign;\r
+  pointer p;\r
+  integer save_loc;\r
+  pointer leader_box;\r
+  scaled leader_wd;\r
+  scaled lx;\r
+  boolean outer_doing_leaders;\r
+  scaled edge;\r
+  real glue_temp;\r
+  real cur_glue;\r
+  scaled cur_g;\r
+\r
+  cur_g = 0;\r
+  cur_glue = 0.0;\r
+  this_box = temp_ptr;\r
+  g_order = glue_order(this_box);\r
+  g_sign = glue_sign(this_box);\r
+  p = list_ptr(this_box);\r
+  incr(cur_s);\r
+\r
+  if (cur_s > 0)\r
+    dvi_out(push);\r
+\r
+  if (cur_s > max_push)\r
+    max_push = cur_s;\r
+\r
+  save_loc = dvi_offset + dvi_ptr;\r
+  base_line = cur_v;\r
+  left_edge = cur_h;\r
+\r
+  while (p != 0)\r
+reswitch:\r
+    if (is_char_node(p))\r
+    {\r
+      synch_h();\r
+      synch_v();\r
+\r
+      do\r
+        {\r
+          f = font(p);\r
+          c = character(p);\r
+\r
+          if (f != dvi_f)\r
+          {\r
+            if (!font_used[f])\r
+            {\r
+              dvi_font_def(f);\r
+              font_used[f] = true;\r
+            }\r
+\r
+            if (f <= 64 + font_base)\r
+              dvi_out(f - font_base - 1 + fnt_num_0);\r
+#ifdef INCREASEFONTS\r
+            else if (f <= 256)\r
+            {\r
+              dvi_out(fnt1);\r
+              dvi_out(f - 1);\r
+            }\r
+            else\r
+            {\r
+              dvi_out(fnt2);\r
+              dvi_out(((f - 1) >> 8));\r
+              dvi_out(((f - 1) & 255));\r
+            }\r
+#else\r
+            else\r
+            {\r
+              dvi_out(fnt1);\r
+              dvi_out(f - 1);\r
+            }\r
+#endif\r
+\r
+            dvi_f = f;\r
+          }\r
+\r
+          if (c >= 128)\r
+            dvi_out(set1);\r
+\r
+          dvi_out(c);\r
+          cur_h = cur_h + char_width(f, char_info(f, c));\r
+          p = link(p);\r
+        }\r
+      while (!(!is_char_node(p)));\r
+\r
+      dvi_h = cur_h;\r
+  }\r
+  else\r
+  {\r
+    switch (type(p))\r
+    {\r
+      case hlist_node:\r
+      case vlist_node:\r
+        if (list_ptr(p) == 0)\r
+          cur_h = cur_h + width(p);\r
+        else\r
+        {\r
+          save_h = dvi_h;\r
+          save_v = dvi_v;\r
+          cur_v = base_line + shift_amount(p);\r
+          temp_ptr = p;\r
+          edge = cur_h;\r
+\r
+          if (type(p) == vlist_node)\r
+            vlist_out();\r
+          else\r
+            hlist_out();\r
+\r
+          dvi_h = save_h;\r
+          dvi_v = save_v;\r
+          cur_h = edge + width(p);\r
+          cur_v = base_line;\r
+        }\r
+        break;\r
+\r
+      case rule_node:\r
+        {\r
+          rule_ht = height(p);\r
+          rule_dp = depth(p);\r
+          rule_wd = width(p);\r
+          goto fin_rule;\r
+        }\r
+        break;\r
+\r
+      case whatsit_node:\r
+        out_what(p);\r
+        break;\r
+\r
+      case glue_node:\r
+        {\r
+          g = glue_ptr(p);\r
+          rule_wd = width(g) - cur_g;\r
+\r
+          if (g_sign != normal)\r
+          {\r
+            if (g_sign == stretching)\r
+            {\r
+              if (stretch_order(g) == g_order)\r
+              {\r
+                cur_glue = cur_glue + stretch(g);\r
+                vet_glue(glue_set(this_box) * cur_glue);\r
+                cur_g = round(glue_temp);\r
+              }\r
+            }\r
+            else if (shrink_order(g) == g_order)\r
+            {\r
+              cur_glue = cur_glue - shrink(g);\r
+              vet_glue(glue_set(this_box) * cur_glue);\r
+              cur_g = round(glue_temp);\r
+            }\r
+          }\r
+\r
+          rule_wd = rule_wd + cur_g;\r
+\r
+          if (subtype(p) >= a_leaders)\r
+          {\r
+            leader_box = leader_ptr(p);\r
+\r
+            if (type(leader_box) == rule_node)\r
+            {\r
+              rule_ht = height(leader_box);\r
+              rule_dp = depth(leader_box);\r
+              goto fin_rule;\r
+            }\r
+\r
+            leader_wd = width(leader_box);\r
+\r
+            if ((leader_wd > 0) && (rule_wd > 0))\r
+            {\r
+              rule_wd = rule_wd + 10;\r
+              edge = cur_h + rule_wd;\r
+              lx = 0;\r
+\r
+              if (subtype(p) == a_leaders)\r
+              {\r
+                save_h = cur_h;\r
+                cur_h = left_edge + leader_wd * ((cur_h - left_edge) / leader_wd);\r
+\r
+                if (cur_h < save_h)\r
+                  cur_h = cur_h + leader_wd;\r
+              }\r
+              else\r
+              {\r
+                lq = rule_wd / leader_wd;\r
+                lr = rule_wd % leader_wd;\r
+\r
+                if (subtype(p) == c_leaders)\r
+                  cur_h = cur_h + (lr / 2);\r
+                else\r
+                {\r
+                  lx = (2 * lr + lq + 1) / (2 * lq + 2);\r
+                  cur_h = cur_h + ((lr - (lq - 1)* lx) / 2);\r
+                }\r
+              }\r
+\r
+              while (cur_h + leader_wd <= edge)\r
+              {\r
+                cur_v = base_line + shift_amount(leader_box);\r
+                synch_v();\r
+                save_v = dvi_v;\r
+                synch_h();\r
+                save_h = dvi_h;\r
+                temp_ptr = leader_box;\r
+                outer_doing_leaders = doing_leaders;\r
+                doing_leaders = true;\r
+\r
+                if (type(leader_box) == vlist_node)\r
+                  vlist_out();\r
+                else\r
+                  hlist_out();\r
+\r
+                doing_leaders = outer_doing_leaders;\r
+                dvi_v = save_v;\r
+                dvi_h = save_h;\r
+                cur_v = base_line;\r
+                cur_h = save_h + leader_wd + lx;\r
+              }\r
+\r
+              cur_h = edge - 10;\r
+              goto next_p;\r
+            }\r
+          }\r
+\r
+          goto move_past;\r
+        }\r
+        break;\r
+\r
+      case kern_node:\r
+      case math_node:\r
+        cur_h = cur_h + width(p);\r
+        break;\r
+\r
+      case ligature_node:\r
+        {\r
+          mem[lig_trick] = mem[lig_char(p)];\r
+          link(lig_trick) = link(p);\r
+          p = lig_trick;\r
+          goto reswitch;\r
+        }\r
+        break;\r
+\r
+      default:\r
+        break;\r
+    }\r
+\r
+    goto next_p;\r
+\r
+fin_rule:\r
+    if (is_running(rule_ht))\r
+      rule_ht = height(this_box);\r
+\r
+    if (is_running(rule_dp))\r
+      rule_dp = depth(this_box);\r
+\r
+    rule_ht = rule_ht + rule_dp;\r
+\r
+    if ((rule_ht > 0) && (rule_wd > 0))\r
+    {\r
+      synch_h();\r
+      cur_v = base_line + rule_dp;\r
+      synch_v();\r
+      dvi_out(set_rule);\r
+      dvi_four(rule_ht);\r
+      dvi_four(rule_wd);\r
+      cur_v = base_line;\r
+      dvi_h = dvi_h + rule_wd;\r
+    }\r
+\r
+move_past:\r
+    cur_h = cur_h + rule_wd;\r
+\r
+next_p:\r
+    p = link(p);\r
+  }\r
+\r
+  prune_movements(save_loc);\r
+\r
+  if (cur_s > 0)\r
+    dvi_pop(save_loc);\r
+\r
+  decr(cur_s);\r
+}\r
+/* sec 0629 */\r
+void vlist_out (void)\r
+{\r
+  scaled left_edge;\r
+  scaled top_edge;\r
+  scaled save_h, save_v;\r
+  pointer this_box;\r
+  /* glue_ord g_order; */\r
+  int g_order;\r
+  /* char g_sign; */\r
+  int g_sign;\r
+  pointer p;\r
+  integer save_loc;\r
+  pointer leader_box;\r
+  scaled leader_ht;\r
+  scaled lx;\r
+  boolean outer_doing_leaders;\r
+  scaled edge;\r
+  real glue_temp;\r
+  real cur_glue;\r
+  scaled cur_g;\r
+\r
+  cur_g = 0;\r
+  cur_glue = 0.0;\r
+  this_box = temp_ptr;\r
+  g_order = glue_order(this_box);\r
+  g_sign = glue_sign(this_box);\r
+  p = list_ptr(this_box);\r
+  incr(cur_s);\r
+\r
+  if (cur_s > 0)\r
+    dvi_out(push);\r
+\r
+  if (cur_s > max_push)\r
+    max_push = cur_s;\r
+\r
+  save_loc = dvi_offset + dvi_ptr;\r
+  left_edge = cur_h;\r
+  cur_v = cur_v - height(this_box);\r
+  top_edge = cur_v;\r
+\r
+  while (p != 0)\r
+  {\r
+    if (is_char_node(p))\r
+    {\r
+      confusion("vlistout");\r
+      return;\r
+    }\r
+    else\r
+    {\r
+      switch (type(p))\r
+      {\r
+        case hlist_node:\r
+        case vlist_node:\r
+          if (list_ptr(p) == 0)\r
+            cur_v = cur_v + height(p) + depth(p);\r
+          else\r
+          {\r
+            cur_v = cur_v + height(p);\r
+            synch_v();\r
+            save_h = dvi_h;\r
+            save_v = dvi_v;\r
+            cur_h = left_edge + shift_amount(p);\r
+            temp_ptr = p;\r
+\r
+            if (type(p) == vlist_node)\r
+              vlist_out();\r
+            else\r
+              hlist_out();\r
+\r
+            dvi_h = save_h;\r
+            dvi_v = save_v;\r
+            cur_v = save_v + depth(p);\r
+            cur_h = left_edge;\r
+          }\r
+          break;\r
+\r
+        case rule_node:\r
+          {\r
+            rule_ht = height(p);\r
+            rule_dp = depth(p);\r
+            rule_wd = width(p);\r
+            goto fin_rule;\r
+          }\r
+          break;\r
+\r
+        case whatsit_node:\r
+          out_what(p);\r
+          break;\r
+\r
+        case glue_node:\r
+          {\r
+            g = glue_ptr(p);\r
+            rule_ht = width(g) - cur_g;\r
+\r
+            if (g_sign != normal)\r
+            {\r
+              if (g_sign == stretching)\r
+              {\r
+                if (stretch_order(g) == g_order)\r
+                {\r
+                  cur_glue = cur_glue + stretch(g);\r
+                  vet_glue(glue_set(this_box) * cur_glue);\r
+                  cur_g = round(glue_temp);\r
+                }\r
+              }\r
+              else if (shrink_order(g) == g_order)   /* BUG FIX !!! */\r
+              {\r
+                cur_glue = cur_glue - shrink(g);\r
+                vet_glue(glue_set(this_box) * cur_glue);\r
+                cur_g = round(glue_temp);\r
+              }\r
+            }\r
+\r
+            rule_ht = rule_ht + cur_g;\r
+\r
+            if (subtype(p) >= a_leaders)\r
+            {\r
+              leader_box = leader_ptr(p);\r
+\r
+              if (type(leader_box) == rule_node)\r
+              {\r
+                rule_wd = width(leader_box);\r
+                rule_dp = 0;\r
+                goto fin_rule;\r
+              }\r
+\r
+              leader_ht = height(leader_box) + depth(leader_box);\r
+\r
+              if ((leader_ht > 0) && (rule_ht > 0))\r
+              {\r
+                rule_ht = rule_ht + 10;\r
+                edge = cur_v + rule_ht;\r
+                lx = 0;\r
+\r
+                if (subtype(p) == a_leaders)\r
+                {\r
+                  save_v = cur_v;\r
+                  cur_v = top_edge + leader_ht * ((cur_v - top_edge) / leader_ht);\r
+\r
+                  if (cur_v < save_v)\r
+                    cur_v = cur_v + leader_ht;\r
+                }\r
+                else\r
+                {\r
+                  lq = rule_ht / leader_ht;\r
+                  lr = rule_ht % leader_ht;\r
+\r
+                  if (subtype(p) == c_leaders)\r
+                    cur_v = cur_v + (lr / 2);\r
+                  else\r
+                  {\r
+                    lx = (2 * lr + lq + 1) / (2 * lq + 2);\r
+                    cur_v = cur_v + ((lr - (lq - 1) * lx) / 2);\r
+                  }\r
+                }\r
+\r
+                while (cur_v + leader_ht <= edge)\r
+                {\r
+                  cur_h = left_edge + shift_amount(leader_box);\r
+                  synch_h();\r
+                  save_h = dvi_h;\r
+                  cur_v = cur_v + height(leader_box);\r
+                  synch_v();\r
+                  save_v = dvi_v;\r
+                  temp_ptr = leader_box;\r
+                  outer_doing_leaders = doing_leaders;\r
+                  doing_leaders = true;\r
+\r
+                  if (type(leader_box) == vlist_node)\r
+                    vlist_out();\r
+                  else\r
+                    hlist_out();\r
+\r
+                  doing_leaders = outer_doing_leaders;\r
+                  dvi_v = save_v;\r
+                  dvi_h = save_h;\r
+                  cur_h = left_edge;\r
+                  cur_v = save_v - height(leader_box) + leader_ht + lx;\r
+                }\r
+\r
+                cur_v = edge - 10;\r
+                goto next_p;\r
+              }\r
+            }\r
+\r
+            goto move_past;\r
+          }\r
+          break;\r
+\r
+        case kern_node:\r
+          cur_v = cur_v + width(p);\r
+          break;\r
+\r
+        default:\r
+          break;\r
+      }\r
+\r
+      goto next_p;\r
+\r
+fin_rule:\r
+      if (is_running(rule_wd))\r
+        rule_wd = width(this_box);\r
+\r
+      rule_ht = rule_ht + rule_dp;\r
+      cur_v = cur_v + rule_ht;\r
+\r
+      if ((rule_ht > 0) && (rule_wd > 0))\r
+      {\r
+        synch_h();\r
+        synch_v();\r
+        dvi_out(put_rule);\r
+        dvi_four(rule_ht);\r
+        dvi_four(rule_wd);\r
+      }\r
+\r
+      goto next_p;\r
+\r
+move_past:\r
+      cur_v = cur_v + rule_ht;\r
+    }\r
+\r
+next_p:\r
+    p = link(p);\r
+  }\r
+\r
+  prune_movements(save_loc);\r
+\r
+  if (cur_s > 0)\r
+    dvi_pop(save_loc);\r
+\r
+  decr(cur_s);\r
+}\r
+/* sec 0638 */\r
+void dvi_ship_out_(pointer p)\r
+{\r
+  integer page_loc;\r
+  char j, k;\r
+  pool_pointer s;\r
+  char old_setting;\r
+\r
+  if (tracing_output > 0)\r
+  {\r
+    print_nl("");\r
+    print_ln();\r
+    prints("Completed box being shipped out");\r
+  }\r
+\r
+  if (term_offset > max_print_line - 9)\r
+    print_ln();\r
+  else if ((term_offset > 0) || (file_offset > 0))\r
+    print_char(' ');\r
+\r
+  print_char('[');\r
+  j = 9;\r
+\r
+  while ((count(j) == 0) && (j > 0))\r
+    decr(j);\r
+\r
+  for (k = 0; k <= j; k++)\r
+  {\r
+    print_int(count(k));\r
+\r
+    if (k < j)\r
+      print_char('.');\r
+  }\r
+  \r
+  update_terminal();\r
+\r
+  if (tracing_output > 0)\r
+  {\r
+    print_char(']');\r
+    begin_diagnostic();\r
+    show_box(p);\r
+    end_diagnostic(true);\r
+  }\r
+\r
+  if ((height(p) > max_dimen) || (depth(p) > max_dimen) ||\r
+      (height(p) + depth(p) + v_offset > max_dimen) ||\r
+      (width(p) + h_offset > max_dimen))\r
+  {\r
+    print_err("Huge page cannot be shipped out");\r
+    help2("The page just created is more than 18 feet tall or",\r
+        "more than 18 feet wide, so I suspect something went wrong.");\r
+    error();\r
+\r
+    if (tracing_output <= 0)\r
+    {\r
+      begin_diagnostic();\r
+      print_nl("The following box has been deleted:");\r
+      show_box(p);\r
+      end_diagnostic(true);\r
+    }\r
+\r
+    goto done;\r
+  }\r
+\r
+  if (height(p) + depth(p) + v_offset > max_v)\r
+    max_v = height(p) + depth(p) + v_offset;\r
+\r
+  if (width(p) + h_offset > max_h)\r
+    max_h = width(p) + h_offset;\r
+\r
+  dvi_h = 0;\r
+  dvi_v = 0;\r
+  cur_h = h_offset;\r
+  dvi_f = null_font;\r
+  ensure_dvi_open();\r
+\r
+  if (total_pages == 0)\r
+  {\r
+    dvi_out(pre);\r
+    dvi_out(id_byte);\r
+    dvi_four(25400000L);\r
+    dvi_four(473628672L);\r
+    prepare_mag();\r
+    dvi_four(mag);\r
+    old_setting = selector;\r
+    selector = new_string;\r
+    prints(" TeX output ");\r
+    print_int(year);\r
+    print_char('.');\r
+    print_two(month);\r
+    print_char('.');\r
+    print_two(day);\r
+    print_char(':');\r
+    print_two(tex_time / 60);\r
+    print_two(tex_time % 60);\r
+    selector = old_setting;\r
+    dvi_out(cur_length);\r
+\r
+    for (s = str_start[str_ptr]; s <= pool_ptr - 1; s++)\r
+      dvi_out(str_pool[s]);\r
+\r
+    pool_ptr = str_start[str_ptr];\r
+  }\r
+\r
+  page_loc = dvi_offset + dvi_ptr;\r
+  dvi_out(bop);\r
+\r
+  for (k = 0; k <= 9; k++)\r
+    dvi_four(count(k));\r
+\r
+  dvi_four(last_bop);\r
+  last_bop = page_loc;\r
+  cur_v = height(p) + v_offset;\r
+  temp_ptr = p;\r
+\r
+  if (type(p) == vlist_node)\r
+    vlist_out();\r
+  else\r
+    hlist_out();\r
+\r
+  dvi_out(eop);\r
+  incr(total_pages);\r
+  cur_s = -1;\r
+\r
+done:\r
+  if (tracing_output <= 0)\r
+    print_char(']');\r
+\r
+  dead_cycles = 0;\r
+  update_terminal();\r
+\r
+#ifdef STAT\r
+  if (tracing_stats > 1)\r
+  {\r
+    print_nl("Memory usage before: ");\r
+    print_int(var_used);\r
+    print_char('&');\r
+    print_int(dyn_used);\r
+    print_char(';');\r
+  }\r
+#endif\r
+\r
+  flush_node_list(p);\r
+\r
+#ifdef STAT\r
+  if (tracing_stats > 1)\r
+  {\r
+    prints(" after: ");\r
+    print_int(var_used);\r
+    print_char('&');\r
+    print_int(dyn_used);\r
+    prints("; still utouched: ");\r
+    print_int(hi_mem_min - lo_mem_max - 1);\r
+    print_ln();\r
+  }\r
+#endif\r
+}\r
+void ship_out (pointer p)\r
+{\r
+  //printf("init pdf devices.");\r
+  //dvi_ship_out_(p);\r
+  //printf("DPX test");\r
+  pdf_ship_out(p);\r
+  /*\r
+  switch (shipout_flag)\r
+  {\r
+    case out_dvi_flag:\r
+    case out_xdv_flag:\r
+      dvi_ship_out_(p);\r
+      break;\r
+    case out_pdf_flag:\r
+      //pdf_ship_out(p);\r
+      break;\r
+  }*/\r
+}\r
+/* sec 0645 */\r
+void scan_spec (group_code c, boolean three_codes)\r
+{\r
+  integer s;\r
+  char spec_code;\r
+\r
+  if (three_codes)\r
+    s = saved(0);\r
+\r
+  if (scan_keyword("to"))\r
+    spec_code = exactly;\r
+  else if (scan_keyword("spread"))\r
+    spec_code = additional;\r
+  else\r
+  {\r
+    spec_code = additional;\r
+    cur_val = 0;\r
+    goto found;\r
+  }\r
+\r
+  scan_dimen(false, false, false);\r
+\r
+found:\r
+  if (three_codes)\r
+  {\r
+    saved(0) = s;\r
+    incr(save_ptr);\r
+  }\r
+\r
+  saved(0) = spec_code;\r
+  saved(1) = cur_val;\r
+  save_ptr = save_ptr + 2;\r
+  new_save_level(c);\r
+  scan_left_brace();\r
+}\r
+/* sec 0649 */\r
+pointer hpack_(pointer p, scaled w, small_number m)\r
+{\r
+  pointer r;\r
+  pointer q;\r
+  scaled h, d, x;\r
+  scaled s;\r
+  pointer g;\r
+  /* glue_ord o; */\r
+  int o;\r
+  internal_font_number f;\r
+  four_quarters i;\r
+  eight_bits hd;\r
+\r
+  last_badness = 0;\r
+  r = get_node(box_node_size);\r
+  type(r) = hlist_node;\r
+  subtype(r) = 0;\r
+  shift_amount(r) = 0;\r
+  q = r + list_offset;\r
+  link(q) = p;\r
+  h = 0;\r
+  d = 0;\r
+  x = 0;\r
+  total_stretch[normal] = 0;\r
+  total_shrink[normal] = 0;\r
+  total_stretch[fil] = 0;\r
+  total_shrink[fil] = 0;\r
+  total_stretch[fill] = 0;\r
+  total_shrink[fill] = 0;\r
+  total_stretch[filll] = 0;\r
+  total_shrink[filll] = 0;\r
+\r
+  while (p != 0)\r
+  {\r
+reswitch:\r
+\r
+    while (is_char_node(p))\r
+    {\r
+      f = font(p);\r
+      i = char_info(f, character(p));\r
+      hd = height_depth(i);\r
+      x = x + char_width(f, i);\r
+      s = char_height(f, hd);\r
+\r
+      if (s > h)\r
+        h = s;\r
+\r
+      s = char_depth(f, hd);\r
+\r
+      if (s > d)\r
+        d = s;\r
+\r
+      p = link(p);\r
+    }\r
+\r
+    if (p != 0)\r
+    {\r
+      switch (type(p))\r
+      {\r
+        case hlist_node:\r
+        case vlist_node:\r
+        case rule_node:\r
+        case unset_node:\r
+          {\r
+            x = x + width(p);\r
+\r
+            if (type(p) >= rule_node)\r
+              s = 0;\r
+            else\r
+              s = shift_amount(p);\r
+\r
+            if (height(p) - s > h)\r
+              h = height(p) - s;\r
+\r
+            if (depth(p) + s > d)\r
+              d = depth(p) + s;\r
+          }\r
+          break;\r
+\r
+        case ins_node:\r
+        case mark_node:\r
+        case adjust_node:\r
+          if (adjust_tail != 0)\r
+          {\r
+            while (link(q) != p)\r
+              q = link(q);\r
+\r
+            if (type(p) == adjust_node)\r
+            {\r
+              link(adjust_tail) = adjust_ptr(p);\r
+\r
+              while (link(adjust_tail) != 0)\r
+                adjust_tail = link(adjust_tail);\r
+\r
+              p = link(p);\r
+              free_node(link(q), small_node_size);\r
+            }\r
+            else\r
+            {\r
+              link(adjust_tail) = p;\r
+              adjust_tail = p;\r
+              p = link(p);\r
+            }\r
+\r
+            link(q) = p;\r
+            p = q;\r
+          }\r
+          break;\r
+\r
+        case whatsit_node:\r
+          break;\r
+\r
+        case glue_node:\r
+          {\r
+            g = glue_ptr(p);\r
+            x = x + width(g);\r
+            o = stretch_order(g);\r
+            total_stretch[o] = total_stretch[o] + stretch(g);\r
+            o = shrink_order(g);\r
+            total_shrink[o] = total_shrink[o] + shrink(g);\r
+\r
+            if (subtype(p) >= a_leaders)\r
+            {\r
+              g = leader_ptr(p);\r
+\r
+              if (height(g) > h)\r
+                h = height(g);\r
+\r
+              if (depth(g) > d)\r
+                d = depth(g);\r
+            }\r
+          }\r
+          break;\r
+\r
+        case kern_node:\r
+        case math_node:\r
+          x = x + width(p);\r
+          break;\r
+\r
+        case ligature_node:\r
+          {\r
+            mem[lig_trick] = mem[lig_char(p)];\r
+            link(lig_trick) = link(p);\r
+            p = lig_trick;\r
+            goto reswitch;\r
+          }\r
+          break;\r
+\r
+        default:\r
+          break;\r
+      }\r
+      p = link(p);\r
+    }\r
+  }\r
+\r
+  if (adjust_tail != 0)\r
+    link(adjust_tail) = 0;\r
+\r
+  height(r) = h;\r
+  depth(r) = d;\r
+\r
+  if (m == additional)\r
+    w = x + w;\r
+\r
+  width(r) = w;\r
+  x = w - x;\r
+\r
+  if (x == 0)\r
+  {\r
+    glue_sign(r) = normal;\r
+    glue_order(r) = normal;\r
+    glue_set(r) = 0.0;\r
+    goto exit;\r
+  }\r
+  else if (x > 0)\r
+  {\r
+    if (total_stretch[filll] != 0)\r
+      o = filll;\r
+    else if (total_stretch[fill] != 0)\r
+      o = fill;\r
+    else if (total_stretch[fil] != 0)\r
+      o = fil;\r
+    else\r
+      o = normal;\r
+\r
+    glue_order(r) = o;\r
+    glue_sign(r) = stretching;\r
+\r
+    if (total_stretch[o] != 0)\r
+      glue_set(r) = x / ((double) total_stretch[o]);\r
+    else\r
+    {\r
+      glue_sign(r) = normal;\r
+      glue_set(r) = 0.0;\r
+    }\r
+\r
+    if (o == normal)\r
+      if (list_ptr(r) != 0)\r
+      {\r
+        last_badness = badness(x, total_stretch[normal]);\r
+\r
+        if (last_badness > hbadness)\r
+        {\r
+          print_ln();\r
+\r
+          if (last_badness > 100)\r
+            print_nl("Underfull");\r
+          else\r
+            print_nl("Loose");\r
+\r
+          prints(" \\hbox (badness ");\r
+          print_int(last_badness);\r
+\r
+          if (last_badness > 100)\r
+            underfull_hbox++;\r
+\r
+          goto common_ending;\r
+        }\r
+      }\r
+\r
+    goto exit;\r
+  }\r
+  else\r
+  {\r
+    if (total_shrink[filll] != 0)\r
+      o = filll;\r
+    else if (total_shrink[fill] != 0)\r
+      o = fill;\r
+    else if (total_shrink[fil] != 0)\r
+      o = fil;\r
+    else\r
+      o = normal;\r
+\r
+    glue_order(r) = o;\r
+    glue_sign(r) = shrinking;\r
+\r
+    if (total_shrink[o] != 0)\r
+      glue_set(r) = ((- (integer) x) / ((double) total_shrink[o]));\r
+    else\r
+    {\r
+      glue_sign(r) = normal;\r
+      glue_set(r) = 0.0;\r
+    }\r
+\r
+    if ((total_shrink[o] < - (integer) x) && (o == 0) && (list_ptr(r) != 0))\r
+    {\r
+      last_badness = 1000000L;\r
+      glue_set(r) = 1.0;\r
+\r
+      if ((- (integer) x - total_shrink[normal] > hfuzz) || (hbadness < 100))\r
+      {\r
+        if ((overfull_rule > 0) && (- (integer) x - total_shrink[0] > hfuzz))\r
+        {\r
+          while (link(q) != 0)\r
+            q = link(q);\r
+          \r
+          link(q) = new_rule();\r
+          width(link(q)) = overfull_rule;\r
+        }\r
+        \r
+        print_ln();\r
+        print_nl("Overfull \\hbox (");\r
+        print_scaled(- (integer) x - total_shrink[normal]);\r
+        prints("pt too wide");\r
+        \r
+        overfull_hbox++;\r
+        goto common_ending;\r
+      }\r
+    }\r
+    else if (o == normal)\r
+      if (list_ptr(r) != 0)\r
+      {\r
+        last_badness = badness(- (integer) x, total_shrink[normal]);\r
+\r
+        if (last_badness > hbadness)\r
+        {\r
+          print_ln();\r
+          print_nl("Tight \\hbox (badness ");\r
+          print_int(last_badness);\r
+          goto common_ending;\r
+        }\r
+      }\r
+\r
+    goto exit;\r
+  }\r
+\r
+common_ending:\r
+\r
+  if (output_active)\r
+    prints(") has occurred while \\output is active");\r
+  else\r
+  {\r
+    if (pack_begin_line != 0)\r
+    {\r
+      if (pack_begin_line > 0)\r
+        prints(") in paragraph at lines ");\r
+      else\r
+        prints(") in alignment at lines ");\r
+\r
+      print_int(abs(pack_begin_line));\r
+      prints("--");\r
+    }\r
+    else\r
+      prints(") detected at line ");\r
+\r
+    print_int(line);\r
+  }\r
+\r
+  print_ln();\r
+  font_in_short_display = null_font;\r
+  short_display(list_ptr(r));\r
+  print_ln();\r
+  begin_diagnostic();\r
+  show_box(r);\r
+  end_diagnostic(true);\r
+\r
+exit:\r
+  return r;\r
+}\r
+/* sec 0668 */\r
+pointer vpackage_(pointer p, scaled h, small_number m, scaled l)\r
+{\r
+  pointer r;\r
+  scaled w, d, x;\r
+  scaled s;\r
+  pointer g;\r
+  /* glue_ord o; */\r
+  int o;\r
+\r
+  last_badness = 0;\r
+  r = get_node(box_node_size);\r
+  type(r) = vlist_node;\r
+  subtype(r) = min_quarterword;\r
+  shift_amount(r) = 0;\r
+  list_ptr(r) = p;\r
+  w = 0;\r
+  d = 0;\r
+  x = 0;\r
+  total_stretch[normal] = 0;\r
+  total_shrink[normal] = 0;\r
+  total_stretch[fil] = 0;\r
+  total_shrink[fil] = 0;\r
+  total_stretch[fill] = 0;\r
+  total_shrink[fill] = 0;\r
+  total_stretch[filll] = 0;\r
+  total_shrink[filll] = 0;\r
+\r
+  while (p != 0)\r
+  {\r
+    if (is_char_node(p))\r
+    {\r
+      confusion("vpack");\r
+      return 0;\r
+    }\r
+    else switch (type(p))\r
+    {\r
+      case hlist_node:\r
+      case vlist_node:\r
+      case rule_node:\r
+      case unset_node:\r
+        {\r
+          x = x + d + height(p);\r
+          d = depth(p);\r
+\r
+          if (type(p) >= rule_node)\r
+            s = 0;\r
+          else\r
+            s = shift_amount(p);\r
+\r
+          if (width(p) + s > w)\r
+            w = width(p) + s;\r
+        }\r
+        break;\r
+\r
+      case whatsit_node:\r
+        break;\r
+\r
+      case glue_node:\r
+        {\r
+          x = x + d;\r
+          d = 0;\r
+          g = glue_ptr(p);\r
+          x = x + width(g);\r
+          o = stretch_order(g);\r
+          total_stretch[o] = total_stretch[o] + stretch(g);\r
+          o = shrink_order(g);\r
+          total_shrink[o] = total_shrink[o] + shrink(g);\r
+\r
+          if (subtype(p) >= a_leaders)\r
+          {\r
+            g = leader_ptr(p);\r
+\r
+            if (width(g) > w)\r
+              w = width(g);\r
+          }\r
+        }\r
+        break;\r
+\r
+      case kern_node:\r
+        {\r
+          x = x + d + width(p);\r
+          d = 0;\r
+        }\r
+        break;\r
+\r
+      default:\r
+        break;\r
+    }\r
+\r
+    p = link(p);\r
+  }\r
+\r
+  width(r) = w;\r
+\r
+  if (d > l)\r
+  {\r
+    x = x + d - l;\r
+    depth(r) = l;\r
+  }\r
+  else\r
+    depth(r) = d;\r
+\r
+  if (m == additional)\r
+    h = x + h;\r
+\r
+  height(r) = h;\r
+  x = h - x;\r
+\r
+  if (x == 0)\r
+  {\r
+    glue_sign(r) = normal;\r
+    glue_order(r) = normal;\r
+    glue_set(r) = 0.0;\r
+    goto exit;\r
+  }\r
+  else if (x > 0)\r
+  {\r
+    if (total_stretch[filll] != 0)\r
+      o = filll;\r
+    else if (total_stretch[fill] != 0)\r
+      o = fill;\r
+    else if (total_stretch[fil] != 0)\r
+      o = fil;\r
+    else\r
+      o = normal;\r
+\r
+    glue_order(r) = o;\r
+    glue_sign(r) = stretching;\r
+\r
+    if (total_stretch[o] != 0)\r
+      glue_set(r) = x / ((double) total_stretch[o]);\r
+    else\r
+    {\r
+      glue_sign(r) = normal;\r
+      glue_set(r) = 0.0;\r
+    }\r
+\r
+    if (o == normal)\r
+      if (list_ptr(r) != 0)\r
+      {\r
+        last_badness = badness(x, total_stretch[normal]);\r
+\r
+        if (last_badness > vbadness)\r
+        {\r
+          print_ln();\r
+\r
+          if (last_badness > 100)\r
+            print_nl("Underfull");\r
+          else\r
+            print_nl("Loose");\r
+\r
+          prints(" \\vbox (badness ");\r
+          print_int(last_badness);\r
+\r
+          if (last_badness > 100)\r
+            underfull_vbox++;\r
+\r
+          goto common_ending;\r
+        }\r
+      }\r
+\r
+    goto exit;\r
+  }\r
+  else\r
+  {\r
+    if (total_shrink[filll] != 0)\r
+      o = filll;\r
+    else if (total_shrink[fill] != 0)\r
+      o = fill;\r
+    else if (total_shrink[fil] != 0)\r
+      o = fil;\r
+    else\r
+      o = normal;\r
+\r
+    glue_order(r) = o;\r
+    glue_sign(r) = shrinking;\r
+\r
+    if (total_shrink[o] != 0)\r
+      glue_set(r) = (- (integer) x) / ((double) total_shrink[o]);\r
+    else\r
+    {\r
+      glue_sign(r) = normal;\r
+      glue_set(r) = 0.0;\r
+    }\r
+\r
+    if ((total_shrink[o] < - (integer) x) && (o == 0) && (list_ptr(r) != 0))\r
+    {\r
+      last_badness = 1000000L;\r
+      glue_set(r) = 1.0;\r
+\r
+      if ((- (integer) x - total_shrink[0] > vfuzz) || (vbadness < 100))\r
+      {\r
+        print_ln();\r
+        print_nl("Overfull \\vbox (");\r
+        print_scaled(- (integer) x - total_shrink[0]);\r
+        prints("pt too high");\r
+\r
+        overfull_vbox++;\r
+\r
+        goto common_ending;\r
+      }\r
+    }\r
+    else if (o == 0)\r
+      if (list_ptr(r) != 0)\r
+      {\r
+        last_badness = badness(- (integer) x, total_shrink[normal]);\r
+        if (last_badness > vbadness)\r
+        {\r
+          print_ln();\r
+          print_nl("Tight \\vbox (badness ");\r
+          print_int(last_badness);\r
+          goto common_ending;\r
+        }\r
+      }\r
+\r
+    goto exit;\r
+  }\r
+\r
+common_ending:\r
+\r
+  if (output_active)\r
+    prints(") has occurred while \\output is active");\r
+  else\r
+  {\r
+    if (pack_begin_line != 0)\r
+    {\r
+      prints(") in alignment at lines ");\r
+      print_int(abs(pack_begin_line));\r
+      prints("--");\r
+    }\r
+    else\r
+      prints(") detected at line ");\r
+\r
+    print_int(line);\r
+    print_ln();\r
+  }\r
+\r
+  begin_diagnostic();\r
+  show_box(r);\r
+  end_diagnostic(true);\r
+\r
+exit:\r
+  return r;\r
+}\r
+/* sec 0679 */\r
+void append_to_vlist (pointer b)\r
+{\r
+  scaled d;\r
+  pointer p;\r
+\r
+  if (prev_depth > ignore_depth)\r
+  {\r
+    d = width(baseline_skip) - prev_depth - height(b);\r
+\r
+    if (d < line_skip_limit)\r
+      p = new_param_glue(line_skip_code);\r
+    else\r
+    {\r
+      p = new_skip_param(baseline_skip_code);\r
+      width(temp_ptr) = d;\r
+    }\r
+\r
+    link(tail) = p;\r
+    tail = p;\r
+  }\r
+\r
+  link(tail) = b;\r
+  tail = b;\r
+  prev_depth = depth(b);\r
+}\r
+/* sec 0686 */\r
+pointer new_noad (void)\r
+{\r
+  pointer p;\r
+\r
+  p = get_node(noad_size);\r
+  type(p) = ord_noad;\r
+  subtype(p) = normal;\r
+  mem[nucleus(p)].hh = empty_field;\r
+  mem[subscr(p)].hh = empty_field;\r
+  mem[supscr(p)].hh = empty_field;\r
+\r
+  return p;\r
+}\r
+/* sec 0688 */\r
+pointer new_style (small_number s)\r
+{\r
+  pointer p;\r
+\r
+  p = get_node(style_node_size);\r
+  type(p) = style_node;\r
+  subtype(p) = s;\r
+  width(p) = 0;\r
+  depth(p) = 0;\r
+\r
+  return p;\r
+}\r
+/* sec 0689 */\r
+pointer new_choice (void)\r
+{\r
+  pointer p;\r
+\r
+  p = get_node(style_node_size);\r
+  type(p) = choice_node;\r
+  subtype(p) = 0;\r
+  display_mlist(p) = 0;\r
+  text_mlist(p) = 0;\r
+  script_mlist(p) = 0;\r
+  script_script_mlist(p) = 0;\r
+\r
+  return p;\r
+}\r
+/* sec 0693 */\r
+void show_info (void)\r
+{\r
+  show_node_list(info(temp_ptr));\r
+}\r
+/* sec 0704 */\r
+pointer fraction_rule (scaled t)\r
+{\r
+  pointer p;\r
+\r
+  p = new_rule();\r
+  height(p) = t;\r
+  depth(p) = 0;\r
+\r
+  return p;\r
+}\r
+/* sec 0705 */\r
+pointer overbar (pointer b, scaled k, scaled t)\r
+{\r
+  pointer p, q;\r
+\r
+  p = new_kern(k);\r
+  link(p) = b;\r
+  q = fraction_rule(t);\r
+  link(q) = p;\r
+  p = new_kern(t);\r
+  link(p) = q;\r
+\r
+  return vpackage(p, 0, 1, max_dimen);\r
+}\r
+/* sec 0709 */\r
+pointer char_box (internal_font_number f, quarterword c)\r
+{\r
+  four_quarters q;\r
+  eight_bits hd;\r
+  pointer b, p;\r
+\r
+  q = char_info(f, c);\r
+  hd = height_depth(q);\r
+  b = new_null_box();\r
+  width(b) = char_width(f, q) + char_italic(f, q);\r
+  height(b) = char_height(f, hd);\r
+  depth(b) = char_depth(f, hd);\r
+  p = get_avail();\r
+  character(p) = c;\r
+  font(p) = f;\r
+  list_ptr(b) = p;\r
+\r
+  return b;\r
+}\r
+/* sec 0711 */\r
+void stack_into_box (pointer b, internal_font_number f, quarterword c)\r
+{\r
+  pointer p;\r
+\r
+  p = char_box(f, c);\r
+  link(p) = list_ptr(b);\r
+  list_ptr(b) = p;\r
+  height(b) = height(p);\r
+}\r
+/* sec 0712 */\r
+scaled height_plus_depth (internal_font_number f, quarterword c)\r
+{\r
+  four_quarters q;\r
+  eight_bits hd;\r
+\r
+  q = char_info(f, c);\r
+  hd = height_depth(q);\r
+\r
+  return char_height(f, hd) + char_depth(f, hd);\r
+}\r
+/* sec 0706 */\r
+pointer var_delimiter (pointer d, small_number s, scaled v)\r
+{\r
+  pointer b;\r
+  internal_font_number f, g;\r
+  quarterword c, x, y;\r
+  integer m, n;\r
+  scaled u;\r
+  scaled w;\r
+  four_quarters q;\r
+  four_quarters r;\r
+  eight_bits hd;\r
+  /* small_number z; */\r
+  int z;\r
+  boolean large_attempt;\r
+\r
+  f = null_font;\r
+  w = 0;\r
+  large_attempt = false;\r
+  z = small_fam(d);\r
+  x = small_char(d);\r
+\r
+  while (true)\r
+  {\r
+    if ((z != 0) || (x != 0))\r
+    {\r
+      z = z + s + 16;\r
+\r
+      do\r
+        {\r
+          z = z - 16;\r
+          g = fam_fnt(z);\r
+\r
+          if (g != null_font)\r
+          {\r
+            y = x;\r
+\r
+            if ((y >= font_bc[g]) && (y <= font_ec[g]))\r
+            {\r
+continu:\r
+              q = char_info(g, y);\r
+              \r
+              if (char_exists(q))\r
+              {\r
+                if (char_tag(q) == ext_tag)\r
+                {\r
+                  f = g;\r
+                  c = y;\r
+                  goto found;\r
+                }\r
+\r
+                hd = height_depth(q);\r
+                u = char_height(g, hd) + char_depth(g, hd);\r
+\r
+                if (u > w)\r
+                {\r
+                  f = g;\r
+                  c = y;\r
+                  w = u;\r
+\r
+                  if (u >= v)\r
+                    goto found;\r
+                }\r
+\r
+                if (char_tag(q) == list_tag)\r
+                {\r
+                  y = rem_byte(q);\r
+                  goto continu;\r
+                }\r
+              }\r
+            }\r
+          }\r
+        }\r
+      while (!(z < 16));\r
+    }\r
+\r
+    if (large_attempt)\r
+      goto found;\r
+\r
+    large_attempt = true;\r
+    z = large_fam(d);\r
+    x = large_char(d);\r
+  }\r
+\r
+found:\r
+  if (f != null_font)\r
+    if (char_tag(q) == ext_tag)\r
+    {\r
+      b = new_null_box();\r
+      type(b) = vlist_node;\r
+      r = font_info[exten_base[f] + rem_byte(q)].qqqq;\r
+      c = ext_rep(r);\r
+      u = height_plus_depth(f, c);\r
+      w = 0;\r
+      q = char_info(f, c);\r
+      width(b) = char_width(f, q) + char_italic(f, q);\r
+      c = ext_bot(r);\r
+\r
+      if (c != min_quarterword)\r
+        w = w + height_plus_depth(f, c);\r
+\r
+      c = ext_mid(r);\r
+\r
+      if (c != min_quarterword)\r
+        w = w + height_plus_depth(f, c);\r
+\r
+      c = ext_top(r);\r
+\r
+      if (c != min_quarterword)\r
+        w = w + height_plus_depth(f, c);\r
+\r
+      n = 0;\r
+\r
+      if (u > 0)\r
+        while (w < v)\r
+        {\r
+          w = w + u;\r
+          incr(n);\r
+\r
+          if (ext_mid(r) != min_quarterword)\r
+            w = w + u;\r
+        }\r
+\r
+      c = ext_bot(r);\r
+\r
+      if (c != min_quarterword)\r
+        stack_into_box(b, f, c);\r
+\r
+      c = ext_rep(r);\r
+\r
+      for (m = 1; m <= n; m++)\r
+        stack_into_box(b, f, c);\r
+\r
+      c = ext_mid(r);\r
+\r
+      if (c != min_quarterword)\r
+      {\r
+        stack_into_box(b, f, c);\r
+        c = ext_rep(r);\r
+\r
+        for (m = 1; m <= n; m++)\r
+          stack_into_box(b, f, c);\r
+      }\r
+\r
+      c = ext_top(r);\r
+\r
+      if (c != 0)\r
+        stack_into_box(b, f, c);\r
+      \r
+      depth(b) = w - height(b);\r
+    }\r
+    else\r
+      b = char_box(f, c);\r
+  else\r
+  {\r
+    b = new_null_box();\r
+    width(b) = null_delimiter_space;\r
+  }\r
+\r
+  shift_amount(b) = half(height(b) - depth(b)) - axis_height(s);\r
+\r
+  return b;\r
+}\r
index 5da5ef6..d8f1986 100644 (file)
-/* Copyright 2014 Clerk Ma
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301 USA.  */
-
-#define EXTERN extern
-
-#include "yandytex.h"
-
-/* sec 0715 */
-pointer rebox (pointer b, scaled w)
-{
-  pointer p;
-  internal_font_number f;
-  scaled v;
-
-  if ((width(b) != w) && (list_ptr(b) != 0))
-  {
-    if (type(b) == vlist_node)
-      b = hpack(b, 0, 1);
-
-    p = list_ptr(b);
-
-    if ((is_char_node(p)) && (link(p) == 0))
-    {
-      f = font(p);
-      v = char_width(f, char_info(f, character(p)));
-
-      if (v != width(b))
-        link(p) = new_kern(width(b) - v);
-    }
-
-    free_node(b, box_node_size);
-    b = new_glue(ss_glue);
-    link(b) = p;
-
-    while (link(p) != 0)
-      p = link(p);
-
-    link(p) = new_glue(ss_glue);
-    return hpack(b, w, exactly);
-  }
-  else
-  {
-    width(b) = w;
-    return b;
-  }
-}
-/* sec 0716 */
-pointer math_glue (pointer g, scaled m)
-{
-  pointer p;
-  integer n;
-  scaled f;
-
-  n = x_over_n(m, 65536L);
-  f = tex_remainder;
-
-  if (f < 0)
-  {
-    decr(n);
-    f = f + 65536L;
-  }
-
-  p = get_node(glue_spec_size);
-  width(p) = mu_mult(width(g));
-  stretch_order(p) = stretch_order(g);
-
-  if (stretch_order(p) == normal)
-    stretch(p) = mu_mult(stretch(g));
-  else
-    stretch(p) = stretch(g);
-
-  shrink_order(p) = shrink_order(g);
-
-  if (shrink_order(p) == normal)
-    shrink(p) = mu_mult(shrink(g));
-  else
-    shrink(p) = shrink(g);
-
-  return p;
-}
-/* sec 0717 */
-void math_kern (pointer p, scaled m)
-{
-  integer n;
-  scaled f;
-
-  if (subtype(p) == mu_glue)
-  {
-    n = x_over_n(m, 65536L);
-    f = tex_remainder;
-
-    if (f < 0)
-    {
-      decr(n);
-      f = f + 65536L;
-    }
-
-    width(p) = mu_mult(width(p));
-    subtype(p) = explicit;
-  }
-}
-/* sec 0718 */
-void flush_math (void)
-{
-  flush_node_list(link(head));
-  flush_node_list(incompleat_noad);
-  link(head) = 0;
-  tail = head;
-  incompleat_noad = 0;
-}
-/* sec 0720 */
-pointer clean_box (pointer p, small_number s)
-{
-  pointer q;
-  small_number save_style;
-  pointer x;
-  pointer r;
-
-  switch (math_type(p))
-  {
-    case math_char:
-      {
-        cur_mlist = new_noad();
-        mem[nucleus(cur_mlist)] = mem[p];
-      }
-      break;
-
-    case sub_box:
-      {
-        q = info(p);
-        goto found;
-      }
-      break;
-
-    case sub_mlist:
-      cur_mlist = info(p);
-      break;
-
-    default:
-      {
-        q = new_null_box();
-        goto found;
-      }
-    break;
-  }
-
-  save_style = cur_style;
-  cur_style = s;
-  mlist_penalties = false;
-  mlist_to_hlist();
-  q = link(temp_head);
-  cur_style = save_style;
-
-  {
-    if (cur_style < script_style)
-      cur_size = text_size;
-    else
-      cur_size = 16 * ((cur_style - text_style) / 2);
-
-    cur_mu = x_over_n(math_quad(cur_size), 18);
-  }
-
-found:
-  if (is_char_node(q) || (q == 0))
-    x = hpack(q, 0, 1);
-  else if ((link(q) == 0) && (type(q) <= vlist_node) && (shift_amount(q) == 0))
-    x = q;
-  else
-    x = hpack(q, 0, 1);
-
-  q = list_ptr(x);
-
-  if (is_char_node(q))
-  {
-    r = link(q);
-
-    if (r != 0)
-      if (link(r) == 0)
-        if (!is_char_node(r))
-          if (type(r) == kern_node)
-          {
-            free_node(r, small_node_size);
-            link(q) = 0;
-          }
-  }
-
-  return x;
-}
-/* sec 0722 */
-void fetch (pointer a)
-{
-  cur_c = character(a);
-  cur_f = fam_fnt(fam(a) + cur_size);
-
-  if (cur_f == null_font)
-  {
-    print_err("");
-    print_size(cur_size);
-    print_char(' ');
-    print_int(fam(a));
-    prints(" is undefined (character ");
-    print(cur_c);
-    print_char(')');
-    help4("Somewhere in the math formula just ended, you used the",
-        "stated character from an undefined font family. For example,",
-        "plain TeX doesn't allow \\it or \\sl in subscripts. Proceed,",
-        "and I'll try to forget that I needed that character.");
-    error();
-    cur_i = null_character;
-    math_type(a) = 0;
-  }
-  else
-  {
-    if ((cur_c >= font_bc[cur_f]) && (cur_c <= font_ec[cur_f]))
-      cur_i = char_info(cur_f, cur_c);
-    else
-      cur_i = null_character;
-
-    if (!char_exists(cur_i))
-    {
-      char_warning(cur_f, cur_c);
-      math_type(a) = 0;
-    }
-  }
-}
-/* sec 0734 */
-void make_over (pointer q)
-{
-  info(nucleus(q)) = overbar(clean_box(nucleus(q), 2 * (cur_style / 2) + 1),
-      3 * default_rule_thickness, default_rule_thickness);
-  math_type(nucleus(q)) = sub_box;
-}
-/* sec 0735 */
-void make_under (pointer q)
-{
-  pointer p, x, y;
-  scaled delta;
-
-  x = clean_box(nucleus(q), cur_style);
-  p = new_kern(3 * default_rule_thickness);
-  link(x) = p;
-  link(p) = fraction_rule(default_rule_thickness);
-  y = vpackage(x, 0, 1, max_dimen);
-  delta = height(y) + depth(y) + default_rule_thickness;
-  height(y) = height(x);
-  depth(y) = delta - height(y);
-  info(nucleus(q)) = y;
-  math_type(nucleus(q)) = sub_box;
-}
-/* sec 0736 */
-void make_vcenter (pointer q)
-{ 
-  pointer v;
-  scaled delta;
-
-  v = info(nucleus(q));
-
-  if (type(v) != vlist_node)
-  {
-    confusion("vcenter");
-    return;
-  }
-
-  delta = height(v) + depth(v);
-  height(v) = axis_height(cur_size) + half(delta);
-  depth(v) = delta - height(v);
-}
-/* sec 0737 */
-void make_radical (pointer q)
-{
-  pointer x, y;
-  scaled delta, clr;
-
-  x = clean_box(nucleus(q), 2 * (cur_style / 2) + 1);
-
-  if (cur_style < text_style)
-    clr = default_rule_thickness + (abs(math_x_height(cur_size)) / 4);
-  else
-  {
-    clr = default_rule_thickness;
-    clr = clr + (abs(clr) / 4);
-  }
-
-  y = var_delimiter(left_delimiter(q), cur_size, height(x) + depth(x) + clr + default_rule_thickness);
-  delta = depth(y) -(height(x) + depth(x) + clr);
-
-  if (delta > 0)
-    clr = clr + half(delta);
-
-  shift_amount(y) = - (integer) (height(x) + clr);
-  link(y) = overbar(x, clr, height(y));
-  info(nucleus(q)) = hpack(y, 0, 1);
-  math_type(nucleus(q)) = sub_box;
-}
-/* sec 0738 */
-void make_math_accent (pointer q)
-{
-  pointer p, x, y;
-  integer a;
-  quarterword c;
-  internal_font_number f;
-  four_quarters i;
-  scaled s;
-  scaled h;
-  scaled delta;
-  scaled w;
-
-  fetch(accent_chr(q));
-
-  if (char_exists(cur_i))
-  {
-    i = cur_i;
-    c = cur_c;
-    f = cur_f;
-    s = 0;
-
-    if (math_type(nucleus(q)) == math_char)
-    {
-      fetch(nucleus(q));
-
-      if (char_tag(cur_i) == lig_tag)
-      {
-        a = lig_kern_start(cur_f, cur_i);
-        cur_i = font_info[a].qqqq;
-
-        if (skip_byte(cur_i) > stop_flag)
-        {
-          a = lig_kern_restart(cur_f, cur_i);
-          cur_i = font_info[a].qqqq;
-        }
-
-        while (true)
-        {
-          if (next_char(cur_i) == skew_char[cur_f])
-          {
-            if (op_byte(cur_i) >= kern_flag)
-              if (skip_byte(cur_i) <= stop_flag)
-                s = char_kern(cur_f, cur_i);
-
-            goto done1;
-          }
-
-          if (skip_byte(cur_i) >= stop_flag)
-            goto done1;
-
-          a = a + skip_byte(cur_i) + 1;
-          cur_i = font_info[a].qqqq;
-        }
-      }
-    }
-
-done1:
-    x = clean_box(nucleus(q), cramped_style(cur_style));
-    w = width(x);
-    h = height(x);
-
-    while (true)
-    {
-      if (char_tag(i) != list_tag)
-        goto done;
-
-      y = rem_byte(i);
-      i = char_info(f, y);
-
-      if (!char_exists(i))
-        goto done;
-
-      if (char_width(f, i) > w)
-        goto done;
-
-      c = y;
-    }
-
-done:
-    if (h < x_height(f))
-      delta = h;
-    else
-      delta = x_height(f);
-
-    if ((math_type(supscr(q)) != 0) || (math_type(subscr(q)) != 0))
-      if (math_type(nucleus(q)) == math_char)
-      {
-        flush_node_list(x);
-        x = new_noad();
-        mem[nucleus(x)] = mem[nucleus(q)];
-        mem[supscr(x)] = mem[supscr(q)];
-        mem[subscr(x)] = mem[subscr(q)];
-        mem[supscr(q)].hh = empty_field;
-        mem[subscr(q)].hh = empty_field;
-        math_type(nucleus(q)) = sub_mlist;
-        info(nucleus(q)) = x;
-        x = clean_box(nucleus(q), cur_style);
-        delta = delta + height(x) - h;
-        h = height(x);
-      }
-
-    y = char_box(f, c);
-    shift_amount(y) = s + half(w - width(y));
-    width(y) = 0;
-    p = new_kern(-(integer) delta);
-    link(p) = x;
-    link(y) = p;
-    y = vpackage(y, 0, 1, max_dimen);
-    width(y) = width(x);
-
-    if (height(y) < h)
-    {
-      p = new_kern(h - height(y));
-      link(p) = list_ptr(y);
-      list_ptr(y) = p;
-      height(y) = h;
-    }
-
-    info(nucleus(q)) = y;
-    math_type(nucleus(q)) = sub_box;
-  }
-}
-/* sec 0743 */
-void make_fraction (pointer q)
-{
-  pointer p, v, x, y, z;
-  scaled delta, delta1, delta2, shift_up, shift_down, clr;
-  
-  if (thickness(q) == default_code)
-    thickness(q) = default_rule_thickness;
-
-  x = clean_box(numerator(q), num_style(cur_style));
-  z = clean_box(denominator(q), denom_style(cur_style));
-
-  if (width(x) < width(z))
-    x = rebox(x, width(z));
-  else
-    z = rebox(z, width(x));
-
-  if (cur_style < text_style)
-  {
-    shift_up = num1(cur_size);
-    shift_down = denom1(cur_size);
-  }
-  else
-  {
-    shift_down = denom2(cur_size);
-
-    if (thickness(q) != 0)
-      shift_up = num2(cur_size);
-    else
-      shift_up = num3(cur_size);
-  }
-
-  if (thickness(q) == 0)
-  {
-    if (cur_style < text_style)
-      clr = 7 * default_rule_thickness;
-    else
-      clr = 3 * default_rule_thickness;
-
-    delta = half(clr - ((shift_up - depth(x)) - (height(z) - shift_down)));
-
-    if (delta > 0)
-    {
-      shift_up = shift_up + delta;
-      shift_down = shift_down + delta;
-    }
-  }
-  else
-  {
-    if (cur_style < text_style)
-      clr = 3 * thickness(q);
-    else
-      clr = thickness(q);
-
-    delta = half(thickness(q));
-    delta1 = clr - ((shift_up - depth(x)) - (axis_height(cur_size) + delta));
-    delta2 = clr - ((axis_height(cur_size) - delta) - (height(z) - shift_down));
-
-    if (delta1 > 0)
-      shift_up = shift_up + delta1;
-
-    if (delta2 > 0)
-      shift_down = shift_down + delta2;
-  }
-
-  v = new_null_box();
-  type(v) = vlist_node;
-  height(v) = shift_up + height(x);
-  depth(v) = depth(z) + shift_down;
-  width(v) = width(x);
-
-  if (thickness(q) == 0)
-  {
-    p = new_kern((shift_up - depth(x)) - (height(z) - shift_down));
-    link(p) = z;
-  }
-  else
-  {
-    y = fraction_rule(thickness(q));
-    p = new_kern((axis_height(cur_size) - delta) - (height(z) - shift_down));
-    link(y) = p;
-    link(p) = z;
-    p = new_kern((shift_up - depth(x)) - (axis_height(cur_size) + delta));
-    link(p) = y;
-  }
-
-  link(x) = p;
-  list_ptr(v) = x;
-
-  if (cur_style < text_style)
-    delta = delim1(cur_size);
-  else
-    delta = delim2(cur_size);
-
-  x = var_delimiter(left_delimiter(q), cur_size, delta);
-  link(x) = v;
-  z = var_delimiter(right_delimiter(q), cur_size, delta);
-  link(v) = z;
-  new_hlist(q) = hpack(x, 0, 1);
-}
-/* sec 0752 */
-void make_ord (pointer q)
-{
-  integer a;
-  pointer p, r;
-
-restart:
-  if (math_type(subscr(q)) == 0)
-    if (math_type(supscr(q)) == 0)
-      if (math_type(nucleus(q)) == math_char)
-      {
-        p = link(q);
-
-        if (p != 0)
-          if ((type(p) >= ord_noad) && (type(p) <= punct_noad))
-            if (math_type(nucleus(p)) == math_char)
-              if (fam(nucleus(p)) == fam(nucleus(q)))
-              {
-                math_type(nucleus(q)) = math_text_char;
-                fetch(nucleus(q));
-
-                if (char_tag(cur_i) == lig_tag)
-                {
-                  a = lig_kern_start(cur_f, cur_i);
-                  cur_c = character(nucleus(p));
-                  cur_i = font_info[a].qqqq;
-
-                  if (skip_byte(cur_i) > stop_flag)
-                  {
-                    a = lig_kern_restart(cur_f, cur_i);
-                    cur_i = font_info[a].qqqq;
-                  }
-
-                  while (true)
-                  {
-                    if (next_char(cur_i) == cur_c)
-                      if (skip_byte(cur_i) <= stop_flag)
-                        if (op_byte(cur_i) >= kern_flag)
-                        {
-                          p = new_kern(char_kern(cur_f, cur_i));
-                          link(p) = link(q);
-                          link(q) = p;
-                          return;
-                        }
-                        else
-                        {
-                          check_interrupt();
-
-                          switch (op_byte(cur_i))
-                          {
-                            case 1:
-                            case 5:
-                              character(nucleus(q)) = rem_byte(cur_i);
-                              break;
-                            case 2:
-                            case 6:
-                              character(nucleus(p)) = rem_byte(cur_i);
-                              break;
-                            case 3:
-                            case 7:
-                            case 11:
-                              {
-                                r = new_noad();
-                                character(nucleus(r)) = rem_byte(cur_i);
-                                fam(nucleus(r)) = fam(nucleus(q));
-                                link(q) = r;
-                                link(r) = p;
-
-                                if (op_byte(cur_i) < 11)
-                                  math_type(nucleus(r)) = math_char;
-                                else
-                                  math_type(nucleus(r)) = math_text_char;
-                              }
-                              break;
-
-                            default:
-                              {
-                                link(q) = link(p);
-                                character(nucleus(q)) = rem_byte(cur_i);
-                                mem[subscr(q)] = mem[subscr(p)];
-                                mem[supscr(q)] = mem[supscr(p)];
-                                free_node(p, noad_size);
-                              }
-                              break;
-                          }
-
-                          if (op_byte(cur_i) > 3)
-                            return;
-
-                          math_type(nucleus(q)) = math_char;
-                          goto restart;
-                        }
-
-                    if (skip_byte(cur_i) >= stop_flag)
-                      return;
-
-                    a = a + skip_byte(cur_i) + 1;
-                    cur_i = font_info[a].qqqq;
-                  }
-                }
-              }
-      }
-}
-/* sec 0762 */
-small_number make_left_right (pointer q, small_number style, scaled max_d, scaled max_h)
-{
-  scaled delta, delta1, delta2;
-
-  if (style < script_style)
-    cur_size = text_size;
-  else
-    cur_size = 16 * ((style - text_style) / 2);
-
-  delta2 = max_d + axis_height(cur_size);
-  delta1 = max_h + max_d - delta2;
-
-  if (delta2 > delta1)
-    delta1 = delta2;
-
-  delta = (delta1 / 500) * delimiter_factor;
-  delta2 = delta1 + delta1 - delimiter_shortfall;
-
-  if (delta < delta2)
-    delta = delta2;
-
-  new_hlist(q) = var_delimiter(delimiter(q), cur_size, delta);
-
-  return type(q) - (left_noad - open_noad);
-}
-/* sec 0726 */
-void mlist_to_hlist (void)
-{
-  pointer mlist;
-  boolean penalties;
-  small_number style;
-  small_number save_style;
-  pointer q;
-  pointer r;
-  /* small_number r_type; */
-  int r_type;
-  /* small_number t; */
-  int t;
-  pointer p, x, y, z;
-  integer pen;
-  small_number s;
-  scaled max_h, max_d;
-  scaled delta;
-
-  mlist = cur_mlist;
-  penalties = mlist_penalties;
-  style = cur_style;
-  q = mlist;
-  r = 0;
-  r_type = op_noad;
-  max_h = 0;
-  max_d = 0;
-
-  {
-    if (cur_style < script_style)
-      cur_size = text_size;
-    else
-      cur_size = 16 * ((cur_style - text_style) / 2);
-
-    cur_mu = x_over_n(math_quad(cur_size), 18);
-  }
-
-  while (q != 0)
-  {
-reswitch:
-    delta = 0;
-
-    switch (type(q))
-    {
-      case bin_noad:
-        switch (r_type)
-        {
-          case bin_noad:
-          case op_noad:
-          case rel_noad:
-          case open_noad:
-          case punct_noad:
-          case left_noad:
-            {
-              type(q) = ord_noad;
-              goto reswitch;
-            }
-            break;
-
-          default:
-            do_nothing();
-            break;
-        }
-        break;
-
-      case rel_noad:
-      case close_noad:
-      case punct_noad:
-      case right_noad:
-        {
-          if (r_type == bin_noad)
-            type(r) = ord_noad;
-
-          if (type(q) == right_noad)
-            goto done_with_noad;
-        }
-        break;
-
-      case left_noad:
-        goto done_with_noad;
-        break;
-
-      case fraction_noad:
-        {
-          make_fraction(q);
-          goto check_dimensions;
-        }
-        break;
-
-      case op_noad:
-        {
-          delta = make_op(q);
-
-          if (subtype(q) == limits)
-            goto check_dimensions;
-        }
-        break;
-
-      case ord_noad:
-        make_ord(q);
-        break;
-
-      case open_noad:
-      case inner_noad:
-        do_nothing();
-        break;
-
-      case radical_noad:
-        make_radical(q);
-        break;
-
-      case over_noad:
-        make_over(q);
-        break;
-
-      case under_noad:
-        make_under(q);
-        break;
-
-      case accent_noad:
-        make_math_accent(q);
-        break;
-
-      case vcenter_noad:
-        make_vcenter(q);
-        break;
-
-      case style_node:
-        {
-          cur_style = subtype(q);
-
-          {
-            if (cur_style < script_style)
-              cur_size = text_size;
-            else
-              cur_size = 16 * ((cur_style - text_style) / 2);
-
-            cur_mu = x_over_n(math_quad(cur_size), 18);
-          }
-
-          goto done_with_node;
-        }
-        break;
-
-      case choice_node:
-        {
-          switch (cur_style / 2)
-          {
-            case 0:
-              choose_mlist(display_mlist);
-              break;
-
-            case 1:
-              choose_mlist(text_mlist);
-              break;
-
-            case 2:
-              choose_mlist(script_mlist);
-              break;
-
-            case 3:
-              choose_mlist(script_script_mlist);
-              break;
-          }
-
-          flush_node_list(display_mlist(q));
-          flush_node_list(text_mlist(q));
-          flush_node_list(script_mlist(q));
-          flush_node_list(script_script_mlist(q));
-          type(q) = style_node;
-          subtype(q) = cur_style;
-          width(q) = 0;
-          depth(q) = 0;
-
-          if (p != 0)
-          {
-            z = link(q);
-            link(q) = p;
-
-            while (link(p) != 0)
-              p = link(p);
-
-            link(p) = z;
-          }
-
-          goto done_with_node;
-        }
-        break;
-
-      case ins_node:
-      case mark_node:
-      case adjust_node:
-      case whatsit_node:
-      case penalty_node:
-      case disc_node:
-        goto done_with_node;
-        break;
-
-      case rule_node:
-        {
-          if (height(q) > max_h)
-            max_h = height(q);
-
-          if (depth(q) > max_d)
-            max_d = depth(q);
-
-          goto done_with_node;
-        }
-        break;
-
-      case glue_node:
-        {
-          if (subtype(q) == mu_glue)
-          {
-            x = glue_ptr(q);
-            y = math_glue(x, cur_mu);
-            delete_glue_ref(x);
-            glue_ptr(q) = y;
-            subtype(q) = normal;
-          }
-          else if ((cur_size != text_size) && (subtype(q) == cond_math_glue))
-          {
-            p = link(q);
-
-            if (p != 0)
-              if ((type(q) == glue_node) || (type(p) == kern_node))
-              {
-                link(q) = link(p);
-                link(p) = 0;
-                flush_node_list(p);
-              }
-          }
-
-          goto done_with_node;
-        }
-        break;
-
-      case kern_node:
-        {
-          math_kern(q, cur_mu);
-          goto done_with_node;
-        }
-        break;
-
-      default:
-        {
-          confusion("mlist1");
-          return;
-        }
-        break;
-    }
-
-    switch (math_type(nucleus(q)))
-    {
-      case math_char:
-      case math_text_char:
-        {
-          fetch(nucleus(q));
-
-          if (char_exists(cur_i))
-          {
-            delta = char_italic(cur_f, cur_i);
-            p = new_character(cur_f, cur_c);
-
-            if ((math_type(nucleus(q)) == math_text_char) && (space(cur_f) != 0))
-              delta = 0;
-
-            if ((math_type(subscr(q)) == 0) && (delta != 0))
-            {
-              link(p) = new_kern(delta);
-              delta = 0;
-            }
-          }
-          else
-            p = 0;
-        }
-        break;
-
-      case 0:
-        p = 0;
-        break;
-
-      case sub_box:
-        p = info(nucleus(q));
-        break;
-
-      case sub_mlist:
-        {
-          cur_mlist = info(nucleus(q));
-          save_style = cur_style;
-          mlist_penalties = false;
-          mlist_to_hlist();
-          cur_style = save_style;
-
-          {
-            if (cur_style < script_style)
-              cur_size = text_size;
-            else
-              cur_size = 16 * ((cur_style - text_style) / 2);
-
-            cur_mu = x_over_n(math_quad(cur_size), 18);
-          }
-
-          p = hpack(link(temp_head), 0, 1);
-        }
-        break;
-
-      default:
-        {
-          confusion("mlist2");
-          return;
-        }
-        break;
-    }
-  
-    new_hlist(q) = p;
-
-    if ((math_type(subscr(q)) == 0) && (math_type(supscr(q)) == 0))
-      goto check_dimensions;
-
-    make_scripts(q, delta);
-
-check_dimensions:
-    z = hpack(new_hlist(q), 0, 1);
-
-    if (height(z) > max_h)
-      max_h = height(z);
-
-    if (depth(z) > max_d)
-      max_d = depth(z);
-
-    free_node(z, box_node_size);
-
-done_with_noad:
-    r = q;
-    r_type = type(r);
-
-done_with_node:
-    q = link(q);
-  }
-
-  if (r_type == bin_noad)
-    type(r) = ord_noad;
-
-  p = temp_head;
-  link(p) = 0;
-  q = mlist;
-  r_type = 0;
-  cur_style = style;
-
-  {
-    if (cur_style < script_style)
-      cur_size = text_size;
-    else
-      cur_size = 16 *((cur_style - text_style) / 2);
-
-    cur_mu = x_over_n(math_quad(cur_size), 18);
-  }
-
-  while (q != 0)
-  {
-    t = ord_noad;
-    s = noad_size;
-    pen = inf_penalty;
-
-    switch (type(q))
-    {
-      case op_noad:
-      case open_noad:
-      case close_noad:
-      case punct_noad:
-      case inner_noad:
-        t = type(q);
-        break;
-
-      case bin_noad:
-        {
-          t = bin_noad;
-          pen = bin_op_penalty;
-        }
-        break;
-
-      case rel_noad:
-        {
-          t = rel_noad;
-          pen = rel_penalty;
-        }
-        break;
-
-      case ord_noad:
-      case vcenter_noad:
-      case over_noad:
-      case under_noad:
-        do_nothing();
-        break;
-
-      case radical_noad:
-        s = radical_noad_size;
-        break;
-
-      case accent_noad:
-        s = accent_noad_size;
-        break;
-
-      case fraction_noad:
-        {
-          t = inner_noad;
-          s = fraction_noad_size;
-        }
-        break;
-
-      case left_noad:
-      case right_noad:
-        t = make_left_right(q, style, max_d, max_h);
-        break;
-
-      case style_node:
-        {
-          cur_style = subtype(q);
-          s = style_node_size;
-
-          {
-            if (cur_style < script_style)
-              cur_size = text_size;
-            else
-              cur_size = 16 *((cur_style - text_style) / 2);
-
-            cur_mu = x_over_n(math_quad(cur_size), 18);
-          }
-
-          goto delete_q;
-        }
-        break;
-
-      case whatsit_node:
-      case penalty_node:
-      case rule_node:
-      case disc_node:
-      case adjust_node:
-      case ins_node:
-      case mark_node:
-      case glue_node:
-      case kern_node:
-        {
-          link(p) = q;
-          p = q;
-          q = link(q);
-          link(p) = 0;
-          goto done;
-        }
-        break;
-
-      default:
-        {
-          confusion("mlist3");
-          return;
-        }
-        break;
-    }
-
-    if (r_type > 0)
-    {
-      switch (str_pool[r_type * 8 + t + magic_offset])
-      {
-        case '0':
-          x = 0;
-          break;
-
-        case '1':
-          if (cur_style < script_style)
-            x = thin_mu_skip_code;
-          else
-            x = 0;
-          break;
-
-        case '2':
-          x = thin_mu_skip_code;
-          break;
-
-        case '3':
-          if (cur_style < script_style)
-            x = med_mu_skip_code;
-          else
-            x = 0;
-          break;
-
-        case '4':
-          if (cur_style < script_style)
-            x = thick_mu_skip_code;
-          else
-            x = 0;
-          break;
-
-        default:
-          {
-            confusion("mlist4");
-            return;
-          }
-          break;
-      }
-
-      if (x != 0)
-      {
-        y = math_glue(glue_par(x), cur_mu);
-        z = new_glue(y);
-        glue_ref_count(y) = 0;
-        link(p) = z;
-        p = z;
-        subtype(z) = x + 1;
-      }
-    }
-
-    if (new_hlist(q) != 0)
-    {
-      link(p) = new_hlist(q);
-
-      do
-        {
-          p = link(p);
-        }
-      while (!(link(p) == 0));
-    }
-
-    if (penalties)
-      if (link(q) != 0)
-        if (pen < inf_penalty)
-        {
-          r_type = type(link(q));
-
-          if (r_type != penalty_node)
-            if (r_type != rel_noad)
-            {
-              z = new_penalty(pen);
-              link(p) = z;
-              p = z;
-            }
-        }
-
-    r_type = t;
-
-delete_q:
-    r = q;
-    q = link(q);
-    free_node(r, s);
-done:;
-  }
-}
-/* sec 0772 */
-void push_alignment (void)
-{
-  pointer p;
-
-  p = get_node(align_stack_node_size);
-  link(p) = align_ptr;
-  info(p) = cur_align;
-  llink(p) = preamble;
-  rlink(p) = cur_span;
-  mem[p + 2].cint = cur_loop;
-  mem[p + 3].cint = align_state;
-  info(p + 4) = cur_head;
-  link(p + 4) = cur_tail;
-  align_ptr = p;
-  cur_head = get_avail();
-}
-/* sec 0772 */
-void pop_alignment (void)
-{
-  pointer p;
-
-  free_avail(cur_head);
-  p = align_ptr;
-  cur_tail = link(p + 4);
-  cur_head = info(p + 4);
-  align_state = mem[p + 3].cint;
-  cur_loop = mem[p + 2].cint;
-  cur_span = rlink(p);
-  preamble = llink(p);
-  cur_align = info(p);
-  align_ptr = link(p);
-  free_node(p, align_stack_node_size);
-}
-/* sec 0782 */
-void get_preamble_token (void)
-{
-restart:
-  get_token();
-
-  while ((cur_chr == span_code) && (cur_cmd == tab_mark))
-  {
-    get_token();
-
-    if (cur_cmd > max_command)
-    {
-      expand();
-      get_token();
-    }
-  }
-
-  if (cur_cmd == endv)
-  {
-    fatal_error("(interwoven alignment preambles are not allowed)");
-    return;
-  }
-
-  if ((cur_cmd == assign_glue) && (cur_chr == glue_base + tab_skip_code))
-  {
-    scan_optional_equals();
-    scan_glue(glue_val);
-
-    if (global_defs > 0)
-      geq_define(glue_base + tab_skip_code, glue_ref, cur_val);
-    else
-      eq_define(glue_base + tab_skip_code, glue_ref, cur_val);
-
-    goto restart;
-  }
-}
-/* sec 0774 */
-void init_align (void)
-{
-  pointer save_cs_ptr;
-  pointer p;
-
-  save_cs_ptr = cur_cs;
-  push_alignment();
-  align_state = -1000000L;
-
-  if ((mode == mmode) && ((tail != head) || (incompleat_noad != 0)))
-  {
-    print_err("Improper ");
-    print_esc("halign");
-    prints(" inside $$'s");
-    help3("Displays can use special alignments (like \\eqalignno)",
-        "only if nothing but the alignment itself is between $$'s.",
-        "So I've deleted the formulas that preceded this alignment.");
-    error();
-    flush_math();
-  }
-
-  push_nest();
-
-  if (mode == mmode)
-  {
-    mode = -vmode;
-    prev_depth = nest[nest_ptr - 2].aux_field.cint;
-  }
-  else if (mode > 0)
-    mode = - (integer) mode;
-
-  scan_spec(align_group, false);
-  preamble = 0;
-  cur_align = align_head;
-  cur_loop = 0;
-  scanner_status = aligning;
-  warning_index = save_cs_ptr;
-  align_state = -1000000L;
-
-  while (true)
-  {
-    link(cur_align) = new_param_glue(tab_skip_code);
-    cur_align = link(cur_align);
-
-    if (cur_cmd == car_ret)
-      goto done;
-
-    p = hold_head;
-    link(p) = 0;
-
-    while (true)
-    {
-      get_preamble_token();
-
-      if (cur_cmd == mac_param)
-        goto done1;
-
-      if ((cur_cmd <= car_ret) && (cur_cmd >= tab_mark) && (align_state == -1000000L))
-        if ((p == hold_head) && (cur_loop == 0) && (cur_cmd == tab_mark))
-          cur_loop = cur_align;
-        else
-        {
-          print_err("Missing # inserted in alignment preamble");
-          help3("There should be exactly one # between &'s, when an",
-              "\\halign or \\valign is being set up. In this case you had",
-              "none, so I've put one in; maybe that will work.");
-          back_error();
-          goto done1;
-        }
-      else if ((cur_cmd != spacer) || (p != hold_head))
-      {
-        link(p) = get_avail();
-        p = link(p);
-        info(p) = cur_tok;
-      }
-    }
-
-done1:
-    link(cur_align) = new_null_box();
-    cur_align = link(cur_align);
-    info(cur_align) = end_span;
-    width(cur_align) = null_flag;
-    u_part(cur_align) = link(hold_head);
-    p = hold_head;
-    link(p) = 0;
-
-    while (true)
-    {
-continu:
-      get_preamble_token();
-
-      if ((cur_cmd <= car_ret) && (cur_cmd >= tab_mark) && (align_state == -1000000L))
-        goto done2;
-
-      if (cur_cmd == mac_param)
-      {
-        print_err("Only one # is allowed per tab");
-        help3("There should be exactly one # between &'s, when an",
-            "\\halign or \\valign is being set up. In this case you had",
-            "more than one, so I'm ignoring all but the first.");
-        error();
-        goto continu;
-      }
-
-      link(p) = get_avail();
-      p = link(p);
-      info(p) = cur_tok;
-    }
-
-done2:
-    link(p) = get_avail();
-    p = link(p);
-    info(p) = end_template_token;
-    v_part(cur_align) = link(hold_head);
-  }
-
-done:
-  scanner_status = 0;
-  new_save_level(align_group);
-
-  if (every_cr != 0)
-    begin_token_list(every_cr, every_cr_text);
-
-  align_peek();
-}
-/* sec 0787 */
-void init_span (pointer p)
-{
-  push_nest();
-
-  if (mode == -hmode)
-    space_factor = 1000;
-  else
-  {
-    prev_depth = ignore_depth;
-    normal_paragraph();
-  }
-
-  cur_span = p;
-}
-/* sec 0786 */
-void init_row (void)
-{
-  push_nest();
-
-  mode = (-hmode - vmode) - mode;
-
-  if (mode == -hmode)
-    space_factor = 0;
-  else
-    prev_depth = 0;
-
-  tail_append(new_glue(glue_ptr(preamble)));
-  subtype(tail) = tab_skip_code + 1;
-  cur_align = link(preamble);
-  cur_tail = cur_head;
-  init_span(cur_align);
-}
-/* sec 0788 */
-void init_col (void)
-{
-  extra_info(cur_align) = cur_cmd;
-
-  if (cur_cmd == omit)
-    align_state = 0;
-  else
-  {
-    back_input();
-    begin_token_list(u_part(cur_align), u_template);
-  }
-}
-/* sec 0799 */
-void fin_row (void)
-{
-  pointer p;
-
-  if (mode == -hmode)
-  {
-    p = hpack(link(head), 0, 1);
-    pop_nest();
-    append_to_vlist(p);
-
-    if (cur_head != cur_tail)
-    {
-      link(tail) = link(cur_head);
-      tail = cur_tail;
-    }
-  }
-  else
-  {
-    p = vpackage(link(head), 0, 1, max_dimen);
-    pop_nest();
-    link(tail) = p;
-    tail = p;
-    space_factor = 1000;
-  }
-
-  type(p) = unset_node;
-  glue_stretch(p) = 0;
-
-  if (every_cr != 0)
-    begin_token_list(every_cr, every_cr_text);
-
-  align_peek();
-}
-/* sec 0800 */
-void fin_align (void)
-{
-  pointer p, q, r, s, u, v;
-  scaled t, w;
-  scaled o;
-  halfword n;
-  scaled rule_save;
-  memory_word aux_save;
-
-  if (cur_group != align_group)
-  {
-    confusion("align1");
-    return;
-  }
-
-  unsave();
-
-  if (cur_group != align_group)
-  {
-    confusion("align0");
-    return;
-  }
-
-  unsave();
-
-  if (nest[nest_ptr - 1].mode_field == mmode)
-    o = display_indent;
-  else
-    o = 0;
-
-  q = link(preamble);
-
-  do
-    {
-      flush_list(u_part(q));
-      flush_list(v_part(q));
-      p = link(link(q));
-
-      if (width(q) == null_flag)
-      {
-        width(q) = 0;
-        r = link(q);
-        s = glue_ptr(r);
-
-        if (s != zero_glue)
-        {
-          add_glue_ref(zero_glue);
-          delete_glue_ref(s);
-          glue_ptr(c) = zero_glue;
-        }
-      }
-
-      if (info(q) != end_span)
-      {
-        t = width(q) + width(glue_ptr(link(q)));
-        r = info(q);
-        s = end_span;
-        info(s) = p;
-        n = min_quarterword + 1;
-
-        do
-          {
-            width(r) = width(r) - t;
-            u = info(r);
-
-            while (link(r) > n)
-            {
-              s = info(s);
-              n = link(info(s)) + 1;
-            }
-
-            if (link(r) < n)
-            {
-              info(r) = info(s);
-              info(s) = r;
-              decr(link(r));
-              s = r;
-            }
-            else
-            {
-              if (width(r) > width(info(s)))
-                width(info(s)) = width(r);
-
-              free_node(r, span_node_size);
-            }
-
-            r = u;
-          }
-        while (!(r == end_span));
-      }
-
-      type(q) = unset_node;
-      span_count(q) = min_quarterword;
-      height(q) = 0;
-      depth(q) = 0;
-      glue_order(q) = normal;
-      glue_sign(q) = normal;
-      glue_stretch(q) = 0;
-      glue_shrink(q) = 0;
-      q = p;
-    }
-  while (!(q == 0));
-
-  save_ptr = save_ptr - 2;
-  pack_begin_line = - (integer) mode_line;
-
-  if (mode == -vmode)
-  {
-    rule_save = overfull_rule;
-    overfull_rule = 0;
-    p = hpack(preamble, saved(1), saved(0));
-    overfull_rule = rule_save;
-  }
-  else
-  {
-    q = link(preamble);
-
-    do
-      {
-        height(q) = width(q);
-        width(q) = 0;
-        q = link(link(q));
-      }
-    while (!(q == 0));
-
-    p = vpackage(preamble, saved(1), saved(0), max_dimen);
-    q = link(preamble);
-
-    do
-      {
-        width(q) = height(q);
-        height(q) = 0;
-        q = link(link(q));
-      }
-    while (!(q == 0));
-  }
-
-  pack_begin_line = 0;
-  q = link(head);
-  s = head;
-
-  while (q != 0)
-  {
-    if (!is_char_node(q))
-      if (type(q) == unset_node)
-      {
-        if (mode == -vmode)
-        {
-          type(q) = hlist_node;
-          width(q) = width(p);
-        }
-        else
-        {
-          type(q) = vlist_node;
-          height(q) = height(p);
-        }
-
-        glue_order(q) = glue_order(p);
-        glue_sign(q) = glue_sign(p);
-        glue_set(q) = glue_set(p);
-        shift_amount(q) = o;
-        r = link(list_ptr(q));
-        s = link(list_ptr(p));
-
-        do
-          {
-            n = span_count(r);
-            t = width(s);
-            w = t;
-            u = hold_head;
-
-            while (n > min_quarterword)
-            {
-              decr(n);
-              s = link(s);
-              v = glue_ptr(s);
-              link(u) = new_glue(v);
-              u = link(u);
-              subtype(u) = tab_skip_code + 1;
-              t = t + width(v);
-
-              if (glue_sign(p) == stretching)
-              {
-                if (stretch_order(v) == glue_order(p))
-                  t = t + round(glue_set(p) * stretch(v));
-              }
-              else if (glue_sign(p) == shrinking)
-              {
-                if (shrink_order(v) == glue_order(p))
-                  t = t - round(glue_set(p) * shrink(v));
-              }
-
-              s = link(s);
-              link(u) = new_null_box();
-              u = link(u);
-              t = t + width(s);
-
-              if (mode == -vmode)
-                width(u) = width(s);
-              else
-              {
-                type(u) = vlist_node;
-                height(u) = width(s);
-              }
-            }
-            
-
-            if (mode == -vmode)
-            {
-              height(r) = height(q);
-              depth(r) = depth(q);
-
-              if (t == width(r))
-              {
-                glue_sign(r) = normal;
-                glue_order(r) = normal;
-                glue_set(r) = 0.0;
-              }
-              else if (t > width(r))
-              {
-                glue_sign(r) = stretching;
-
-                if (glue_stretch(r) == 0)
-                  glue_set(r) = 0.0;
-                else
-                  glue_set(r) = (t - width(r)) / ((double) glue_stretch(r));
-              }
-              else
-              {
-                glue_order(r) = glue_sign(r);
-                glue_sign(r) = shrinking;
-
-                if (glue_shrink(r) == 0)
-                  glue_set(r) = 0.0;
-                else if ((glue_order(r) == normal) && (width(r) - t > glue_shrink(r)))
-                  glue_set(r) = 1.0;
-                else
-                  glue_set(r) = (width(r) - t)/ ((double) glue_shrink(r));
-              }
-
-              width(r) = w;
-              type(r) = hlist_node;
-            }
-            else
-            {
-              width(r) = width(q);
-
-              if (t == height(r))
-              {
-                glue_sign(r) = normal;
-                glue_order(r) = normal;
-                glue_set(r) = 0.0;
-              }
-              else if (t > height(r))
-              {
-                glue_sign(r) = stretching;
-
-                if (glue_stretch(r) == 0)
-                  glue_set(r) = 0.0;
-                else
-                  glue_set(r) = (t - height(r)) / ((double) glue_stretch(r));
-              }
-              else
-              {
-                glue_order(r) = glue_sign(r);
-                glue_sign(r) = shrinking;
-
-                if (glue_shrink(r) == 0)
-                  glue_set(r) = 0.0;
-                else if ((glue_order(r) == normal) && (height(r) - t > glue_shrink(r)))
-                  glue_set(r) = 1.0;
-                else
-                  glue_set(r) = (height(r) - t) / ((double) glue_shrink(r));
-              }
-
-              height(r) = w;
-              type(r) = vlist_node;
-            }
-
-            shift_amount(r) = 0;
-
-            if (u != hold_head)
-            {
-              link(u) = link(r);
-              link(r) = link(hold_head);
-              r = u;
-            }
-
-            r = link(link(r));
-            s = link(link(s));
-          }
-        while (!(r == 0));
-      }
-      else if (type(q) == rule_node)
-      {
-        if (is_running(width(q)))
-          width(q) = width(p);
-
-        if (is_running(height(q)))
-          height(q) = height(p);
-
-        if (is_running(depth(q)))
-          depth(q) = depth(p);
-
-        if (o != 0)
-        {
-          r = link(q);
-          link(q) = 0;
-          q = hpack(q, 0, 1);
-          shift_amount(q) = o;
-          link(q) = r;
-          link(s) = q;
-        }
-      }
-    s = q;
-    q = link(q);
-  }
-
-  flush_node_list(p);
-  pop_alignment();
-  aux_save = cur_list.aux_field;
-  p = link(head);
-  q = tail;
-  pop_nest();
-
-  if (mode == mmode)
-  {
-    do_assignments();
-
-    if (cur_cmd != math_shift)
-    {
-      print_err("Missing $$ inserted");
-      help2("Displays can use special alignments (like \\eqalignno)",
-          "only if nothing but the alignment itself is between $$'s.");
-      back_error();
-    }
-    else
-    {
-      get_x_token();
-
-      if (cur_cmd != math_shift)
-      {
-        print_err("Display math should end with $$");
-        help2("The `$' that I just saw supposedly matches a previous `$$'.",
-            "So I shall assume that you typed `$$' both times.");
-        back_error();
-      }
-    }
-
-    pop_nest();
-    tail_append(new_penalty(pre_display_penalty));
-    tail_append(new_param_glue(above_display_skip_code));
-    link(tail) = p;
-
-    if (p != 0)
-      tail = q;
-
-    tail_append(new_penalty(post_display_penalty));
-    tail_append(new_param_glue(below_display_skip_code));
-    prev_depth = aux_save.cint;
-    resume_after_display();
-  }
-  else
-  {
-    cur_list.aux_field = aux_save;
-    link(tail) = p;
-
-    if (p != 0)
-      tail = q;
-
-    if (mode == vmode)
-      build_page();
-  }
-}
-/* sec 0791 */
-boolean fin_col (void)
-{
-  pointer p;
-  pointer q, r;
-  pointer s;
-  pointer u;
-  scaled w;
-  glue_ord o;
-  halfword n;
-
-  if (cur_align == 0)
-  {
-    confusion("endv");
-    return 0;
-  }
-
-  q = link(cur_align);
-
-  if (q == 0)
-  {
-    confusion("endv");
-    return 0;
-  }
-
-  if (align_state < 500000L)
-  {
-    fatal_error("(interwoven alignment preambles are not allowed)");
-    return 0;
-  }
-
-  p = link(q);
-
-  if ((p == 0) && (extra_info(cur_align) < cr_code))
-    if (cur_loop != 0)
-    {
-      link(q) = new_null_box();
-      p = link(q);
-      info(p) = end_span;
-      width(p) = null_flag;
-      cur_loop = link(cur_loop);
-      q = hold_head;
-      r = u_part(cur_loop);
-
-      while (r != 0)
-      {
-        link(q) = get_avail();
-        q = link(q);
-        info(q) = info(r);
-        r = link(r);
-      }
-
-      link(q) = 0;
-      u_part(p) = link(hold_head);
-      q = hold_head;
-      r = v_part(cur_loop);
-
-      while (r != 0)
-      {
-        link(q) = get_avail();
-        q = link(q);
-        info(q) = info(r);
-        r = link(r);
-      }
-
-      link(q) = 0;
-      v_part(p) = link(hold_head);
-      cur_loop = link(cur_loop);
-      link(p) = new_glue(glue_ptr(cur_loop));
-    }
-    else
-    {
-      print_err("Extra alignment tab has been changed to ");
-      print_esc("cr");
-      help3("You have given more \\span or & marks than there were",
-          "in the preamble to the \\halign or \\valign now in progress.",
-          "So I'll assume that you meant to type \\cr instead.");
-      extra_info(cur_align) = cr_code;
-      error();
-    }
-
-  if (extra_info(cur_align) != span_code)
-  {
-    unsave();
-    new_save_level(align_group);
-
-    {
-      if (mode == -hmode)
-      {
-        adjust_tail = cur_tail;
-        u = hpack(link(head), 0, 1);
-        w = width(u);
-        cur_tail = adjust_tail;
-        adjust_tail = 0;
-      }
-      else
-      {
-        u = vpackage(link(head), 0, 1, 0);
-        w = height(u);
-      }
-
-      n = min_quarterword;
-
-      if (cur_span != cur_align)
-      {
-        q = cur_span;
-
-        do
-          {
-            incr(n);
-            q = link(link(q));
-          }
-        while (!(q == cur_align));
-
-        if (n > max_quarterword)
-        {
-          confusion("256 spans");
-          return 0;
-        }
-
-        q = cur_span;
-
-        while (link(info(q)) < n)
-          q = info(q);
-
-        if (link(info(q)) > n)
-        {
-          s = get_node(span_node_size);
-          info(s) = info(q);
-          link(s) = n;
-          info(q) = s;
-          width(s) = w;
-        }
-        else if (width(info(q)) < w)
-          width(info(q)) = w;
-      }
-      else if (w > width(cur_align))
-        width(cur_align) = w;
-
-      type(u) = unset_node;
-      span_count(u) = n;
-
-      if (total_stretch[filll] != 0)
-        o = filll;
-      else if (total_stretch[fill] != 0)
-        o = fill;
-      else if (total_stretch[fil] != 0)
-        o = fil;
-      else
-        o = normal;
-
-      glue_order(u) = o;
-      glue_stretch(u) = total_stretch[o];
-
-      if (total_shrink[filll] != 0)
-        o = filll;
-      else if (total_shrink[fill] != 0)
-        o = fill;
-      else if (total_shrink[fil] != 0)
-        o = fil;
-      else
-        o = normal;
-
-      glue_sign(u) = o;
-      glue_shrink(u) = total_shrink[o];
-      pop_nest();
-      link(tail) = u;
-      tail = u;
-    }
-
-    tail_append(new_glue(glue_ptr(link(cur_align))));
-    subtype(tail) = tab_skip_code + 1;
-
-    if (extra_info(cur_align) >= cr_code)
-    {
-      return true;
-    }
-
-    init_span(p);
-  }
-
-  align_state = 1000000L;
-
-  do
-    {
-      get_x_token();
-    }
-  while (!(cur_cmd != spacer));
-
-  cur_align = p;
-  init_col();
-
-  return false;
-}
-/* sec 0749 */
-scaled make_op (pointer q)
-{
-  scaled delta;
-  pointer p, v, x, y, z;
-  quarterword c;
-  four_quarters i;
-  scaled shift_up, shift_down;
-
-  if ((subtype(q) == normal) && (cur_style < text_style))
-    subtype(q) = limits;
-
-  if (math_type(nucleus(q)) == math_char)
-  {
-    fetch(nucleus(q));
-
-    if ((cur_style < text_style) && (char_tag(cur_i) == list_tag))
-    {
-      c = rem_byte(cur_i);
-      i = char_info(cur_f, c);
-
-      if (char_exists(i))
-      {
-        cur_c = c;
-        cur_i = i;
-        character(nucleus(q)) = c;
-      }
-    }
-
-    delta = char_italic(cur_f, cur_i);
-    x = clean_box(nucleus(q), cur_style);
-
-    if ((math_type(subscr(q)) != 0) && (subtype(q) != limits))
-      width(x) = width(x) - delta;
-
-    shift_amount(x) = half(height(x) - depth(x)) - axis_height(cur_size);
-    math_type(nucleus(q)) = sub_box;
-    info(nucleus(q)) = x;
-  }
-  else
-    delta = 0;
-
-  if (subtype(q) == limits)
-  {
-    x = clean_box(supscr(q), sup_style(cur_style));
-    y = clean_box(nucleus(q), cur_style);
-    z = clean_box(subscr(q), sub_style(cur_style));
-    v = new_null_box();
-    type(v) = vlist_node;
-    width(v) = width(y);
-
-    if (width(x) > width(v))
-      width(v) = width(x);
-
-    if (width(z) > width(v))
-      width(v) = width(z);
-
-    x = rebox(x, width(v));
-    y = rebox(y, width(v));
-    z = rebox(z, width(v));
-    shift_amount(x) = half(delta);
-    shift_amount(z) = - (integer) shift_amount(x);
-    height(v) = height(y);
-    depth(v) = depth(y);
-
-    if (math_type(supscr(q)) == 0)
-    {
-      free_node(x, box_node_size);
-      list_ptr(v) = y;
-    }
-    else
-    {
-      shift_up = big_op_spacing3 - depth(x);
-
-      if (shift_up < big_op_spacing1)
-        shift_up = big_op_spacing1;
-
-      p = new_kern(shift_up);
-      link(p) = y;
-      link(x) = p;
-      p = new_kern(big_op_spacing5);
-      link(p) = x;
-      list_ptr(v) = p;
-      height(v) = height(v) + big_op_spacing5 + height(x) + depth(x) + shift_up;
-    }
-
-    if (math_type(subscr(q)) == 0)
-      free_node(z, box_node_size);
-    else
-    {
-      shift_down = big_op_spacing4 - height(z);
-
-      if (shift_down < big_op_spacing2)
-        shift_down = big_op_spacing2;
-
-      p = new_kern(shift_down);
-      link(y) = p;
-      link(p) = z;
-      p = new_kern(big_op_spacing5);
-      link(z) = p;
-      depth(v) = depth(v) + big_op_spacing5 + height(z) + depth(z) + shift_down;
-    }
-
-    new_hlist(q) = v;
-  }
-
-  return delta;
-}
-/* sec 0756 */
-void make_scripts (pointer q, scaled delta)
-{
-  pointer p, x, y, z;
-  scaled shift_up, shift_down, clr;
-  small_number t;
-
-  p = new_hlist(q);
-
-  if (is_char_node(p))
-  {
-    shift_up = 0;
-    shift_down = 0;
-  }
-  else
-  {
-    z = hpack(p, 0, 1);
-
-    if (cur_style < script_style)
-      t = script_size;
-    else
-      t = script_script_size;
-
-    shift_up = height(z) - sup_drop(t);
-    shift_down = depth(z) + sub_drop(t);
-    free_node(z, box_node_size);
-  }
-
-  if (math_type(supscr(q)) == 0)
-  {
-    x = clean_box(subscr(q), sub_style(cur_style));
-    width(x) = width(x) + script_space;
-
-    if (shift_down < sub1(cur_size))
-      shift_down = sub1(cur_size);
-
-    clr = height(x) -(abs(math_x_height(cur_size) * 4) / 5);
-
-    if (shift_down < clr)
-      shift_down = clr;
-
-    shift_amount(x) = shift_down;
-  }
-  else
-  {
-    {
-      x = clean_box(supscr(q), sup_style(cur_style));
-      width(x) = width(x) + script_space;
-
-      if (odd(cur_style))
-        clr = sup3(cur_size);
-      else if (cur_style < text_style)
-        clr = sup1(cur_size);
-      else
-        clr = sup2(cur_size);
-
-      if (shift_up < clr)
-        shift_up = clr;
-
-      clr = depth(x) +(abs(math_x_height(cur_size)) / 4);
-
-      if (shift_up < clr)
-        shift_up = clr;
-    }
-
-    if (math_type(subscr(q)) == 0)
-      shift_amount(x) = - (integer) shift_up;
-    else
-    {
-      y = clean_box(subscr(q), sub_style(cur_style));
-      width(y) = width(y) + script_space;
-
-      if (shift_down < sub2(cur_size))
-        shift_down = sub2(cur_size);
-
-      clr = 4 * default_rule_thickness - ((shift_up - depth(x)) - (height(y) - shift_down));
-
-      if (clr > 0)
-      {
-        shift_down = shift_down + clr;
-
-        clr = (abs(math_x_height(cur_size) * 4) / 5) - (shift_up - depth(x));
-
-        if (clr > 0)
-        {
-          shift_up = shift_up + clr;
-          shift_down = shift_down - clr;
-        }
-      }
-
-      shift_amount(x) = delta;
-      p = new_kern((shift_up - depth(x)) - (height(y) - shift_down));
-      link(x) = p;
-      link(p) = y;
-      x = vpackage(x, 0, 1, max_dimen);
-      shift_amount(x) = shift_down;
-    }
-  }
-
-  if (new_hlist(q) == 0)
-    new_hlist(q) = x;
-  else
-  {
-    p = new_hlist(q);
-
-    while (link(p) != 0)
-      p = link(p);
-
-    link(p) = x;
-  }
+/* Copyright 2014 Clerk Ma\r
+\r
+   This program is free software; you can redistribute it and/or modify\r
+   it under the terms of the GNU General Public License as published by\r
+   the Free Software Foundation; either version 2 of the License, or\r
+   (at your option) any later version.\r
+\r
+   This program is distributed in the hope that it will be useful, but\r
+   WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+   General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with this program; if not, write to the Free Software\r
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA\r
+   02110-1301 USA.  */\r
+\r
+#define EXTERN extern\r
+\r
+#include "yandytex.h"\r
+\r
+/* sec 0715 */\r
+pointer rebox (pointer b, scaled w)\r
+{\r
+  pointer p;\r
+  internal_font_number f;\r
+  scaled v;\r
+\r
+  if ((width(b) != w) && (list_ptr(b) != 0))\r
+  {\r
+    if (type(b) == vlist_node)\r
+      b = hpack(b, 0, 1);\r
+\r
+    p = list_ptr(b);\r
+\r
+    if ((is_char_node(p)) && (link(p) == 0))\r
+    {\r
+      f = font(p);\r
+      v = char_width(f, char_info(f, character(p)));\r
+\r
+      if (v != width(b))\r
+        link(p) = new_kern(width(b) - v);\r
+    }\r
+\r
+    free_node(b, box_node_size);\r
+    b = new_glue(ss_glue);\r
+    link(b) = p;\r
+\r
+    while (link(p) != 0)\r
+      p = link(p);\r
+\r
+    link(p) = new_glue(ss_glue);\r
+    return hpack(b, w, exactly);\r
+  }\r
+  else\r
+  {\r
+    width(b) = w;\r
+    return b;\r
+  }\r
+}\r
+/* sec 0716 */\r
+pointer math_glue (pointer g, scaled m)\r
+{\r
+  pointer p;\r
+  integer n;\r
+  scaled f;\r
+\r
+  n = x_over_n(m, 65536L);\r
+  f = tex_remainder;\r
+\r
+  if (f < 0)\r
+  {\r
+    decr(n);\r
+    f = f + 65536L;\r
+  }\r
+\r
+  p = get_node(glue_spec_size);\r
+  width(p) = mu_mult(width(g));\r
+  stretch_order(p) = stretch_order(g);\r
+\r
+  if (stretch_order(p) == normal)\r
+    stretch(p) = mu_mult(stretch(g));\r
+  else\r
+    stretch(p) = stretch(g);\r
+\r
+  shrink_order(p) = shrink_order(g);\r
+\r
+  if (shrink_order(p) == normal)\r
+    shrink(p) = mu_mult(shrink(g));\r
+  else\r
+    shrink(p) = shrink(g);\r
+\r
+  return p;\r
+}\r
+/* sec 0717 */\r
+void math_kern (pointer p, scaled m)\r
+{\r
+  integer n;\r
+  scaled f;\r
+\r
+  if (subtype(p) == mu_glue)\r
+  {\r
+    n = x_over_n(m, 65536L);\r
+    f = tex_remainder;\r
+\r
+    if (f < 0)\r
+    {\r
+      decr(n);\r
+      f = f + 65536L;\r
+    }\r
+\r
+    width(p) = mu_mult(width(p));\r
+    subtype(p) = explicit;\r
+  }\r
+}\r
+/* sec 0718 */\r
+void flush_math (void)\r
+{\r
+  flush_node_list(link(head));\r
+  flush_node_list(incompleat_noad);\r
+  link(head) = 0;\r
+  tail = head;\r
+  incompleat_noad = 0;\r
+}\r
+/* sec 0720 */\r
+pointer clean_box (pointer p, small_number s)\r
+{\r
+  pointer q;\r
+  small_number save_style;\r
+  pointer x;\r
+  pointer r;\r
+\r
+  switch (math_type(p))\r
+  {\r
+    case math_char:\r
+      {\r
+        cur_mlist = new_noad();\r
+        mem[nucleus(cur_mlist)] = mem[p];\r
+      }\r
+      break;\r
+\r
+    case sub_box:\r
+      {\r
+        q = info(p);\r
+        goto found;\r
+      }\r
+      break;\r
+\r
+    case sub_mlist:\r
+      cur_mlist = info(p);\r
+      break;\r
+\r
+    default:\r
+      {\r
+        q = new_null_box();\r
+        goto found;\r
+      }\r
+    break;\r
+  }\r
+\r
+  save_style = cur_style;\r
+  cur_style = s;\r
+  mlist_penalties = false;\r
+  mlist_to_hlist();\r
+  q = link(temp_head);\r
+  cur_style = save_style;\r
+\r
+  {\r
+    if (cur_style < script_style)\r
+      cur_size = text_size;\r
+    else\r
+      cur_size = 16 * ((cur_style - text_style) / 2);\r
+\r
+    cur_mu = x_over_n(math_quad(cur_size), 18);\r
+  }\r
+\r
+found:\r
+  if (is_char_node(q) || (q == 0))\r
+    x = hpack(q, 0, 1);\r
+  else if ((link(q) == 0) && (type(q) <= vlist_node) && (shift_amount(q) == 0))\r
+    x = q;\r
+  else\r
+    x = hpack(q, 0, 1);\r
+\r
+  q = list_ptr(x);\r
+\r
+  if (is_char_node(q))\r
+  {\r
+    r = link(q);\r
+\r
+    if (r != 0)\r
+      if (link(r) == 0)\r
+        if (!is_char_node(r))\r
+          if (type(r) == kern_node)\r
+          {\r
+            free_node(r, small_node_size);\r
+            link(q) = 0;\r
+          }\r
+  }\r
+\r
+  return x;\r
+}\r
+/* sec 0722 */\r
+void fetch (pointer a)\r
+{\r
+  cur_c = character(a);\r
+  cur_f = fam_fnt(fam(a) + cur_size);\r
+\r
+  if (cur_f == null_font)\r
+  {\r
+    print_err("");\r
+    print_size(cur_size);\r
+    print_char(' ');\r
+    print_int(fam(a));\r
+    prints(" is undefined (character ");\r
+    print(cur_c);\r
+    print_char(')');\r
+    help4("Somewhere in the math formula just ended, you used the",\r
+        "stated character from an undefined font family. For example,",\r
+        "plain TeX doesn't allow \\it or \\sl in subscripts. Proceed,",\r
+        "and I'll try to forget that I needed that character.");\r
+    error();\r
+    cur_i = null_character;\r
+    math_type(a) = 0;\r
+  }\r
+  else\r
+  {\r
+    if ((cur_c >= font_bc[cur_f]) && (cur_c <= font_ec[cur_f]))\r
+      cur_i = char_info(cur_f, cur_c);\r
+    else\r
+      cur_i = null_character;\r
+\r
+    if (!char_exists(cur_i))\r
+    {\r
+      char_warning(cur_f, cur_c);\r
+      math_type(a) = 0;\r
+    }\r
+  }\r
+}\r
+/* sec 0734 */\r
+void make_over (pointer q)\r
+{\r
+  info(nucleus(q)) = overbar(clean_box(nucleus(q), 2 * (cur_style / 2) + 1),\r
+      3 * default_rule_thickness, default_rule_thickness);\r
+  math_type(nucleus(q)) = sub_box;\r
+}\r
+/* sec 0735 */\r
+void make_under (pointer q)\r
+{\r
+  pointer p, x, y;\r
+  scaled delta;\r
+\r
+  x = clean_box(nucleus(q), cur_style);\r
+  p = new_kern(3 * default_rule_thickness);\r
+  link(x) = p;\r
+  link(p) = fraction_rule(default_rule_thickness);\r
+  y = vpackage(x, 0, 1, max_dimen);\r
+  delta = height(y) + depth(y) + default_rule_thickness;\r
+  height(y) = height(x);\r
+  depth(y) = delta - height(y);\r
+  info(nucleus(q)) = y;\r
+  math_type(nucleus(q)) = sub_box;\r
+}\r
+/* sec 0736 */\r
+void make_vcenter (pointer q)\r
+{ \r
+  pointer v;\r
+  scaled delta;\r
+\r
+  v = info(nucleus(q));\r
+\r
+  if (type(v) != vlist_node)\r
+  {\r
+    confusion("vcenter");\r
+    return;\r
+  }\r
+\r
+  delta = height(v) + depth(v);\r
+  height(v) = axis_height(cur_size) + half(delta);\r
+  depth(v) = delta - height(v);\r
+}\r
+/* sec 0737 */\r
+void make_radical (pointer q)\r
+{\r
+  pointer x, y;\r
+  scaled delta, clr;\r
+\r
+  x = clean_box(nucleus(q), 2 * (cur_style / 2) + 1);\r
+\r
+  if (cur_style < text_style)\r
+    clr = default_rule_thickness + (abs(math_x_height(cur_size)) / 4);\r
+  else\r
+  {\r
+    clr = default_rule_thickness;\r
+    clr = clr + (abs(clr) / 4);\r
+  }\r
+\r
+  y = var_delimiter(left_delimiter(q), cur_size, height(x) + depth(x) + clr + default_rule_thickness);\r
+  delta = depth(y) -(height(x) + depth(x) + clr);\r
+\r
+  if (delta > 0)\r
+    clr = clr + half(delta);\r
+\r
+  shift_amount(y) = - (integer) (height(x) + clr);\r
+  link(y) = overbar(x, clr, height(y));\r
+  info(nucleus(q)) = hpack(y, 0, 1);\r
+  math_type(nucleus(q)) = sub_box;\r
+}\r
+/* sec 0738 */\r
+void make_math_accent (pointer q)\r
+{\r
+  pointer p, x, y;\r
+  integer a;\r
+  quarterword c;\r
+  internal_font_number f;\r
+  four_quarters i;\r
+  scaled s;\r
+  scaled h;\r
+  scaled delta;\r
+  scaled w;\r
+\r
+  fetch(accent_chr(q));\r
+\r
+  if (char_exists(cur_i))\r
+  {\r
+    i = cur_i;\r
+    c = cur_c;\r
+    f = cur_f;\r
+    s = 0;\r
+\r
+    if (math_type(nucleus(q)) == math_char)\r
+    {\r
+      fetch(nucleus(q));\r
+\r
+      if (char_tag(cur_i) == lig_tag)\r
+      {\r
+        a = lig_kern_start(cur_f, cur_i);\r
+        cur_i = font_info[a].qqqq;\r
+\r
+        if (skip_byte(cur_i) > stop_flag)\r
+        {\r
+          a = lig_kern_restart(cur_f, cur_i);\r
+          cur_i = font_info[a].qqqq;\r
+        }\r
+\r
+        while (true)\r
+        {\r
+          if (next_char(cur_i) == skew_char[cur_f])\r
+          {\r
+            if (op_byte(cur_i) >= kern_flag)\r
+              if (skip_byte(cur_i) <= stop_flag)\r
+                s = char_kern(cur_f, cur_i);\r
+\r
+            goto done1;\r
+          }\r
+\r
+          if (skip_byte(cur_i) >= stop_flag)\r
+            goto done1;\r
+\r
+          a = a + skip_byte(cur_i) + 1;\r
+          cur_i = font_info[a].qqqq;\r
+        }\r
+      }\r
+    }\r
+\r
+done1:\r
+    x = clean_box(nucleus(q), cramped_style(cur_style));\r
+    w = width(x);\r
+    h = height(x);\r
+\r
+    while (true)\r
+    {\r
+      if (char_tag(i) != list_tag)\r
+        goto done;\r
+\r
+      y = rem_byte(i);\r
+      i = char_info(f, y);\r
+\r
+      if (!char_exists(i))\r
+        goto done;\r
+\r
+      if (char_width(f, i) > w)\r
+        goto done;\r
+\r
+      c = y;\r
+    }\r
+\r
+done:\r
+    if (h < x_height(f))\r
+      delta = h;\r
+    else\r
+      delta = x_height(f);\r
+\r
+    if ((math_type(supscr(q)) != 0) || (math_type(subscr(q)) != 0))\r
+      if (math_type(nucleus(q)) == math_char)\r
+      {\r
+        flush_node_list(x);\r
+        x = new_noad();\r
+        mem[nucleus(x)] = mem[nucleus(q)];\r
+        mem[supscr(x)] = mem[supscr(q)];\r
+        mem[subscr(x)] = mem[subscr(q)];\r
+        mem[supscr(q)].hh = empty_field;\r
+        mem[subscr(q)].hh = empty_field;\r
+        math_type(nucleus(q)) = sub_mlist;\r
+        info(nucleus(q)) = x;\r
+        x = clean_box(nucleus(q), cur_style);\r
+        delta = delta + height(x) - h;\r
+        h = height(x);\r
+      }\r
+\r
+    y = char_box(f, c);\r
+    shift_amount(y) = s + half(w - width(y));\r
+    width(y) = 0;\r
+    p = new_kern(-(integer) delta);\r
+    link(p) = x;\r
+    link(y) = p;\r
+    y = vpackage(y, 0, 1, max_dimen);\r
+    width(y) = width(x);\r
+\r
+    if (height(y) < h)\r
+    {\r
+      p = new_kern(h - height(y));\r
+      link(p) = list_ptr(y);\r
+      list_ptr(y) = p;\r
+      height(y) = h;\r
+    }\r
+\r
+    info(nucleus(q)) = y;\r
+    math_type(nucleus(q)) = sub_box;\r
+  }\r
+}\r
+/* sec 0743 */\r
+void make_fraction (pointer q)\r
+{\r
+  pointer p, v, x, y, z;\r
+  scaled delta, delta1, delta2, shift_up, shift_down, clr;\r
+  \r
+  if (thickness(q) == default_code)\r
+    thickness(q) = default_rule_thickness;\r
+\r
+  x = clean_box(numerator(q), num_style(cur_style));\r
+  z = clean_box(denominator(q), denom_style(cur_style));\r
+\r
+  if (width(x) < width(z))\r
+    x = rebox(x, width(z));\r
+  else\r
+    z = rebox(z, width(x));\r
+\r
+  if (cur_style < text_style)\r
+  {\r
+    shift_up = num1(cur_size);\r
+    shift_down = denom1(cur_size);\r
+  }\r
+  else\r
+  {\r
+    shift_down = denom2(cur_size);\r
+\r
+    if (thickness(q) != 0)\r
+      shift_up = num2(cur_size);\r
+    else\r
+      shift_up = num3(cur_size);\r
+  }\r
+\r
+  if (thickness(q) == 0)\r
+  {\r
+    if (cur_style < text_style)\r
+      clr = 7 * default_rule_thickness;\r
+    else\r
+      clr = 3 * default_rule_thickness;\r
+\r
+    delta = half(clr - ((shift_up - depth(x)) - (height(z) - shift_down)));\r
+\r
+    if (delta > 0)\r
+    {\r
+      shift_up = shift_up + delta;\r
+      shift_down = shift_down + delta;\r
+    }\r
+  }\r
+  else\r
+  {\r
+    if (cur_style < text_style)\r
+      clr = 3 * thickness(q);\r
+    else\r
+      clr = thickness(q);\r
+\r
+    delta = half(thickness(q));\r
+    delta1 = clr - ((shift_up - depth(x)) - (axis_height(cur_size) + delta));\r
+    delta2 = clr - ((axis_height(cur_size) - delta) - (height(z) - shift_down));\r
+\r
+    if (delta1 > 0)\r
+      shift_up = shift_up + delta1;\r
+\r
+    if (delta2 > 0)\r
+      shift_down = shift_down + delta2;\r
+  }\r
+\r
+  v = new_null_box();\r
+  type(v) = vlist_node;\r
+  height(v) = shift_up + height(x);\r
+  depth(v) = depth(z) + shift_down;\r
+  width(v) = width(x);\r
+\r
+  if (thickness(q) == 0)\r
+  {\r
+    p = new_kern((shift_up - depth(x)) - (height(z) - shift_down));\r
+    link(p) = z;\r
+  }\r
+  else\r
+  {\r
+    y = fraction_rule(thickness(q));\r
+    p = new_kern((axis_height(cur_size) - delta) - (height(z) - shift_down));\r
+    link(y) = p;\r
+    link(p) = z;\r
+    p = new_kern((shift_up - depth(x)) - (axis_height(cur_size) + delta));\r
+    link(p) = y;\r
+  }\r
+\r
+  link(x) = p;\r
+  list_ptr(v) = x;\r
+\r
+  if (cur_style < text_style)\r
+    delta = delim1(cur_size);\r
+  else\r
+    delta = delim2(cur_size);\r
+\r
+  x = var_delimiter(left_delimiter(q), cur_size, delta);\r
+  link(x) = v;\r
+  z = var_delimiter(right_delimiter(q), cur_size, delta);\r
+  link(v) = z;\r
+  new_hlist(q) = hpack(x, 0, 1);\r
+}\r
+/* sec 0752 */\r
+void make_ord (pointer q)\r
+{\r
+  integer a;\r
+  pointer p, r;\r
+\r
+restart:\r
+  if (math_type(subscr(q)) == 0)\r
+    if (math_type(supscr(q)) == 0)\r
+      if (math_type(nucleus(q)) == math_char)\r
+      {\r
+        p = link(q);\r
+\r
+        if (p != 0)\r
+          if ((type(p) >= ord_noad) && (type(p) <= punct_noad))\r
+            if (math_type(nucleus(p)) == math_char)\r
+              if (fam(nucleus(p)) == fam(nucleus(q)))\r
+              {\r
+                math_type(nucleus(q)) = math_text_char;\r
+                fetch(nucleus(q));\r
+\r
+                if (char_tag(cur_i) == lig_tag)\r
+                {\r
+                  a = lig_kern_start(cur_f, cur_i);\r
+                  cur_c = character(nucleus(p));\r
+                  cur_i = font_info[a].qqqq;\r
+\r
+                  if (skip_byte(cur_i) > stop_flag)\r
+                  {\r
+                    a = lig_kern_restart(cur_f, cur_i);\r
+                    cur_i = font_info[a].qqqq;\r
+                  }\r
+\r
+                  while (true)\r
+                  {\r
+                    if (next_char(cur_i) == cur_c)\r
+                      if (skip_byte(cur_i) <= stop_flag)\r
+                        if (op_byte(cur_i) >= kern_flag)\r
+                        {\r
+                          p = new_kern(char_kern(cur_f, cur_i));\r
+                          link(p) = link(q);\r
+                          link(q) = p;\r
+                          return;\r
+                        }\r
+                        else\r
+                        {\r
+                          check_interrupt();\r
+\r
+                          switch (op_byte(cur_i))\r
+                          {\r
+                            case 1:\r
+                            case 5:\r
+                              character(nucleus(q)) = rem_byte(cur_i);\r
+                              break;\r
+                            case 2:\r
+                            case 6:\r
+                              character(nucleus(p)) = rem_byte(cur_i);\r
+                              break;\r
+                            case 3:\r
+                            case 7:\r
+                            case 11:\r
+                              {\r
+                                r = new_noad();\r
+                                character(nucleus(r)) = rem_byte(cur_i);\r
+                                fam(nucleus(r)) = fam(nucleus(q));\r
+                                link(q) = r;\r
+                                link(r) = p;\r
+\r
+                                if (op_byte(cur_i) < 11)\r
+                                  math_type(nucleus(r)) = math_char;\r
+                                else\r
+                                  math_type(nucleus(r)) = math_text_char;\r
+                              }\r
+                              break;\r
+\r
+                            default:\r
+                              {\r
+                                link(q) = link(p);\r
+                                character(nucleus(q)) = rem_byte(cur_i);\r
+                                mem[subscr(q)] = mem[subscr(p)];\r
+                                mem[supscr(q)] = mem[supscr(p)];\r
+                                free_node(p, noad_size);\r
+                              }\r
+                              break;\r
+                          }\r
+\r
+                          if (op_byte(cur_i) > 3)\r
+                            return;\r
+\r
+                          math_type(nucleus(q)) = math_char;\r
+                          goto restart;\r
+                        }\r
+\r
+                    if (skip_byte(cur_i) >= stop_flag)\r
+                      return;\r
+\r
+                    a = a + skip_byte(cur_i) + 1;\r
+                    cur_i = font_info[a].qqqq;\r
+                  }\r
+                }\r
+              }\r
+      }\r
+}\r
+/* sec 0762 */\r
+small_number make_left_right (pointer q, small_number style, scaled max_d, scaled max_h)\r
+{\r
+  scaled delta, delta1, delta2;\r
+\r
+  if (style < script_style)\r
+    cur_size = text_size;\r
+  else\r
+    cur_size = 16 * ((style - text_style) / 2);\r
+\r
+  delta2 = max_d + axis_height(cur_size);\r
+  delta1 = max_h + max_d - delta2;\r
+\r
+  if (delta2 > delta1)\r
+    delta1 = delta2;\r
+\r
+  delta = (delta1 / 500) * delimiter_factor;\r
+  delta2 = delta1 + delta1 - delimiter_shortfall;\r
+\r
+  if (delta < delta2)\r
+    delta = delta2;\r
+\r
+  new_hlist(q) = var_delimiter(delimiter(q), cur_size, delta);\r
+\r
+  return type(q) - (left_noad - open_noad);\r
+}\r
+/* sec 0726 */\r
+void mlist_to_hlist (void)\r
+{\r
+  pointer mlist;\r
+  boolean penalties;\r
+  small_number style;\r
+  small_number save_style;\r
+  pointer q;\r
+  pointer r;\r
+  /* small_number r_type; */\r
+  int r_type;\r
+  /* small_number t; */\r
+  int t;\r
+  pointer p, x, y, z;\r
+  integer pen;\r
+  small_number s;\r
+  scaled max_h, max_d;\r
+  scaled delta;\r
+\r
+  mlist = cur_mlist;\r
+  penalties = mlist_penalties;\r
+  style = cur_style;\r
+  q = mlist;\r
+  r = 0;\r
+  r_type = op_noad;\r
+  max_h = 0;\r
+  max_d = 0;\r
+\r
+  {\r
+    if (cur_style < script_style)\r
+      cur_size = text_size;\r
+    else\r
+      cur_size = 16 * ((cur_style - text_style) / 2);\r
+\r
+    cur_mu = x_over_n(math_quad(cur_size), 18);\r
+  }\r
+\r
+  while (q != 0)\r
+  {\r
+reswitch:\r
+    delta = 0;\r
+\r
+    switch (type(q))\r
+    {\r
+      case bin_noad:\r
+        switch (r_type)\r
+        {\r
+          case bin_noad:\r
+          case op_noad:\r
+          case rel_noad:\r
+          case open_noad:\r
+          case punct_noad:\r
+          case left_noad:\r
+            {\r
+              type(q) = ord_noad;\r
+              goto reswitch;\r
+            }\r
+            break;\r
+\r
+          default:\r
+            do_nothing();\r
+            break;\r
+        }\r
+        break;\r
+\r
+      case rel_noad:\r
+      case close_noad:\r
+      case punct_noad:\r
+      case right_noad:\r
+        {\r
+          if (r_type == bin_noad)\r
+            type(r) = ord_noad;\r
+\r
+          if (type(q) == right_noad)\r
+            goto done_with_noad;\r
+        }\r
+        break;\r
+\r
+      case left_noad:\r
+        goto done_with_noad;\r
+        break;\r
+\r
+      case fraction_noad:\r
+        {\r
+          make_fraction(q);\r
+          goto check_dimensions;\r
+        }\r
+        break;\r
+\r
+      case op_noad:\r
+        {\r
+          delta = make_op(q);\r
+\r
+          if (subtype(q) == limits)\r
+            goto check_dimensions;\r
+        }\r
+        break;\r
+\r
+      case ord_noad:\r
+        make_ord(q);\r
+        break;\r
+\r
+      case open_noad:\r
+      case inner_noad:\r
+        do_nothing();\r
+        break;\r
+\r
+      case radical_noad:\r
+        make_radical(q);\r
+        break;\r
+\r
+      case over_noad:\r
+        make_over(q);\r
+        break;\r
+\r
+      case under_noad:\r
+        make_under(q);\r
+        break;\r
+\r
+      case accent_noad:\r
+        make_math_accent(q);\r
+        break;\r
+\r
+      case vcenter_noad:\r
+        make_vcenter(q);\r
+        break;\r
+\r
+      case style_node:\r
+        {\r
+          cur_style = subtype(q);\r
+\r
+          {\r
+            if (cur_style < script_style)\r
+              cur_size = text_size;\r
+            else\r
+              cur_size = 16 * ((cur_style - text_style) / 2);\r
+\r
+            cur_mu = x_over_n(math_quad(cur_size), 18);\r
+          }\r
+\r
+          goto done_with_node;\r
+        }\r
+        break;\r
+\r
+      case choice_node:\r
+        {\r
+          switch (cur_style / 2)\r
+          {\r
+            case 0:\r
+              choose_mlist(display_mlist);\r
+              break;\r
+\r
+            case 1:\r
+              choose_mlist(text_mlist);\r
+              break;\r
+\r
+            case 2:\r
+              choose_mlist(script_mlist);\r
+              break;\r
+\r
+            case 3:\r
+              choose_mlist(script_script_mlist);\r
+              break;\r
+          }\r
+\r
+          flush_node_list(display_mlist(q));\r
+          flush_node_list(text_mlist(q));\r
+          flush_node_list(script_mlist(q));\r
+          flush_node_list(script_script_mlist(q));\r
+          type(q) = style_node;\r
+          subtype(q) = cur_style;\r
+          width(q) = 0;\r
+          depth(q) = 0;\r
+\r
+          if (p != 0)\r
+          {\r
+            z = link(q);\r
+            link(q) = p;\r
+\r
+            while (link(p) != 0)\r
+              p = link(p);\r
+\r
+            link(p) = z;\r
+          }\r
+\r
+          goto done_with_node;\r
+        }\r
+        break;\r
+\r
+      case ins_node:\r
+      case mark_node:\r
+      case adjust_node:\r
+      case whatsit_node:\r
+      case penalty_node:\r
+      case disc_node:\r
+        goto done_with_node;\r
+        break;\r
+\r
+      case rule_node:\r
+        {\r
+          if (height(q) > max_h)\r
+            max_h = height(q);\r
+\r
+          if (depth(q) > max_d)\r
+            max_d = depth(q);\r
+\r
+          goto done_with_node;\r
+        }\r
+        break;\r
+\r
+      case glue_node:\r
+        {\r
+          if (subtype(q) == mu_glue)\r
+          {\r
+            x = glue_ptr(q);\r
+            y = math_glue(x, cur_mu);\r
+            delete_glue_ref(x);\r
+            glue_ptr(q) = y;\r
+            subtype(q) = normal;\r
+          }\r
+          else if ((cur_size != text_size) && (subtype(q) == cond_math_glue))\r
+          {\r
+            p = link(q);\r
+\r
+            if (p != 0)\r
+              if ((type(q) == glue_node) || (type(p) == kern_node))\r
+              {\r
+                link(q) = link(p);\r
+                link(p) = 0;\r
+                flush_node_list(p);\r
+              }\r
+          }\r
+\r
+          goto done_with_node;\r
+        }\r
+        break;\r
+\r
+      case kern_node:\r
+        {\r
+          math_kern(q, cur_mu);\r
+          goto done_with_node;\r
+        }\r
+        break;\r
+\r
+      default:\r
+        {\r
+          confusion("mlist1");\r
+          return;\r
+        }\r
+        break;\r
+    }\r
+\r
+    switch (math_type(nucleus(q)))\r
+    {\r
+      case math_char:\r
+      case math_text_char:\r
+        {\r
+          fetch(nucleus(q));\r
+\r
+          if (char_exists(cur_i))\r
+          {\r
+            delta = char_italic(cur_f, cur_i);\r
+            p = new_character(cur_f, cur_c);\r
+\r
+            if ((math_type(nucleus(q)) == math_text_char) && (space(cur_f) != 0))\r
+              delta = 0;\r
+\r
+            if ((math_type(subscr(q)) == 0) && (delta != 0))\r
+            {\r
+              link(p) = new_kern(delta);\r
+              delta = 0;\r
+            }\r
+          }\r
+          else\r
+            p = 0;\r
+        }\r
+        break;\r
+\r
+      case 0:\r
+        p = 0;\r
+        break;\r
+\r
+      case sub_box:\r
+        p = info(nucleus(q));\r
+        break;\r
+\r
+      case sub_mlist:\r
+        {\r
+          cur_mlist = info(nucleus(q));\r
+          save_style = cur_style;\r
+          mlist_penalties = false;\r
+          mlist_to_hlist();\r
+          cur_style = save_style;\r
+\r
+          {\r
+            if (cur_style < script_style)\r
+              cur_size = text_size;\r
+            else\r
+              cur_size = 16 * ((cur_style - text_style) / 2);\r
+\r
+            cur_mu = x_over_n(math_quad(cur_size), 18);\r
+          }\r
+\r
+          p = hpack(link(temp_head), 0, 1);\r
+        }\r
+        break;\r
+\r
+      default:\r
+        {\r
+          confusion("mlist2");\r
+          return;\r
+        }\r
+        break;\r
+    }\r
+  \r
+    new_hlist(q) = p;\r
+\r
+    if ((math_type(subscr(q)) == 0) && (math_type(supscr(q)) == 0))\r
+      goto check_dimensions;\r
+\r
+    make_scripts(q, delta);\r
+\r
+check_dimensions:\r
+    z = hpack(new_hlist(q), 0, 1);\r
+\r
+    if (height(z) > max_h)\r
+      max_h = height(z);\r
+\r
+    if (depth(z) > max_d)\r
+      max_d = depth(z);\r
+\r
+    free_node(z, box_node_size);\r
+\r
+done_with_noad:\r
+    r = q;\r
+    r_type = type(r);\r
+\r
+done_with_node:\r
+    q = link(q);\r
+  }\r
+\r
+  if (r_type == bin_noad)\r
+    type(r) = ord_noad;\r
+\r
+  p = temp_head;\r
+  link(p) = 0;\r
+  q = mlist;\r
+  r_type = 0;\r
+  cur_style = style;\r
+\r
+  {\r
+    if (cur_style < script_style)\r
+      cur_size = text_size;\r
+    else\r
+      cur_size = 16 *((cur_style - text_style) / 2);\r
+\r
+    cur_mu = x_over_n(math_quad(cur_size), 18);\r
+  }\r
+\r
+  while (q != 0)\r
+  {\r
+    t = ord_noad;\r
+    s = noad_size;\r
+    pen = inf_penalty;\r
+\r
+    switch (type(q))\r
+    {\r
+      case op_noad:\r
+      case open_noad:\r
+      case close_noad:\r
+      case punct_noad:\r
+      case inner_noad:\r
+        t = type(q);\r
+        break;\r
+\r
+      case bin_noad:\r
+        {\r
+          t = bin_noad;\r
+          pen = bin_op_penalty;\r
+        }\r
+        break;\r
+\r
+      case rel_noad:\r
+        {\r
+          t = rel_noad;\r
+          pen = rel_penalty;\r
+        }\r
+        break;\r
+\r
+      case ord_noad:\r
+      case vcenter_noad:\r
+      case over_noad:\r
+      case under_noad:\r
+        do_nothing();\r
+        break;\r
+\r
+      case radical_noad:\r
+        s = radical_noad_size;\r
+        break;\r
+\r
+      case accent_noad:\r
+        s = accent_noad_size;\r
+        break;\r
+\r
+      case fraction_noad:\r
+        {\r
+          t = inner_noad;\r
+          s = fraction_noad_size;\r
+        }\r
+        break;\r
+\r
+      case left_noad:\r
+      case right_noad:\r
+        t = make_left_right(q, style, max_d, max_h);\r
+        break;\r
+\r
+      case style_node:\r
+        {\r
+          cur_style = subtype(q);\r
+          s = style_node_size;\r
+\r
+          {\r
+            if (cur_style < script_style)\r
+              cur_size = text_size;\r
+            else\r
+              cur_size = 16 *((cur_style - text_style) / 2);\r
+\r
+            cur_mu = x_over_n(math_quad(cur_size), 18);\r
+          }\r
+\r
+          goto delete_q;\r
+        }\r
+        break;\r
+\r
+      case whatsit_node:\r
+      case penalty_node:\r
+      case rule_node:\r
+      case disc_node:\r
+      case adjust_node:\r
+      case ins_node:\r
+      case mark_node:\r
+      case glue_node:\r
+      case kern_node:\r
+        {\r
+          link(p) = q;\r
+          p = q;\r
+          q = link(q);\r
+          link(p) = 0;\r
+          goto done;\r
+        }\r
+        break;\r
+\r
+      default:\r
+        {\r
+          confusion("mlist3");\r
+          return;\r
+        }\r
+        break;\r
+    }\r
+\r
+    if (r_type > 0)\r
+    {\r
+      switch (str_pool[r_type * 8 + t + magic_offset])\r
+      {\r
+        case '0':\r
+          x = 0;\r
+          break;\r
+\r
+        case '1':\r
+          if (cur_style < script_style)\r
+            x = thin_mu_skip_code;\r
+          else\r
+            x = 0;\r
+          break;\r
+\r
+        case '2':\r
+          x = thin_mu_skip_code;\r
+          break;\r
+\r
+        case '3':\r
+          if (cur_style < script_style)\r
+            x = med_mu_skip_code;\r
+          else\r
+            x = 0;\r
+          break;\r
+\r
+        case '4':\r
+          if (cur_style < script_style)\r
+            x = thick_mu_skip_code;\r
+          else\r
+            x = 0;\r
+          break;\r
+\r
+        default:\r
+          {\r
+            confusion("mlist4");\r
+            return;\r
+          }\r
+          break;\r
+      }\r
+\r
+      if (x != 0)\r
+      {\r
+        y = math_glue(glue_par(x), cur_mu);\r
+        z = new_glue(y);\r
+        glue_ref_count(y) = 0;\r
+        link(p) = z;\r
+        p = z;\r
+        subtype(z) = x + 1;\r
+      }\r
+    }\r
+\r
+    if (new_hlist(q) != 0)\r
+    {\r
+      link(p) = new_hlist(q);\r
+\r
+      do\r
+        {\r
+          p = link(p);\r
+        }\r
+      while (!(link(p) == 0));\r
+    }\r
+\r
+    if (penalties)\r
+      if (link(q) != 0)\r
+        if (pen < inf_penalty)\r
+        {\r
+          r_type = type(link(q));\r
+\r
+          if (r_type != penalty_node)\r
+            if (r_type != rel_noad)\r
+            {\r
+              z = new_penalty(pen);\r
+              link(p) = z;\r
+              p = z;\r
+            }\r
+        }\r
+\r
+    r_type = t;\r
+\r
+delete_q:\r
+    r = q;\r
+    q = link(q);\r
+    free_node(r, s);\r
+done:;\r
+  }\r
+}\r
+/* sec 0772 */\r
+void push_alignment (void)\r
+{\r
+  pointer p;\r
+\r
+  p = get_node(align_stack_node_size);\r
+  link(p) = align_ptr;\r
+  info(p) = cur_align;\r
+  llink(p) = preamble;\r
+  rlink(p) = cur_span;\r
+  mem[p + 2].cint = cur_loop;\r
+  mem[p + 3].cint = align_state;\r
+  info(p + 4) = cur_head;\r
+  link(p + 4) = cur_tail;\r
+  align_ptr = p;\r
+  cur_head = get_avail();\r
+}\r
+/* sec 0772 */\r
+void pop_alignment (void)\r
+{\r
+  pointer p;\r
+\r
+  free_avail(cur_head);\r
+  p = align_ptr;\r
+  cur_tail = link(p + 4);\r
+  cur_head = info(p + 4);\r
+  align_state = mem[p + 3].cint;\r
+  cur_loop = mem[p + 2].cint;\r
+  cur_span = rlink(p);\r
+  preamble = llink(p);\r
+  cur_align = info(p);\r
+  align_ptr = link(p);\r
+  free_node(p, align_stack_node_size);\r
+}\r
+/* sec 0782 */\r
+void get_preamble_token (void)\r
+{\r
+restart:\r
+  get_token();\r
+\r
+  while ((cur_chr == span_code) && (cur_cmd == tab_mark))\r
+  {\r
+    get_token();\r
+\r
+    if (cur_cmd > max_command)\r
+    {\r
+      expand();\r
+      get_token();\r
+    }\r
+  }\r
+\r
+  if (cur_cmd == endv)\r
+  {\r
+    fatal_error("(interwoven alignment preambles are not allowed)");\r
+    return;\r
+  }\r
+\r
+  if ((cur_cmd == assign_glue) && (cur_chr == glue_base + tab_skip_code))\r
+  {\r
+    scan_optional_equals();\r
+    scan_glue(glue_val);\r
+\r
+    if (global_defs > 0)\r
+      geq_define(glue_base + tab_skip_code, glue_ref, cur_val);\r
+    else\r
+      eq_define(glue_base + tab_skip_code, glue_ref, cur_val);\r
+\r
+    goto restart;\r
+  }\r
+}\r
+/* sec 0774 */\r
+void init_align (void)\r
+{\r
+  pointer save_cs_ptr;\r
+  pointer p;\r
+\r
+  save_cs_ptr = cur_cs;\r
+  push_alignment();\r
+  align_state = -1000000L;\r
+\r
+  if ((mode == mmode) && ((tail != head) || (incompleat_noad != 0)))\r
+  {\r
+    print_err("Improper ");\r
+    print_esc("halign");\r
+    prints(" inside $$'s");\r
+    help3("Displays can use special alignments (like \\eqalignno)",\r
+        "only if nothing but the alignment itself is between $$'s.",\r
+        "So I've deleted the formulas that preceded this alignment.");\r
+    error();\r
+    flush_math();\r
+  }\r
+\r
+  push_nest();\r
+\r
+  if (mode == mmode)\r
+  {\r
+    mode = -vmode;\r
+    prev_depth = nest[nest_ptr - 2].aux_field.cint;\r
+  }\r
+  else if (mode > 0)\r
+    mode = - (integer) mode;\r
+\r
+  scan_spec(align_group, false);\r
+  preamble = 0;\r
+  cur_align = align_head;\r
+  cur_loop = 0;\r
+  scanner_status = aligning;\r
+  warning_index = save_cs_ptr;\r
+  align_state = -1000000L;\r
+\r
+  while (true)\r
+  {\r
+    link(cur_align) = new_param_glue(tab_skip_code);\r
+    cur_align = link(cur_align);\r
+\r
+    if (cur_cmd == car_ret)\r
+      goto done;\r
+\r
+    p = hold_head;\r
+    link(p) = 0;\r
+\r
+    while (true)\r
+    {\r
+      get_preamble_token();\r
+\r
+      if (cur_cmd == mac_param)\r
+        goto done1;\r
+\r
+      if ((cur_cmd <= car_ret) && (cur_cmd >= tab_mark) && (align_state == -1000000L))\r
+        if ((p == hold_head) && (cur_loop == 0) && (cur_cmd == tab_mark))\r
+          cur_loop = cur_align;\r
+        else\r
+        {\r
+          print_err("Missing # inserted in alignment preamble");\r
+          help3("There should be exactly one # between &'s, when an",\r
+              "\\halign or \\valign is being set up. In this case you had",\r
+              "none, so I've put one in; maybe that will work.");\r
+          back_error();\r
+          goto done1;\r
+        }\r
+      else if ((cur_cmd != spacer) || (p != hold_head))\r
+      {\r
+        link(p) = get_avail();\r
+        p = link(p);\r
+        info(p) = cur_tok;\r
+      }\r
+    }\r
+\r
+done1:\r
+    link(cur_align) = new_null_box();\r
+    cur_align = link(cur_align);\r
+    info(cur_align) = end_span;\r
+    width(cur_align) = null_flag;\r
+    u_part(cur_align) = link(hold_head);\r
+    p = hold_head;\r
+    link(p) = 0;\r
+\r
+    while (true)\r
+    {\r
+continu:\r
+      get_preamble_token();\r
+\r
+      if ((cur_cmd <= car_ret) && (cur_cmd >= tab_mark) && (align_state == -1000000L))\r
+        goto done2;\r
+\r
+      if (cur_cmd == mac_param)\r
+      {\r
+        print_err("Only one # is allowed per tab");\r
+        help3("There should be exactly one # between &'s, when an",\r
+            "\\halign or \\valign is being set up. In this case you had",\r
+            "more than one, so I'm ignoring all but the first.");\r
+        error();\r
+        goto continu;\r
+      }\r
+\r
+      link(p) = get_avail();\r
+      p = link(p);\r
+      info(p) = cur_tok;\r
+    }\r
+\r
+done2:\r
+    link(p) = get_avail();\r
+    p = link(p);\r
+    info(p) = end_template_token;\r
+    v_part(cur_align) = link(hold_head);\r
+  }\r
+\r
+done:\r
+  scanner_status = 0;\r
+  new_save_level(align_group);\r
+\r
+  if (every_cr != 0)\r
+    begin_token_list(every_cr, every_cr_text);\r
+\r
+  align_peek();\r
+}\r
+/* sec 0787 */\r
+void init_span (pointer p)\r
+{\r
+  push_nest();\r
+\r
+  if (mode == -hmode)\r
+    space_factor = 1000;\r
+  else\r
+  {\r
+    prev_depth = ignore_depth;\r
+    normal_paragraph();\r
+  }\r
+\r
+  cur_span = p;\r
+}\r
+/* sec 0786 */\r
+void init_row (void)\r
+{\r
+  push_nest();\r
+\r
+  mode = (-hmode - vmode) - mode;\r
+\r
+  if (mode == -hmode)\r
+    space_factor = 0;\r
+  else\r
+    prev_depth = 0;\r
+\r
+  tail_append(new_glue(glue_ptr(preamble)));\r
+  subtype(tail) = tab_skip_code + 1;\r
+  cur_align = link(preamble);\r
+  cur_tail = cur_head;\r
+  init_span(cur_align);\r
+}\r
+/* sec 0788 */\r
+void init_col (void)\r
+{\r
+  extra_info(cur_align) = cur_cmd;\r
+\r
+  if (cur_cmd == omit)\r
+    align_state = 0;\r
+  else\r
+  {\r
+    back_input();\r
+    begin_token_list(u_part(cur_align), u_template);\r
+  }\r
+}\r
+/* sec 0799 */\r
+void fin_row (void)\r
+{\r
+  pointer p;\r
+\r
+  if (mode == -hmode)\r
+  {\r
+    p = hpack(link(head), 0, 1);\r
+    pop_nest();\r
+    append_to_vlist(p);\r
+\r
+    if (cur_head != cur_tail)\r
+    {\r
+      link(tail) = link(cur_head);\r
+      tail = cur_tail;\r
+    }\r
+  }\r
+  else\r
+  {\r
+    p = vpackage(link(head), 0, 1, max_dimen);\r
+    pop_nest();\r
+    link(tail) = p;\r
+    tail = p;\r
+    space_factor = 1000;\r
+  }\r
+\r
+  type(p) = unset_node;\r
+  glue_stretch(p) = 0;\r
+\r
+  if (every_cr != 0)\r
+    begin_token_list(every_cr, every_cr_text);\r
+\r
+  align_peek();\r
+}\r
+/* sec 0800 */\r
+void fin_align (void)\r
+{\r
+  pointer p, q, r, s, u, v;\r
+  scaled t, w;\r
+  scaled o;\r
+  halfword n;\r
+  scaled rule_save;\r
+  memory_word aux_save;\r
+\r
+  if (cur_group != align_group)\r
+  {\r
+    confusion("align1");\r
+    return;\r
+  }\r
+\r
+  unsave();\r
+\r
+  if (cur_group != align_group)\r
+  {\r
+    confusion("align0");\r
+    return;\r
+  }\r
+\r
+  unsave();\r
+\r
+  if (nest[nest_ptr - 1].mode_field == mmode)\r
+    o = display_indent;\r
+  else\r
+    o = 0;\r
+\r
+  q = link(preamble);\r
+\r
+  do\r
+    {\r
+      flush_list(u_part(q));\r
+      flush_list(v_part(q));\r
+      p = link(link(q));\r
+\r
+      if (width(q) == null_flag)\r
+      {\r
+        width(q) = 0;\r
+        r = link(q);\r
+        s = glue_ptr(r);\r
+\r
+        if (s != zero_glue)\r
+        {\r
+          add_glue_ref(zero_glue);\r
+          delete_glue_ref(s);\r
+          glue_ptr(c) = zero_glue;\r
+        }\r
+      }\r
+\r
+      if (info(q) != end_span)\r
+      {\r
+        t = width(q) + width(glue_ptr(link(q)));\r
+        r = info(q);\r
+        s = end_span;\r
+        info(s) = p;\r
+        n = min_quarterword + 1;\r
+\r
+        do\r
+          {\r
+            width(r) = width(r) - t;\r
+            u = info(r);\r
+\r
+            while (link(r) > n)\r
+            {\r
+              s = info(s);\r
+              n = link(info(s)) + 1;\r
+            }\r
+\r
+            if (link(r) < n)\r
+            {\r
+              info(r) = info(s);\r
+              info(s) = r;\r
+              decr(link(r));\r
+              s = r;\r
+            }\r
+            else\r
+            {\r
+              if (width(r) > width(info(s)))\r
+                width(info(s)) = width(r);\r
+\r
+              free_node(r, span_node_size);\r
+            }\r
+\r
+            r = u;\r
+          }\r
+        while (!(r == end_span));\r
+      }\r
+\r
+      type(q) = unset_node;\r
+      span_count(q) = min_quarterword;\r
+      height(q) = 0;\r
+      depth(q) = 0;\r
+      glue_order(q) = normal;\r
+      glue_sign(q) = normal;\r
+      glue_stretch(q) = 0;\r
+      glue_shrink(q) = 0;\r
+      q = p;\r
+    }\r
+  while (!(q == 0));\r
+\r
+  save_ptr = save_ptr - 2;\r
+  pack_begin_line = - (integer) mode_line;\r
+\r
+  if (mode == -vmode)\r
+  {\r
+    rule_save = overfull_rule;\r
+    overfull_rule = 0;\r
+    p = hpack(preamble, saved(1), saved(0));\r
+    overfull_rule = rule_save;\r
+  }\r
+  else\r
+  {\r
+    q = link(preamble);\r
+\r
+    do\r
+      {\r
+        height(q) = width(q);\r
+        width(q) = 0;\r
+        q = link(link(q));\r
+      }\r
+    while (!(q == 0));\r
+\r
+    p = vpackage(preamble, saved(1), saved(0), max_dimen);\r
+    q = link(preamble);\r
+\r
+    do\r
+      {\r
+        width(q) = height(q);\r
+        height(q) = 0;\r
+        q = link(link(q));\r
+      }\r
+    while (!(q == 0));\r
+  }\r
+\r
+  pack_begin_line = 0;\r
+  q = link(head);\r
+  s = head;\r
+\r
+  while (q != 0)\r
+  {\r
+    if (!is_char_node(q))\r
+      if (type(q) == unset_node)\r
+      {\r
+        if (mode == -vmode)\r
+        {\r
+          type(q) = hlist_node;\r
+          width(q) = width(p);\r
+        }\r
+        else\r
+        {\r
+          type(q) = vlist_node;\r
+          height(q) = height(p);\r
+        }\r
+\r
+        glue_order(q) = glue_order(p);\r
+        glue_sign(q) = glue_sign(p);\r
+        glue_set(q) = glue_set(p);\r
+        shift_amount(q) = o;\r
+        r = link(list_ptr(q));\r
+        s = link(list_ptr(p));\r
+\r
+        do\r
+          {\r
+            n = span_count(r);\r
+            t = width(s);\r
+            w = t;\r
+            u = hold_head;\r
+\r
+            while (n > min_quarterword)\r
+            {\r
+              decr(n);\r
+              s = link(s);\r
+              v = glue_ptr(s);\r
+              link(u) = new_glue(v);\r
+              u = link(u);\r
+              subtype(u) = tab_skip_code + 1;\r
+              t = t + width(v);\r
+\r
+              if (glue_sign(p) == stretching)\r
+              {\r
+                if (stretch_order(v) == glue_order(p))\r
+                  t = t + round(glue_set(p) * stretch(v));\r
+              }\r
+              else if (glue_sign(p) == shrinking)\r
+              {\r
+                if (shrink_order(v) == glue_order(p))\r
+                  t = t - round(glue_set(p) * shrink(v));\r
+              }\r
+\r
+              s = link(s);\r
+              link(u) = new_null_box();\r
+              u = link(u);\r
+              t = t + width(s);\r
+\r
+              if (mode == -vmode)\r
+                width(u) = width(s);\r
+              else\r
+              {\r
+                type(u) = vlist_node;\r
+                height(u) = width(s);\r
+              }\r
+            }\r
+            \r
+\r
+            if (mode == -vmode)\r
+            {\r
+              height(r) = height(q);\r
+              depth(r) = depth(q);\r
+\r
+              if (t == width(r))\r
+              {\r
+                glue_sign(r) = normal;\r
+                glue_order(r) = normal;\r
+                glue_set(r) = 0.0;\r
+              }\r
+              else if (t > width(r))\r
+              {\r
+                glue_sign(r) = stretching;\r
+\r
+                if (glue_stretch(r) == 0)\r
+                  glue_set(r) = 0.0;\r
+                else\r
+                  glue_set(r) = (t - width(r)) / ((double) glue_stretch(r));\r
+              }\r
+              else\r
+              {\r
+                glue_order(r) = glue_sign(r);\r
+                glue_sign(r) = shrinking;\r
+\r
+                if (glue_shrink(r) == 0)\r
+                  glue_set(r) = 0.0;\r
+                else if ((glue_order(r) == normal) && (width(r) - t > glue_shrink(r)))\r
+                  glue_set(r) = 1.0;\r
+                else\r
+                  glue_set(r) = (width(r) - t)/ ((double) glue_shrink(r));\r
+              }\r
+\r
+              width(r) = w;\r
+              type(r) = hlist_node;\r
+            }\r
+            else\r
+            {\r
+              width(r) = width(q);\r
+\r
+              if (t == height(r))\r
+              {\r
+                glue_sign(r) = normal;\r
+                glue_order(r) = normal;\r
+                glue_set(r) = 0.0;\r
+              }\r
+              else if (t > height(r))\r
+              {\r
+                glue_sign(r) = stretching;\r
+\r
+                if (glue_stretch(r) == 0)\r
+                  glue_set(r) = 0.0;\r
+                else\r
+                  glue_set(r) = (t - height(r)) / ((double) glue_stretch(r));\r
+              }\r
+              else\r
+              {\r
+                glue_order(r) = glue_sign(r);\r
+                glue_sign(r) = shrinking;\r
+\r
+                if (glue_shrink(r) == 0)\r
+                  glue_set(r) = 0.0;\r
+                else if ((glue_order(r) == normal) && (height(r) - t > glue_shrink(r)))\r
+                  glue_set(r) = 1.0;\r
+                else\r
+                  glue_set(r) = (height(r) - t) / ((double) glue_shrink(r));\r
+              }\r
+\r
+              height(r) = w;\r
+              type(r) = vlist_node;\r
+            }\r
+\r
+            shift_amount(r) = 0;\r
+\r
+            if (u != hold_head)\r
+            {\r
+              link(u) = link(r);\r
+              link(r) = link(hold_head);\r
+              r = u;\r
+            }\r
+\r
+            r = link(link(r));\r
+            s = link(link(s));\r
+          }\r
+        while (!(r == 0));\r
+      }\r
+      else if (type(q) == rule_node)\r
+      {\r
+        if (is_running(width(q)))\r
+          width(q) = width(p);\r
+\r
+        if (is_running(height(q)))\r
+          height(q) = height(p);\r
+\r
+        if (is_running(depth(q)))\r
+          depth(q) = depth(p);\r
+\r
+        if (o != 0)\r
+        {\r
+          r = link(q);\r
+          link(q) = 0;\r
+          q = hpack(q, 0, 1);\r
+          shift_amount(q) = o;\r
+          link(q) = r;\r
+          link(s) = q;\r
+        }\r
+      }\r
+    s = q;\r
+    q = link(q);\r
+  }\r
+\r
+  flush_node_list(p);\r
+  pop_alignment();\r
+  aux_save = cur_list.aux_field;\r
+  p = link(head);\r
+  q = tail;\r
+  pop_nest();\r
+\r
+  if (mode == mmode)\r
+  {\r
+    do_assignments();\r
+\r
+    if (cur_cmd != math_shift)\r
+    {\r
+      print_err("Missing $$ inserted");\r
+      help2("Displays can use special alignments (like \\eqalignno)",\r
+          "only if nothing but the alignment itself is between $$'s.");\r
+      back_error();\r
+    }\r
+    else\r
+    {\r
+      get_x_token();\r
+\r
+      if (cur_cmd != math_shift)\r
+      {\r
+        print_err("Display math should end with $$");\r
+        help2("The `$' that I just saw supposedly matches a previous `$$'.",\r
+            "So I shall assume that you typed `$$' both times.");\r
+        back_error();\r
+      }\r
+    }\r
+\r
+    pop_nest();\r
+    tail_append(new_penalty(pre_display_penalty));\r
+    tail_append(new_param_glue(above_display_skip_code));\r
+    link(tail) = p;\r
+\r
+    if (p != 0)\r
+      tail = q;\r
+\r
+    tail_append(new_penalty(post_display_penalty));\r
+    tail_append(new_param_glue(below_display_skip_code));\r
+    prev_depth = aux_save.cint;\r
+    resume_after_display();\r
+  }\r
+  else\r
+  {\r
+    cur_list.aux_field = aux_save;\r
+    link(tail) = p;\r
+\r
+    if (p != 0)\r
+      tail = q;\r
+\r
+    if (mode == vmode)\r
+      build_page();\r
+  }\r
+}\r
+/* sec 0791 */\r
+boolean fin_col (void)\r
+{\r
+  pointer p;\r
+  pointer q, r;\r
+  pointer s;\r
+  pointer u;\r
+  scaled w;\r
+  glue_ord o;\r
+  halfword n;\r
+\r
+  if (cur_align == 0)\r
+  {\r
+    confusion("endv");\r
+    return 0;\r
+  }\r
+\r
+  q = link(cur_align);\r
+\r
+  if (q == 0)\r
+  {\r
+    confusion("endv");\r
+    return 0;\r
+  }\r
+\r
+  if (align_state < 500000L)\r
+  {\r
+    fatal_error("(interwoven alignment preambles are not allowed)");\r
+    return 0;\r
+  }\r
+\r
+  p = link(q);\r
+\r
+  if ((p == 0) && (extra_info(cur_align) < cr_code))\r
+    if (cur_loop != 0)\r
+    {\r
+      link(q) = new_null_box();\r
+      p = link(q);\r
+      info(p) = end_span;\r
+      width(p) = null_flag;\r
+      cur_loop = link(cur_loop);\r
+      q = hold_head;\r
+      r = u_part(cur_loop);\r
+\r
+      while (r != 0)\r
+      {\r
+        link(q) = get_avail();\r
+        q = link(q);\r
+        info(q) = info(r);\r
+        r = link(r);\r
+      }\r
+\r
+      link(q) = 0;\r
+      u_part(p) = link(hold_head);\r
+      q = hold_head;\r
+      r = v_part(cur_loop);\r
+\r
+      while (r != 0)\r
+      {\r
+        link(q) = get_avail();\r
+        q = link(q);\r
+        info(q) = info(r);\r
+        r = link(r);\r
+      }\r
+\r
+      link(q) = 0;\r
+      v_part(p) = link(hold_head);\r
+      cur_loop = link(cur_loop);\r
+      link(p) = new_glue(glue_ptr(cur_loop));\r
+    }\r
+    else\r
+    {\r
+      print_err("Extra alignment tab has been changed to ");\r
+      print_esc("cr");\r
+      help3("You have given more \\span or & marks than there were",\r
+          "in the preamble to the \\halign or \\valign now in progress.",\r
+          "So I'll assume that you meant to type \\cr instead.");\r
+      extra_info(cur_align) = cr_code;\r
+      error();\r
+    }\r
+\r
+  if (extra_info(cur_align) != span_code)\r
+  {\r
+    unsave();\r
+    new_save_level(align_group);\r
+\r
+    {\r
+      if (mode == -hmode)\r
+      {\r
+        adjust_tail = cur_tail;\r
+        u = hpack(link(head), 0, 1);\r
+        w = width(u);\r
+        cur_tail = adjust_tail;\r
+        adjust_tail = 0;\r
+      }\r
+      else\r
+      {\r
+        u = vpackage(link(head), 0, 1, 0);\r
+        w = height(u);\r
+      }\r
+\r
+      n = min_quarterword;\r
+\r
+      if (cur_span != cur_align)\r
+      {\r
+        q = cur_span;\r
+\r
+        do\r
+          {\r
+            incr(n);\r
+            q = link(link(q));\r
+          }\r
+        while (!(q == cur_align));\r
+\r
+        if (n > max_quarterword)\r
+        {\r
+          confusion("256 spans");\r
+          return 0;\r
+        }\r
+\r
+        q = cur_span;\r
+\r
+        while (link(info(q)) < n)\r
+          q = info(q);\r
+\r
+        if (link(info(q)) > n)\r
+        {\r
+          s = get_node(span_node_size);\r
+          info(s) = info(q);\r
+          link(s) = n;\r
+          info(q) = s;\r
+          width(s) = w;\r
+        }\r
+        else if (width(info(q)) < w)\r
+          width(info(q)) = w;\r
+      }\r
+      else if (w > width(cur_align))\r
+        width(cur_align) = w;\r
+\r
+      type(u) = unset_node;\r
+      span_count(u) = n;\r
+\r
+      if (total_stretch[filll] != 0)\r
+        o = filll;\r
+      else if (total_stretch[fill] != 0)\r
+        o = fill;\r
+      else if (total_stretch[fil] != 0)\r
+        o = fil;\r
+      else\r
+        o = normal;\r
+\r
+      glue_order(u) = o;\r
+      glue_stretch(u) = total_stretch[o];\r
+\r
+      if (total_shrink[filll] != 0)\r
+        o = filll;\r
+      else if (total_shrink[fill] != 0)\r
+        o = fill;\r
+      else if (total_shrink[fil] != 0)\r
+        o = fil;\r
+      else\r
+        o = normal;\r
+\r
+      glue_sign(u) = o;\r
+      glue_shrink(u) = total_shrink[o];\r
+      pop_nest();\r
+      link(tail) = u;\r
+      tail = u;\r
+    }\r
+\r
+    tail_append(new_glue(glue_ptr(link(cur_align))));\r
+    subtype(tail) = tab_skip_code + 1;\r
+\r
+    if (extra_info(cur_align) >= cr_code)\r
+    {\r
+      return true;\r
+    }\r
+\r
+    init_span(p);\r
+  }\r
+\r
+  align_state = 1000000L;\r
+\r
+  do\r
+    {\r
+      get_x_token();\r
+    }\r
+  while (!(cur_cmd != spacer));\r
+\r
+  cur_align = p;\r
+  init_col();\r
+\r
+  return false;\r
+}\r
+/* sec 0749 */\r
+scaled make_op (pointer q)\r
+{\r
+  scaled delta;\r
+  pointer p, v, x, y, z;\r
+  quarterword c;\r
+  four_quarters i;\r
+  scaled shift_up, shift_down;\r
+\r
+  if ((subtype(q) == normal) && (cur_style < text_style))\r
+    subtype(q) = limits;\r
+\r
+  if (math_type(nucleus(q)) == math_char)\r
+  {\r
+    fetch(nucleus(q));\r
+\r
+    if ((cur_style < text_style) && (char_tag(cur_i) == list_tag))\r
+    {\r
+      c = rem_byte(cur_i);\r
+      i = char_info(cur_f, c);\r
+\r
+      if (char_exists(i))\r
+      {\r
+        cur_c = c;\r
+        cur_i = i;\r
+        character(nucleus(q)) = c;\r
+      }\r
+    }\r
+\r
+    delta = char_italic(cur_f, cur_i);\r
+    x = clean_box(nucleus(q), cur_style);\r
+\r
+    if ((math_type(subscr(q)) != 0) && (subtype(q) != limits))\r
+      width(x) = width(x) - delta;\r
+\r
+    shift_amount(x) = half(height(x) - depth(x)) - axis_height(cur_size);\r
+    math_type(nucleus(q)) = sub_box;\r
+    info(nucleus(q)) = x;\r
+  }\r
+  else\r
+    delta = 0;\r
+\r
+  if (subtype(q) == limits)\r
+  {\r
+    x = clean_box(supscr(q), sup_style(cur_style));\r
+    y = clean_box(nucleus(q), cur_style);\r
+    z = clean_box(subscr(q), sub_style(cur_style));\r
+    v = new_null_box();\r
+    type(v) = vlist_node;\r
+    width(v) = width(y);\r
+\r
+    if (width(x) > width(v))\r
+      width(v) = width(x);\r
+\r
+    if (width(z) > width(v))\r
+      width(v) = width(z);\r
+\r
+    x = rebox(x, width(v));\r
+    y = rebox(y, width(v));\r
+    z = rebox(z, width(v));\r
+    shift_amount(x) = half(delta);\r
+    shift_amount(z) = - (integer) shift_amount(x);\r
+    height(v) = height(y);\r
+    depth(v) = depth(y);\r
+\r
+    if (math_type(supscr(q)) == 0)\r
+    {\r
+      free_node(x, box_node_size);\r
+      list_ptr(v) = y;\r
+    }\r
+    else\r
+    {\r
+      shift_up = big_op_spacing3 - depth(x);\r
+\r
+      if (shift_up < big_op_spacing1)\r
+        shift_up = big_op_spacing1;\r
+\r
+      p = new_kern(shift_up);\r
+      link(p) = y;\r
+      link(x) = p;\r
+      p = new_kern(big_op_spacing5);\r
+      link(p) = x;\r
+      list_ptr(v) = p;\r
+      height(v) = height(v) + big_op_spacing5 + height(x) + depth(x) + shift_up;\r
+    }\r
+\r
+    if (math_type(subscr(q)) == 0)\r
+      free_node(z, box_node_size);\r
+    else\r
+    {\r
+      shift_down = big_op_spacing4 - height(z);\r
+\r
+      if (shift_down < big_op_spacing2)\r
+        shift_down = big_op_spacing2;\r
+\r
+      p = new_kern(shift_down);\r
+      link(y) = p;\r
+      link(p) = z;\r
+      p = new_kern(big_op_spacing5);\r
+      link(z) = p;\r
+      depth(v) = depth(v) + big_op_spacing5 + height(z) + depth(z) + shift_down;\r
+    }\r
+\r
+    new_hlist(q) = v;\r
+  }\r
+\r
+  return delta;\r
+}\r
+/* sec 0756 */\r
+void make_scripts (pointer q, scaled delta)\r
+{\r
+  pointer p, x, y, z;\r
+  scaled shift_up, shift_down, clr;\r
+  small_number t;\r
+\r
+  p = new_hlist(q);\r
+\r
+  if (is_char_node(p))\r
+  {\r
+    shift_up = 0;\r
+    shift_down = 0;\r
+  }\r
+  else\r
+  {\r
+    z = hpack(p, 0, 1);\r
+\r
+    if (cur_style < script_style)\r
+      t = script_size;\r
+    else\r
+      t = script_script_size;\r
+\r
+    shift_up = height(z) - sup_drop(t);\r
+    shift_down = depth(z) + sub_drop(t);\r
+    free_node(z, box_node_size);\r
+  }\r
+\r
+  if (math_type(supscr(q)) == 0)\r
+  {\r
+    x = clean_box(subscr(q), sub_style(cur_style));\r
+    width(x) = width(x) + script_space;\r
+\r
+    if (shift_down < sub1(cur_size))\r
+      shift_down = sub1(cur_size);\r
+\r
+    clr = height(x) -(abs(math_x_height(cur_size) * 4) / 5);\r
+\r
+    if (shift_down < clr)\r
+      shift_down = clr;\r
+\r
+    shift_amount(x) = shift_down;\r
+  }\r
+  else\r
+  {\r
+    {\r
+      x = clean_box(supscr(q), sup_style(cur_style));\r
+      width(x) = width(x) + script_space;\r
+\r
+      if (odd(cur_style))\r
+        clr = sup3(cur_size);\r
+      else if (cur_style < text_style)\r
+        clr = sup1(cur_size);\r
+      else\r
+        clr = sup2(cur_size);\r
+\r
+      if (shift_up < clr)\r
+        shift_up = clr;\r
+\r
+      clr = depth(x) +(abs(math_x_height(cur_size)) / 4);\r
+\r
+      if (shift_up < clr)\r
+        shift_up = clr;\r
+    }\r
+\r
+    if (math_type(subscr(q)) == 0)\r
+      shift_amount(x) = - (integer) shift_up;\r
+    else\r
+    {\r
+      y = clean_box(subscr(q), sub_style(cur_style));\r
+      width(y) = width(y) + script_space;\r
+\r
+      if (shift_down < sub2(cur_size))\r
+        shift_down = sub2(cur_size);\r
+\r
+      clr = 4 * default_rule_thickness - ((shift_up - depth(x)) - (height(y) - shift_down));\r
+\r
+      if (clr > 0)\r
+      {\r
+        shift_down = shift_down + clr;\r
+\r
+        clr = (abs(math_x_height(cur_size) * 4) / 5) - (shift_up - depth(x));\r
+\r
+        if (clr > 0)\r
+        {\r
+          shift_up = shift_up + clr;\r
+          shift_down = shift_down - clr;\r
+        }\r
+      }\r
+\r
+      shift_amount(x) = delta;\r
+      p = new_kern((shift_up - depth(x)) - (height(y) - shift_down));\r
+      link(x) = p;\r
+      link(p) = y;\r
+      x = vpackage(x, 0, 1, max_dimen);\r
+      shift_amount(x) = shift_down;\r
+    }\r
+  }\r
+\r
+  if (new_hlist(q) == 0)\r
+    new_hlist(q) = x;\r
+  else\r
+  {\r
+    p = new_hlist(q);\r
+\r
+    while (link(p) != 0)\r
+      p = link(p);\r
+\r
+    link(p) = x;\r
+  }\r
 }
\ No newline at end of file
index 9e9ff09..e2c46b1 100644 (file)
-/* Copyright 2014 Clerk Ma
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301 USA.  */
-
-#define EXTERN extern
-
-#include "yandytex.h"
-
-/* sec 0785 */
-void align_peek (void)
-{
-restart:
-  align_state = 1000000L;
-
-  do
-    {
-      get_x_token();
-    }
-  while (!(cur_cmd != spacer));
-
-  if (cur_cmd == no_align)
-  {
-    scan_left_brace();
-
-    new_save_level(no_align_group);
-
-    if (mode == -vmode)
-      normal_paragraph();
-  }
-  else if (cur_cmd == right_brace)
-    fin_align();
-  else if ((cur_cmd == car_ret) && (cur_chr == cr_cr_code))
-    goto restart;
-  else
-  {
-    init_row();
-    init_col();
-  }
-}
-/* sec 0826 */
-pointer finite_shrink (pointer p)
-{
-  pointer q;
-
-  if (no_shrink_error_yet)
-  {
-    no_shrink_error_yet = false;
-    print_err("Infinite glue shrinkage found in a paragraph");
-    help5("The paragraph just ended includes some glue that has",
-        "infinite shrinkability, e.g., `\\hskip 0pt minus 1fil'.",
-        "Such glue doesn't belong there---it allows a paragraph",
-        "of any length to fit on one line. But it's safe to proceed,",
-        "since the offensive shrinkability has been made finite.");
-    error();
-  }
-
-  q = new_spec(p);
-  shrink_order(q) = normal;
-  delete_glue_ref(p);
-
-  return q;
-}
-/* sec 0829 */
-void try_break (integer pi, small_number break_type)
-{
-  pointer r;
-  pointer prev_r;
-  halfword old_l;
-  boolean no_break_yet;
-  pointer prev_prev_r;
-  pointer s;
-  pointer q;
-  pointer v;
-  integer t;
-  internal_font_number f;
-  halfword l;
-  boolean node_r_stays_active;
-  scaled line_width;
-  char fit_class;
-  halfword b;
-  integer d;
-  boolean artificial_demerits;
-  pointer save_link;
-  scaled shortfall;
-
-  if (abs(pi) >= inf_penalty)
-    if (pi > 0)
-      goto exit;
-    else
-      pi = eject_penalty;
-
-  no_break_yet = true;
-  prev_r = active;
-  old_l = 0;
-  do_all_six(copy_to_cur_active);
-
-  while (true)
-  {
-continu:
-    r = link(prev_r);
-
-    if (type(r) == delta_node)
-    {
-      do_all_six(update_width);
-      prev_prev_r = prev_r;
-      prev_r = r;
-      goto continu;
-    }
-
-    {
-      l = line_number(r);
-
-      if (l > old_l)
-      {
-        if ((minimum_demerits < awful_bad) && ((old_l != easy_line) || (r == active)))
-        {
-          if (no_break_yet)
-          {
-            no_break_yet = false;
-            do_all_six(set_break_width_to_background);
-            s = cur_p;
-
-            if (break_type > unhyphenated)
-              if (cur_p != 0)
-              {
-                t = replace_count(cur_p);
-                v = cur_p;
-                s = post_break(cur_p);
-
-                while (t > 0)
-                {
-                  decr(t);
-                  v = link(v);
-
-                  if (is_char_node(v))
-                  {
-                    f = font(v);
-                    break_width[1] = break_width[1] - char_width(f, char_info(f, character(v)));
-                  }
-                  else switch (type(v))
-                  {
-                    case ligature_node:
-                      {
-                        f = font(lig_char(v));
-                        break_width[1] = break_width[1] - char_width(f, char_info(f, character(lig_char(v))));
-                      }
-                      break;
-
-                    case hlist_node:
-                    case vlist_node:
-                    case rule_node:
-                    case kern_node:
-                      break_width[1] = break_width[1] - width(v);
-                      break;
-
-                    default:
-                      {
-                        confusion("disc1");
-                        return;
-                      }
-                      break;
-                  }
-                }
-
-                while (s != 0)
-                {
-                  if (is_char_node(s))
-                  {
-                    f = font(s);
-                    break_width[1] = break_width[1] + char_width(f, char_info(f, character(s)));
-                  }
-                  else switch (type(s))
-                  {
-                    case ligature_node:
-                      {
-                        f = font(lig_char(s));
-                        break_width[1] = break_width[1] + char_width(f, char_info(f, character(lig_char(s))));
-                      }
-                      break;
-
-                    case hlist_node:
-                    case vlist_node:
-                    case rule_node:
-                    case kern_node:
-                      break_width[1] = break_width[1] + width(s);
-                      break;
-
-                    default:
-                      {
-                        confusion("disc2");
-                        return;
-                      }
-                      break;
-                  }
-
-                  s = link(s);
-                }
-
-                break_width[1] = break_width[1] + disc_width;
-
-                if (post_break(cur_p) == 0)
-                  s = link(v);
-              }
-
-              while (s != 0)
-              {
-                if (is_char_node(s))
-                  goto done;
-
-                switch (type(s))
-                {
-                  case glue_node:
-                    {
-                      v = glue_ptr(s);
-                      break_width[1] = break_width[1] - width(v);
-                      break_width[2 + stretch_order(v)] = break_width[2 + stretch_order(v)] - stretch(v);
-                      break_width[6] = break_width[6] - shrink(v);
-                    }
-                    break;
-
-                  case penalty_node:
-                    do_nothing();
-                    break;
-
-                  case math_node:
-                    break_width[1] = break_width[1] - width(s);
-                    break;
-
-                  case kern_node:
-                    if (subtype(s) != explicit)
-                      goto done;
-                    else
-                      break_width[1] = break_width[1] - width(s);
-                    break;
-
-                  default:
-                    goto done;
-                    break;
-                }
-
-                s = link(s);
-              }
-done:;
-          }
-
-          if (type(prev_r) == delta_node)
-            do_all_six(convert_to_break_width);
-          else if (prev_r == active)
-            do_all_six(store_break_width);
-          else
-          {
-            q = get_node(delta_node_size);
-            link(q) = r;
-            type(q) = delta_node;
-            subtype(q) = 0;
-            do_all_six(new_delta_to_break_width);
-            link(prev_r) = q;
-            prev_prev_r = prev_r;
-            prev_r = q;
-          }
-
-          if (abs(adj_demerits) >= awful_bad - minimum_demerits)
-            minimum_demerits = awful_bad - 1;
-          else
-            minimum_demerits = minimum_demerits + abs(adj_demerits);
-
-          for (fit_class = very_loose_fit; fit_class <= tight_fit; fit_class++)
-          {
-            if (minimal_demerits[fit_class] <= minimum_demerits)
-            {
-              q = get_node(passive_node_size);
-              link(q) = passive;
-              passive = q;
-              cur_break(q) = cur_p;
-#ifdef STAT
-              incr(pass_number);
-              serial(q) = pass_number;
-#endif
-              prev_break(q) = best_place[fit_class];
-              q = get_node(active_node_size);
-              break_node(q) = passive;
-              line_number(q) = best_pl_line[fit_class] + 1;
-              fitness(q) = fit_class;
-              type(q) = break_type;
-              total_demerits(q) = minimal_demerits[fit_class];
-              link(q) = r;
-              link(prev_r) = q;
-              prev_r = q;
-#ifdef STAT
-              if (tracing_paragraphs > 0)
-              {
-                print_nl("@@");
-                print_int(serial(passive));
-                prints(": line ");
-                print_int(line_number(q) - 1);
-                print_char('.');
-                print_int(fit_class);
-
-                if (break_type == hyphenated)
-                  print_char('-');
-
-                prints(" t=");
-                print_int(total_demerits(q));
-                prints(" -> @@");
-
-                if (prev_break(passive) == 0)
-                  print_char('0');
-                else
-                  print_int(serial(prev_break(passive)));
-              }
-#endif
-            }
-
-            minimal_demerits[fit_class] = awful_bad;
-          }
-
-          minimum_demerits = awful_bad;
-
-          if (r != active)
-          {
-            q = get_node(delta_node_size);
-            link(q) = r;
-            type(q) = delta_node;
-            subtype(q) = 0;
-            do_all_six(new_delta_from_break_width);
-            link(prev_r) = q;
-            prev_prev_r = prev_r;
-            prev_r = q;
-          }
-        }
-
-        if (r == active)
-          goto exit;
-
-        if (l > easy_line)
-        {
-          line_width = second_width;
-          old_l = max_halfword - 1;
-        }
-        else
-        {
-          old_l = l;
-
-          if (l > last_special_line)
-            line_width = second_width;
-          else if (par_shape_ptr == 0)
-            line_width = first_width;
-          else
-            line_width = mem[par_shape_ptr + 2 * l].cint;
-        }
-      }
-    }
-
-    {
-      artificial_demerits = false;
-      shortfall = line_width - cur_active_width[1];
-
-      if (shortfall > 0)
-        if ((cur_active_width[3] != 0) || (cur_active_width[4] != 0) || (cur_active_width[5] != 0))
-        {
-          b = 0;
-          fit_class = decent_fit;
-        }
-        else
-        {
-          if (shortfall > 7230584L)
-            if (cur_active_width[2] < 1663497L)
-            {
-              b = 10000;
-              fit_class = very_loose_fit;
-              goto done1;
-            }
-
-          b = badness(shortfall, cur_active_width[2]);
-
-          if (b > 12)
-            if (b > 99)
-              fit_class = very_loose_fit;
-            else
-              fit_class = loose_fit;
-          else
-            fit_class = decent_fit;
-done1:;
-        }
-      else
-      {
-        if (- (integer) shortfall > cur_active_width[6])
-          b = inf_bad + 1;
-        else
-          b = badness(- (integer) shortfall, cur_active_width[6]);
-
-        if (b > 12)
-          fit_class = tight_fit;
-        else
-          fit_class = decent_fit;
-      }
-
-      if ((b > inf_bad) || (pi == eject_penalty))
-      {
-        if (final_pass && (minimum_demerits == awful_bad) && (link(r) == active) && (prev_r == active))
-          artificial_demerits = true;
-        else if (b > threshold)
-          goto deactivate;
-
-        node_r_stays_active = false;
-      }
-      else
-      {
-        prev_r = r;
-
-        if (b > threshold)
-          goto continu;
-
-        node_r_stays_active = true;
-      }
-
-      if (artificial_demerits)
-        d = 0;
-      else
-      {
-        d = line_penalty + b;
-
-        if (abs(d) >= 10000)
-          d = 100000000L;
-        else
-          d = d * d;
-
-        if (pi != 0)
-          if (pi > 0)
-            d = d + pi * pi;
-          else if (pi > -10000)
-            d = d - pi * pi;
-
-        if ((break_type == hyphenated) && (type(r) == hyphenated))
-          if (cur_p != 0)
-            d = d + double_hyphen_demerits;
-          else
-            d = d + final_hyphen_demerits;
-
-        if (abs(toint(fit_class) - toint(fitness(r))) > 1)
-          d = d + adj_demerits;
-      }
-
-#ifdef STAT
-      if (tracing_paragraphs > 0)
-      {
-        if (printed_node != cur_p)
-        {
-          print_nl("");
-
-          if (cur_p == 0)
-            short_display(link(printed_node));
-          else
-          {
-            save_link = link(cur_p);
-            link(cur_p) = 0;
-            print_nl("");
-            short_display(link(printed_node));
-            link(cur_p) = save_link;
-          }
-
-          printed_node = cur_p;
-        }
-
-        print_nl("@");
-
-        if (cur_p == 0)
-          print_esc("par");
-        else if (type(cur_p) != glue_node)
-        {
-          if (type(cur_p) == penalty_node)
-            print_esc("penalty");
-          else if (type(cur_p) == disc_node)
-            print_esc("discretionary");
-          else if (type(cur_p) == kern_node)
-            print_esc("kern");
-          else
-            print_esc("math");
-        }
-
-        prints(" via @@");
-
-        if (break_node(r) == 0)
-          print_char('0');
-        else
-          print_int(serial(break_node(r)));
-
-        prints(" b=");
-
-        if (b > inf_bad)
-          print_char('*');
-        else
-          print_int(b);
-
-        prints(" p=");
-        print_int(pi);
-        prints(" d=");
-
-        if (artificial_demerits)
-          print_char('*');
-        else
-          print_int(d);
-      }
-#endif
-
-      d = d + total_demerits(r);
-
-      if (d <= minimal_demerits[fit_class])
-      {
-        minimal_demerits[fit_class] = d;
-        best_place[fit_class] = break_node(r);
-        best_pl_line[fit_class] = l;
-
-        if (d < minimum_demerits)
-          minimum_demerits = d;
-      }
-
-      if (node_r_stays_active)
-        goto continu;
-
-deactivate:
-      link(prev_r) = link(r);
-      free_node(r, active_node_size);
-
-      if (prev_r == active)
-      {
-        r = link(active);
-
-        if (type(r) == delta_node)
-        {
-          do_all_six(update_active);
-          do_all_six(copy_to_cur_active);
-          link(active) = link(r);
-          free_node(r, delta_node_size);
-        }
-      }
-      else if (type(prev_r) == delta_node)
-      {
-        r = link(prev_r);
-
-        if (r == active)
-        {
-          do_all_six(downdate_width);
-          link(prev_prev_r) = active;
-          free_node(prev_r, delta_node_size);
-          prev_r = prev_prev_r;
-        }
-        else if (type(r) == delta_node)
-        {
-          do_all_six(update_width);
-          do_all_six(combine_two_deltas);
-          link(prev_r) = link(r);
-          free_node(r, delta_node_size);
-        }
-      }
-    }
-  }
-
-exit:;
-#ifdef STAT
-  if (cur_p == printed_node)
-    if (cur_p != 0)
-      if (type(cur_p) == disc_node)
-      {
-        t = replace_count(cur_p);
-
-        while (t > 0)
-        {
-          decr(t);
-          printed_node = link(printed_node);
-        }
-      }
-#endif
-}
-/* sec 0877 */
-void post_line_break (integer final_widow_penalty)
-{
-  pointer q, r, s;
-  boolean disc_break;
-  boolean post_disc_break;
-  scaled cur_width;
-  scaled cur_indent;
-  quarterword t;
-  integer pen;
-  halfword cur_line;
-
-  q = break_node(best_bet);
-  cur_p = 0;
-
-  do
-    {
-      r = q;
-      q = prev_break(q);
-      next_break(r) = cur_p;
-      cur_p = r;
-    }
-  while (!(q == 0));
-
-  cur_line = prev_graf + 1;
-
-  do
-    {
-      q = cur_break(cur_p);
-      disc_break = false;
-      post_disc_break = false;
-
-      if (q != 0)
-        if (type(q) == glue_node)
-        {
-          delete_glue_ref(glue_ptr(q));
-          glue_ptr(q) = right_skip;
-          subtype(q) = right_skip_code + 1;
-          add_glue_ref(right_skip);
-          goto done;
-        }
-        else
-        {
-          if (type(q) == disc_node)
-          {
-            t = replace_count(q);
-
-            if (t == 0)
-              r = link(q);
-            else
-            {
-              r = q;
-
-              while (t > 1)
-              {
-                r = link(r);
-                decr(t);
-              }
-
-              s = link(r);
-              r = link(s);
-              link(s) = 0;
-              flush_node_list(link(q));
-              replace_count(q) = 0;
-            }
-
-            if (post_break(q) != 0)
-            {
-              s = post_break(q);
-
-              while (link(s) != 0)
-                s = link(s);
-
-              link(s) = r;
-              r = post_break(q);
-              post_break(q) = 0;
-              post_disc_break = true;
-            }
-
-            if (pre_break(q) != 0)
-            {
-              s = prev_break(q);
-              link(q) = s;
-
-              while (link(s) != 0)
-                s = link(s);
-
-              prev_break(q) = 0;
-              q = s;
-            }
-
-            link(q) = r;
-            disc_break = true;
-          }
-          else if ((type(q) == math_node) || (type(q) == kern_node))
-            width(q) = 0;
-        }
-      else
-      {
-        q = temp_head;
-
-        while (link(q) != 0)
-          q = link(q);
-      }
-
-      r = new_param_glue(right_skip_code);
-      link(r) = link(q);
-      link(q) = r;
-      q = r;
-
-done:
-
-      r = link(q);
-      link(q) = 0;
-      q = link(temp_head);
-      link(temp_head) = r;
-
-      if (left_skip != 0)
-      {
-        r = new_param_glue(left_skip_code);
-        link(r) = q;
-        q = r;
-      }
-
-      if (cur_line > last_special_line)
-      {
-        cur_width = second_width;
-        cur_indent = second_indent;
-      }
-      else if (par_shape_ptr == 0)
-      {
-        cur_width = first_width;
-        cur_indent = first_indent;
-      }
-      else
-      {
-        cur_width = mem[par_shape_ptr + 2 * cur_line].cint;
-        cur_indent = mem[par_shape_ptr + 2 * cur_line - 1].cint;
-      }
-
-      adjust_tail = adjust_head;
-      just_box = hpack(q, cur_width, 0);
-      shift_amount(just_box) = cur_indent;
-      append_to_vlist(just_box);
-
-      if (adjust_head != adjust_tail)
-      {
-        link(tail) = link(adjust_head);
-        tail = adjust_tail;
-      }
-
-      adjust_tail = 0;
-
-      if (cur_line + 1 != best_line)
-      {
-        pen = inter_line_penalty;
-
-        if (cur_line == prev_graf + 1)
-          pen = pen + club_penalty;
-
-        if (cur_line + 2 == best_line)
-          pen = pen + final_widow_penalty;
-
-        if (disc_break)
-          pen = pen + broken_penalty;
-
-        if (pen != 0)
-        {
-          r = new_penalty(pen);
-          link(tail) = r;
-          tail = r;
-        }
-      }
-
-      incr(cur_line);
-      cur_p = next_break(cur_p);
-
-      if (cur_p != 0)
-        if (!post_disc_break)
-        {
-          r = temp_head;
-
-          while (true)
-          {
-            q = link(r);
-
-            if (q == cur_break(cur_p))
-              goto done1;
-
-            if (is_char_node(q))
-              goto done1;
-
-            if (non_discardable(q))
-              goto done1;
-
-            if (type(q) == kern_node)
-              if (subtype(q) != 1)
-                goto done1;
-
-            r = q;
-          }
-done1:
-          if (r != temp_head)
-          {
-            link(r) = 0;
-            flush_node_list(link(temp_head));
-            link(temp_head) = q;
-          }
-        }
-    }
-  while (!(cur_p == 0));
-
-  if ((cur_line != best_line) || (link(temp_head) != 0))
-  {
-    confusion("line breaking");
-    return;
-  }
-
-  prev_graf = best_line - 1;
-}
-/* sec 0906 */
-small_number reconstitute (small_number j, small_number n, halfword bchar, halfword hchar)
-{
-  pointer p;
-  pointer t;
-  four_quarters q;
-  halfword cur_rh;
-  halfword test_char;
-  scaled w;
-  font_index k;
-
-  hyphen_passed = 0;
-  t = hold_head;
-  w = 0;
-  link(hold_head) = 0;
-  cur_l = hu[j];
-  cur_q = t;
-
-  if (j == 0)
-  {
-    ligature_present = init_lig;
-    p = init_list; 
-
-    if (ligature_present)
-      lft_hit = init_lft; 
-
-    while (p != 0)
-    {
-      append_charnode_to_t(character(p));
-      p = link(p);
-    }
-  }
-  else if (cur_l < 256)
-  {
-    append_charnode_to_t(cur_l);
-  }
-
-  lig_stack = 0;
-  set_cur_r();
-
-continu:
-  if (cur_l == non_char)
-  {
-    k = bchar_label[hf];
-
-    if (k == non_address)
-      goto done;
-    else
-      q = font_info[k].qqqq;
-  }
-  else
-  {
-    q = char_info(hf, cur_l);
-
-    if (char_tag(q) != lig_tag)
-      goto done;
-
-    k = lig_kern_start(hf, q);
-    q = font_info[k].qqqq;
-
-    if (skip_byte(q) > stop_flag)
-    {
-      k = lig_kern_restart(hf, q);
-      q = font_info[k].qqqq;
-    }
-  }
-
-  if (cur_rh < non_char)
-    test_char = cur_rh;
-  else
-    test_char = cur_r;
-
-  while (true)
-  {
-    if (next_char(q) == test_char)
-      if (skip_byte(q) <= 128)
-        if (cur_rh < non_char)
-        {
-          hyphen_passed = j;
-          hchar = non_char;
-          cur_rh = non_char;
-          goto continu;
-        }
-        else
-        {
-          if (hchar < non_char)
-            if (odd(hyf[j]))
-            {
-              hyphen_passed = j;
-              hchar = non_char;
-            }
-
-          if (op_byte(q) < kern_flag)
-          {
-            if (cur_l == non_char)
-              lft_hit = true;
-
-            if (j == n)
-              if (lig_stack == 0)
-                rt_hit = true;
-
-            check_interrupt();
-
-            switch (op_byte(q))
-            {
-              case 1:
-              case 5:
-                {
-                  cur_l = rem_byte(q);
-                  ligature_present = true;
-                }
-                break;
-
-              case 2:
-              case 6:
-                {
-                  cur_r = rem_byte(q);
-
-                  if (lig_stack != 0)
-                    character(lig_stack) = cur_r;
-                  else
-                  {
-                    lig_stack = new_lig_item(cur_r);
-
-                    if (j == n)
-                      bchar = non_char;
-                    else
-                    {
-                      p = get_avail();
-                      list_ptr(lig_stack) = p;
-                      character(p) = hu[j + 1];
-                      font(p) = hf;
-                    }
-                  }
-                }
-                break;
-
-              case 3:
-                {
-                  cur_r = rem_byte(q);
-                  p = lig_stack;
-                  lig_stack = new_lig_item(cur_r);
-                  link(lig_stack) = p;
-                }
-                break;
-
-              case 7:
-              case 11:
-                {
-                  wrap_lig(false);
-                  cur_q = t;
-                  cur_l = rem_byte(q);
-                  ligature_present = true;
-                }
-                break;
-
-              default:
-                {
-                  cur_l = rem_byte(q);
-                  ligature_present = true;
-
-                  if (lig_stack != 0)
-                  {
-                    if (lig_ptr(lig_stack) != 0)
-                    {
-                      link(t) = lig_ptr(lig_stack);
-                      t = link(t);
-                      incr(j);
-                    }
-
-                    p = lig_stack;
-                    lig_stack = link(p);
-                    free_node(p, small_node_size);
-
-                    if (lig_stack == 0)
-                    {
-                      if (j < n)
-                        cur_r = hu[j + 1];
-                      else
-                        cur_r = bchar;
-
-                      if (odd(hyf[j]))
-                        cur_rh = hchar;
-                      else
-                        cur_rh = 256;
-                    }
-                    else
-                      cur_r = character(lig_stack);
-                  }
-                  else if (j == n)
-                    goto done;
-                  else
-                  {
-                    append_charnode_to_t(cur_r);
-                    incr(j);
-                    set_cur_r();
-                  }
-                }
-                break;
-            }
-
-            if (op_byte(q) > 4)
-              if (op_byte(q) != 7)
-                goto done;
-
-            goto continu;
-          }
-
-          w = char_kern(hf, q);
-          goto done;
-        }
-
-    if (skip_byte(q) >= stop_flag)
-      if (cur_rh == non_char)
-        goto done;
-      else
-      {
-        cur_rh = non_char;
-        goto continu;
-      }
-      
-    k = k + skip_byte(q) + 1;
-    q = font_info[k].qqqq;
-  }
-
-done:
-  wrap_lig(rt_hit);
-
-  if (w != 0)
-  {
-    link(t) = new_kern(w);
-    t = link(t);
-    w = 0;
-  }
-
-  if (lig_stack != 0)
-  {
-    cur_q = t;
-    cur_l = character(lig_stack);
-    ligature_present = true;
-    pop_lig_stack();
-    goto continu;
-  }
-
-  return j;
-}
-/* sec 0895 */
-void hyphenate (void)
-{
-  /* char i, j, l; */
-  char i, j;
-  int l;
-  pointer q, r, s;
-  halfword bchar;
-  pointer major_tail, minor_tail;
-  /* ASCII_code c; */
-  int c;
-  char c_loc;
-  /* integer r_count; */
-  int r_count;
-  pointer hyf_node;
-  trie_pointer z;
-  integer v;
-  hyph_pointer h;
-  str_number k;
-  pool_pointer u;
-
-  for (j = 0; j <= hn; j++)
-    hyf[j] = 0;
-
-  h = hc[1];
-  incr(hn);
-  hc[hn] = cur_lang;
-
-  for (j = 2; j <= hn; j++)
-    h = (h + h + hc[j]) % hyphen_prime;
-
-  while (true)
-  {
-    k = hyph_word[h];
-
-    if (k == 0)
-      goto not_found;
-
-    if (length(k) < hn)
-      goto not_found;
-
-    if (length(k) == hn)
-    {
-      j = 1;
-      u = str_start[k];
-
-      do
-        {
-          if (str_pool[u] < hc[j])
-            goto not_found;
-
-          if (str_pool[u] > hc[j])
-            goto done;
-
-          incr(j);
-          incr(u);
-        }
-      while (!(j > hn));
-
-      s = hyph_list[h];
-
-      while (s != 0)
-      {
-        hyf[info(s)] = 1;
-        s = link(s);
-      }
-
-      decr(hn);
-      goto found;
-    }
-
-done:
-    if (h > 0)
-      decr(h);
-    else
-      h = hyphen_prime;
-  }
-
-not_found:
-  decr(hn);
-
-  if (trie_trc[cur_lang + 1] != cur_lang)
-    return;
-
-  hc[0] = 0;
-  hc[hn + 1] = 0;
-  hc[hn + 2] = 256;
-
-  for (j = 0; j <= hn - r_hyf + 1; j++)
-  {
-    z = trie_trl[cur_lang + 1] + hc[j];
-    l = j;
-
-    while (hc[l] == trie_trc[z])
-    {
-      if (trie_tro[z] != min_trie_op)
-      {
-        v = trie_tro[z];
-
-        do
-          {
-            v = v + op_start[cur_lang];
-            i = l - hyf_distance[v];
-
-            if (hyf_num[v] > hyf[i])
-              hyf[i]= hyf_num[v];
-
-            v = hyf_next[v];
-          }
-        while (!(v == min_trie_op));
-      }
-
-      incr(l);
-      z = trie_trl[z] + hc[l];
-    }
-  }
-
-found:
-  for (j = 0; j <= l_hyf - 1; j++)
-    hyf[j] = 0;
-
-  for (j = 0; j <= r_hyf - 1; j++)
-    hyf[hn - j]= 0;
-
-  for (j = l_hyf; j <= hn - r_hyf; j++)
-    if (odd(hyf[j]))
-      goto found1;
-
-  return;
-
-found1:
-  q = link(hb);
-  link(hb) = 0;
-  r = link(ha);
-  link(ha) = 0;
-  bchar = hyf_bchar;
-
-  if (is_char_node(ha))
-    if (font(ha) != hf)
-      goto found2;
-    else
-    {
-      init_list = ha;
-      init_lig = false;
-      hu[0] = character(ha);
-    }
-  else if (type(ha) == ligature_node)
-    if (font(lig_char(ha)) != hf)
-      goto found2;
-    else
-    {
-      init_list = lig_ptr(ha);
-      init_lig = true;
-      init_lft = (subtype(ha) > 1);
-      hu[0] = character(lig_char(ha));
-
-      if (init_list == 0)
-        if (init_lft)
-        {
-          hu[0] = 256;
-          init_lig = false;
-        }
-
-      free_node(ha, small_node_size);
-    }
-  else
-  {
-    if (!is_char_node(r))
-      if (type(r) == ligature_node)
-        if (subtype(r) > 1)
-          goto found2;
-
-    j = 1;
-    s = ha;
-    init_list = 0;
-    goto common_ending;
-  }
-
-  s = cur_p;
-
-  while (link(s) != ha)
-    s = link(s);
-
-  j = 0;
-  goto common_ending;
-
-found2:
-  s = ha;
-  j = 0;
-  hu[0] = 256;
-  init_lig = false;
-  init_list = 0;
-
-common_ending:
-  flush_node_list(r);
-
-  do
-    {
-      l = j;
-      j = reconstitute(j, hn, bchar, hyf_char) + 1;
-
-      if (hyphen_passed == 0)
-      {
-        link(s) = link(hold_head);
-
-        while (link(s) != 0)
-          s = link(s);
-
-        if (odd(hyf[j - 1]))
-        {
-          l = j;
-          hyphen_passed = j - 1;
-          link(hold_head) = 0;
-        }
-      }
-
-      if (hyphen_passed > 0)
-        do
-          {
-            r = get_node(small_node_size);
-            link(r) = link(hold_head);
-            type(r) = disc_node;
-            major_tail = r;
-            r_count = 0;
-
-            while (link(major_tail) != 0)
-            {
-              major_tail = link(major_tail);
-              incr(r_count);
-            }
-
-            i = hyphen_passed;
-            hyf[i] = 0;
-            minor_tail = 0;
-            pre_break(r) = 0;
-            hyf_node = new_character(hf, hyf_char);
-
-            if (hyf_node != 0)
-            {
-              incr(i);
-              c = hu[i];
-              hu[i] = hyf_char;
-              free_avail(hyf_node);
-            }
-
-            while (l <= i)
-            {
-              l = reconstitute(l, i, font_bchar[hf], non_char) + 1;
-
-              if (link(hold_head) != 0) /* BUG FIX ??? */
-              {
-                if (minor_tail == 0)
-                  pre_break(r) = link(hold_head);
-                else
-                  link(minor_tail) = link(hold_head);
-
-                minor_tail = link(hold_head);
-
-                while (link(minor_tail) != 0)  /* BUG FIX */
-                  minor_tail = link(minor_tail);
-              }
-            }
-
-            if (hyf_node != 0)
-            {
-              hu[i] = c;
-              l = i;
-              decr(i);
-            }
-
-            minor_tail = 0;
-            post_break(r) = 0;
-            c_loc = 0;
-
-            if (bchar_label[hf] != non_address)
-            {
-              decr(l);
-              c = hu[l];
-              c_loc = l;
-              hu[l]= 256;
-            }
-
-            while (l < j)
-            {
-              do
-                {
-                  l = reconstitute(l, hn, bchar, 256) + 1;
-
-                  if (c_loc > 0)
-                  {
-                    hu[c_loc] = c;
-                    c_loc = 0;
-                  }
-
-                  if (link(hold_head) != 0)     /* BUG FIX */
-                  {
-                    if (minor_tail == 0)
-                      post_break(r) = link(hold_head);
-                    else
-                      link(minor_tail) = link(hold_head);
-
-                    minor_tail = link(hold_head);
-
-                    while (link(minor_tail) != 0)
-                      minor_tail = link(minor_tail);
-                  }
-                }
-              while (!(l >= j));
-
-              while (l > j)
-              {
-                j = reconstitute(j, hn, bchar, non_char) + 1;
-                link(major_tail) = link(hold_head);
-
-                while (link(major_tail) != 0)
-                {
-                  major_tail = link(major_tail);
-                  incr(r_count);
-                }
-              }
-            }
-
-            if (r_count > 127)
-            {
-              link(s) = link(r);
-              link(r) = 0;
-              flush_node_list(r);
-            }
-            else
-            {
-              link(s) = r;
-              replace_count(r) = r_count;
-            }
-
-            s = major_tail;
-            hyphen_passed = j - 1;
-            link(hold_head) = 0;
-          }
-        while (!(!odd(hyf[j - 1])));
-    }
-  while (!(j > hn));
-
-  link(s) = q;
-  flush_list(init_list);
-}
-/* sec 0934 */
-void new_hyph_exceptions (void)
-{
-  char n;
-  char j;
-  hyph_pointer h;
-  str_number k;
-  pointer p;
-  pointer q;
-  str_number s, t;
-  pool_pointer u, v;
-
-  scan_left_brace();
-  set_cur_lang();
-  n = 0;
-  p = 0;
-
-  while (true)
-  {
-    get_x_token();
-
-reswitch:
-    switch (cur_cmd)
-    {
-      case letter:
-      case other_char:
-      case char_given:
-        if (cur_chr == '-')
-        {
-          if (n < 63)
-          {
-            q = get_avail();
-            link(q) = p;
-            info(q) = n;
-            p = q;
-          }
-        }
-        else
-        {
-          if (lc_code(cur_chr) == 0)
-          {
-            print_err("Not a letter");
-            help2("Letters in \\hyphenation words must have \\lccode>0.",
-                "Proceed; I'll ignore the character I just read.");
-            error();
-          }
-          else if (n < 63)
-          {
-            incr(n);
-            hc[n] = lc_code(cur_chr);
-          }
-        }
-        break;
-
-      case char_num:
-        {
-          scan_char_num();
-          cur_chr = cur_val;
-          cur_cmd = char_given;
-          goto reswitch;
-        }
-        break;
-
-      case spacer:
-      case right_brace:
-        {
-          if (n > 1)
-          {
-            incr(n);
-            hc[n] = cur_lang;
-            str_room(n);
-            h = 0;
-
-            for (j = 1; j <= n; j++)
-            {
-              h = (h + h + hc[j]) % hyphen_prime;
-              append_char(hc[j]);
-            }
-
-            s = make_string();
-
-            if (hyph_count == hyphen_prime)
-            {
-              overflow("exception dictionary", hyphen_prime);
-              return;
-            }
-
-            incr(hyph_count);
-
-            while (hyph_word[h] != 0)
-            {
-              k = hyph_word[h];
-
-              if (length(k) < length(s))
-                goto found;
-
-              if (length(k) > length(s))
-                goto not_found;
-
-              u = str_start[k];
-              v = str_start[s];
-
-              do
-                {
-                  if (str_pool[u] < str_pool[v])
-                    goto found;
-
-                  if (str_pool[u] > str_pool[v])
-                    goto not_found;
-
-                  incr(u);
-                  incr(v);
-                }
-              while (!(u == str_start[k + 1]));
-
-found:
-              q = hyph_list[h];
-              hyph_list[h] = p;
-              p = q;
-              t = hyph_word[h];
-              hyph_word[h] = s;
-              s = t;
-
-not_found:
-              if (h > 0)
-                decr(h);
-              else
-                h = hyphen_prime;
-            }
-
-            hyph_word[h] = s;
-            hyph_list[h] = p;
-          }
-
-          if (cur_cmd == right_brace)
-            return;
-
-          n = 0;
-          p = 0;
-        }
-        break;
-
-      default:
-        {
-          print_err("Improper ");
-          print_esc("hyphenation");
-          prints(" will be flushed");
-          help2("Hyphenation exceptions must contain only letters",
-              "and hyphens. But continue; I'll forgive and forget.");
-          error();
-        }
-        break;
-    }
-  }
-}
-/* sec 0968 */
-pointer prune_page_top (pointer p)
-{
-  pointer prev_p;
-  pointer q;
-
-  prev_p = temp_head;
-  link(temp_head) = p;
-
-  while (p != 0)
-    switch (type(p))
-    {
-      case hlist_node:
-      case vlist_node:
-      case rule_node:
-        {
-          q = new_skip_param(split_top_skip_code);
-          link(prev_p) = q;
-          link(q) = p;
-
-          if (width(temp_ptr) > height(p))
-            width(temp_ptr) = width(temp_ptr) - height(p);
-          else
-            width(temp_ptr) = 0;
-
-          p = 0;
-        }
-        break;
-
-      case whatsit_node:
-      case mark_node:
-      case ins_node:
-        {
-          prev_p = p;
-          p = link(prev_p);
-        }
-        break;
-
-      case glue_node:
-      case kern_node:
-      case penalty_node:
-        {
-          q = p;
-          p = link(q);
-          link(q) = 0;
-          link(prev_p) = p;
-          flush_node_list(q);
-        }
-        break;
-
-      default:
-        {
-          confusion("pruning");
-          return 0;
-        }
-        break;
-    }
-
-  return link(temp_head);
-}
-/* sec 0970 */
-pointer vert_break (pointer p, scaled h, scaled d)
-{
-  pointer prev_p;
-  pointer q, r;
-  integer pi;
-  integer b;
-  integer least_cost;
-  pointer best_place;
-  scaled prev_dp; 
-  /* small_number t; */
-  int t;
-
-  prev_p = p;
-  least_cost = awful_bad;
-  do_all_six(set_height_zero);
-  prev_dp = 0;
-
-  while (true)
-  {
-    if (p == 0)
-      pi = eject_penalty;
-    else switch (type(p))
-    {
-      case hlist_node:
-      case vlist_node:
-      case rule_node:
-        {
-          cur_height = cur_height + prev_dp + height(p);
-          prev_dp = depth(p);
-          goto not_found;
-        }
-        break;
-
-      case whatsit_node:
-        goto not_found;
-        break;
-
-      case glue_node:
-        if (precedes_break(prev_p))
-          pi = 0;
-        else
-          goto update_heights;
-        break;
-
-      case kern_node:
-        {
-          if (link(p) == 0)
-            t = penalty_node;
-          else
-            t = type(link(p));
-
-          if (t == glue_node)
-            pi = 0;
-          else
-            goto update_heights;
-        }
-        break;
-
-      case penalty_node:
-        pi = penalty(p);
-        break;
-
-      case mark_node:
-      case ins_node:
-        goto not_found;
-        break;
-
-      default:
-        {
-          confusion("vertbreak");
-          return 0;
-        }
-        break;
-    }
-
-    if (pi < inf_penalty)
-    {
-      if (cur_height < h)
-        if ((active_width[3] != 0) || (active_width[4] != 0) || (active_width[5] != 0))
-          b = 0;
-        else
-          b = badness(h - cur_height, active_width[2]);
-      else if (act_width - h > active_width[6])
-        b = awful_bad;
-      else
-        b = badness(cur_height - h, active_width[6]);
-
-      if (b < awful_bad)
-        if (pi <= eject_penalty)
-          b = pi;
-        else if (b < inf_bad)
-          b = b + pi;
-        else
-          b = deplorable;
-
-      if (b <= least_cost)
-      {
-        best_place = p;
-        least_cost = b;
-        best_height_plus_depth = cur_height + prev_dp;
-      }
-
-      if ((b == awful_bad) || (pi <= eject_penalty))
-        goto done;
-    }
-
-    if ((type(p) < glue_node) || (type(p) > kern_node))
-      goto not_found;
-
-update_heights:
-
-    if (type(p) == kern_node)
-      q = p;
-    else
-    {
-      q = glue_ptr(p);
-      active_width[2 + stretch_order(q)] = active_width[2 + stretch_order(q)] + stretch(q);
-      active_width[6] = active_width[6] + shrink(q);
-
-      if ((shrink_order(q) != normal) && (shrink(q) != 0))
-      {
-        print_err("Infinite glue shrinkage found in box being split");
-        help4("The box you are \\vsplitting contains some infinitely",
-            "shrinkable glue, e.g., `\\vss' or `\\vskip 0pt minus 1fil'.",
-            "Such glue doesn't belong there; but you can safely proceed,",
-            "since the offensive shrinkability has been made finite.");
-        error();
-        r = new_spec(q);
-        shrink_order(r) = normal;
-        delete_glue_ref(q);
-        glue_ptr(p) = r;
-        q = r;
-      }
-    }
-
-    cur_height = cur_height + prev_dp + width(q);
-    prev_dp = 0;
-
-not_found:
-
-    if (prev_dp > d)
-    {
-      cur_height = cur_height + prev_dp - d;
-      prev_dp = d;
-    }
-
-    prev_p = p;
-    p = link(prev_p);
-  }
-
-done:
-  return best_place;
-}
-/* sec 0977 */
-pointer vsplit (eight_bits n, scaled h)
-{
-  pointer v;
-  pointer p;
-  pointer q;
-
-  v = box(n);
-
-  if (split_first_mark != 0)
-  {
-    delete_token_ref(split_first_mark);
-    split_first_mark = 0;
-    delete_token_ref(split_bot_mark);
-    split_bot_mark = 0;
-  }
-
-  if (v == 0)
-  {
-    return 0;
-  }
-
-  if (type(v) != vlist_node)
-  {
-    print_err("");
-    print_esc("vsplit");
-    prints(" needs a ");
-    print_esc("vbox");
-    help2("The box you are trying to split is an \\hbox.",
-        "I can't split such a box, so I'll leave it alone.");
-    error();
-    return 0;
-  }
-
-  q = vert_break(list_ptr(v), h, split_max_depth);
-  p = list_ptr(v);
-
-  if (p == q)
-    list_ptr(v) = 0;
-  else while (true)
-  {
-    if (type(p) == mark_node)
-      if (split_first_mark == 0)
-      {
-        split_first_mark = mark_ptr(p);
-        split_bot_mark = split_first_mark;
-        token_ref_count(split_first_mark) = token_ref_count(split_first_mark) + 2;
-      }
-      else
-      {
-        delete_token_ref(split_bot_mark);
-        split_bot_mark = mark_ptr(p);
-        add_token_ref(split_bot_mark);
-      }
-
-    if (link(p) == q)
-    {
-      link(p) = 0;
-      goto done;
-    }
-
-    p = link(p);
-  }
-
-done:
-  q = prune_page_top(q);
-  p = list_ptr(v);
-  free_node(v, box_node_size);
-  if (q == 0)
-    box(n) = 0;
-  else
-    box(n) = vpackage(q, 0, 1, max_dimen);
-
-  return vpackage(p, h, exactly, split_max_depth);
-}
-/* sec 0985 */
-void print_totals (void)
-{
-  print_scaled(page_so_far[1]);
-  print_plus(2, "");
-  print_plus(3, "fil");
-  print_plus(4, "fill");
-  print_plus(5, "filll");
-
-  if (page_shrink != 0)
-  {
-    prints(" minus ");
-    print_scaled(page_shrink);
-  }
-}
-/* sec 0987 */
-void freeze_page_specs (small_number s)
-{
-  page_contents = s;
-  page_goal = vsize;
-  page_max_depth = max_depth;
-  page_depth = 0;
-  do_all_six(set_page_so_far_zero);
-  least_page_cost = awful_bad;
-
-#ifdef STAT
-  if (tracing_pages > 0)
-  {
-    begin_diagnostic();
-    print_nl("%% goal height=");
-    print_scaled(page_goal);
-    prints(", max depth=");
-    print_scaled(page_max_depth);
-    end_diagnostic(false);
-  }
-#endif
-}
-/* sec 0992 */
-void box_error (eight_bits n)
-{
-  error();
-  begin_diagnostic();
-  print_nl("The following box has been deleted:");
-  show_box(box(n));
-  end_diagnostic(true);
-  flush_node_list(box(n));
-  box(n) = 0;
-}
-/* sec 0993 */
-void ensure_vbox_(eight_bits n)
-{
-  pointer p;
-
-  p = box(n);
-
-  if (p != 0)
-    if (type(p) == hlist_node)
-    {
-      print_err("Insertions can only be added to a vbox");
-      help3("Tut tut: You're trying to \\insert into a",
-          "\\box register that now contains an \\hbox.",
-          "Proceed, and I'll discard its present contents.");
-      box_error(n);
-    }
-}
-/* sec 1012 */
-void fire_up (pointer c)
-{
-  pointer p, q, r, s;
-  pointer prev_p;
-  /* unsigned char n; */
-  unsigned int n;
-  boolean wait;
-  integer save_vbadness;
-  scaled save_vfuzz;
-  pointer save_split_top_skip;
-
-  if (type(best_page_break) == penalty_node)
-  {
-    geq_word_define(int_base + output_penalty_code, penalty(best_page_break));
-    penalty(best_page_break) = inf_penalty;
-  }
-  else
-    geq_word_define(int_base + output_penalty_code, inf_penalty);
-
-  if (bot_mark != 0)
-  {
-    if (top_mark != 0)
-      delete_token_ref(top_mark);
-
-    top_mark = bot_mark;
-    add_token_ref(top_mark);
-    delete_token_ref(first_mark);
-    first_mark = 0;
-  }
-
-  if (c == best_page_break)
-    best_page_break = 0;
-
-  if (box(255) != 0)
-  {
-    print_err("");
-    print_esc("box");
-    prints("255 is not void");
-    help2("You shouldn't use \\box255 except in \\output routines.",
-        "Proceed, and I'll discard its present contents.");
-    box_error(255);
-  }
-
-  insert_penalties = 0;
-  save_split_top_skip = split_top_skip;
-
-  if (holding_inserts <= 0)
-  {
-    r = link(page_ins_head);
-
-    while (r != page_ins_head)
-    {
-      if (best_ins_ptr(r) != 0)
-      {
-        n = subtype(r);
-        ensure_vbox(n);
-
-        if (box(n) == 0)
-          box(n) = new_null_box();
-
-        p = box(n) + list_offset;
-
-        while (link(p) != 0)
-          p = link(p);
-
-        last_ins_ptr(r) = p;
-      }
-
-      r = link(r);
-    }
-  }
-
-  q = hold_head;
-  link(q) = 0;
-  prev_p = page_head;
-  p = link(prev_p);
-
-  while (p != best_page_break)
-  {
-    if (type(p) == ins_node)
-    {
-      if (holding_inserts <= 0)
-      {
-        r = link(page_ins_head);
-
-        while (subtype(r) != subtype(p))
-          r = link(r);
-
-        if (best_ins_ptr(r) == 0)
-          wait = true;
-        else
-        {
-          wait = false;
-          s = last_ins_ptr(r);
-          link(s) = ins_ptr(p);
-
-          if (best_ins_ptr(r) == p)
-          {
-            if (type(r) == split_up)
-              if ((broken_ins(r) == p) && (broken_ins(r) != 0))
-              {
-                while (link(s) != broken_ptr(r))
-                  s = link(s);
-
-                link(s) = 0;
-                split_top_skip = split_top_ptr(p);
-                ins_ptr(p) = prune_page_top(broken_ptr(r));
-
-                if (ins_ptr(p) != 0)
-                {
-                  temp_ptr = vpackage(ins_ptr(p), 0, 1, max_dimen);
-                  height(p) = height(temp_ptr) + depth(temp_ptr);
-                  free_node(temp_ptr, box_node_size);
-                  wait = true;
-                }
-              }
-
-            best_ins_ptr(r) = 0;
-            n = subtype(r);
-            temp_ptr = list_ptr(box(n));
-            free_node(box(n), box_node_size);
-            box(n) = vpackage(temp_ptr, 0, 1, max_dimen);
-          }
-          else
-          {
-            while (link(s) != 0)
-              s = link(s);
-
-            last_ins_ptr(r) = s;
-          }
-        }
-
-        link(prev_p) = link(p);
-        link(p) = 0;
-
-        if (wait)
-        {
-          link(q) = p;
-          q = p;
-          incr(insert_penalties);
-        }
-        else
-        {
-          delete_glue_ref(split_top_ptr(p));
-          free_node(p, ins_node_size);
-        }
-
-        p = prev_p;
-      }
-    }
-    else if (type(p) == mark_node)
-    {
-      if (first_mark == 0)
-      {
-        first_mark = mark_ptr(p);
-        add_token_ref(first_mark);
-      }
-
-      if (bot_mark != 0)
-        delete_token_ref(bot_mark);
-
-      bot_mark = mark_ptr(p);
-      add_token_ref(bot_mark);
-    }
-
-    prev_p = p;
-    p = link(prev_p);
-  }
-
-  split_top_skip = save_split_top_skip;
-
-  if (p != 0)
-  {
-    if (link(contrib_head) == 0)
-      if (nest_ptr == 0)
-        tail = page_tail;
-      else
-        nest[0].tail_field = page_tail;
-
-    link(page_tail) = link(contrib_head);
-    link(contrib_head) = p;
-    link(prev_p) = 0;
-  }
-
-  save_vbadness = vbadness;
-  vbadness = inf_bad;
-  save_vfuzz = vfuzz;
-  vfuzz = max_dimen;
-  box(255) = vpackage(link(page_head), best_size, 0, page_max_depth);
-  vbadness = save_vbadness;
-  vfuzz = save_vfuzz;
-
-  if (last_glue != empty_flag)
-    delete_glue_ref(last_glue);
-
-  page_contents = 0;
-  page_tail = page_head;
-  link(page_head) = 0;
-  last_glue = empty_flag;
-  last_penalty = 0;
-  last_kern = 0;
-  page_depth = 0;
-  page_max_depth = 0;
-
-  if (q != hold_head)
-  {
-    link(page_head) = link(hold_head);
-    page_tail = q;
-  }
-
-  r = link(page_ins_head);
-
-  while (r != page_ins_head)
-  {
-    q = link(r);
-    free_node(r, page_ins_node_size);
-    r = q;
-  }
-  link(page_ins_head) = page_ins_head;
-
-  if ((top_mark != 0) && (first_mark == 0))
-  {
-    first_mark = top_mark;
-    add_token_ref(top_mark);
-  }
-
-  if (output_routine != 0)
-    if (dead_cycles >= max_dead_cycles)
-    {
-      print_err("Output loop---");
-      print_int(dead_cycles);
-      prints(" consecutive dead cycles");
-      help3("I've concluded that your \\output is awry; it never does",
-          "\\ship_out, so I'm shipping \box255 out myself. Next ",
-          "increase \\maxdeadcycles if you want me to be more patient!");
-      error();
-    }
-    else
-    {
-      output_active = true;
-      incr(dead_cycles);
-      push_nest();
-      mode = -vmode;
-      prev_depth = ignore_depth;
-      mode_line = - (integer) line;
-      begin_token_list(output_routine, output_text);
-      new_save_level(output_group);
-      normal_paragraph();
-      scan_left_brace();
-      return;
-    }
-
-  {
-    if (link(page_head) != 0)
-    {
-      if (link(contrib_head) == 0)
-        if (nest_ptr == 0)
-          tail = page_tail;
-        else
-          nest[0].tail_field = page_tail;
-      else
-        link(page_tail) = link(contrib_head);
-
-      link(contrib_head) = link(page_head);
-      link(page_head) = 0;
-      page_tail = page_head;
-    }
-
-    ship_out(box(255));
-    box(255) = 0;
-  }
+/* Copyright 2014 Clerk Ma\r
+\r
+   This program is free software; you can redistribute it and/or modify\r
+   it under the terms of the GNU General Public License as published by\r
+   the Free Software Foundation; either version 2 of the License, or\r
+   (at your option) any later version.\r
+\r
+   This program is distributed in the hope that it will be useful, but\r
+   WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+   General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with this program; if not, write to the Free Software\r
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA\r
+   02110-1301 USA.  */\r
+\r
+#define EXTERN extern\r
+\r
+#include "yandytex.h"\r
+\r
+/* sec 0785 */\r
+void align_peek (void)\r
+{\r
+restart:\r
+  align_state = 1000000L;\r
+\r
+  do\r
+    {\r
+      get_x_token();\r
+    }\r
+  while (!(cur_cmd != spacer));\r
+\r
+  if (cur_cmd == no_align)\r
+  {\r
+    scan_left_brace();\r
+\r
+    new_save_level(no_align_group);\r
+\r
+    if (mode == -vmode)\r
+      normal_paragraph();\r
+  }\r
+  else if (cur_cmd == right_brace)\r
+    fin_align();\r
+  else if ((cur_cmd == car_ret) && (cur_chr == cr_cr_code))\r
+    goto restart;\r
+  else\r
+  {\r
+    init_row();\r
+    init_col();\r
+  }\r
+}\r
+/* sec 0826 */\r
+pointer finite_shrink (pointer p)\r
+{\r
+  pointer q;\r
+\r
+  if (no_shrink_error_yet)\r
+  {\r
+    no_shrink_error_yet = false;\r
+    print_err("Infinite glue shrinkage found in a paragraph");\r
+    help5("The paragraph just ended includes some glue that has",\r
+        "infinite shrinkability, e.g., `\\hskip 0pt minus 1fil'.",\r
+        "Such glue doesn't belong there---it allows a paragraph",\r
+        "of any length to fit on one line. But it's safe to proceed,",\r
+        "since the offensive shrinkability has been made finite.");\r
+    error();\r
+  }\r
+\r
+  q = new_spec(p);\r
+  shrink_order(q) = normal;\r
+  delete_glue_ref(p);\r
+\r
+  return q;\r
+}\r
+/* sec 0829 */\r
+void try_break (integer pi, small_number break_type)\r
+{\r
+  pointer r;\r
+  pointer prev_r;\r
+  halfword old_l;\r
+  boolean no_break_yet;\r
+  pointer prev_prev_r;\r
+  pointer s;\r
+  pointer q;\r
+  pointer v;\r
+  integer t;\r
+  internal_font_number f;\r
+  halfword l;\r
+  boolean node_r_stays_active;\r
+  scaled line_width;\r
+  char fit_class;\r
+  halfword b;\r
+  integer d;\r
+  boolean artificial_demerits;\r
+  pointer save_link;\r
+  scaled shortfall;\r
+\r
+  if (abs(pi) >= inf_penalty)\r
+    if (pi > 0)\r
+      goto exit;\r
+    else\r
+      pi = eject_penalty;\r
+\r
+  no_break_yet = true;\r
+  prev_r = active;\r
+  old_l = 0;\r
+  do_all_six(copy_to_cur_active);\r
+\r
+  while (true)\r
+  {\r
+continu:\r
+    r = link(prev_r);\r
+\r
+    if (type(r) == delta_node)\r
+    {\r
+      do_all_six(update_width);\r
+      prev_prev_r = prev_r;\r
+      prev_r = r;\r
+      goto continu;\r
+    }\r
+\r
+    {\r
+      l = line_number(r);\r
+\r
+      if (l > old_l)\r
+      {\r
+        if ((minimum_demerits < awful_bad) && ((old_l != easy_line) || (r == active)))\r
+        {\r
+          if (no_break_yet)\r
+          {\r
+            no_break_yet = false;\r
+            do_all_six(set_break_width_to_background);\r
+            s = cur_p;\r
+\r
+            if (break_type > unhyphenated)\r
+              if (cur_p != 0)\r
+              {\r
+                t = replace_count(cur_p);\r
+                v = cur_p;\r
+                s = post_break(cur_p);\r
+\r
+                while (t > 0)\r
+                {\r
+                  decr(t);\r
+                  v = link(v);\r
+\r
+                  if (is_char_node(v))\r
+                  {\r
+                    f = font(v);\r
+                    break_width[1] = break_width[1] - char_width(f, char_info(f, character(v)));\r
+                  }\r
+                  else switch (type(v))\r
+                  {\r
+                    case ligature_node:\r
+                      {\r
+                        f = font(lig_char(v));\r
+                        break_width[1] = break_width[1] - char_width(f, char_info(f, character(lig_char(v))));\r
+                      }\r
+                      break;\r
+\r
+                    case hlist_node:\r
+                    case vlist_node:\r
+                    case rule_node:\r
+                    case kern_node:\r
+                      break_width[1] = break_width[1] - width(v);\r
+                      break;\r
+\r
+                    default:\r
+                      {\r
+                        confusion("disc1");\r
+                        return;\r
+                      }\r
+                      break;\r
+                  }\r
+                }\r
+\r
+                while (s != 0)\r
+                {\r
+                  if (is_char_node(s))\r
+                  {\r
+                    f = font(s);\r
+                    break_width[1] = break_width[1] + char_width(f, char_info(f, character(s)));\r
+                  }\r
+                  else switch (type(s))\r
+                  {\r
+                    case ligature_node:\r
+                      {\r
+                        f = font(lig_char(s));\r
+                        break_width[1] = break_width[1] + char_width(f, char_info(f, character(lig_char(s))));\r
+                      }\r
+                      break;\r
+\r
+                    case hlist_node:\r
+                    case vlist_node:\r
+                    case rule_node:\r
+                    case kern_node:\r
+                      break_width[1] = break_width[1] + width(s);\r
+                      break;\r
+\r
+                    default:\r
+                      {\r
+                        confusion("disc2");\r
+                        return;\r
+                      }\r
+                      break;\r
+                  }\r
+\r
+                  s = link(s);\r
+                }\r
+\r
+                break_width[1] = break_width[1] + disc_width;\r
+\r
+                if (post_break(cur_p) == 0)\r
+                  s = link(v);\r
+              }\r
+\r
+              while (s != 0)\r
+              {\r
+                if (is_char_node(s))\r
+                  goto done;\r
+\r
+                switch (type(s))\r
+                {\r
+                  case glue_node:\r
+                    {\r
+                      v = glue_ptr(s);\r
+                      break_width[1] = break_width[1] - width(v);\r
+                      break_width[2 + stretch_order(v)] = break_width[2 + stretch_order(v)] - stretch(v);\r
+                      break_width[6] = break_width[6] - shrink(v);\r
+                    }\r
+                    break;\r
+\r
+                  case penalty_node:\r
+                    do_nothing();\r
+                    break;\r
+\r
+                  case math_node:\r
+                    break_width[1] = break_width[1] - width(s);\r
+                    break;\r
+\r
+                  case kern_node:\r
+                    if (subtype(s) != explicit)\r
+                      goto done;\r
+                    else\r
+                      break_width[1] = break_width[1] - width(s);\r
+                    break;\r
+\r
+                  default:\r
+                    goto done;\r
+                    break;\r
+                }\r
+\r
+                s = link(s);\r
+              }\r
+done:;\r
+          }\r
+\r
+          if (type(prev_r) == delta_node)\r
+            do_all_six(convert_to_break_width);\r
+          else if (prev_r == active)\r
+            do_all_six(store_break_width);\r
+          else\r
+          {\r
+            q = get_node(delta_node_size);\r
+            link(q) = r;\r
+            type(q) = delta_node;\r
+            subtype(q) = 0;\r
+            do_all_six(new_delta_to_break_width);\r
+            link(prev_r) = q;\r
+            prev_prev_r = prev_r;\r
+            prev_r = q;\r
+          }\r
+\r
+          if (abs(adj_demerits) >= awful_bad - minimum_demerits)\r
+            minimum_demerits = awful_bad - 1;\r
+          else\r
+            minimum_demerits = minimum_demerits + abs(adj_demerits);\r
+\r
+          for (fit_class = very_loose_fit; fit_class <= tight_fit; fit_class++)\r
+          {\r
+            if (minimal_demerits[fit_class] <= minimum_demerits)\r
+            {\r
+              q = get_node(passive_node_size);\r
+              link(q) = passive;\r
+              passive = q;\r
+              cur_break(q) = cur_p;\r
+#ifdef STAT\r
+              incr(pass_number);\r
+              serial(q) = pass_number;\r
+#endif\r
+              prev_break(q) = best_place[fit_class];\r
+              q = get_node(active_node_size);\r
+              break_node(q) = passive;\r
+              line_number(q) = best_pl_line[fit_class] + 1;\r
+              fitness(q) = fit_class;\r
+              type(q) = break_type;\r
+              total_demerits(q) = minimal_demerits[fit_class];\r
+              link(q) = r;\r
+              link(prev_r) = q;\r
+              prev_r = q;\r
+#ifdef STAT\r
+              if (tracing_paragraphs > 0)\r
+              {\r
+                print_nl("@@");\r
+                print_int(serial(passive));\r
+                prints(": line ");\r
+                print_int(line_number(q) - 1);\r
+                print_char('.');\r
+                print_int(fit_class);\r
+\r
+                if (break_type == hyphenated)\r
+                  print_char('-');\r
+\r
+                prints(" t=");\r
+                print_int(total_demerits(q));\r
+                prints(" -> @@");\r
+\r
+                if (prev_break(passive) == 0)\r
+                  print_char('0');\r
+                else\r
+                  print_int(serial(prev_break(passive)));\r
+              }\r
+#endif\r
+            }\r
+\r
+            minimal_demerits[fit_class] = awful_bad;\r
+          }\r
+\r
+          minimum_demerits = awful_bad;\r
+\r
+          if (r != active)\r
+          {\r
+            q = get_node(delta_node_size);\r
+            link(q) = r;\r
+            type(q) = delta_node;\r
+            subtype(q) = 0;\r
+            do_all_six(new_delta_from_break_width);\r
+            link(prev_r) = q;\r
+            prev_prev_r = prev_r;\r
+            prev_r = q;\r
+          }\r
+        }\r
+\r
+        if (r == active)\r
+          goto exit;\r
+\r
+        if (l > easy_line)\r
+        {\r
+          line_width = second_width;\r
+          old_l = max_halfword - 1;\r
+        }\r
+        else\r
+        {\r
+          old_l = l;\r
+\r
+          if (l > last_special_line)\r
+            line_width = second_width;\r
+          else if (par_shape_ptr == 0)\r
+            line_width = first_width;\r
+          else\r
+            line_width = mem[par_shape_ptr + 2 * l].cint;\r
+        }\r
+      }\r
+    }\r
+\r
+    {\r
+      artificial_demerits = false;\r
+      shortfall = line_width - cur_active_width[1];\r
+\r
+      if (shortfall > 0)\r
+        if ((cur_active_width[3] != 0) || (cur_active_width[4] != 0) || (cur_active_width[5] != 0))\r
+        {\r
+          b = 0;\r
+          fit_class = decent_fit;\r
+        }\r
+        else\r
+        {\r
+          if (shortfall > 7230584L)\r
+            if (cur_active_width[2] < 1663497L)\r
+            {\r
+              b = 10000;\r
+              fit_class = very_loose_fit;\r
+              goto done1;\r
+            }\r
+\r
+          b = badness(shortfall, cur_active_width[2]);\r
+\r
+          if (b > 12)\r
+            if (b > 99)\r
+              fit_class = very_loose_fit;\r
+            else\r
+              fit_class = loose_fit;\r
+          else\r
+            fit_class = decent_fit;\r
+done1:;\r
+        }\r
+      else\r
+      {\r
+        if (- (integer) shortfall > cur_active_width[6])\r
+          b = inf_bad + 1;\r
+        else\r
+          b = badness(- (integer) shortfall, cur_active_width[6]);\r
+\r
+        if (b > 12)\r
+          fit_class = tight_fit;\r
+        else\r
+          fit_class = decent_fit;\r
+      }\r
+\r
+      if ((b > inf_bad) || (pi == eject_penalty))\r
+      {\r
+        if (final_pass && (minimum_demerits == awful_bad) && (link(r) == active) && (prev_r == active))\r
+          artificial_demerits = true;\r
+        else if (b > threshold)\r
+          goto deactivate;\r
+\r
+        node_r_stays_active = false;\r
+      }\r
+      else\r
+      {\r
+        prev_r = r;\r
+\r
+        if (b > threshold)\r
+          goto continu;\r
+\r
+        node_r_stays_active = true;\r
+      }\r
+\r
+      if (artificial_demerits)\r
+        d = 0;\r
+      else\r
+      {\r
+        d = line_penalty + b;\r
+\r
+        if (abs(d) >= 10000)\r
+          d = 100000000L;\r
+        else\r
+          d = d * d;\r
+\r
+        if (pi != 0)\r
+          if (pi > 0)\r
+            d = d + pi * pi;\r
+          else if (pi > -10000)\r
+            d = d - pi * pi;\r
+\r
+        if ((break_type == hyphenated) && (type(r) == hyphenated))\r
+          if (cur_p != 0)\r
+            d = d + double_hyphen_demerits;\r
+          else\r
+            d = d + final_hyphen_demerits;\r
+\r
+        if (abs(toint(fit_class) - toint(fitness(r))) > 1)\r
+          d = d + adj_demerits;\r
+      }\r
+\r
+#ifdef STAT\r
+      if (tracing_paragraphs > 0)\r
+      {\r
+        if (printed_node != cur_p)\r
+        {\r
+          print_nl("");\r
+\r
+          if (cur_p == 0)\r
+            short_display(link(printed_node));\r
+          else\r
+          {\r
+            save_link = link(cur_p);\r
+            link(cur_p) = 0;\r
+            print_nl("");\r
+            short_display(link(printed_node));\r
+            link(cur_p) = save_link;\r
+          }\r
+\r
+          printed_node = cur_p;\r
+        }\r
+\r
+        print_nl("@");\r
+\r
+        if (cur_p == 0)\r
+          print_esc("par");\r
+        else if (type(cur_p) != glue_node)\r
+        {\r
+          if (type(cur_p) == penalty_node)\r
+            print_esc("penalty");\r
+          else if (type(cur_p) == disc_node)\r
+            print_esc("discretionary");\r
+          else if (type(cur_p) == kern_node)\r
+            print_esc("kern");\r
+          else\r
+            print_esc("math");\r
+        }\r
+\r
+        prints(" via @@");\r
+\r
+        if (break_node(r) == 0)\r
+          print_char('0');\r
+        else\r
+          print_int(serial(break_node(r)));\r
+\r
+        prints(" b=");\r
+\r
+        if (b > inf_bad)\r
+          print_char('*');\r
+        else\r
+          print_int(b);\r
+\r
+        prints(" p=");\r
+        print_int(pi);\r
+        prints(" d=");\r
+\r
+        if (artificial_demerits)\r
+          print_char('*');\r
+        else\r
+          print_int(d);\r
+      }\r
+#endif\r
+\r
+      d = d + total_demerits(r);\r
+\r
+      if (d <= minimal_demerits[fit_class])\r
+      {\r
+        minimal_demerits[fit_class] = d;\r
+        best_place[fit_class] = break_node(r);\r
+        best_pl_line[fit_class] = l;\r
+\r
+        if (d < minimum_demerits)\r
+          minimum_demerits = d;\r
+      }\r
+\r
+      if (node_r_stays_active)\r
+        goto continu;\r
+\r
+deactivate:\r
+      link(prev_r) = link(r);\r
+      free_node(r, active_node_size);\r
+\r
+      if (prev_r == active)\r
+      {\r
+        r = link(active);\r
+\r
+        if (type(r) == delta_node)\r
+        {\r
+          do_all_six(update_active);\r
+          do_all_six(copy_to_cur_active);\r
+          link(active) = link(r);\r
+          free_node(r, delta_node_size);\r
+        }\r
+      }\r
+      else if (type(prev_r) == delta_node)\r
+      {\r
+        r = link(prev_r);\r
+\r
+        if (r == active)\r
+        {\r
+          do_all_six(downdate_width);\r
+          link(prev_prev_r) = active;\r
+          free_node(prev_r, delta_node_size);\r
+          prev_r = prev_prev_r;\r
+        }\r
+        else if (type(r) == delta_node)\r
+        {\r
+          do_all_six(update_width);\r
+          do_all_six(combine_two_deltas);\r
+          link(prev_r) = link(r);\r
+          free_node(r, delta_node_size);\r
+        }\r
+      }\r
+    }\r
+  }\r
+\r
+exit:;\r
+#ifdef STAT\r
+  if (cur_p == printed_node)\r
+    if (cur_p != 0)\r
+      if (type(cur_p) == disc_node)\r
+      {\r
+        t = replace_count(cur_p);\r
+\r
+        while (t > 0)\r
+        {\r
+          decr(t);\r
+          printed_node = link(printed_node);\r
+        }\r
+      }\r
+#endif\r
+}\r
+/* sec 0877 */\r
+void post_line_break (integer final_widow_penalty)\r
+{\r
+  pointer q, r, s;\r
+  boolean disc_break;\r
+  boolean post_disc_break;\r
+  scaled cur_width;\r
+  scaled cur_indent;\r
+  quarterword t;\r
+  integer pen;\r
+  halfword cur_line;\r
+\r
+  q = break_node(best_bet);\r
+  cur_p = 0;\r
+\r
+  do\r
+    {\r
+      r = q;\r
+      q = prev_break(q);\r
+      next_break(r) = cur_p;\r
+      cur_p = r;\r
+    }\r
+  while (!(q == 0));\r
+\r
+  cur_line = prev_graf + 1;\r
+\r
+  do\r
+    {\r
+      q = cur_break(cur_p);\r
+      disc_break = false;\r
+      post_disc_break = false;\r
+\r
+      if (q != 0)\r
+        if (type(q) == glue_node)\r
+        {\r
+          delete_glue_ref(glue_ptr(q));\r
+          glue_ptr(q) = right_skip;\r
+          subtype(q) = right_skip_code + 1;\r
+          add_glue_ref(right_skip);\r
+          goto done;\r
+        }\r
+        else\r
+        {\r
+          if (type(q) == disc_node)\r
+          {\r
+            t = replace_count(q);\r
+\r
+            if (t == 0)\r
+              r = link(q);\r
+            else\r
+            {\r
+              r = q;\r
+\r
+              while (t > 1)\r
+              {\r
+                r = link(r);\r
+                decr(t);\r
+              }\r
+\r
+              s = link(r);\r
+              r = link(s);\r
+              link(s) = 0;\r
+              flush_node_list(link(q));\r
+              replace_count(q) = 0;\r
+            }\r
+\r
+            if (post_break(q) != 0)\r
+            {\r
+              s = post_break(q);\r
+\r
+              while (link(s) != 0)\r
+                s = link(s);\r
+\r
+              link(s) = r;\r
+              r = post_break(q);\r
+              post_break(q) = 0;\r
+              post_disc_break = true;\r
+            }\r
+\r
+            if (pre_break(q) != 0)\r
+            {\r
+              s = prev_break(q);\r
+              link(q) = s;\r
+\r
+              while (link(s) != 0)\r
+                s = link(s);\r
+\r
+              prev_break(q) = 0;\r
+              q = s;\r
+            }\r
+\r
+            link(q) = r;\r
+            disc_break = true;\r
+          }\r
+          else if ((type(q) == math_node) || (type(q) == kern_node))\r
+            width(q) = 0;\r
+        }\r
+      else\r
+      {\r
+        q = temp_head;\r
+\r
+        while (link(q) != 0)\r
+          q = link(q);\r
+      }\r
+\r
+      r = new_param_glue(right_skip_code);\r
+      link(r) = link(q);\r
+      link(q) = r;\r
+      q = r;\r
+\r
+done:\r
+\r
+      r = link(q);\r
+      link(q) = 0;\r
+      q = link(temp_head);\r
+      link(temp_head) = r;\r
+\r
+      if (left_skip != 0)\r
+      {\r
+        r = new_param_glue(left_skip_code);\r
+        link(r) = q;\r
+        q = r;\r
+      }\r
+\r
+      if (cur_line > last_special_line)\r
+      {\r
+        cur_width = second_width;\r
+        cur_indent = second_indent;\r
+      }\r
+      else if (par_shape_ptr == 0)\r
+      {\r
+        cur_width = first_width;\r
+        cur_indent = first_indent;\r
+      }\r
+      else\r
+      {\r
+        cur_width = mem[par_shape_ptr + 2 * cur_line].cint;\r
+        cur_indent = mem[par_shape_ptr + 2 * cur_line - 1].cint;\r
+      }\r
+\r
+      adjust_tail = adjust_head;\r
+      just_box = hpack(q, cur_width, 0);\r
+      shift_amount(just_box) = cur_indent;\r
+      append_to_vlist(just_box);\r
+\r
+      if (adjust_head != adjust_tail)\r
+      {\r
+        link(tail) = link(adjust_head);\r
+        tail = adjust_tail;\r
+      }\r
+\r
+      adjust_tail = 0;\r
+\r
+      if (cur_line + 1 != best_line)\r
+      {\r
+        pen = inter_line_penalty;\r
+\r
+        if (cur_line == prev_graf + 1)\r
+          pen = pen + club_penalty;\r
+\r
+        if (cur_line + 2 == best_line)\r
+          pen = pen + final_widow_penalty;\r
+\r
+        if (disc_break)\r
+          pen = pen + broken_penalty;\r
+\r
+        if (pen != 0)\r
+        {\r
+          r = new_penalty(pen);\r
+          link(tail) = r;\r
+          tail = r;\r
+        }\r
+      }\r
+\r
+      incr(cur_line);\r
+      cur_p = next_break(cur_p);\r
+\r
+      if (cur_p != 0)\r
+        if (!post_disc_break)\r
+        {\r
+          r = temp_head;\r
+\r
+          while (true)\r
+          {\r
+            q = link(r);\r
+\r
+            if (q == cur_break(cur_p))\r
+              goto done1;\r
+\r
+            if (is_char_node(q))\r
+              goto done1;\r
+\r
+            if (non_discardable(q))\r
+              goto done1;\r
+\r
+            if (type(q) == kern_node)\r
+              if (subtype(q) != 1)\r
+                goto done1;\r
+\r
+            r = q;\r
+          }\r
+done1:\r
+          if (r != temp_head)\r
+          {\r
+            link(r) = 0;\r
+            flush_node_list(link(temp_head));\r
+            link(temp_head) = q;\r
+          }\r
+        }\r
+    }\r
+  while (!(cur_p == 0));\r
+\r
+  if ((cur_line != best_line) || (link(temp_head) != 0))\r
+  {\r
+    confusion("line breaking");\r
+    return;\r
+  }\r
+\r
+  prev_graf = best_line - 1;\r
+}\r
+/* sec 0906 */\r
+small_number reconstitute (small_number j, small_number n, halfword bchar, halfword hchar)\r
+{\r
+  pointer p;\r
+  pointer t;\r
+  four_quarters q;\r
+  halfword cur_rh;\r
+  halfword test_char;\r
+  scaled w;\r
+  font_index k;\r
+\r
+  hyphen_passed = 0;\r
+  t = hold_head;\r
+  w = 0;\r
+  link(hold_head) = 0;\r
+  cur_l = hu[j];\r
+  cur_q = t;\r
+\r
+  if (j == 0)\r
+  {\r
+    ligature_present = init_lig;\r
+    p = init_list; \r
+\r
+    if (ligature_present)\r
+      lft_hit = init_lft; \r
+\r
+    while (p != 0)\r
+    {\r
+      append_charnode_to_t(character(p));\r
+      p = link(p);\r
+    }\r
+  }\r
+  else if (cur_l < 256)\r
+  {\r
+    append_charnode_to_t(cur_l);\r
+  }\r
+\r
+  lig_stack = 0;\r
+  set_cur_r();\r
+\r
+continu:\r
+  if (cur_l == non_char)\r
+  {\r
+    k = bchar_label[hf];\r
+\r
+    if (k == non_address)\r
+      goto done;\r
+    else\r
+      q = font_info[k].qqqq;\r
+  }\r
+  else\r
+  {\r
+    q = char_info(hf, cur_l);\r
+\r
+    if (char_tag(q) != lig_tag)\r
+      goto done;\r
+\r
+    k = lig_kern_start(hf, q);\r
+    q = font_info[k].qqqq;\r
+\r
+    if (skip_byte(q) > stop_flag)\r
+    {\r
+      k = lig_kern_restart(hf, q);\r
+      q = font_info[k].qqqq;\r
+    }\r
+  }\r
+\r
+  if (cur_rh < non_char)\r
+    test_char = cur_rh;\r
+  else\r
+    test_char = cur_r;\r
+\r
+  while (true)\r
+  {\r
+    if (next_char(q) == test_char)\r
+      if (skip_byte(q) <= 128)\r
+        if (cur_rh < non_char)\r
+        {\r
+          hyphen_passed = j;\r
+          hchar = non_char;\r
+          cur_rh = non_char;\r
+          goto continu;\r
+        }\r
+        else\r
+        {\r
+          if (hchar < non_char)\r
+            if (odd(hyf[j]))\r
+            {\r
+              hyphen_passed = j;\r
+              hchar = non_char;\r
+            }\r
+\r
+          if (op_byte(q) < kern_flag)\r
+          {\r
+            if (cur_l == non_char)\r
+              lft_hit = true;\r
+\r
+            if (j == n)\r
+              if (lig_stack == 0)\r
+                rt_hit = true;\r
+\r
+            check_interrupt();\r
+\r
+            switch (op_byte(q))\r
+            {\r
+              case 1:\r
+              case 5:\r
+                {\r
+                  cur_l = rem_byte(q);\r
+                  ligature_present = true;\r
+                }\r
+                break;\r
+\r
+              case 2:\r
+              case 6:\r
+                {\r
+                  cur_r = rem_byte(q);\r
+\r
+                  if (lig_stack != 0)\r
+                    character(lig_stack) = cur_r;\r
+                  else\r
+                  {\r
+                    lig_stack = new_lig_item(cur_r);\r
+\r
+                    if (j == n)\r
+                      bchar = non_char;\r
+                    else\r
+                    {\r
+                      p = get_avail();\r
+                      list_ptr(lig_stack) = p;\r
+                      character(p) = hu[j + 1];\r
+                      font(p) = hf;\r
+                    }\r
+                  }\r
+                }\r
+                break;\r
+\r
+              case 3:\r
+                {\r
+                  cur_r = rem_byte(q);\r
+                  p = lig_stack;\r
+                  lig_stack = new_lig_item(cur_r);\r
+                  link(lig_stack) = p;\r
+                }\r
+                break;\r
+\r
+              case 7:\r
+              case 11:\r
+                {\r
+                  wrap_lig(false);\r
+                  cur_q = t;\r
+                  cur_l = rem_byte(q);\r
+                  ligature_present = true;\r
+                }\r
+                break;\r
+\r
+              default:\r
+                {\r
+                  cur_l = rem_byte(q);\r
+                  ligature_present = true;\r
+\r
+                  if (lig_stack != 0)\r
+                  {\r
+                    if (lig_ptr(lig_stack) != 0)\r
+                    {\r
+                      link(t) = lig_ptr(lig_stack);\r
+                      t = link(t);\r
+                      incr(j);\r
+                    }\r
+\r
+                    p = lig_stack;\r
+                    lig_stack = link(p);\r
+                    free_node(p, small_node_size);\r
+\r
+                    if (lig_stack == 0)\r
+                    {\r
+                      if (j < n)\r
+                        cur_r = hu[j + 1];\r
+                      else\r
+                        cur_r = bchar;\r
+\r
+                      if (odd(hyf[j]))\r
+                        cur_rh = hchar;\r
+                      else\r
+                        cur_rh = 256;\r
+                    }\r
+                    else\r
+                      cur_r = character(lig_stack);\r
+                  }\r
+                  else if (j == n)\r
+                    goto done;\r
+                  else\r
+                  {\r
+                    append_charnode_to_t(cur_r);\r
+                    incr(j);\r
+                    set_cur_r();\r
+                  }\r
+                }\r
+                break;\r
+            }\r
+\r
+            if (op_byte(q) > 4)\r
+              if (op_byte(q) != 7)\r
+                goto done;\r
+\r
+            goto continu;\r
+          }\r
+\r
+          w = char_kern(hf, q);\r
+          goto done;\r
+        }\r
+\r
+    if (skip_byte(q) >= stop_flag)\r
+      if (cur_rh == non_char)\r
+        goto done;\r
+      else\r
+      {\r
+        cur_rh = non_char;\r
+        goto continu;\r
+      }\r
+      \r
+    k = k + skip_byte(q) + 1;\r
+    q = font_info[k].qqqq;\r
+  }\r
+\r
+done:\r
+  wrap_lig(rt_hit);\r
+\r
+  if (w != 0)\r
+  {\r
+    link(t) = new_kern(w);\r
+    t = link(t);\r
+    w = 0;\r
+  }\r
+\r
+  if (lig_stack != 0)\r
+  {\r
+    cur_q = t;\r
+    cur_l = character(lig_stack);\r
+    ligature_present = true;\r
+    pop_lig_stack();\r
+    goto continu;\r
+  }\r
+\r
+  return j;\r
+}\r
+/* sec 0895 */\r
+void hyphenate (void)\r
+{\r
+  /* char i, j, l; */\r
+  char i, j;\r
+  int l;\r
+  pointer q, r, s;\r
+  halfword bchar;\r
+  pointer major_tail, minor_tail;\r
+  /* ASCII_code c; */\r
+  int c;\r
+  char c_loc;\r
+  /* integer r_count; */\r
+  int r_count;\r
+  pointer hyf_node;\r
+  trie_pointer z;\r
+  integer v;\r
+  hyph_pointer h;\r
+  str_number k;\r
+  pool_pointer u;\r
+\r
+  for (j = 0; j <= hn; j++)\r
+    hyf[j] = 0;\r
+\r
+  h = hc[1];\r
+  incr(hn);\r
+  hc[hn] = cur_lang;\r
+\r
+  for (j = 2; j <= hn; j++)\r
+    h = (h + h + hc[j]) % hyphen_prime;\r
+\r
+  while (true)\r
+  {\r
+    k = hyph_word[h];\r
+\r
+    if (k == 0)\r
+      goto not_found;\r
+\r
+    if (length(k) < hn)\r
+      goto not_found;\r
+\r
+    if (length(k) == hn)\r
+    {\r
+      j = 1;\r
+      u = str_start[k];\r
+\r
+      do\r
+        {\r
+          if (str_pool[u] < hc[j])\r
+            goto not_found;\r
+\r
+          if (str_pool[u] > hc[j])\r
+            goto done;\r
+\r
+          incr(j);\r
+          incr(u);\r
+        }\r
+      while (!(j > hn));\r
+\r
+      s = hyph_list[h];\r
+\r
+      while (s != 0)\r
+      {\r
+        hyf[info(s)] = 1;\r
+        s = link(s);\r
+      }\r
+\r
+      decr(hn);\r
+      goto found;\r
+    }\r
+\r
+done:\r
+    if (h > 0)\r
+      decr(h);\r
+    else\r
+      h = hyphen_prime;\r
+  }\r
+\r
+not_found:\r
+  decr(hn);\r
+\r
+  if (trie_trc[cur_lang + 1] != cur_lang)\r
+    return;\r
+\r
+  hc[0] = 0;\r
+  hc[hn + 1] = 0;\r
+  hc[hn + 2] = 256;\r
+\r
+  for (j = 0; j <= hn - r_hyf + 1; j++)\r
+  {\r
+    z = trie_trl[cur_lang + 1] + hc[j];\r
+    l = j;\r
+\r
+    while (hc[l] == trie_trc[z])\r
+    {\r
+      if (trie_tro[z] != min_trie_op)\r
+      {\r
+        v = trie_tro[z];\r
+\r
+        do\r
+          {\r
+            v = v + op_start[cur_lang];\r
+            i = l - hyf_distance[v];\r
+\r
+            if (hyf_num[v] > hyf[i])\r
+              hyf[i]= hyf_num[v];\r
+\r
+            v = hyf_next[v];\r
+          }\r
+        while (!(v == min_trie_op));\r
+      }\r
+\r
+      incr(l);\r
+      z = trie_trl[z] + hc[l];\r
+    }\r
+  }\r
+\r
+found:\r
+  for (j = 0; j <= l_hyf - 1; j++)\r
+    hyf[j] = 0;\r
+\r
+  for (j = 0; j <= r_hyf - 1; j++)\r
+    hyf[hn - j]= 0;\r
+\r
+  for (j = l_hyf; j <= hn - r_hyf; j++)\r
+    if (odd(hyf[j]))\r
+      goto found1;\r
+\r
+  return;\r
+\r
+found1:\r
+  q = link(hb);\r
+  link(hb) = 0;\r
+  r = link(ha);\r
+  link(ha) = 0;\r
+  bchar = hyf_bchar;\r
+\r
+  if (is_char_node(ha))\r
+    if (font(ha) != hf)\r
+      goto found2;\r
+    else\r
+    {\r
+      init_list = ha;\r
+      init_lig = false;\r
+      hu[0] = character(ha);\r
+    }\r
+  else if (type(ha) == ligature_node)\r
+    if (font(lig_char(ha)) != hf)\r
+      goto found2;\r
+    else\r
+    {\r
+      init_list = lig_ptr(ha);\r
+      init_lig = true;\r
+      init_lft = (subtype(ha) > 1);\r
+      hu[0] = character(lig_char(ha));\r
+\r
+      if (init_list == 0)\r
+        if (init_lft)\r
+        {\r
+          hu[0] = 256;\r
+          init_lig = false;\r
+        }\r
+\r
+      free_node(ha, small_node_size);\r
+    }\r
+  else\r
+  {\r
+    if (!is_char_node(r))\r
+      if (type(r) == ligature_node)\r
+        if (subtype(r) > 1)\r
+          goto found2;\r
+\r
+    j = 1;\r
+    s = ha;\r
+    init_list = 0;\r
+    goto common_ending;\r
+  }\r
+\r
+  s = cur_p;\r
+\r
+  while (link(s) != ha)\r
+    s = link(s);\r
+\r
+  j = 0;\r
+  goto common_ending;\r
+\r
+found2:\r
+  s = ha;\r
+  j = 0;\r
+  hu[0] = 256;\r
+  init_lig = false;\r
+  init_list = 0;\r
+\r
+common_ending:\r
+  flush_node_list(r);\r
+\r
+  do\r
+    {\r
+      l = j;\r
+      j = reconstitute(j, hn, bchar, hyf_char) + 1;\r
+\r
+      if (hyphen_passed == 0)\r
+      {\r
+        link(s) = link(hold_head);\r
+\r
+        while (link(s) != 0)\r
+          s = link(s);\r
+\r
+        if (odd(hyf[j - 1]))\r
+        {\r
+          l = j;\r
+          hyphen_passed = j - 1;\r
+          link(hold_head) = 0;\r
+        }\r
+      }\r
+\r
+      if (hyphen_passed > 0)\r
+        do\r
+          {\r
+            r = get_node(small_node_size);\r
+            link(r) = link(hold_head);\r
+            type(r) = disc_node;\r
+            major_tail = r;\r
+            r_count = 0;\r
+\r
+            while (link(major_tail) != 0)\r
+            {\r
+              major_tail = link(major_tail);\r
+              incr(r_count);\r
+            }\r
+\r
+            i = hyphen_passed;\r
+            hyf[i] = 0;\r
+            minor_tail = 0;\r
+            pre_break(r) = 0;\r
+            hyf_node = new_character(hf, hyf_char);\r
+\r
+            if (hyf_node != 0)\r
+            {\r
+              incr(i);\r
+              c = hu[i];\r
+              hu[i] = hyf_char;\r
+              free_avail(hyf_node);\r
+            }\r
+\r
+            while (l <= i)\r
+            {\r
+              l = reconstitute(l, i, font_bchar[hf], non_char) + 1;\r
+\r
+              if (link(hold_head) != 0) /* BUG FIX ??? */\r
+              {\r
+                if (minor_tail == 0)\r
+                  pre_break(r) = link(hold_head);\r
+                else\r
+                  link(minor_tail) = link(hold_head);\r
+\r
+                minor_tail = link(hold_head);\r
+\r
+                while (link(minor_tail) != 0)  /* BUG FIX */\r
+                  minor_tail = link(minor_tail);\r
+              }\r
+            }\r
+\r
+            if (hyf_node != 0)\r
+            {\r
+              hu[i] = c;\r
+              l = i;\r
+              decr(i);\r
+            }\r
+\r
+            minor_tail = 0;\r
+            post_break(r) = 0;\r
+            c_loc = 0;\r
+\r
+            if (bchar_label[hf] != non_address)\r
+            {\r
+              decr(l);\r
+              c = hu[l];\r
+              c_loc = l;\r
+              hu[l]= 256;\r
+            }\r
+\r
+            while (l < j)\r
+            {\r
+              do\r
+                {\r
+                  l = reconstitute(l, hn, bchar, 256) + 1;\r
+\r
+                  if (c_loc > 0)\r
+                  {\r
+                    hu[c_loc] = c;\r
+                    c_loc = 0;\r
+                  }\r
+\r
+                  if (link(hold_head) != 0)     /* BUG FIX */\r
+                  {\r
+                    if (minor_tail == 0)\r
+                      post_break(r) = link(hold_head);\r
+                    else\r
+                      link(minor_tail) = link(hold_head);\r
+\r
+                    minor_tail = link(hold_head);\r
+\r
+                    while (link(minor_tail) != 0)\r
+                      minor_tail = link(minor_tail);\r
+                  }\r
+                }\r
+              while (!(l >= j));\r
+\r
+              while (l > j)\r
+              {\r
+                j = reconstitute(j, hn, bchar, non_char) + 1;\r
+                link(major_tail) = link(hold_head);\r
+\r
+                while (link(major_tail) != 0)\r
+                {\r
+                  major_tail = link(major_tail);\r
+                  incr(r_count);\r
+                }\r
+              }\r
+            }\r
+\r
+            if (r_count > 127)\r
+            {\r
+              link(s) = link(r);\r
+              link(r) = 0;\r
+              flush_node_list(r);\r
+            }\r
+            else\r
+            {\r
+              link(s) = r;\r
+              replace_count(r) = r_count;\r
+            }\r
+\r
+            s = major_tail;\r
+            hyphen_passed = j - 1;\r
+            link(hold_head) = 0;\r
+          }\r
+        while (!(!odd(hyf[j - 1])));\r
+    }\r
+  while (!(j > hn));\r
+\r
+  link(s) = q;\r
+  flush_list(init_list);\r
+}\r
+/* sec 0934 */\r
+void new_hyph_exceptions (void)\r
+{\r
+  char n;\r
+  char j;\r
+  hyph_pointer h;\r
+  str_number k;\r
+  pointer p;\r
+  pointer q;\r
+  str_number s, t;\r
+  pool_pointer u, v;\r
+\r
+  scan_left_brace();\r
+  set_cur_lang();\r
+  n = 0;\r
+  p = 0;\r
+\r
+  while (true)\r
+  {\r
+    get_x_token();\r
+\r
+reswitch:\r
+    switch (cur_cmd)\r
+    {\r
+      case letter:\r
+      case other_char:\r
+      case char_given:\r
+        if (cur_chr == '-')\r
+        {\r
+          if (n < 63)\r
+          {\r
+            q = get_avail();\r
+            link(q) = p;\r
+            info(q) = n;\r
+            p = q;\r
+          }\r
+        }\r
+        else\r
+        {\r
+          if (lc_code(cur_chr) == 0)\r
+          {\r
+            print_err("Not a letter");\r
+            help2("Letters in \\hyphenation words must have \\lccode>0.",\r
+                "Proceed; I'll ignore the character I just read.");\r
+            error();\r
+          }\r
+          else if (n < 63)\r
+          {\r
+            incr(n);\r
+            hc[n] = lc_code(cur_chr);\r
+          }\r
+        }\r
+        break;\r
+\r
+      case char_num:\r
+        {\r
+          scan_char_num();\r
+          cur_chr = cur_val;\r
+          cur_cmd = char_given;\r
+          goto reswitch;\r
+        }\r
+        break;\r
+\r
+      case spacer:\r
+      case right_brace:\r
+        {\r
+          if (n > 1)\r
+          {\r
+            incr(n);\r
+            hc[n] = cur_lang;\r
+            str_room(n);\r
+            h = 0;\r
+\r
+            for (j = 1; j <= n; j++)\r
+            {\r
+              h = (h + h + hc[j]) % hyphen_prime;\r
+              append_char(hc[j]);\r
+            }\r
+\r
+            s = make_string();\r
+\r
+            if (hyph_count == hyphen_prime)\r
+            {\r
+              overflow("exception dictionary", hyphen_prime);\r
+              return;\r
+            }\r
+\r
+            incr(hyph_count);\r
+\r
+            while (hyph_word[h] != 0)\r
+            {\r
+              k = hyph_word[h];\r
+\r
+              if (length(k) < length(s))\r
+                goto found;\r
+\r
+              if (length(k) > length(s))\r
+                goto not_found;\r
+\r
+              u = str_start[k];\r
+              v = str_start[s];\r
+\r
+              do\r
+                {\r
+                  if (str_pool[u] < str_pool[v])\r
+                    goto found;\r
+\r
+                  if (str_pool[u] > str_pool[v])\r
+                    goto not_found;\r
+\r
+                  incr(u);\r
+                  incr(v);\r
+                }\r
+              while (!(u == str_start[k + 1]));\r
+\r
+found:\r
+              q = hyph_list[h];\r
+              hyph_list[h] = p;\r
+              p = q;\r
+              t = hyph_word[h];\r
+              hyph_word[h] = s;\r
+              s = t;\r
+\r
+not_found:\r
+              if (h > 0)\r
+                decr(h);\r
+              else\r
+                h = hyphen_prime;\r
+            }\r
+\r
+            hyph_word[h] = s;\r
+            hyph_list[h] = p;\r
+          }\r
+\r
+          if (cur_cmd == right_brace)\r
+            return;\r
+\r
+          n = 0;\r
+          p = 0;\r
+        }\r
+        break;\r
+\r
+      default:\r
+        {\r
+          print_err("Improper ");\r
+          print_esc("hyphenation");\r
+          prints(" will be flushed");\r
+          help2("Hyphenation exceptions must contain only letters",\r
+              "and hyphens. But continue; I'll forgive and forget.");\r
+          error();\r
+        }\r
+        break;\r
+    }\r
+  }\r
+}\r
+/* sec 0968 */\r
+pointer prune_page_top (pointer p)\r
+{\r
+  pointer prev_p;\r
+  pointer q;\r
+\r
+  prev_p = temp_head;\r
+  link(temp_head) = p;\r
+\r
+  while (p != 0)\r
+    switch (type(p))\r
+    {\r
+      case hlist_node:\r
+      case vlist_node:\r
+      case rule_node:\r
+        {\r
+          q = new_skip_param(split_top_skip_code);\r
+          link(prev_p) = q;\r
+          link(q) = p;\r
+\r
+          if (width(temp_ptr) > height(p))\r
+            width(temp_ptr) = width(temp_ptr) - height(p);\r
+          else\r
+            width(temp_ptr) = 0;\r
+\r
+          p = 0;\r
+        }\r
+        break;\r
+\r
+      case whatsit_node:\r
+      case mark_node:\r
+      case ins_node:\r
+        {\r
+          prev_p = p;\r
+          p = link(prev_p);\r
+        }\r
+        break;\r
+\r
+      case glue_node:\r
+      case kern_node:\r
+      case penalty_node:\r
+        {\r
+          q = p;\r
+          p = link(q);\r
+          link(q) = 0;\r
+          link(prev_p) = p;\r
+          flush_node_list(q);\r
+        }\r
+        break;\r
+\r
+      default:\r
+        {\r
+          confusion("pruning");\r
+          return 0;\r
+        }\r
+        break;\r
+    }\r
+\r
+  return link(temp_head);\r
+}\r
+/* sec 0970 */\r
+pointer vert_break (pointer p, scaled h, scaled d)\r
+{\r
+  pointer prev_p;\r
+  pointer q, r;\r
+  integer pi;\r
+  integer b;\r
+  integer least_cost;\r
+  pointer best_place;\r
+  scaled prev_dp; \r
+  /* small_number t; */\r
+  int t;\r
+\r
+  prev_p = p;\r
+  least_cost = awful_bad;\r
+  do_all_six(set_height_zero);\r
+  prev_dp = 0;\r
+\r
+  while (true)\r
+  {\r
+    if (p == 0)\r
+      pi = eject_penalty;\r
+    else switch (type(p))\r
+    {\r
+      case hlist_node:\r
+      case vlist_node:\r
+      case rule_node:\r
+        {\r
+          cur_height = cur_height + prev_dp + height(p);\r
+          prev_dp = depth(p);\r
+          goto not_found;\r
+        }\r
+        break;\r
+\r
+      case whatsit_node:\r
+        goto not_found;\r
+        break;\r
+\r
+      case glue_node:\r
+        if (precedes_break(prev_p))\r
+          pi = 0;\r
+        else\r
+          goto update_heights;\r
+        break;\r
+\r
+      case kern_node:\r
+        {\r
+          if (link(p) == 0)\r
+            t = penalty_node;\r
+          else\r
+            t = type(link(p));\r
+\r
+          if (t == glue_node)\r
+            pi = 0;\r
+          else\r
+            goto update_heights;\r
+        }\r
+        break;\r
+\r
+      case penalty_node:\r
+        pi = penalty(p);\r
+        break;\r
+\r
+      case mark_node:\r
+      case ins_node:\r
+        goto not_found;\r
+        break;\r
+\r
+      default:\r
+        {\r
+          confusion("vertbreak");\r
+          return 0;\r
+        }\r
+        break;\r
+    }\r
+\r
+    if (pi < inf_penalty)\r
+    {\r
+      if (cur_height < h)\r
+        if ((active_width[3] != 0) || (active_width[4] != 0) || (active_width[5] != 0))\r
+          b = 0;\r
+        else\r
+          b = badness(h - cur_height, active_width[2]);\r
+      else if (act_width - h > active_width[6])\r
+        b = awful_bad;\r
+      else\r
+        b = badness(cur_height - h, active_width[6]);\r
+\r
+      if (b < awful_bad)\r
+        if (pi <= eject_penalty)\r
+          b = pi;\r
+        else if (b < inf_bad)\r
+          b = b + pi;\r
+        else\r
+          b = deplorable;\r
+\r
+      if (b <= least_cost)\r
+      {\r
+        best_place = p;\r
+        least_cost = b;\r
+        best_height_plus_depth = cur_height + prev_dp;\r
+      }\r
+\r
+      if ((b == awful_bad) || (pi <= eject_penalty))\r
+        goto done;\r
+    }\r
+\r
+    if ((type(p) < glue_node) || (type(p) > kern_node))\r
+      goto not_found;\r
+\r
+update_heights:\r
+\r
+    if (type(p) == kern_node)\r
+      q = p;\r
+    else\r
+    {\r
+      q = glue_ptr(p);\r
+      active_width[2 + stretch_order(q)] = active_width[2 + stretch_order(q)] + stretch(q);\r
+      active_width[6] = active_width[6] + shrink(q);\r
+\r
+      if ((shrink_order(q) != normal) && (shrink(q) != 0))\r
+      {\r
+        print_err("Infinite glue shrinkage found in box being split");\r
+        help4("The box you are \\vsplitting contains some infinitely",\r
+            "shrinkable glue, e.g., `\\vss' or `\\vskip 0pt minus 1fil'.",\r
+            "Such glue doesn't belong there; but you can safely proceed,",\r
+            "since the offensive shrinkability has been made finite.");\r
+        error();\r
+        r = new_spec(q);\r
+        shrink_order(r) = normal;\r
+        delete_glue_ref(q);\r
+        glue_ptr(p) = r;\r
+        q = r;\r
+      }\r
+    }\r
+\r
+    cur_height = cur_height + prev_dp + width(q);\r
+    prev_dp = 0;\r
+\r
+not_found:\r
+\r
+    if (prev_dp > d)\r
+    {\r
+      cur_height = cur_height + prev_dp - d;\r
+      prev_dp = d;\r
+    }\r
+\r
+    prev_p = p;\r
+    p = link(prev_p);\r
+  }\r
+\r
+done:\r
+  return best_place;\r
+}\r
+/* sec 0977 */\r
+pointer vsplit (eight_bits n, scaled h)\r
+{\r
+  pointer v;\r
+  pointer p;\r
+  pointer q;\r
+\r
+  v = box(n);\r
+\r
+  if (split_first_mark != 0)\r
+  {\r
+    delete_token_ref(split_first_mark);\r
+    split_first_mark = 0;\r
+    delete_token_ref(split_bot_mark);\r
+    split_bot_mark = 0;\r
+  }\r
+\r
+  if (v == 0)\r
+  {\r
+    return 0;\r
+  }\r
+\r
+  if (type(v) != vlist_node)\r
+  {\r
+    print_err("");\r
+    print_esc("vsplit");\r
+    prints(" needs a ");\r
+    print_esc("vbox");\r
+    help2("The box you are trying to split is an \\hbox.",\r
+        "I can't split such a box, so I'll leave it alone.");\r
+    error();\r
+    return 0;\r
+  }\r
+\r
+  q = vert_break(list_ptr(v), h, split_max_depth);\r
+  p = list_ptr(v);\r
+\r
+  if (p == q)\r
+    list_ptr(v) = 0;\r
+  else while (true)\r
+  {\r
+    if (type(p) == mark_node)\r
+      if (split_first_mark == 0)\r
+      {\r
+        split_first_mark = mark_ptr(p);\r
+        split_bot_mark = split_first_mark;\r
+        token_ref_count(split_first_mark) = token_ref_count(split_first_mark) + 2;\r
+      }\r
+      else\r
+      {\r
+        delete_token_ref(split_bot_mark);\r
+        split_bot_mark = mark_ptr(p);\r
+        add_token_ref(split_bot_mark);\r
+      }\r
+\r
+    if (link(p) == q)\r
+    {\r
+      link(p) = 0;\r
+      goto done;\r
+    }\r
+\r
+    p = link(p);\r
+  }\r
+\r
+done:\r
+  q = prune_page_top(q);\r
+  p = list_ptr(v);\r
+  free_node(v, box_node_size);\r
\r
+  if (q == 0)\r
+    box(n) = 0;\r
+  else\r
+    box(n) = vpackage(q, 0, 1, max_dimen);\r
+\r
+  return vpackage(p, h, exactly, split_max_depth);\r
+}\r
+/* sec 0985 */\r
+void print_totals (void)\r
+{\r
+  print_scaled(page_so_far[1]);\r
+  print_plus(2, "");\r
+  print_plus(3, "fil");\r
+  print_plus(4, "fill");\r
+  print_plus(5, "filll");\r
+\r
+  if (page_shrink != 0)\r
+  {\r
+    prints(" minus ");\r
+    print_scaled(page_shrink);\r
+  }\r
+}\r
+/* sec 0987 */\r
+void freeze_page_specs (small_number s)\r
+{\r
+  page_contents = s;\r
+  page_goal = vsize;\r
+  page_max_depth = max_depth;\r
+  page_depth = 0;\r
+  do_all_six(set_page_so_far_zero);\r
+  least_page_cost = awful_bad;\r
+\r
+#ifdef STAT\r
+  if (tracing_pages > 0)\r
+  {\r
+    begin_diagnostic();\r
+    print_nl("%% goal height=");\r
+    print_scaled(page_goal);\r
+    prints(", max depth=");\r
+    print_scaled(page_max_depth);\r
+    end_diagnostic(false);\r
+  }\r
+#endif\r
+}\r
+/* sec 0992 */\r
+void box_error (eight_bits n)\r
+{\r
+  error();\r
+  begin_diagnostic();\r
+  print_nl("The following box has been deleted:");\r
+  show_box(box(n));\r
+  end_diagnostic(true);\r
+  flush_node_list(box(n));\r
+  box(n) = 0;\r
+}\r
+/* sec 0993 */\r
+void ensure_vbox_(eight_bits n)\r
+{\r
+  pointer p;\r
+\r
+  p = box(n);\r
+\r
+  if (p != 0)\r
+    if (type(p) == hlist_node)\r
+    {\r
+      print_err("Insertions can only be added to a vbox");\r
+      help3("Tut tut: You're trying to \\insert into a",\r
+          "\\box register that now contains an \\hbox.",\r
+          "Proceed, and I'll discard its present contents.");\r
+      box_error(n);\r
+    }\r
+}\r
+/* sec 1012 */\r
+void fire_up (pointer c)\r
+{\r
+  pointer p, q, r, s;\r
+  pointer prev_p;\r
+  /* unsigned char n; */\r
+  unsigned int n;\r
+  boolean wait;\r
+  integer save_vbadness;\r
+  scaled save_vfuzz;\r
+  pointer save_split_top_skip;\r
+\r
+  if (type(best_page_break) == penalty_node)\r
+  {\r
+    geq_word_define(int_base + output_penalty_code, penalty(best_page_break));\r
+    penalty(best_page_break) = inf_penalty;\r
+  }\r
+  else\r
+    geq_word_define(int_base + output_penalty_code, inf_penalty);\r
+\r
+  if (bot_mark != 0)\r
+  {\r
+    if (top_mark != 0)\r
+      delete_token_ref(top_mark);\r
+\r
+    top_mark = bot_mark;\r
+    add_token_ref(top_mark);\r
+    delete_token_ref(first_mark);\r
+    first_mark = 0;\r
+  }\r
+\r
+  if (c == best_page_break)\r
+    best_page_break = 0;\r
+\r
+  if (box(255) != 0)\r
+  {\r
+    print_err("");\r
+    print_esc("box");\r
+    prints("255 is not void");\r
+    help2("You shouldn't use \\box255 except in \\output routines.",\r
+        "Proceed, and I'll discard its present contents.");\r
+    box_error(255);\r
+  }\r
+\r
+  insert_penalties = 0;\r
+  save_split_top_skip = split_top_skip;\r
+\r
+  if (holding_inserts <= 0)\r
+  {\r
+    r = link(page_ins_head);\r
+\r
+    while (r != page_ins_head)\r
+    {\r
+      if (best_ins_ptr(r) != 0)\r
+      {\r
+        n = subtype(r);\r
+        ensure_vbox(n);\r
+\r
+        if (box(n) == 0)\r
+          box(n) = new_null_box();\r
+\r
+        p = box(n) + list_offset;\r
+\r
+        while (link(p) != 0)\r
+          p = link(p);\r
+\r
+        last_ins_ptr(r) = p;\r
+      }\r
+\r
+      r = link(r);\r
+    }\r
+  }\r
+\r
+  q = hold_head;\r
+  link(q) = 0;\r
+  prev_p = page_head;\r
+  p = link(prev_p);\r
+\r
+  while (p != best_page_break)\r
+  {\r
+    if (type(p) == ins_node)\r
+    {\r
+      if (holding_inserts <= 0)\r
+      {\r
+        r = link(page_ins_head);\r
+\r
+        while (subtype(r) != subtype(p))\r
+          r = link(r);\r
+\r
+        if (best_ins_ptr(r) == 0)\r
+          wait = true;\r
+        else\r
+        {\r
+          wait = false;\r
+          s = last_ins_ptr(r);\r
+          link(s) = ins_ptr(p);\r
+\r
+          if (best_ins_ptr(r) == p)\r
+          {\r
+            if (type(r) == split_up)\r
+              if ((broken_ins(r) == p) && (broken_ins(r) != 0))\r
+              {\r
+                while (link(s) != broken_ptr(r))\r
+                  s = link(s);\r
+\r
+                link(s) = 0;\r
+                split_top_skip = split_top_ptr(p);\r
+                ins_ptr(p) = prune_page_top(broken_ptr(r));\r
+\r
+                if (ins_ptr(p) != 0)\r
+                {\r
+                  temp_ptr = vpackage(ins_ptr(p), 0, 1, max_dimen);\r
+                  height(p) = height(temp_ptr) + depth(temp_ptr);\r
+                  free_node(temp_ptr, box_node_size);\r
+                  wait = true;\r
+                }\r
+              }\r
+\r
+            best_ins_ptr(r) = 0;\r
+            n = subtype(r);\r
+            temp_ptr = list_ptr(box(n));\r
+            free_node(box(n), box_node_size);\r
+            box(n) = vpackage(temp_ptr, 0, 1, max_dimen);\r
+          }\r
+          else\r
+          {\r
+            while (link(s) != 0)\r
+              s = link(s);\r
+\r
+            last_ins_ptr(r) = s;\r
+          }\r
+        }\r
+\r
+        link(prev_p) = link(p);\r
+        link(p) = 0;\r
+\r
+        if (wait)\r
+        {\r
+          link(q) = p;\r
+          q = p;\r
+          incr(insert_penalties);\r
+        }\r
+        else\r
+        {\r
+          delete_glue_ref(split_top_ptr(p));\r
+          free_node(p, ins_node_size);\r
+        }\r
+\r
+        p = prev_p;\r
+      }\r
+    }\r
+    else if (type(p) == mark_node)\r
+    {\r
+      if (first_mark == 0)\r
+      {\r
+        first_mark = mark_ptr(p);\r
+        add_token_ref(first_mark);\r
+      }\r
+\r
+      if (bot_mark != 0)\r
+        delete_token_ref(bot_mark);\r
+\r
+      bot_mark = mark_ptr(p);\r
+      add_token_ref(bot_mark);\r
+    }\r
+\r
+    prev_p = p;\r
+    p = link(prev_p);\r
+  }\r
+\r
+  split_top_skip = save_split_top_skip;\r
+\r
+  if (p != 0)\r
+  {\r
+    if (link(contrib_head) == 0)\r
+      if (nest_ptr == 0)\r
+        tail = page_tail;\r
+      else\r
+        nest[0].tail_field = page_tail;\r
+\r
+    link(page_tail) = link(contrib_head);\r
+    link(contrib_head) = p;\r
+    link(prev_p) = 0;\r
+  }\r
+\r
+  save_vbadness = vbadness;\r
+  vbadness = inf_bad;\r
+  save_vfuzz = vfuzz;\r
+  vfuzz = max_dimen;\r
+  box(255) = vpackage(link(page_head), best_size, 0, page_max_depth);\r
+  vbadness = save_vbadness;\r
+  vfuzz = save_vfuzz;\r
+\r
+  if (last_glue != empty_flag)\r
+    delete_glue_ref(last_glue);\r
+\r
+  page_contents = 0;\r
+  page_tail = page_head;\r
+  link(page_head) = 0;\r
+  last_glue = empty_flag;\r
+  last_penalty = 0;\r
+  last_kern = 0;\r
+  page_depth = 0;\r
+  page_max_depth = 0;\r
+\r
+  if (q != hold_head)\r
+  {\r
+    link(page_head) = link(hold_head);\r
+    page_tail = q;\r
+  }\r
+\r
+  r = link(page_ins_head);\r
+\r
+  while (r != page_ins_head)\r
+  {\r
+    q = link(r);\r
+    free_node(r, page_ins_node_size);\r
+    r = q;\r
+  }\r
\r
+  link(page_ins_head) = page_ins_head;\r
+\r
+  if ((top_mark != 0) && (first_mark == 0))\r
+  {\r
+    first_mark = top_mark;\r
+    add_token_ref(top_mark);\r
+  }\r
+\r
+  if (output_routine != 0)\r
+    if (dead_cycles >= max_dead_cycles)\r
+    {\r
+      print_err("Output loop---");\r
+      print_int(dead_cycles);\r
+      prints(" consecutive dead cycles");\r
+      help3("I've concluded that your \\output is awry; it never does",\r
+          "\\ship_out, so I'm shipping \box255 out myself. Next ",\r
+          "increase \\maxdeadcycles if you want me to be more patient!");\r
+      error();\r
+    }\r
+    else\r
+    {\r
+      output_active = true;\r
+      incr(dead_cycles);\r
+      push_nest();\r
+      mode = -vmode;\r
+      prev_depth = ignore_depth;\r
+      mode_line = - (integer) line;\r
+      begin_token_list(output_routine, output_text);\r
+      new_save_level(output_group);\r
+      normal_paragraph();\r
+      scan_left_brace();\r
+      return;\r
+    }\r
+\r
+  {\r
+    if (link(page_head) != 0)\r
+    {\r
+      if (link(contrib_head) == 0)\r
+        if (nest_ptr == 0)\r
+          tail = page_tail;\r
+        else\r
+          nest[0].tail_field = page_tail;\r
+      else\r
+        link(page_tail) = link(contrib_head);\r
+\r
+      link(contrib_head) = link(page_head);\r
+      link(page_head) = 0;\r
+      page_tail = page_head;\r
+    }\r
+\r
+    ship_out(box(255));\r
+    box(255) = 0;\r
+  }\r
 }
\ No newline at end of file
index 8f86234..850b7e6 100644 (file)
-/* Copyright 2014 Clerk Ma
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301 USA.  */
-
-#define EXTERN extern
-
-#include "yandytex.h"
-
-/* sec 0994 */
-void build_page (void)
-{
-  pointer p;
-  pointer q, r;
-  integer b, c;
-  integer pi;
-  /* unsigned char n; */
-  unsigned int n;
-  scaled delta, h, w;
-
-  if ((link(contrib_head) == 0) || output_active)
-    return;
-
-  do
-    {
-continu:
-      p = link(contrib_head);
-
-      if (last_glue != max_halfword)
-        delete_glue_ref(last_glue);
-
-      last_penalty = 0;
-      last_kern = 0;
-
-      if (type(p) == glue_node)
-      {
-        last_glue = glue_ptr(p);
-        add_glue_ref(last_glue);
-      }
-      else
-      {
-        last_glue = max_halfword;
-
-        if (type(p) == penalty_node)
-          last_penalty = penalty(p);
-        else if (type(p) == kern_node)
-          last_kern = width(p);
-      }
-
-      switch (type(p))
-      {
-        case hlist_node:
-        case vlist_node:
-        case rule_node:
-          if (page_contents < box_there)
-          {
-            if (page_contents == 0)
-              freeze_page_specs(box_there);
-            else
-              page_contents = box_there;
-
-            q = new_skip_param(top_skip_code);
-
-            if (width(temp_ptr) > height(p))
-              width(temp_ptr) = width(temp_ptr) - height(p);
-            else
-              width(temp_ptr) = 0;
-
-            link(q) = p;
-            link(contrib_head) = q;
-            goto continu;
-          }
-          else
-          {
-            page_total = page_total + page_depth + height(p);
-            page_depth = depth(p);
-            goto contribute;
-          }
-          break;
-
-        case whatsit_node:
-          goto contribute;
-          break;
-
-        case glue_node:
-          if (page_contents < box_there)
-            goto done1;
-          else if (precedes_break(page_tail))
-            pi = 0;
-          else
-            goto update_heights;
-          break;
-
-        case kern_node:
-          if (page_contents < box_there)
-            goto done1;
-          else if (link(p) == 0)
-            return;
-          else if (type(link(p)) == glue_node)
-            pi = 0;
-          else
-            goto update_heights;
-          break;
-
-        case penalty_node:
-          if (page_contents < box_there)
-            goto done1;
-          else
-            pi = penalty(p);
-          break;
-
-        case mark_node:
-          goto contribute;
-          break;
-
-        case ins_node:
-          {
-            if (page_contents == 0)
-              freeze_page_specs(inserts_only);
-
-            n = subtype(p);
-            r = page_ins_head;
-
-            while (n >= subtype(link(r)))
-              r = link(r);
-
-            n = n;
-
-            if (subtype(r) != n)
-            {
-              q = get_node(page_ins_node_size);
-              link(q) = link(r);
-              link(r) = q;
-              r = q;
-              subtype(r) = n;
-              type(r) = inserting;
-              ensure_vbox(n);
-
-              if (box(n) == 0)
-                height(r) = 0;
-              else
-                height(r) = height(box(n)) + depth(box(n));
-
-              best_ins_ptr(r) = 0;
-              q = skip(n);
-
-              if (count(n) == 1000)
-                h = height(r);
-              else
-                h = x_over_n(height(r), 1000) * count(n);
-
-              page_goal = page_goal - h - width(q);
-              page_so_far[2 + stretch_order(q)] = page_so_far[2 + stretch_order(q)] + stretch(q);
-              page_shrink = page_shrink + shrink(q);
-
-              if ((shrink_order(q) != normal) && (shrink(q) != 0))
-              {
-                print_err("Infinite glue shrinkage inserted from ");
-                print_esc("skip");
-                print_int(n);
-                help3("The correction glue for page breaking with insertions",
-                    "must have finite shrinkability. But you may proceed,",
-                    "since the offensive shrinkability has been made finite.");
-                error();
-              }
-            }
-
-            if (type(r) == split_up)
-              insert_penalties = insert_penalties + float_cost(p);
-            else
-            {
-              last_ins_ptr(r) = p;
-              delta = page_goal - page_total - page_depth + page_shrink;
-
-              if (count(n) == 1000)
-                h = height(p);
-              else
-                h = x_over_n(height(p), 1000) * count(n);
-
-              if (((h <= 0) || (h <= delta)) && (height(p) + height(r) <= dimen(n)))
-              {
-                page_goal = page_goal - h;
-                height(r) = height(r) + height(p);
-              }
-              else
-              {
-                if (count(n) <= 0)
-                  w = max_dimen;
-                else
-                {
-                  w = page_goal - page_total - page_depth;
-
-                  if (count(n) != 1000)
-                    w = x_over_n(w, count(n)) * 1000;
-                }
-
-                if (w > dimen(n) - height(r))
-                  w = dimen(n) - height(r);
-
-                q = vert_break(ins_ptr(p), w, depth(p));
-                height(r) = height(r) + best_height_plus_depth;
-
-#ifdef STAT
-                if (tracing_pages > 0)
-                {
-                  begin_diagnostic();
-                  print_nl("% split");
-                  print_int(n);
-                  prints(" to");
-                  print_scaled(w);
-                  print_char(',');
-                  print_scaled(best_height_plus_depth);
-                  prints(" p=");
-
-                  if (q == 0)
-                    print_int(eject_penalty);
-                  else if (type(q) == penalty_node)
-                    print_int(penalty(q));
-                  else
-                    print_char('0');
-
-                  end_diagnostic(false);
-                }
-#endif
-                if (count(n) != 1000)
-                  best_height_plus_depth = x_over_n(best_height_plus_depth, 1000) * count(n);
-
-                page_goal = page_goal - best_height_plus_depth;
-                type(r) = split_up;
-                broken_ptr(r) = q;
-                broken_ins(r) = p;
-
-                if (q == 0)
-                  insert_penalties = insert_penalties + (eject_penalty);
-                else if (type(q) == penalty_node)
-                  insert_penalties = insert_penalties + penalty(q);
-              }
-            }
-            goto contribute;
-          }
-          break;
-
-        default:
-          {
-            confusion("page");
-            return;
-          }
-          break;
-      }
-
-      if (pi < inf_penalty)
-      {
-        if (page_total < page_goal)
-          if ((page_so_far[3] != 0) || (page_so_far[4] != 0) || (page_so_far[5] != 0))
-            b = 0;
-          else
-            b = badness(page_goal - page_total, page_so_far[2]);
-        else if (page_total - page_goal > page_shrink)
-          b = awful_bad;
-        else
-          b = badness(page_total - page_goal, page_shrink);
-  
-        if (b < awful_bad)
-          if (pi <= eject_penalty)
-            c = pi; 
-          else if (b < inf_bad)
-            c = b + pi + insert_penalties;
-          else
-            c = deplorable;
-        else
-          c = b;
-
-        if (insert_penalties >= 10000)
-          c = awful_bad;
-
-#ifdef STAT
-        if (tracing_pages > 0)
-        {
-          begin_diagnostic();
-          print_nl("%");
-          prints(" t=");
-          print_totals();
-          prints(" g=");
-          print_scaled(page_goal);
-          prints(" b=");
-
-          if (b == awful_bad)
-            print_char('*');
-          else
-            print_int(b);
-
-          prints(" p=");
-          print_int(pi);
-          prints(" c=");
-
-          if (c == awful_bad)
-            print_char('*');
-          else
-            print_int(c);
-
-          if (c <= least_page_cost)
-            print_char('#');
-
-          end_diagnostic(false);
-        }
-#endif
-
-        if (c <= least_page_cost)
-        {
-          best_page_break = p;
-          best_size = page_goal;
-          least_page_cost = c;
-          r = link(page_ins_head);
-
-          while (r != page_ins_head)
-          {
-            best_ins_ptr(r) = last_ins_ptr(r);
-            r = link(r);
-          }
-        }
-
-        if ((c == awful_bad) || (pi <= eject_penalty))
-        {
-          fire_up(p);
-
-          if (output_active)
-            return;
-
-          goto done;
-        }
-      }
-
-      if ((type(p) < glue_node) || (type(p) > kern_node))
-        goto contribute;
-
-update_heights:
-      if (type(p) == kern_node)
-        q = p;
-      else
-      {
-        q = glue_ptr(p);
-        page_so_far[2 + stretch_order(q)] = page_so_far[2 + stretch_order(q)] + stretch(q);
-        page_shrink = page_shrink + shrink(q);
-
-        if ((shrink_order(q) != normal) && (shrink(q) != 0))
-        {
-          print_err("Infinite glue shrinkage found on current page");
-          help4("The page about to be output contains some infinitely",
-            "shrinkable glue, e.g., `\\vss' or `\\vskip 0pt minus 1fil'.",
-            "Such glue doesn't belong there; but you can safely proceed,",
-            "since the offensive shrinkability has been made finite.");
-          error();
-          r = new_spec(q);
-          shrink_order(r) = normal;
-          delete_glue_ref(q);
-          glue_ptr(p) = r;
-          q = r;
-        }
-      }
-
-      page_total = page_total + page_depth + width(q);
-      page_depth = 0;
-
-contribute:
-      if (page_depth > page_max_depth)
-      {
-        page_total = page_total + page_depth - page_max_depth;
-        page_depth = page_max_depth;
-      }
-
-      link(page_tail) = p;
-      page_tail = p;
-      link(contrib_head) = link(p);
-      link(p) = 0;
-      goto done;
-
-done1:
-      link(contrib_head) = link(p);
-      link(p) = 0;
-      flush_node_list(p);
-done:;
-    }
-  while (!(link(contrib_head) == 0));
-
-  if (nest_ptr == 0)
-    tail = contrib_head;
-  else
-    nest[0].tail_field = contrib_head;
-} 
-/* sec 1043 */
-void app_space (void)
-{
-  pointer q;
-
-  if ((space_factor >= 2000) && (xspace_skip != zero_glue))
-    q = new_param_glue(xspace_skip_code);
-  else
-  {
-    if (space_skip != zero_glue)
-      main_p = space_skip;
-    else
-    {
-      main_p = font_glue[cur_font];
-
-      if (main_p == 0)
-      {
-        main_p = new_spec(zero_glue);
-        main_k = param_base[cur_font] + space_code;
-        width(main_p) = font_info[main_k].cint;
-        stretch(main_p) = font_info[main_k + 1].cint;
-        shrink(main_p) = font_info[main_k + 2].cint;
-        font_glue[cur_font] = main_p;
-      }
-    }
-
-    main_p = new_spec(main_p);
-
-    if (space_factor >= 2000)
-      width(main_p) = width(main_p) + extra_space(cur_font);
-
-    stretch(main_p) = xn_over_d(stretch(main_p), space_factor, 1000);
-    shrink(main_p) = xn_over_d(shrink(main_p), 1000, space_factor);
-    q = new_glue(main_p);
-    glue_ref_count(main_p) = 0;
-  }
-
-  link(tail) = q;
-  tail = q;
-}
-/* sec 1047 */
-void insert_dollar_sign (void)
-{
-  back_input();
-  cur_tok = math_shift_token + '$';
-  print_err("Missing $ inserted");
-  help2("I've inserted a begin-math/end-math symbol since I think",
-      "you left one out. Proceed, with fingers crossed.");
-  ins_error();
-}
-/* sec 1049 */
-void you_cant (void)
-{
-  print_err("You can't use `");
-  print_cmd_chr(cur_cmd, cur_chr);
-  prints("' in ");
-  print_mode(mode);
-}
-/* sec 1050 */
-void report_illegal_case (void)
-{
-  you_cant();
-  help4("Sorry, but I'm not programmed to handle this case;",
-      "I'll just pretend that you didn't ask for it.",
-      "If you're in the wrong mode, you might be able to",
-      "return to the right one by typing `I}' or `I$' or `I\\par'.");
-  error();
-}
-/* sec 1051 */
-boolean privileged (void)
-{
-  if (mode > 0)
-    return true;
-  else
-  {
-    report_illegal_case();
-    return false;
-  }
-}
-/* sec 1054 */
-boolean its_all_over (void)
-{
-  if (privileged())
-  {
-    if ((page_head == page_tail) && (head == tail) && (dead_cycles == 0))
-    {
-      return true;
-    }
-
-    back_input();
-    tail_append(new_null_box());
-    width(tail) = hsize;
-    tail_append(new_glue(fill_glue));
-    tail_append(new_penalty(-1073741824L));
-    build_page();
-  }
-
-  return false;
-}
-/* sec 1060 */
-void append_glue (void)
-{
-  small_number s;
-
-  s = cur_chr;
-
-  switch (s)
-  {
-    case fil_code:
-      cur_val = fil_glue;
-      break;
-
-    case fill_code:
-      cur_val = fill_glue;
-      break;
-
-    case ss_code:
-      cur_val = ss_glue;
-      break;
-
-    case fil_neg_code:
-      cur_val = fil_neg_glue;
-      break;
-
-    case skip_code:
-      scan_glue(glue_val);
-      break;
-
-    case mskip_code:
-      scan_glue(mu_val);
-      break;
-  }
-
-  tail_append(new_glue(cur_val));
-
-  if (s >= skip_code)
-  {
-    decr(glue_ref_count(cur_val));
-
-    if (s > skip_code)
-      subtype(tail) = mu_glue;
-  }
-}
-/* sec 1061 */
-void append_kern (void)
-{ 
-  quarterword s;
-
-  s = cur_chr;
-
-  scan_dimen((s == mu_glue), false, false);
-  tail_append(new_kern(cur_val));
-  subtype(tail) = s;
-}
-/* sec 1064 */
-void off_save (void)
-{
-  pointer p;
-
-  if (cur_group == bottom_level)
-  {
-    print_err("Extra ");
-    print_cmd_chr(cur_cmd, cur_chr);
-    help1("Things are pretty mixed up, but I think the worst is over.");
-    error();
-  }
-  else
-  {
-    back_input();
-    p = get_avail();
-    link(temp_head) = p;
-    print_err("Missing ");
-
-    switch (cur_group)
-    {
-      case semi_simple_group:
-        {
-          info(p) = cs_token_flag + frozen_end_group;
-          print_esc("endgroup");
-        }
-        break;
-
-      case math_shift_group:
-        {
-          info(p) = math_shift_token + '$';
-          print_char('$');
-        }
-        break;
-
-      case math_left_group:
-        {
-          info(p) = cs_token_flag + frozen_right;
-          link(p) = get_avail();
-          p = link(p);
-          info(p) = other_token + '.';
-          print_esc("right.");
-        }
-        break;
-
-      default:
-        {
-          info(p) = right_brace_token + '}';
-          print_char('}');
-        }
-        break;
-    }
-
-    prints(" inserted");
-    ins_list(link(temp_head));
-    help5("I've inserted something that you may have forgotten.",
-        "(See the <inserted text> above.)",
-        "With luck, this will get me unwedged. But if you",
-        "really didn't forget anything, try typing `2' now; then",
-        "my insertion and my current dilemma will both disappear.");
-    error();
-  }
-}
-/* sec 1069 */
-void extra_right_brace (void)
-{
-  print_err("Extra }, or forgotten ");
-
-  switch (cur_group)
-  {
-    case semi_simple_group:
-      print_esc("endgroup");
-      break;
-
-    case math_shift_group:
-      print_char('$');
-      break;
-
-    case math_left_group:
-      print_esc("right");
-      break;
-  }
-
-  help5("I've deleted a group-closing symbol because it seems to be",
-      "spurious, as in `$x}$'. But perhaps the } is legitimate and",
-      "you forgot something else, as in `\\hbox{$x}'. In such cases",
-      "the way to recover is to insert both the forgotten and the",
-      "deleted material, e.g., by typing `I$}'.");
-  error();
-  incr(align_state);
-}
-/* sec 1070 */
-void normal_paragraph (void)
-{
-  if (looseness != 0)
-    eq_word_define(int_base + looseness_code, 0);
-
-  if (hang_indent != 0)
-    eq_word_define(dimen_base + hang_indent_code, 0);
-
-  if (hang_after != 1)
-    eq_word_define(int_base + hang_after_code, 1);
-
-  if (par_shape_ptr != 0)
-    eq_define(par_shape_loc, shape_ref, 0);
-}
-/* sec 1075 */
-void box_end (integer box_context)
-{
-  pointer p;
-
-  if (box_context < box_flag)
-  {
-    if (cur_box != 0)
-    {
-      shift_amount(cur_box) = box_context;
-
-      if (abs(mode) == vmode)
-      {
-        append_to_vlist(cur_box);
-
-        if (adjust_tail != 0)
-        {
-          if (adjust_head != adjust_tail)
-          {
-            link(tail) = link(adjust_head);
-            tail = adjust_tail;
-          }
-
-          adjust_tail = 0;
-        }
-
-        if (mode > 0)
-          build_page();
-      }
-      else
-      {
-        if (abs(mode) == hmode)
-          space_factor = 1000;
-        else
-        {
-          p = new_noad();
-          math_type(nucleus(p)) = sub_box;
-          info(nucleus(p)) = cur_box;
-          cur_box = p;
-        }
-
-        link(tail) = cur_box;
-        tail = cur_box;
-      }
-    }
-  }
-  else if (box_context < ship_out_flag)
-    if (box_context < (box_flag + 256))
-      eq_define((box_base - box_flag) + box_context, box_ref, cur_box);
-    else
-      geq_define((box_base - box_flag - 256) + box_context, box_ref, cur_box);
-  else if (cur_box != 0)
-    if (box_context > ship_out_flag)
-    {
-      do
-        {
-          get_x_token();
-        }
-      while (!((cur_cmd != spacer) && (cur_cmd != relax)));
-
-      if (((cur_cmd == hskip) && (abs(mode) != vmode)) || ((cur_cmd == vskip) && (abs(mode) == vmode)))
-      {
-        append_glue();
-        subtype(tail) = box_context - (leader_flag - a_leaders);
-        leader_ptr(tail) = cur_box;
-      }
-      else
-      {
-        print_err("Leaders not followed by proper glue");
-        help3("You should say `\\leaders <box or rule><hskip or vskip>'.",
-            "I found the <box or rule>, but there's no suitable",
-            "<hskip or vskip>, so I'm ignoring these leaders.");
-        back_error();
-        flush_node_list(cur_box);
-      }
-    }
-    else
-      ship_out(cur_box);
-}
-/* sec 1079 */
-void begin_box (integer box_context)
-{
-  pointer p, q;
-  quarterword m;
-  halfword k;
-  eight_bits n;
-
-  switch (cur_chr)
-  {
-    case box_code:
-      {
-        scan_eight_bit_int();
-        cur_box = box(cur_val);
-        box(cur_val) = 0;
-      }
-      break;
-
-    case copy_code:
-      {
-        scan_eight_bit_int();
-        cur_box = copy_node_list(box(cur_val));
-      }
-      break;
-
-    case last_box_code:
-      {
-        cur_box = 0;
-
-        if (abs(mode) == mmode)
-        {
-          you_cant();
-          help1("Sorry; this \\lastbox will be void.");
-          error();
-        }
-        else if ((mode == vmode) && (head == cur_list.tail_field))
-        {
-          you_cant();
-          help2("Sorry...I usually can't take things from the current page.",
-              "This \\lastbox will therefore be void.");
-          error();
-        }
-        else
-        {
-          if (!is_char_node(tail))
-            if ((type(tail) == hlist_node) || (type(tail) == vlist_node))
-            {
-              q = head;
-
-              do
-                {
-                  p = q;
-
-                  if (!is_char_node(q))
-                    if (type(q) == disc_node)
-                    {
-                      for (m = 1; m <= replace_count(q); m++)
-                        p = link(p);
-
-                      if (p == tail)
-                        goto done;
-                    }
-
-                  q = link(p);
-                }
-              while (!(q == tail));
-
-              cur_box = tail;
-              shift_amount(cur_box) = 0;
-              tail = p;
-              link(p) = 0;
-done:;
-            }
-        }
-      }
-      break;
-
-    case vsplit_code:
-      {
-        scan_eight_bit_int();
-        n = cur_val;
-
-        if (!scan_keyword("to"))
-        {
-          print_err("Missing `to' inserted");
-          help2("I'm working on `\\vsplit<box number> to <dimen>';",
-              "will look for the <dimen> next.");
-          error();
-        }
-
-        scan_dimen(false, false, false);
-        cur_box = vsplit(n, cur_val);
-      }
-      break;
-
-    default:
-      {
-        k = cur_chr - vtop_code;
-        saved(0) = box_context;
-
-        if (k == hmode)
-          if ((box_context < box_flag) && (abs(mode) == vmode))
-            scan_spec(adjust_hbox_group, true);
-          else
-            scan_spec(hbox_group, true);
-        else
-        {
-          if (k == vmode)
-            scan_spec(vbox_group, true);
-          else
-          {
-            scan_spec(vtop_group, true);
-            k = vmode;
-          }
-
-          normal_paragraph();
-        }
-
-        push_nest();
-        mode = - (integer) k;
-
-        if (k == vmode)
-        {
-          prev_depth = ignore_depth;
-
-          if (every_vbox != 0)
-            begin_token_list(every_vbox, every_vbox_text);
-        }
-        else
-        {
-          space_factor = 1000;
-
-          if (every_hbox != 0)
-            begin_token_list(every_hbox, every_vbox_text);
-        }
-
-        return;
-      }
-      break;
-  }
-
-  box_end(box_context);
-}
-/* sec 1084 */
-void scan_box_(integer box_context)
-{
-  do
-    {
-      get_x_token(); 
-    }
-  while (!((cur_cmd != spacer) && (cur_cmd != relax)));
-
-  if (cur_cmd == make_box)
-  {
-    begin_box(box_context);
-  }
-  else if ((box_context >= leader_flag) && ((cur_cmd == hrule) || (cur_cmd == vrule)))
-  {
-    cur_box = scan_rule_spec();
-    box_end(box_context);
-  }
-  else
-  {
-    print_err("A <box> was supposed to be here");
-    help3("I was expecting to see \\hbox or \\vbox or \\copy or \\box or",
-        "something like that. So you might find something missing in",
-        "your output. But keep trying; you can fix this later.");
-    back_error();
-  }
-}
-/* sec 1091 */
-small_number norm_min (integer h)
-{
-  if (h <= 0)
-    return 1;
-  else if (h >= 63)
-    return 63;
-  else
-    return h;
-}
-/* sec 1091 */
-void new_graf (boolean indented)
-{
-  prev_graf = 0;
-
-  if ((mode == vmode) || (head != tail))
-    tail_append(new_param_glue(par_skip_code));
-
-  push_nest();
-  mode = hmode;
-  space_factor = 1000;
-  set_cur_lang();
-  clang = cur_lang;
-  prev_graf = (norm_min(left_hyphen_min) * 64 + norm_min(right_hyphen_min)) * 65536L + cur_lang;
-
-  if (indented)
-  {
-    tail = new_null_box();
-    link(head) = tail;
-    width(tail) = par_indent;
-  }
-
-  if (every_par != 0)
-    begin_token_list(every_par, every_par_text);
-
-  if (nest_ptr == 1)
-    build_page();
-}
-/* sec 1093 */
-void indent_in_hmode (void)
-{
-  pointer p, q;
-
-  if (cur_chr > 0)
-  {
-    p = new_null_box();
-    width(p) = par_indent;
-
-    if (abs(mode) == hmode)
-      space_factor = 1000;
-    else
-    {
-      q = new_noad();
-      math_type(nucleus(q)) = sub_box;
-      info(nucleus(q)) = p;
-      p = q;
-    }
-
-    tail_append(p);
-  }
-}
-/* sec 1095 */
-void head_for_vmode (void)
-{
-  if (mode < 0)
-  {
-    if (cur_cmd != hrule)
-      off_save();
-    else
-    {
-      print_err("You can't use `");
-      print_esc("hrule");
-      prints("' here except with leaders");
-      help2("To put a horizontal rule in an hbox or an alignment,",
-          "you should use \\leaders or \\hrulefill (see The TeXbook).");
-      error();
-    }
-  }
-  else
-  {
-    back_input();
-    cur_tok = par_token;
-    back_input();
-    index = inserted;
-  }
-}
-/* sec 1096 */
-void end_graf (void)
-{
-  if (mode == hmode)
-  {
-    if (head == tail)
-      pop_nest();
-    else
-      line_break(widow_penalty);
-
-    normal_paragraph();
-    error_count = 0;
-  }
-}
-/* sec 1099 */
-void begin_insert_or_adjust (void)
-{
-  if (cur_cmd == vadjust)
-    cur_val = 255;
-  else
-  {
-    scan_eight_bit_int();
-
-    if (cur_val == 255)
-    {
-      print_err("You can't ");
-      print_esc("insert");
-      print_int(255);
-      help1("I'm changing to \\insert0; box 255 is special.");
-      error();
-      cur_val = 0;
-    }
-  }
-
-  saved(0) = cur_val;
-  incr(save_ptr);
-  new_save_level(insert_group);
-  scan_left_brace();
-  normal_paragraph();
-  push_nest();
-  mode = -vmode;
-  prev_depth = ignore_depth;
-}
-/* sec 1101 */
-void make_mark (void)
-{
-  pointer p;
-
-  p = scan_toks(false, true);
-  p = get_node(small_node_size);
-  type(p) = mark_node;
-  subtype(p) = 0;
-  mark_ptr(p) = def_ref;
-  link(tail) = p;
-  tail = p;
-}
-/* sec 1103 */
-void append_penalty (void)
-{
-  scan_int();
-  tail_append(new_penalty(cur_val));
-
-  if (mode == vmode)
-    build_page();
-}
-/* sec 1105 */
-void delete_last (void)
-{
-  pointer p, q;
-  quarterword m;
-
-  if ((mode == vmode) && (tail == head))
-  {
-    if ((cur_chr != glue_node) || (last_glue != max_halfword))
-    {
-      you_cant();
-      help2("Sorry...I usually can't take things from the current page.",
-          "Try `I\\vskip-\\lastskip' instead.");
-
-      if (cur_chr == kern_node)
-        help_line[0] = "Try `I\\kern-\\last_kern' instead.";
-      else if (cur_chr != glue_node)
-        help_line[0] = "Perhaps you can make the output routine do it.";
-      error();
-    }
-  }
-  else
-  {
-    if (!is_char_node(tail))
-      if (type(tail) == cur_chr)
-      {
-        q = head;
-
-        do
-          {
-            p = q;
-
-            if (!is_char_node(q))
-              if (type(q) == disc_node)
-              {
-                for (m = 1; m <= replace_count(q); m++)
-                  p = link(p);
-
-                if (p == tail)
-                  return;
-              }
-
-            q = link(p);
-          }
-        while (!(q == tail));
-
-        link(p) = 0;
-        flush_node_list(tail);
-        tail = p;
-      }
-  }
-}
-/* sec 1110 */
-void unpackage (void)
-{
-  pointer p;
-  char c;
-
-  c = cur_chr;
-  scan_eight_bit_int();
-  p = box(cur_val);
-
-  if (p == 0)
-    return;
-
-  if ((abs(mode) == mmode) || ((abs(mode) == vmode) && (type(p) != vlist_node)) ||
-    ((abs(mode) == hmode) && (type(p) != hlist_node)))
-  {
-    print_err("Incompatible list can't be unboxed");
-    help3("Sorry, Pandora. (You sneaky devil.)",
-        "I refuse to unbox an \\hbox in vertical mode or vice versa.",
-        "And I can't open any boxes in math mode.");
-    error();
-    return;
-  }
-
-  if (c == copy_code)
-    link(tail) = copy_node_list(list_ptr(p));
-  else
-  {
-    link(tail) = list_ptr(p);
-    box(cur_val) = 0;
-    free_node(p, box_node_size);
-  }
-
-  while (link(tail) != 0)
-    tail = link(tail);
-}
-/* sec 1113 */
-void append_italic_correction (void)
-{
-  pointer p;
-  internal_font_number f;
-
-  if (tail != head)
-  {
-    if (is_char_node(tail))
-      p = tail;
-    else if (type(tail) == ligature_node)
-      p = tail + 1;
-    else
-      return;
-
-    f = font(p);
-    tail_append(new_kern(char_italic(f, char_info(f, character(p)))));
-    subtype(tail) = explicit;
-  }
-}
-/* sec 1117 */
-void append_discretionary (void)
-{
-  integer c;
-
-  tail_append(new_disc());
-
-  if (cur_chr == 1)
-  {
-    c = hyphen_char[cur_font];
-
-    if (c >= 0)
-      if (c < 256)
-        pre_break(tail) = new_character(cur_font, c);
-  }
-  else
-  {
-    incr(save_ptr);
-    saved(-1) = 0;
-    new_save_level(disc_group);
-    scan_left_brace();
-    push_nest();
-    mode = -hmode;
-    space_factor = 1000;
-  }
-}
-/* sec 1119 */
-void build_discretionary (void)
-{
-  pointer p, q;
-  integer n;
-
-  unsave();
-  q = head;
-  p = link(q);
-  n = 0;
-
-  while (p != 0)
-  {
-    if (!is_char_node(p))
-      if (type(p) > rule_node)
-        if (type(p) != kern_node)
-          if (type(p) != ligature_node)
-          {
-            print_err("Improper discretionary list");
-            help1("Discretionary lists must contain only boxes and kerns.");
-            error();
-            begin_diagnostic();
-            print_nl("The following discretionary sublist has been deleted:");
-            show_box(p);
-            end_diagnostic(true);
-            flush_node_list(p);
-            link(q) = 0;
-            goto done;
-          }
-
-    q = p;
-    p = link(q);
-    incr(n);
-  }
-
-done:
-  p = link(head);
-  pop_nest();
-
-  switch (saved(-1))
-  {
-    case 0:
-      pre_break(tail) = p;
-      break;
-
-    case 1:
-      post_break(tail) = p;
-      break;
-
-    case 2:
-      {
-        if ((n > 0) && (abs(mode) == mmode))
-        {
-          print_err("Illegal math ");
-          print_esc("discretionary");
-          help2("Sorry: The third part of a discretionary break must be",
-              "empty, in math formulas. I had to delete your third part.");
-          flush_node_list(p);
-          n = 0;
-          error();
-        }
-        else
-          link(tail) = p;
-
-        if (n <= max_quarterword)
-          replace_count(tail) = n;
-        else
-        {
-          print_err("Discretionary list is too long");
-          help2("Wow---I never thought anybody would tweak me here.",
-              "You can't seriously need such a huge discretionary list?");
-          error();
-        }
-
-        if (n > 0)
-          tail = q;
-
-        decr(save_ptr);
-        return;
-      }
-      break;
-  }
-
-  incr(saved(-1));
-  new_save_level(disc_group);
-  scan_left_brace();
-  push_nest();
-  mode = -hmode;
-  space_factor = 1000;
-}
-/* sec 1123 */
-void make_accent (void)
-{
-  real s, t;
-  pointer p, q, r;
-  internal_font_number f;
-  scaled a, h, x, w, delta;
-  four_quarters i;
-
-  scan_char_num();
-  f = cur_font;
-  p = new_character(f, cur_val);
-
-  if (p != 0)
-  {
-    x = x_height(f);
-    s = slant(f) / ((double) 65536.0);
-    a = char_width(f, char_info(f, character(p)));
-    do_assignments();
-    q = 0;
-    f = cur_font;
-
-    if ((cur_cmd == letter) || (cur_cmd == other_char) || (cur_cmd == char_given))
-      q = new_character(f, cur_chr);
-    else if (cur_cmd == char_num)
-    {
-      scan_char_num();
-      q = new_character(f, cur_val);
-    }
-    else
-      back_input();
-
-    if (q != 0)
-    {
-      t = slant(f) / ((double) 65536.0);
-      i = char_info(f, character(q));
-      w = char_width(f, i);
-      h = char_height(f, height_depth(i));
-
-      if (h != x)
-      {
-        p = hpack(p, 0, 1);
-        shift_amount(p) = x - h;
-      }
-
-      delta = round((w - a) / ((double) 2.0) + h * t - x * s);
-      r = new_kern(delta);
-      subtype(r) = acc_kern;
-      link(tail) = r;
-      link(r) = p;
-      tail = new_kern(- (integer) a - delta);
-      subtype(tail) = acc_kern;
-      link(p) = tail;
-      p = q;
-    }
-
-    link(tail) = p;
-    tail = p;
-    space_factor = 1000;
-  }
-}
-/* sec 1127 */
-void align_error (void)
-{
-  if (abs(align_state) > 2)
-  {
-    print_err("Misplaced ");
-    print_cmd_chr(cur_cmd, cur_chr);
-
-    if (cur_tok == tab_token + '&')
-    {
-      help6("I can't figure out why you would want to use a tab mark",
-          "here. If you just want an ampersand, the remedy is",
-          "simple: Just type `I\\&' now. But if some right brace",
-          "up above has ended a previous alignment prematurely,",
-          "you're probably due for more error messages, and you",
-          "might try typing `S' now just to see what is salvageable.");
-    }
-    else
-    {
-      help5("I can't figure out why you would want to use a tab mark",
-          "or \\cr or \\span just now. If something like a right brace",
-          "up above has ended a previous alignment prematurely,",
-          "you're probably due for more error messages, and you",
-          "might try typing `S' now just to see what is salvageable.");
-    }
-
-    error();
-  }
-  else
-  {
-    back_input();
-
-    if (align_state < 0)
-    {
-      print_err("Missing { inserted");
-      incr(align_state);
-      cur_tok = left_brace_token + '{';
-    }
-    else
-    {
-      print_err("Missing } inserted");
-      decr(align_state);
-      cur_tok = right_brace_token + '}';
-    }
-
-    help3("I've put in what seems to be necessary to fix",
-        "the current column of the current alignment.",
-        "Try to go on, since this might almost work.");
-    ins_error();
-  }
-}
-/* sec 1129 */
-void noalign_error (void)
-{
-  print_err("Misplaced ");
-  print_esc("noalign");
-  help2("I expect to see \\noalign only after the \\cr of",
-      "an alignment. Proceed, and I'll ignore this case.");
-  error();
-}
-/* sec 1129 */
-void omit_error (void)
-{
-  print_err("Misplaced ");
-  print_esc("omit");
-  help2("I expect to see \\omit only after tab marks or the \\cr of",
-      "an alignment. Proceed, and I'll ignore this case.");
-  error();
-}
-/* sec 1131 */
-void do_endv (void)
-{
-  base_ptr = input_ptr;
-  input_stack[base_ptr] = cur_input;
-
-  while ((input_stack[base_ptr].index_field != v_template) &&
-    (input_stack[base_ptr].loc_field == 0) &&
-    (input_stack[base_ptr].state_field == token_list))
-    decr(base_ptr);
-
-  if ((input_stack[base_ptr].index_field != v_template) ||
-    (input_stack[base_ptr].loc_field != 0) ||
-    (input_stack[base_ptr].state_field != token_list))
-    fatal_error("(interwoven alignment preambles are not allowed)");
-
-  if (cur_group == align_group)
-  {
-    end_graf();
-
-    if (fin_col())
-      fin_row();
-  }
-  else
-    off_save();
-}
-/* sec 1135 */
-void cs_error (void)
-{
-  print_err("Extra ");
-  print_esc("endcsname");
-  help1("I'm ignoring this, since I wasn't doing a \\csname."); 
-  error();
-}
-/* sec 1136 */
-void push_math (group_code c)
-{
-  push_nest();
-  mode = -mmode;
-  incompleat_noad = 0;
-  new_save_level(c);
-}
-/* sec 1138 */
-void init_math (void)
-{
-  scaled w;
-  scaled l;
-  scaled s;
-  pointer p;
-  pointer q;
-  internal_font_number f;
-  integer n;
-  scaled v;
-  scaled d;
-
-  get_token();
-
-  if ((cur_cmd == math_shift) && (mode > 0))
-  {
-    if (head == tail)
-    {
-      pop_nest();
-      w = -max_dimen;
-    }
-    else
-    {
-      line_break(display_widow_penalty);
-      v = shift_amount(just_box) + 2 * quad(cur_font);
-      w = -max_dimen;
-      p = list_ptr(just_box);
-
-      while (p != 0)
-      {
-reswitch:
-        if (is_char_node(p))
-        {
-          f = font(p);
-          d = char_width(f, char_info(f, character(p)));
-          goto found;
-        }
-
-        switch (type(p))
-        {
-          case hlist_node:
-          case vlist_node:
-          case rule_node:
-            {
-              d = width(p);
-              goto found;
-            }
-            break;
-
-          case ligature_node:
-            {
-              mem[lig_trick] = mem[lig_char(p)];
-              link(lig_trick) = link(p);
-              p = lig_trick;
-              goto reswitch;
-            }
-            break;
-
-          case kern_node:
-          case math_node:
-            d = width(p);
-            break;
-
-          case glue_node:
-            {
-              q = glue_ptr(p);
-              d = width(q);
-
-              if (glue_sign(just_box) == stretching)
-              {
-                if ((glue_order(just_box) == stretch_order(q)) && (stretch(q) != 0))
-                  v = max_dimen;
-              }
-              else if (glue_sign(just_box) == shrinking)
-              {
-                if ((glue_order(just_box) == shrink_order(q)) && (shrink(q) != 0))
-                  v = max_dimen;
-              }
-
-              if (subtype(p) >= a_leaders)
-                goto found;
-            }
-            break;
-
-          case whatsit_node:
-            d = 0;
-            break;
-
-          default:
-            d = 0;
-            break;
-        }
-
-        if (v < max_dimen)
-          v = v + d;
-
-        goto not_found;
-
-found:
-        if (v < max_dimen)
-        {
-          v = v + d;
-          w = v;
-        }
-        else
-        {
-          w = max_dimen;
-          goto done;
-        }
-
-not_found:
-        p = link(p);
-      }
-done:;
-    }
-
-    if (par_shape_ptr == 0)
-      if ((hang_indent != 0) && (((hang_after >= 0) &&
-        (prev_graf + 2 > hang_after)) || (prev_graf + 1 < - (integer) hang_after)))
-      {
-        l = hsize - abs(hang_indent);
-
-        if (hang_indent > 0)
-          s = hang_indent;
-        else
-          s = 0;
-      }
-      else
-      {
-        l = hsize;
-        s = 0;
-      }
-    else
-    {
-      n = info(par_shape_ptr);
-
-      if (prev_graf + 2 >= n)
-        p = par_shape_ptr + 2 * n;
-      else
-        p = par_shape_ptr + 2 * (prev_graf + 2);
-
-      s = mem[p - 1].cint;
-      l = mem[p].cint;
-    }
-
-    push_math(math_shift_group);
-    mode = mmode;
-    eq_word_define(int_base + cur_fam_code, -1);
-    eq_word_define(dimen_base + pre_display_size_code, w);
-    eq_word_define(dimen_base + display_width_code, l);
-    eq_word_define(dimen_base + display_indent_code, s);
-
-    if (every_display != 0)
-      begin_token_list(every_display, every_display_text);
-
-    if (nest_ptr == 1)
-    {
-      build_page();
-    }
-  }
-  else
-  {
-    back_input();
-
-    {
-      push_math(math_shift_group);
-      eq_word_define(int_base + cur_fam_code, -1);
-
-      if (every_math != 0)
-        begin_token_list(every_math, every_math_text);
-    }
-  }
-}
-/* sec 1142 */
-void start_eq_no (void)
-{
-  saved(0) = cur_chr;
-  incr(save_ptr);
-
-  {
-    push_math(math_shift_group);
-    eq_word_define(int_base + cur_fam_code, -1);
-
-    if (every_math != 0)
-      begin_token_list(every_math, every_math_text);
-  }
-}
-/* sec 1151 */
-void scan_math (pointer p)
-{
-  integer c;
-
-restart:
-  do
-    {
-      get_x_token();
-    }
-  while (!((cur_cmd != spacer) && (cur_cmd != relax)));
-
-reswitch:
-  switch (cur_cmd)
-  {
-    case letter:
-    case other_char:
-    case char_given:
-      {
-        c = math_code(cur_chr);
-
-        if (c == 32768L)
-        {
-          {
-            cur_cs = cur_chr + active_base;
-            cur_cmd = eq_type(cur_cs);
-            cur_chr = equiv(cur_cs);
-            x_token();
-            back_input();
-          }
-
-          goto restart;
-        }
-      }
-      break;
-
-    case char_num:
-      {
-        scan_char_num();
-        cur_chr = cur_val;
-        cur_cmd = char_given;
-        goto reswitch;
-      }
-      break;
-
-    case math_char_num:
-      {
-        scan_fifteen_bit_int();
-        c = cur_val;
-      }
-      break;
-
-    case math_given:
-      c = cur_chr;
-      break;
-
-    case delim_num:
-      {
-        scan_twenty_seven_bit_int();
-        c = cur_val / 4096;
-      }
-      break;
-
-    default:
-      {
-        back_input();
-        scan_left_brace();
-        saved(0) = p;
-        incr(save_ptr);
-        push_math(math_group);
-        return;
-      }
-      break;
-  }
-
-  math_type(p) = math_char;
-  character(p) = c % 256;
-
-  if ((c >= var_code) && ((cur_fam >= 0) && (cur_fam < 16)))
-    fam(p) = cur_fam;
-  else
-    fam(p) = (c / 256) % 16;
-}
-/* sec 1155 */
-void set_math_char_(integer c)
-{
-  pointer p;
-
-  if (c >= 32768L)
-  {
-    cur_cs = cur_chr + active_base;
-    cur_cmd = eq_type(cur_cs);
-    cur_chr = equiv(cur_cs);
-    x_token();
-    back_input();
-  }
-  else
-  {
-    p = new_noad();
-    math_type(nucleus(p)) = math_char;
-    character(nucleus(p)) = c % 256;
-    fam(nucleus(p)) = (c / 256) % 16;
-
-    if (c >= var_code)
-    {
-      if (((cur_fam >= 0) && (cur_fam < 16)))
-        fam(nucleus(p)) = cur_fam;
-
-      type(p) = ord_noad;
-    }
-    else
-      type(p) = ord_noad + (c / 4096);
-
-    link(tail) = p;
-    tail = p;
-  }
-}
-/* sec 1159 */
-void math_limit_switch (void)
-{
-  if (head != tail)
-    if (type(tail) == op_noad)
-    {
-      subtype(tail) = cur_chr;
-      return;
-    }
-
-  print_err("Limit controls must follow a math operator");
-  help1("I'm ignoring this misplaced \\limits or \\nolimits command.");
-  error();
-}
-/* sec 1160 */
-void scan_delimiter_(pointer p, boolean r)
-{
-   if (r)
-     scan_twenty_seven_bit_int();
-   else
-   {
-     do
-      {
-        get_x_token();
-      }
-     while (!((cur_cmd != spacer) && (cur_cmd != relax)));
-
-     switch (cur_cmd)
-     {
-       case letter:
-       case other_char:
-         cur_val = del_code(cur_chr);
-         break;
-
-       case delim_num:
-         scan_twenty_seven_bit_int();
-         break;
-
-       default:
-         cur_val = -1;
-         break;
-     }
-   }
-
-   if (cur_val < 0)
-   {
-     print_err("Missing delimiter (. inserted)");
-     help6("I was expecting to see something like `(' or `\\{' or",
-         "`\\}' here. If you typed, e.g., `{' instead of `\\{', you",
-         "should probably delete the `{' by typing `1' now, so that",
-         "braces don't get unbalanced. Otherwise just proceed.",
-         "Acceptable delimiters are characters whose \\delcode is",
-         "nonnegative, or you can use `\\delimiter <delimiter code>'.");
-     back_error();
-     cur_val = 0;
-   }
-
-   small_fam(p) = (cur_val / 1048576L) % 16;
-   small_char(p) = (cur_val / 4096) % 256;
-   large_fam(p) = (cur_val / 256) % 16;
-   large_char(p) = cur_val % 256;
-}
-/* sec 1163 */
-void math_radical (void)
-{
-  tail_append(get_node(radical_noad_size));
-  type(tail) = radical_noad;
-  subtype(tail) = normal;
-  mem[nucleus(tail)].hh = empty_field;
-  mem[subscr(tail)].hh = empty_field;
-  mem[supscr(tail)].hh = empty_field;
-  scan_delimiter(left_delimiter(tail), true);
-  scan_math(nucleus(tail));
-}
-/* sec 1165 */
-void math_ac (void)
-{
-  if (cur_cmd == accent)
-  {
-    print_err("Please use ");
-    print_esc("mathaccent");
-    prints(" for accents in math mode");
-    help2("I'm changing \\accent to \\mathaccent here; wish me luck.",
-      "(Accents are not the same in formulas as they are in text.)");
-    error();
-  }
-
-  tail_append(get_node(accent_noad_size));
-  type(tail) = accent_noad;
-  subtype(tail) = normal;
-  mem[nucleus(tail)].hh = empty_field;
-  mem[subscr(tail)].hh = empty_field;
-  mem[supscr(tail)].hh = empty_field;
-  math_type(accent_chr(tail)) = math_char;
-  scan_fifteen_bit_int();
-  character(accent_chr(tail)) = cur_val % 256;
-
-  if ((cur_val >= var_code) && ((cur_fam >= 0) && (cur_fam < 16)))
-    fam(accent_chr(tail)) = cur_fam;
-  else
-    fam(accent_chr(tail)) = (cur_val / 256) % 16;
-
-  scan_math(nucleus(tail));
-}
-/* sec 1172 */
-void append_choices (void)
-{
-  tail_append(new_choice());
-  incr(save_ptr);
-  saved(-1) = 0;
-  push_math(math_choice_group);
-  scan_left_brace();
-}
-/* sec 1184 */
-pointer fin_mlist (pointer p)
-{
-  pointer q;
-
-  if (incompleat_noad != 0)
-  {
-    math_type(denominator(incompleat_noad)) = sub_mlist;
-    info(denominator(incompleat_noad)) = link(head);
-
-    if (p == 0)
-      q = incompleat_noad;
-    else
-    {
-      q = info(numerator(incompleat_noad));
-
-      if (type(q) != left_noad)
-      {
-        confusion("right");
-        return 0;
-      }
-
-      info(numerator(incompleat_noad)) = link(q);
-      link(q) = incompleat_noad;
-      link(incompleat_noad) = p;
-    }
-  }
-  else
-  {
-    link(tail) = p;
-    q = link(head);
-  }
-
-  pop_nest();
-
-  return q;
-}
-/* sec 1174 */
-void build_choices (void)
-{
-  pointer p;
-
-  unsave();
-  p = fin_mlist(0);
-
-  switch (saved(-1))
-  {
-    case 0:
-      display_mlist(tail) = p;
-      break;
-
-    case 1:
-      text_mlist(tail) = p;
-      break;
-
-    case 2:
-      script_mlist(tail) = p;
-      break;
-
-    case 3:
-      {
-        script_script_mlist(tail) = p;
-        decr(save_ptr);
-        return;
-      }
-      break;
-  }
-
-  incr(saved(-1));
-  push_math(math_choice_group);
-  scan_left_brace();
-}
-/* sec 1176 */
-void sub_sup (void)
-{
-  /* small_number t; */
-  int t;
-  pointer p;
-
-  t = 0;
-  p = 0;
-
-  if (tail != head)
-    if (script_allowed(tail))
-    {
-      p = supscr(tail) + cur_cmd - sup_mark;
-      t = math_type(p);
-    }
-
-  if ((p == 0) || (t != 0))
-  {
-    tail_append(new_noad());
-    p = supscr(tail) + cur_cmd - sup_mark;
-
-    if (t != 0)
-    {
-      if (cur_cmd == sup_mark)
-      {
-        print_err("Double superscript");
-        help1("I treat `x^1^2' essentially like `x^1{}^2'.");
-      }
-      else
-      {
-        print_err("Double subscript");
-        help1("I treat `x_1_2' essentially like `x_1{}_2'.");
-      }
-
-      error();
-    }
-  }
-
-  scan_math(p);
-}
-/* sec 1086 */
-void package (small_number c)
-{
-  scaled h;
-  pointer p;
-  scaled d;
-
-  d = box_max_depth;
-  unsave();
-  save_ptr = save_ptr - 3;
-
-  if (mode == -hmode)
-    cur_box = hpack(link(head), saved(2), saved(1));
-  else
-  {
-    cur_box = vpackage(link(head), saved(2), saved(1), d);
-
-    if (c == vtop_code)
-    {
-      h = 0;
-      p = list_ptr(cur_box);
-
-      if (p != 0)
-        if (type(p) <= rule_node)
-          h = height(p);
-
-      depth(cur_box) = depth(cur_box) - h + height(cur_box);
-      height(cur_box) = h;
-    }
-  }
-
-  pop_nest();
-  box_end(saved(0));
+/* Copyright 2014 Clerk Ma\r
+\r
+   This program is free software; you can redistribute it and/or modify\r
+   it under the terms of the GNU General Public License as published by\r
+   the Free Software Foundation; either version 2 of the License, or\r
+   (at your option) any later version.\r
+\r
+   This program is distributed in the hope that it will be useful, but\r
+   WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+   General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with this program; if not, write to the Free Software\r
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA\r
+   02110-1301 USA.  */\r
+\r
+#define EXTERN extern\r
+\r
+#include "yandytex.h"\r
+\r
+/* sec 0994 */\r
+void build_page (void)\r
+{\r
+  pointer p;\r
+  pointer q, r;\r
+  integer b, c;\r
+  integer pi;\r
+  /* unsigned char n; */\r
+  unsigned int n;\r
+  scaled delta, h, w;\r
+\r
+  if ((link(contrib_head) == 0) || output_active)\r
+    return;\r
+\r
+  do\r
+    {\r
+continu:\r
+      p = link(contrib_head);\r
+\r
+      if (last_glue != max_halfword)\r
+        delete_glue_ref(last_glue);\r
+\r
+      last_penalty = 0;\r
+      last_kern = 0;\r
+\r
+      if (type(p) == glue_node)\r
+      {\r
+        last_glue = glue_ptr(p);\r
+        add_glue_ref(last_glue);\r
+      }\r
+      else\r
+      {\r
+        last_glue = max_halfword;\r
+\r
+        if (type(p) == penalty_node)\r
+          last_penalty = penalty(p);\r
+        else if (type(p) == kern_node)\r
+          last_kern = width(p);\r
+      }\r
+\r
+      switch (type(p))\r
+      {\r
+        case hlist_node:\r
+        case vlist_node:\r
+        case rule_node:\r
+          if (page_contents < box_there)\r
+          {\r
+            if (page_contents == 0)\r
+              freeze_page_specs(box_there);\r
+            else\r
+              page_contents = box_there;\r
+\r
+            q = new_skip_param(top_skip_code);\r
+\r
+            if (width(temp_ptr) > height(p))\r
+              width(temp_ptr) = width(temp_ptr) - height(p);\r
+            else\r
+              width(temp_ptr) = 0;\r
+\r
+            link(q) = p;\r
+            link(contrib_head) = q;\r
+            goto continu;\r
+          }\r
+          else\r
+          {\r
+            page_total = page_total + page_depth + height(p);\r
+            page_depth = depth(p);\r
+            goto contribute;\r
+          }\r
+          break;\r
+\r
+        case whatsit_node:\r
+          goto contribute;\r
+          break;\r
+\r
+        case glue_node:\r
+          if (page_contents < box_there)\r
+            goto done1;\r
+          else if (precedes_break(page_tail))\r
+            pi = 0;\r
+          else\r
+            goto update_heights;\r
+          break;\r
+\r
+        case kern_node:\r
+          if (page_contents < box_there)\r
+            goto done1;\r
+          else if (link(p) == 0)\r
+            return;\r
+          else if (type(link(p)) == glue_node)\r
+            pi = 0;\r
+          else\r
+            goto update_heights;\r
+          break;\r
+\r
+        case penalty_node:\r
+          if (page_contents < box_there)\r
+            goto done1;\r
+          else\r
+            pi = penalty(p);\r
+          break;\r
+\r
+        case mark_node:\r
+          goto contribute;\r
+          break;\r
+\r
+        case ins_node:\r
+          {\r
+            if (page_contents == 0)\r
+              freeze_page_specs(inserts_only);\r
+\r
+            n = subtype(p);\r
+            r = page_ins_head;\r
+\r
+            while (n >= subtype(link(r)))\r
+              r = link(r);\r
+\r
+            n = n;\r
+\r
+            if (subtype(r) != n)\r
+            {\r
+              q = get_node(page_ins_node_size);\r
+              link(q) = link(r);\r
+              link(r) = q;\r
+              r = q;\r
+              subtype(r) = n;\r
+              type(r) = inserting;\r
+              ensure_vbox(n);\r
+\r
+              if (box(n) == 0)\r
+                height(r) = 0;\r
+              else\r
+                height(r) = height(box(n)) + depth(box(n));\r
+\r
+              best_ins_ptr(r) = 0;\r
+              q = skip(n);\r
+\r
+              if (count(n) == 1000)\r
+                h = height(r);\r
+              else\r
+                h = x_over_n(height(r), 1000) * count(n);\r
+\r
+              page_goal = page_goal - h - width(q);\r
+              page_so_far[2 + stretch_order(q)] = page_so_far[2 + stretch_order(q)] + stretch(q);\r
+              page_shrink = page_shrink + shrink(q);\r
+\r
+              if ((shrink_order(q) != normal) && (shrink(q) != 0))\r
+              {\r
+                print_err("Infinite glue shrinkage inserted from ");\r
+                print_esc("skip");\r
+                print_int(n);\r
+                help3("The correction glue for page breaking with insertions",\r
+                    "must have finite shrinkability. But you may proceed,",\r
+                    "since the offensive shrinkability has been made finite.");\r
+                error();\r
+              }\r
+            }\r
+\r
+            if (type(r) == split_up)\r
+              insert_penalties = insert_penalties + float_cost(p);\r
+            else\r
+            {\r
+              last_ins_ptr(r) = p;\r
+              delta = page_goal - page_total - page_depth + page_shrink;\r
+\r
+              if (count(n) == 1000)\r
+                h = height(p);\r
+              else\r
+                h = x_over_n(height(p), 1000) * count(n);\r
+\r
+              if (((h <= 0) || (h <= delta)) && (height(p) + height(r) <= dimen(n)))\r
+              {\r
+                page_goal = page_goal - h;\r
+                height(r) = height(r) + height(p);\r
+              }\r
+              else\r
+              {\r
+                if (count(n) <= 0)\r
+                  w = max_dimen;\r
+                else\r
+                {\r
+                  w = page_goal - page_total - page_depth;\r
+\r
+                  if (count(n) != 1000)\r
+                    w = x_over_n(w, count(n)) * 1000;\r
+                }\r
+\r
+                if (w > dimen(n) - height(r))\r
+                  w = dimen(n) - height(r);\r
+\r
+                q = vert_break(ins_ptr(p), w, depth(p));\r
+                height(r) = height(r) + best_height_plus_depth;\r
+\r
+#ifdef STAT\r
+                if (tracing_pages > 0)\r
+                {\r
+                  begin_diagnostic();\r
+                  print_nl("% split");\r
+                  print_int(n);\r
+                  prints(" to");\r
+                  print_scaled(w);\r
+                  print_char(',');\r
+                  print_scaled(best_height_plus_depth);\r
+                  prints(" p=");\r
+\r
+                  if (q == 0)\r
+                    print_int(eject_penalty);\r
+                  else if (type(q) == penalty_node)\r
+                    print_int(penalty(q));\r
+                  else\r
+                    print_char('0');\r
+\r
+                  end_diagnostic(false);\r
+                }\r
+#endif\r
+                if (count(n) != 1000)\r
+                  best_height_plus_depth = x_over_n(best_height_plus_depth, 1000) * count(n);\r
+\r
+                page_goal = page_goal - best_height_plus_depth;\r
+                type(r) = split_up;\r
+                broken_ptr(r) = q;\r
+                broken_ins(r) = p;\r
+\r
+                if (q == 0)\r
+                  insert_penalties = insert_penalties + (eject_penalty);\r
+                else if (type(q) == penalty_node)\r
+                  insert_penalties = insert_penalties + penalty(q);\r
+              }\r
+            }\r
+            goto contribute;\r
+          }\r
+          break;\r
+\r
+        default:\r
+          {\r
+            confusion("page");\r
+            return;\r
+          }\r
+          break;\r
+      }\r
+\r
+      if (pi < inf_penalty)\r
+      {\r
+        if (page_total < page_goal)\r
+          if ((page_so_far[3] != 0) || (page_so_far[4] != 0) || (page_so_far[5] != 0))\r
+            b = 0;\r
+          else\r
+            b = badness(page_goal - page_total, page_so_far[2]);\r
+        else if (page_total - page_goal > page_shrink)\r
+          b = awful_bad;\r
+        else\r
+          b = badness(page_total - page_goal, page_shrink);\r
+  \r
+        if (b < awful_bad)\r
+          if (pi <= eject_penalty)\r
+            c = pi; \r
+          else if (b < inf_bad)\r
+            c = b + pi + insert_penalties;\r
+          else\r
+            c = deplorable;\r
+        else\r
+          c = b;\r
+\r
+        if (insert_penalties >= 10000)\r
+          c = awful_bad;\r
+\r
+#ifdef STAT\r
+        if (tracing_pages > 0)\r
+        {\r
+          begin_diagnostic();\r
+          print_nl("%");\r
+          prints(" t=");\r
+          print_totals();\r
+          prints(" g=");\r
+          print_scaled(page_goal);\r
+          prints(" b=");\r
+\r
+          if (b == awful_bad)\r
+            print_char('*');\r
+          else\r
+            print_int(b);\r
+\r
+          prints(" p=");\r
+          print_int(pi);\r
+          prints(" c=");\r
+\r
+          if (c == awful_bad)\r
+            print_char('*');\r
+          else\r
+            print_int(c);\r
+\r
+          if (c <= least_page_cost)\r
+            print_char('#');\r
+\r
+          end_diagnostic(false);\r
+        }\r
+#endif\r
+\r
+        if (c <= least_page_cost)\r
+        {\r
+          best_page_break = p;\r
+          best_size = page_goal;\r
+          least_page_cost = c;\r
+          r = link(page_ins_head);\r
+\r
+          while (r != page_ins_head)\r
+          {\r
+            best_ins_ptr(r) = last_ins_ptr(r);\r
+            r = link(r);\r
+          }\r
+        }\r
+\r
+        if ((c == awful_bad) || (pi <= eject_penalty))\r
+        {\r
+          fire_up(p);\r
+\r
+          if (output_active)\r
+            return;\r
+\r
+          goto done;\r
+        }\r
+      }\r
+\r
+      if ((type(p) < glue_node) || (type(p) > kern_node))\r
+        goto contribute;\r
+\r
+update_heights:\r
+      if (type(p) == kern_node)\r
+        q = p;\r
+      else\r
+      {\r
+        q = glue_ptr(p);\r
+        page_so_far[2 + stretch_order(q)] = page_so_far[2 + stretch_order(q)] + stretch(q);\r
+        page_shrink = page_shrink + shrink(q);\r
+\r
+        if ((shrink_order(q) != normal) && (shrink(q) != 0))\r
+        {\r
+          print_err("Infinite glue shrinkage found on current page");\r
+          help4("The page about to be output contains some infinitely",\r
+            "shrinkable glue, e.g., `\\vss' or `\\vskip 0pt minus 1fil'.",\r
+            "Such glue doesn't belong there; but you can safely proceed,",\r
+            "since the offensive shrinkability has been made finite.");\r
+          error();\r
+          r = new_spec(q);\r
+          shrink_order(r) = normal;\r
+          delete_glue_ref(q);\r
+          glue_ptr(p) = r;\r
+          q = r;\r
+        }\r
+      }\r
+\r
+      page_total = page_total + page_depth + width(q);\r
+      page_depth = 0;\r
+\r
+contribute:\r
+      if (page_depth > page_max_depth)\r
+      {\r
+        page_total = page_total + page_depth - page_max_depth;\r
+        page_depth = page_max_depth;\r
+      }\r
+\r
+      link(page_tail) = p;\r
+      page_tail = p;\r
+      link(contrib_head) = link(p);\r
+      link(p) = 0;\r
+      goto done;\r
+\r
+done1:\r
+      link(contrib_head) = link(p);\r
+      link(p) = 0;\r
+      flush_node_list(p);\r
+done:;\r
+    }\r
+  while (!(link(contrib_head) == 0));\r
+\r
+  if (nest_ptr == 0)\r
+    tail = contrib_head;\r
+  else\r
+    nest[0].tail_field = contrib_head;\r
+} \r
+/* sec 1043 */\r
+void app_space (void)\r
+{\r
+  pointer q;\r
+\r
+  if ((space_factor >= 2000) && (xspace_skip != zero_glue))\r
+    q = new_param_glue(xspace_skip_code);\r
+  else\r
+  {\r
+    if (space_skip != zero_glue)\r
+      main_p = space_skip;\r
+    else\r
+    {\r
+      main_p = font_glue[cur_font];\r
+\r
+      if (main_p == 0)\r
+      {\r
+        main_p = new_spec(zero_glue);\r
+        main_k = param_base[cur_font] + space_code;\r
+        width(main_p) = font_info[main_k].cint;\r
+        stretch(main_p) = font_info[main_k + 1].cint;\r
+        shrink(main_p) = font_info[main_k + 2].cint;\r
+        font_glue[cur_font] = main_p;\r
+      }\r
+    }\r
+\r
+    main_p = new_spec(main_p);\r
+\r
+    if (space_factor >= 2000)\r
+      width(main_p) = width(main_p) + extra_space(cur_font);\r
+\r
+    stretch(main_p) = xn_over_d(stretch(main_p), space_factor, 1000);\r
+    shrink(main_p) = xn_over_d(shrink(main_p), 1000, space_factor);\r
+    q = new_glue(main_p);\r
+    glue_ref_count(main_p) = 0;\r
+  }\r
+\r
+  link(tail) = q;\r
+  tail = q;\r
+}\r
+/* sec 1047 */\r
+void insert_dollar_sign (void)\r
+{\r
+  back_input();\r
+  cur_tok = math_shift_token + '$';\r
+  print_err("Missing $ inserted");\r
+  help2("I've inserted a begin-math/end-math symbol since I think",\r
+      "you left one out. Proceed, with fingers crossed.");\r
+  ins_error();\r
+}\r
+/* sec 1049 */\r
+void you_cant (void)\r
+{\r
+  print_err("You can't use `");\r
+  print_cmd_chr(cur_cmd, cur_chr);\r
+  prints("' in ");\r
+  print_mode(mode);\r
+}\r
+/* sec 1050 */\r
+void report_illegal_case (void)\r
+{\r
+  you_cant();\r
+  help4("Sorry, but I'm not programmed to handle this case;",\r
+      "I'll just pretend that you didn't ask for it.",\r
+      "If you're in the wrong mode, you might be able to",\r
+      "return to the right one by typing `I}' or `I$' or `I\\par'.");\r
+  error();\r
+}\r
+/* sec 1051 */\r
+boolean privileged (void)\r
+{\r
+  if (mode > 0)\r
+    return true;\r
+  else\r
+  {\r
+    report_illegal_case();\r
+    return false;\r
+  }\r
+}\r
+/* sec 1054 */\r
+boolean its_all_over (void)\r
+{\r
+  if (privileged())\r
+  {\r
+    if ((page_head == page_tail) && (head == tail) && (dead_cycles == 0))\r
+    {\r
+      return true;\r
+    }\r
+\r
+    back_input();\r
+    tail_append(new_null_box());\r
+    width(tail) = hsize;\r
+    tail_append(new_glue(fill_glue));\r
+    tail_append(new_penalty(-1073741824L));\r
+    build_page();\r
+  }\r
+\r
+  return false;\r
+}\r
+/* sec 1060 */\r
+void append_glue (void)\r
+{\r
+  small_number s;\r
+\r
+  s = cur_chr;\r
+\r
+  switch (s)\r
+  {\r
+    case fil_code:\r
+      cur_val = fil_glue;\r
+      break;\r
+\r
+    case fill_code:\r
+      cur_val = fill_glue;\r
+      break;\r
+\r
+    case ss_code:\r
+      cur_val = ss_glue;\r
+      break;\r
+\r
+    case fil_neg_code:\r
+      cur_val = fil_neg_glue;\r
+      break;\r
+\r
+    case skip_code:\r
+      scan_glue(glue_val);\r
+      break;\r
+\r
+    case mskip_code:\r
+      scan_glue(mu_val);\r
+      break;\r
+  }\r
+\r
+  tail_append(new_glue(cur_val));\r
+\r
+  if (s >= skip_code)\r
+  {\r
+    decr(glue_ref_count(cur_val));\r
+\r
+    if (s > skip_code)\r
+      subtype(tail) = mu_glue;\r
+  }\r
+}\r
+/* sec 1061 */\r
+void append_kern (void)\r
+{ \r
+  quarterword s;\r
+\r
+  s = cur_chr;\r
+\r
+  scan_dimen((s == mu_glue), false, false);\r
+  tail_append(new_kern(cur_val));\r
+  subtype(tail) = s;\r
+}\r
+/* sec 1064 */\r
+void off_save (void)\r
+{\r
+  pointer p;\r
+\r
+  if (cur_group == bottom_level)\r
+  {\r
+    print_err("Extra ");\r
+    print_cmd_chr(cur_cmd, cur_chr);\r
+    help1("Things are pretty mixed up, but I think the worst is over.");\r
+    error();\r
+  }\r
+  else\r
+  {\r
+    back_input();\r
+    p = get_avail();\r
+    link(temp_head) = p;\r
+    print_err("Missing ");\r
+\r
+    switch (cur_group)\r
+    {\r
+      case semi_simple_group:\r
+        {\r
+          info(p) = cs_token_flag + frozen_end_group;\r
+          print_esc("endgroup");\r
+        }\r
+        break;\r
+\r
+      case math_shift_group:\r
+        {\r
+          info(p) = math_shift_token + '$';\r
+          print_char('$');\r
+        }\r
+        break;\r
+\r
+      case math_left_group:\r
+        {\r
+          info(p) = cs_token_flag + frozen_right;\r
+          link(p) = get_avail();\r
+          p = link(p);\r
+          info(p) = other_token + '.';\r
+          print_esc("right.");\r
+        }\r
+        break;\r
+\r
+      default:\r
+        {\r
+          info(p) = right_brace_token + '}';\r
+          print_char('}');\r
+        }\r
+        break;\r
+    }\r
+\r
+    prints(" inserted");\r
+    ins_list(link(temp_head));\r
+    help5("I've inserted something that you may have forgotten.",\r
+        "(See the <inserted text> above.)",\r
+        "With luck, this will get me unwedged. But if you",\r
+        "really didn't forget anything, try typing `2' now; then",\r
+        "my insertion and my current dilemma will both disappear.");\r
+    error();\r
+  }\r
+}\r
+/* sec 1069 */\r
+void extra_right_brace (void)\r
+{\r
+  print_err("Extra }, or forgotten ");\r
+\r
+  switch (cur_group)\r
+  {\r
+    case semi_simple_group:\r
+      print_esc("endgroup");\r
+      break;\r
+\r
+    case math_shift_group:\r
+      print_char('$');\r
+      break;\r
+\r
+    case math_left_group:\r
+      print_esc("right");\r
+      break;\r
+  }\r
+\r
+  help5("I've deleted a group-closing symbol because it seems to be",\r
+      "spurious, as in `$x}$'. But perhaps the } is legitimate and",\r
+      "you forgot something else, as in `\\hbox{$x}'. In such cases",\r
+      "the way to recover is to insert both the forgotten and the",\r
+      "deleted material, e.g., by typing `I$}'.");\r
+  error();\r
+  incr(align_state);\r
+}\r
+/* sec 1070 */\r
+void normal_paragraph (void)\r
+{\r
+  if (looseness != 0)\r
+    eq_word_define(int_base + looseness_code, 0);\r
+\r
+  if (hang_indent != 0)\r
+    eq_word_define(dimen_base + hang_indent_code, 0);\r
+\r
+  if (hang_after != 1)\r
+    eq_word_define(int_base + hang_after_code, 1);\r
+\r
+  if (par_shape_ptr != 0)\r
+    eq_define(par_shape_loc, shape_ref, 0);\r
+}\r
+/* sec 1075 */\r
+void box_end (integer box_context)\r
+{\r
+  pointer p;\r
+\r
+  if (box_context < box_flag)\r
+  {\r
+    if (cur_box != 0)\r
+    {\r
+      shift_amount(cur_box) = box_context;\r
+\r
+      if (abs(mode) == vmode)\r
+      {\r
+        append_to_vlist(cur_box);\r
+\r
+        if (adjust_tail != 0)\r
+        {\r
+          if (adjust_head != adjust_tail)\r
+          {\r
+            link(tail) = link(adjust_head);\r
+            tail = adjust_tail;\r
+          }\r
+\r
+          adjust_tail = 0;\r
+        }\r
+\r
+        if (mode > 0)\r
+          build_page();\r
+      }\r
+      else\r
+      {\r
+        if (abs(mode) == hmode)\r
+          space_factor = 1000;\r
+        else\r
+        {\r
+          p = new_noad();\r
+          math_type(nucleus(p)) = sub_box;\r
+          info(nucleus(p)) = cur_box;\r
+          cur_box = p;\r
+        }\r
+\r
+        link(tail) = cur_box;\r
+        tail = cur_box;\r
+      }\r
+    }\r
+  }\r
+  else if (box_context < ship_out_flag)\r
+    if (box_context < (box_flag + 256))\r
+      eq_define((box_base - box_flag) + box_context, box_ref, cur_box);\r
+    else\r
+      geq_define((box_base - box_flag - 256) + box_context, box_ref, cur_box);\r
+  else if (cur_box != 0)\r
+    if (box_context > ship_out_flag)\r
+    {\r
+      do\r
+        {\r
+          get_x_token();\r
+        }\r
+      while (!((cur_cmd != spacer) && (cur_cmd != relax)));\r
+\r
+      if (((cur_cmd == hskip) && (abs(mode) != vmode)) || ((cur_cmd == vskip) && (abs(mode) == vmode)))\r
+      {\r
+        append_glue();\r
+        subtype(tail) = box_context - (leader_flag - a_leaders);\r
+        leader_ptr(tail) = cur_box;\r
+      }\r
+      else\r
+      {\r
+        print_err("Leaders not followed by proper glue");\r
+        help3("You should say `\\leaders <box or rule><hskip or vskip>'.",\r
+            "I found the <box or rule>, but there's no suitable",\r
+            "<hskip or vskip>, so I'm ignoring these leaders.");\r
+        back_error();\r
+        flush_node_list(cur_box);\r
+      }\r
+    }\r
+    else\r
+      ship_out(cur_box);\r
+}\r
+/* sec 1079 */\r
+void begin_box (integer box_context)\r
+{\r
+  pointer p, q;\r
+  quarterword m;\r
+  halfword k;\r
+  eight_bits n;\r
+\r
+  switch (cur_chr)\r
+  {\r
+    case box_code:\r
+      {\r
+        scan_eight_bit_int();\r
+        cur_box = box(cur_val);\r
+        box(cur_val) = 0;\r
+      }\r
+      break;\r
+\r
+    case copy_code:\r
+      {\r
+        scan_eight_bit_int();\r
+        cur_box = copy_node_list(box(cur_val));\r
+      }\r
+      break;\r
+\r
+    case last_box_code:\r
+      {\r
+        cur_box = 0;\r
+\r
+        if (abs(mode) == mmode)\r
+        {\r
+          you_cant();\r
+          help1("Sorry; this \\lastbox will be void.");\r
+          error();\r
+        }\r
+        else if ((mode == vmode) && (head == cur_list.tail_field))\r
+        {\r
+          you_cant();\r
+          help2("Sorry...I usually can't take things from the current page.",\r
+              "This \\lastbox will therefore be void.");\r
+          error();\r
+        }\r
+        else\r
+        {\r
+          if (!is_char_node(tail))\r
+            if ((type(tail) == hlist_node) || (type(tail) == vlist_node))\r
+            {\r
+              q = head;\r
+\r
+              do\r
+                {\r
+                  p = q;\r
+\r
+                  if (!is_char_node(q))\r
+                    if (type(q) == disc_node)\r
+                    {\r
+                      for (m = 1; m <= replace_count(q); m++)\r
+                        p = link(p);\r
+\r
+                      if (p == tail)\r
+                        goto done;\r
+                    }\r
+\r
+                  q = link(p);\r
+                }\r
+              while (!(q == tail));\r
+\r
+              cur_box = tail;\r
+              shift_amount(cur_box) = 0;\r
+              tail = p;\r
+              link(p) = 0;\r
+done:;\r
+            }\r
+        }\r
+      }\r
+      break;\r
+\r
+    case vsplit_code:\r
+      {\r
+        scan_eight_bit_int();\r
+        n = cur_val;\r
+\r
+        if (!scan_keyword("to"))\r
+        {\r
+          print_err("Missing `to' inserted");\r
+          help2("I'm working on `\\vsplit<box number> to <dimen>';",\r
+              "will look for the <dimen> next.");\r
+          error();\r
+        }\r
+\r
+        scan_dimen(false, false, false);\r
+        cur_box = vsplit(n, cur_val);\r
+      }\r
+      break;\r
+\r
+    default:\r
+      {\r
+        k = cur_chr - vtop_code;\r
+        saved(0) = box_context;\r
+\r
+        if (k == hmode)\r
+          if ((box_context < box_flag) && (abs(mode) == vmode))\r
+            scan_spec(adjust_hbox_group, true);\r
+          else\r
+            scan_spec(hbox_group, true);\r
+        else\r
+        {\r
+          if (k == vmode)\r
+            scan_spec(vbox_group, true);\r
+          else\r
+          {\r
+            scan_spec(vtop_group, true);\r
+            k = vmode;\r
+          }\r
+\r
+          normal_paragraph();\r
+        }\r
+\r
+        push_nest();\r
+        mode = - (integer) k;\r
+\r
+        if (k == vmode)\r
+        {\r
+          prev_depth = ignore_depth;\r
+\r
+          if (every_vbox != 0)\r
+            begin_token_list(every_vbox, every_vbox_text);\r
+        }\r
+        else\r
+        {\r
+          space_factor = 1000;\r
+\r
+          if (every_hbox != 0)\r
+            begin_token_list(every_hbox, every_vbox_text);\r
+        }\r
+\r
+        return;\r
+      }\r
+      break;\r
+  }\r
+\r
+  box_end(box_context);\r
+}\r
+/* sec 1084 */\r
+void scan_box_(integer box_context)\r
+{\r
+  do\r
+    {\r
+      get_x_token(); \r
+    }\r
+  while (!((cur_cmd != spacer) && (cur_cmd != relax)));\r
+\r
+  if (cur_cmd == make_box)\r
+  {\r
+    begin_box(box_context);\r
+  }\r
+  else if ((box_context >= leader_flag) && ((cur_cmd == hrule) || (cur_cmd == vrule)))\r
+  {\r
+    cur_box = scan_rule_spec();\r
+    box_end(box_context);\r
+  }\r
+  else\r
+  {\r
+    print_err("A <box> was supposed to be here");\r
+    help3("I was expecting to see \\hbox or \\vbox or \\copy or \\box or",\r
+        "something like that. So you might find something missing in",\r
+        "your output. But keep trying; you can fix this later.");\r
+    back_error();\r
+  }\r
+}\r
+/* sec 1091 */\r
+small_number norm_min (integer h)\r
+{\r
+  if (h <= 0)\r
+    return 1;\r
+  else if (h >= 63)\r
+    return 63;\r
+  else\r
+    return h;\r
+}\r
+/* sec 1091 */\r
+void new_graf (boolean indented)\r
+{\r
+  prev_graf = 0;\r
+\r
+  if ((mode == vmode) || (head != tail))\r
+    tail_append(new_param_glue(par_skip_code));\r
+\r
+  push_nest();\r
+  mode = hmode;\r
+  space_factor = 1000;\r
+  set_cur_lang();\r
+  clang = cur_lang;\r
+  prev_graf = (norm_min(left_hyphen_min) * 64 + norm_min(right_hyphen_min)) * 65536L + cur_lang;\r
+\r
+  if (indented)\r
+  {\r
+    tail = new_null_box();\r
+    link(head) = tail;\r
+    width(tail) = par_indent;\r
+  }\r
+\r
+  if (every_par != 0)\r
+    begin_token_list(every_par, every_par_text);\r
+\r
+  if (nest_ptr == 1)\r
+    build_page();\r
+}\r
+/* sec 1093 */\r
+void indent_in_hmode (void)\r
+{\r
+  pointer p, q;\r
+\r
+  if (cur_chr > 0)\r
+  {\r
+    p = new_null_box();\r
+    width(p) = par_indent;\r
+\r
+    if (abs(mode) == hmode)\r
+      space_factor = 1000;\r
+    else\r
+    {\r
+      q = new_noad();\r
+      math_type(nucleus(q)) = sub_box;\r
+      info(nucleus(q)) = p;\r
+      p = q;\r
+    }\r
+\r
+    tail_append(p);\r
+  }\r
+}\r
+/* sec 1095 */\r
+void head_for_vmode (void)\r
+{\r
+  if (mode < 0)\r
+  {\r
+    if (cur_cmd != hrule)\r
+      off_save();\r
+    else\r
+    {\r
+      print_err("You can't use `");\r
+      print_esc("hrule");\r
+      prints("' here except with leaders");\r
+      help2("To put a horizontal rule in an hbox or an alignment,",\r
+          "you should use \\leaders or \\hrulefill (see The TeXbook).");\r
+      error();\r
+    }\r
+  }\r
+  else\r
+  {\r
+    back_input();\r
+    cur_tok = par_token;\r
+    back_input();\r
+    index = inserted;\r
+  }\r
+}\r
+/* sec 1096 */\r
+void end_graf (void)\r
+{\r
+  if (mode == hmode)\r
+  {\r
+    if (head == tail)\r
+      pop_nest();\r
+    else\r
+      line_break(widow_penalty);\r
+\r
+    normal_paragraph();\r
+    error_count = 0;\r
+  }\r
+}\r
+/* sec 1099 */\r
+void begin_insert_or_adjust (void)\r
+{\r
+  if (cur_cmd == vadjust)\r
+    cur_val = 255;\r
+  else\r
+  {\r
+    scan_eight_bit_int();\r
+\r
+    if (cur_val == 255)\r
+    {\r
+      print_err("You can't ");\r
+      print_esc("insert");\r
+      print_int(255);\r
+      help1("I'm changing to \\insert0; box 255 is special.");\r
+      error();\r
+      cur_val = 0;\r
+    }\r
+  }\r
+\r
+  saved(0) = cur_val;\r
+  incr(save_ptr);\r
+  new_save_level(insert_group);\r
+  scan_left_brace();\r
+  normal_paragraph();\r
+  push_nest();\r
+  mode = -vmode;\r
+  prev_depth = ignore_depth;\r
+}\r
+/* sec 1101 */\r
+void make_mark (void)\r
+{\r
+  pointer p;\r
+\r
+  p = scan_toks(false, true);\r
+  p = get_node(small_node_size);\r
+  type(p) = mark_node;\r
+  subtype(p) = 0;\r
+  mark_ptr(p) = def_ref;\r
+  link(tail) = p;\r
+  tail = p;\r
+}\r
+/* sec 1103 */\r
+void append_penalty (void)\r
+{\r
+  scan_int();\r
+  tail_append(new_penalty(cur_val));\r
+\r
+  if (mode == vmode)\r
+    build_page();\r
+}\r
+/* sec 1105 */\r
+void delete_last (void)\r
+{\r
+  pointer p, q;\r
+  quarterword m;\r
+\r
+  if ((mode == vmode) && (tail == head))\r
+  {\r
+    if ((cur_chr != glue_node) || (last_glue != max_halfword))\r
+    {\r
+      you_cant();\r
+      help2("Sorry...I usually can't take things from the current page.",\r
+          "Try `I\\vskip-\\lastskip' instead.");\r
+\r
+      if (cur_chr == kern_node)\r
+        help_line[0] = "Try `I\\kern-\\last_kern' instead.";\r
+      else if (cur_chr != glue_node)\r
+        help_line[0] = "Perhaps you can make the output routine do it.";\r
+      error();\r
+    }\r
+  }\r
+  else\r
+  {\r
+    if (!is_char_node(tail))\r
+      if (type(tail) == cur_chr)\r
+      {\r
+        q = head;\r
+\r
+        do\r
+          {\r
+            p = q;\r
+\r
+            if (!is_char_node(q))\r
+              if (type(q) == disc_node)\r
+              {\r
+                for (m = 1; m <= replace_count(q); m++)\r
+                  p = link(p);\r
+\r
+                if (p == tail)\r
+                  return;\r
+              }\r
+\r
+            q = link(p);\r
+          }\r
+        while (!(q == tail));\r
+\r
+        link(p) = 0;\r
+        flush_node_list(tail);\r
+        tail = p;\r
+      }\r
+  }\r
+}\r
+/* sec 1110 */\r
+void unpackage (void)\r
+{\r
+  pointer p;\r
+  char c;\r
+\r
+  c = cur_chr;\r
+  scan_eight_bit_int();\r
+  p = box(cur_val);\r
+\r
+  if (p == 0)\r
+    return;\r
+\r
+  if ((abs(mode) == mmode) || ((abs(mode) == vmode) && (type(p) != vlist_node)) ||\r
+    ((abs(mode) == hmode) && (type(p) != hlist_node)))\r
+  {\r
+    print_err("Incompatible list can't be unboxed");\r
+    help3("Sorry, Pandora. (You sneaky devil.)",\r
+        "I refuse to unbox an \\hbox in vertical mode or vice versa.",\r
+        "And I can't open any boxes in math mode.");\r
+    error();\r
+    return;\r
+  }\r
+\r
+  if (c == copy_code)\r
+    link(tail) = copy_node_list(list_ptr(p));\r
+  else\r
+  {\r
+    link(tail) = list_ptr(p);\r
+    box(cur_val) = 0;\r
+    free_node(p, box_node_size);\r
+  }\r
+\r
+  while (link(tail) != 0)\r
+    tail = link(tail);\r
+}\r
+/* sec 1113 */\r
+void append_italic_correction (void)\r
+{\r
+  pointer p;\r
+  internal_font_number f;\r
+\r
+  if (tail != head)\r
+  {\r
+    if (is_char_node(tail))\r
+      p = tail;\r
+    else if (type(tail) == ligature_node)\r
+      p = tail + 1;\r
+    else\r
+      return;\r
+\r
+    f = font(p);\r
+    tail_append(new_kern(char_italic(f, char_info(f, character(p)))));\r
+    subtype(tail) = explicit;\r
+  }\r
+}\r
+/* sec 1117 */\r
+void append_discretionary (void)\r
+{\r
+  integer c;\r
+\r
+  tail_append(new_disc());\r
+\r
+  if (cur_chr == 1)\r
+  {\r
+    c = hyphen_char[cur_font];\r
+\r
+    if (c >= 0)\r
+      if (c < 256)\r
+        pre_break(tail) = new_character(cur_font, c);\r
+  }\r
+  else\r
+  {\r
+    incr(save_ptr);\r
+    saved(-1) = 0;\r
+    new_save_level(disc_group);\r
+    scan_left_brace();\r
+    push_nest();\r
+    mode = -hmode;\r
+    space_factor = 1000;\r
+  }\r
+}\r
+/* sec 1119 */\r
+void build_discretionary (void)\r
+{\r
+  pointer p, q;\r
+  integer n;\r
+\r
+  unsave();\r
+  q = head;\r
+  p = link(q);\r
+  n = 0;\r
+\r
+  while (p != 0)\r
+  {\r
+    if (!is_char_node(p))\r
+      if (type(p) > rule_node)\r
+        if (type(p) != kern_node)\r
+          if (type(p) != ligature_node)\r
+          {\r
+            print_err("Improper discretionary list");\r
+            help1("Discretionary lists must contain only boxes and kerns.");\r
+            error();\r
+            begin_diagnostic();\r
+            print_nl("The following discretionary sublist has been deleted:");\r
+            show_box(p);\r
+            end_diagnostic(true);\r
+            flush_node_list(p);\r
+            link(q) = 0;\r
+            goto done;\r
+          }\r
+\r
+    q = p;\r
+    p = link(q);\r
+    incr(n);\r
+  }\r
+\r
+done:\r
+  p = link(head);\r
+  pop_nest();\r
+\r
+  switch (saved(-1))\r
+  {\r
+    case 0:\r
+      pre_break(tail) = p;\r
+      break;\r
+\r
+    case 1:\r
+      post_break(tail) = p;\r
+      break;\r
+\r
+    case 2:\r
+      {\r
+        if ((n > 0) && (abs(mode) == mmode))\r
+        {\r
+          print_err("Illegal math ");\r
+          print_esc("discretionary");\r
+          help2("Sorry: The third part of a discretionary break must be",\r
+              "empty, in math formulas. I had to delete your third part.");\r
+          flush_node_list(p);\r
+          n = 0;\r
+          error();\r
+        }\r
+        else\r
+          link(tail) = p;\r
+\r
+        if (n <= max_quarterword)\r
+          replace_count(tail) = n;\r
+        else\r
+        {\r
+          print_err("Discretionary list is too long");\r
+          help2("Wow---I never thought anybody would tweak me here.",\r
+              "You can't seriously need such a huge discretionary list?");\r
+          error();\r
+        }\r
+\r
+        if (n > 0)\r
+          tail = q;\r
+\r
+        decr(save_ptr);\r
+        return;\r
+      }\r
+      break;\r
+  }\r
+\r
+  incr(saved(-1));\r
+  new_save_level(disc_group);\r
+  scan_left_brace();\r
+  push_nest();\r
+  mode = -hmode;\r
+  space_factor = 1000;\r
+}\r
+/* sec 1123 */\r
+void make_accent (void)\r
+{\r
+  real s, t;\r
+  pointer p, q, r;\r
+  internal_font_number f;\r
+  scaled a, h, x, w, delta;\r
+  four_quarters i;\r
+\r
+  scan_char_num();\r
+  f = cur_font;\r
+  p = new_character(f, cur_val);\r
+\r
+  if (p != 0)\r
+  {\r
+    x = x_height(f);\r
+    s = slant(f) / ((double) 65536.0);\r
+    a = char_width(f, char_info(f, character(p)));\r
+    do_assignments();\r
+    q = 0;\r
+    f = cur_font;\r
+\r
+    if ((cur_cmd == letter) || (cur_cmd == other_char) || (cur_cmd == char_given))\r
+      q = new_character(f, cur_chr);\r
+    else if (cur_cmd == char_num)\r
+    {\r
+      scan_char_num();\r
+      q = new_character(f, cur_val);\r
+    }\r
+    else\r
+      back_input();\r
+\r
+    if (q != 0)\r
+    {\r
+      t = slant(f) / ((double) 65536.0);\r
+      i = char_info(f, character(q));\r
+      w = char_width(f, i);\r
+      h = char_height(f, height_depth(i));\r
+\r
+      if (h != x)\r
+      {\r
+        p = hpack(p, 0, 1);\r
+        shift_amount(p) = x - h;\r
+      }\r
+\r
+      delta = round((w - a) / ((double) 2.0) + h * t - x * s);\r
+      r = new_kern(delta);\r
+      subtype(r) = acc_kern;\r
+      link(tail) = r;\r
+      link(r) = p;\r
+      tail = new_kern(- (integer) a - delta);\r
+      subtype(tail) = acc_kern;\r
+      link(p) = tail;\r
+      p = q;\r
+    }\r
+\r
+    link(tail) = p;\r
+    tail = p;\r
+    space_factor = 1000;\r
+  }\r
+}\r
+/* sec 1127 */\r
+void align_error (void)\r
+{\r
+  if (abs(align_state) > 2)\r
+  {\r
+    print_err("Misplaced ");\r
+    print_cmd_chr(cur_cmd, cur_chr);\r
+\r
+    if (cur_tok == tab_token + '&')\r
+    {\r
+      help6("I can't figure out why you would want to use a tab mark",\r
+          "here. If you just want an ampersand, the remedy is",\r
+          "simple: Just type `I\\&' now. But if some right brace",\r
+          "up above has ended a previous alignment prematurely,",\r
+          "you're probably due for more error messages, and you",\r
+          "might try typing `S' now just to see what is salvageable.");\r
+    }\r
+    else\r
+    {\r
+      help5("I can't figure out why you would want to use a tab mark",\r
+          "or \\cr or \\span just now. If something like a right brace",\r
+          "up above has ended a previous alignment prematurely,",\r
+          "you're probably due for more error messages, and you",\r
+          "might try typing `S' now just to see what is salvageable.");\r
+    }\r
+\r
+    error();\r
+  }\r
+  else\r
+  {\r
+    back_input();\r
+\r
+    if (align_state < 0)\r
+    {\r
+      print_err("Missing { inserted");\r
+      incr(align_state);\r
+      cur_tok = left_brace_token + '{';\r
+    }\r
+    else\r
+    {\r
+      print_err("Missing } inserted");\r
+      decr(align_state);\r
+      cur_tok = right_brace_token + '}';\r
+    }\r
+\r
+    help3("I've put in what seems to be necessary to fix",\r
+        "the current column of the current alignment.",\r
+        "Try to go on, since this might almost work.");\r
+    ins_error();\r
+  }\r
+}\r
+/* sec 1129 */\r
+void noalign_error (void)\r
+{\r
+  print_err("Misplaced ");\r
+  print_esc("noalign");\r
+  help2("I expect to see \\noalign only after the \\cr of",\r
+      "an alignment. Proceed, and I'll ignore this case.");\r
+  error();\r
+}\r
+/* sec 1129 */\r
+void omit_error (void)\r
+{\r
+  print_err("Misplaced ");\r
+  print_esc("omit");\r
+  help2("I expect to see \\omit only after tab marks or the \\cr of",\r
+      "an alignment. Proceed, and I'll ignore this case.");\r
+  error();\r
+}\r
+/* sec 1131 */\r
+void do_endv (void)\r
+{\r
+  base_ptr = input_ptr;\r
+  input_stack[base_ptr] = cur_input;\r
+\r
+  while ((input_stack[base_ptr].index_field != v_template) &&\r
+    (input_stack[base_ptr].loc_field == 0) &&\r
+    (input_stack[base_ptr].state_field == token_list))\r
+    decr(base_ptr);\r
+\r
+  if ((input_stack[base_ptr].index_field != v_template) ||\r
+    (input_stack[base_ptr].loc_field != 0) ||\r
+    (input_stack[base_ptr].state_field != token_list))\r
+    fatal_error("(interwoven alignment preambles are not allowed)");\r
+\r
+  if (cur_group == align_group)\r
+  {\r
+    end_graf();\r
+\r
+    if (fin_col())\r
+      fin_row();\r
+  }\r
+  else\r
+    off_save();\r
+}\r
+/* sec 1135 */\r
+void cs_error (void)\r
+{\r
+  print_err("Extra ");\r
+  print_esc("endcsname");\r
+  help1("I'm ignoring this, since I wasn't doing a \\csname."); \r
+  error();\r
+}\r
+/* sec 1136 */\r
+void push_math (group_code c)\r
+{\r
+  push_nest();\r
+  mode = -mmode;\r
+  incompleat_noad = 0;\r
+  new_save_level(c);\r
+}\r
+/* sec 1138 */\r
+void init_math (void)\r
+{\r
+  scaled w;\r
+  scaled l;\r
+  scaled s;\r
+  pointer p;\r
+  pointer q;\r
+  internal_font_number f;\r
+  integer n;\r
+  scaled v;\r
+  scaled d;\r
+\r
+  get_token();\r
+\r
+  if ((cur_cmd == math_shift) && (mode > 0))\r
+  {\r
+    if (head == tail)\r
+    {\r
+      pop_nest();\r
+      w = -max_dimen;\r
+    }\r
+    else\r
+    {\r
+      line_break(display_widow_penalty);\r
+      v = shift_amount(just_box) + 2 * quad(cur_font);\r
+      w = -max_dimen;\r
+      p = list_ptr(just_box);\r
+\r
+      while (p != 0)\r
+      {\r
+reswitch:\r
+        if (is_char_node(p))\r
+        {\r
+          f = font(p);\r
+          d = char_width(f, char_info(f, character(p)));\r
+          goto found;\r
+        }\r
+\r
+        switch (type(p))\r
+        {\r
+          case hlist_node:\r
+          case vlist_node:\r
+          case rule_node:\r
+            {\r
+              d = width(p);\r
+              goto found;\r
+            }\r
+            break;\r
+\r
+          case ligature_node:\r
+            {\r
+              mem[lig_trick] = mem[lig_char(p)];\r
+              link(lig_trick) = link(p);\r
+              p = lig_trick;\r
+              goto reswitch;\r
+            }\r
+            break;\r
+\r
+          case kern_node:\r
+          case math_node:\r
+            d = width(p);\r
+            break;\r
+\r
+          case glue_node:\r
+            {\r
+              q = glue_ptr(p);\r
+              d = width(q);\r
+\r
+              if (glue_sign(just_box) == stretching)\r
+              {\r
+                if ((glue_order(just_box) == stretch_order(q)) && (stretch(q) != 0))\r
+                  v = max_dimen;\r
+              }\r
+              else if (glue_sign(just_box) == shrinking)\r
+              {\r
+                if ((glue_order(just_box) == shrink_order(q)) && (shrink(q) != 0))\r
+                  v = max_dimen;\r
+              }\r
+\r
+              if (subtype(p) >= a_leaders)\r
+                goto found;\r
+            }\r
+            break;\r
+\r
+          case whatsit_node:\r
+            d = 0;\r
+            break;\r
+\r
+          default:\r
+            d = 0;\r
+            break;\r
+        }\r
+\r
+        if (v < max_dimen)\r
+          v = v + d;\r
+\r
+        goto not_found;\r
+\r
+found:\r
+        if (v < max_dimen)\r
+        {\r
+          v = v + d;\r
+          w = v;\r
+        }\r
+        else\r
+        {\r
+          w = max_dimen;\r
+          goto done;\r
+        }\r
+\r
+not_found:\r
+        p = link(p);\r
+      }\r
+done:;\r
+    }\r
+\r
+    if (par_shape_ptr == 0)\r
+      if ((hang_indent != 0) && (((hang_after >= 0) &&\r
+        (prev_graf + 2 > hang_after)) || (prev_graf + 1 < - (integer) hang_after)))\r
+      {\r
+        l = hsize - abs(hang_indent);\r
+\r
+        if (hang_indent > 0)\r
+          s = hang_indent;\r
+        else\r
+          s = 0;\r
+      }\r
+      else\r
+      {\r
+        l = hsize;\r
+        s = 0;\r
+      }\r
+    else\r
+    {\r
+      n = info(par_shape_ptr);\r
+\r
+      if (prev_graf + 2 >= n)\r
+        p = par_shape_ptr + 2 * n;\r
+      else\r
+        p = par_shape_ptr + 2 * (prev_graf + 2);\r
+\r
+      s = mem[p - 1].cint;\r
+      l = mem[p].cint;\r
+    }\r
+\r
+    push_math(math_shift_group);\r
+    mode = mmode;\r
+    eq_word_define(int_base + cur_fam_code, -1);\r
+    eq_word_define(dimen_base + pre_display_size_code, w);\r
+    eq_word_define(dimen_base + display_width_code, l);\r
+    eq_word_define(dimen_base + display_indent_code, s);\r
+\r
+    if (every_display != 0)\r
+      begin_token_list(every_display, every_display_text);\r
+\r
+    if (nest_ptr == 1)\r
+    {\r
+      build_page();\r
+    }\r
+  }\r
+  else\r
+  {\r
+    back_input();\r
+\r
+    {\r
+      push_math(math_shift_group);\r
+      eq_word_define(int_base + cur_fam_code, -1);\r
+\r
+      if (every_math != 0)\r
+        begin_token_list(every_math, every_math_text);\r
+    }\r
+  }\r
+}\r
+/* sec 1142 */\r
+void start_eq_no (void)\r
+{\r
+  saved(0) = cur_chr;\r
+  incr(save_ptr);\r
+\r
+  {\r
+    push_math(math_shift_group);\r
+    eq_word_define(int_base + cur_fam_code, -1);\r
+\r
+    if (every_math != 0)\r
+      begin_token_list(every_math, every_math_text);\r
+  }\r
+}\r
+/* sec 1151 */\r
+void scan_math (pointer p)\r
+{\r
+  integer c;\r
+\r
+restart:\r
+  do\r
+    {\r
+      get_x_token();\r
+    }\r
+  while (!((cur_cmd != spacer) && (cur_cmd != relax)));\r
+\r
+reswitch:\r
+  switch (cur_cmd)\r
+  {\r
+    case letter:\r
+    case other_char:\r
+    case char_given:\r
+      {\r
+        c = math_code(cur_chr);\r
+\r
+        if (c == 32768L)\r
+        {\r
+          {\r
+            cur_cs = cur_chr + active_base;\r
+            cur_cmd = eq_type(cur_cs);\r
+            cur_chr = equiv(cur_cs);\r
+            x_token();\r
+            back_input();\r
+          }\r
+\r
+          goto restart;\r
+        }\r
+      }\r
+      break;\r
+\r
+    case char_num:\r
+      {\r
+        scan_char_num();\r
+        cur_chr = cur_val;\r
+        cur_cmd = char_given;\r
+        goto reswitch;\r
+      }\r
+      break;\r
+\r
+    case math_char_num:\r
+      {\r
+        scan_fifteen_bit_int();\r
+        c = cur_val;\r
+      }\r
+      break;\r
+\r
+    case math_given:\r
+      c = cur_chr;\r
+      break;\r
+\r
+    case delim_num:\r
+      {\r
+        scan_twenty_seven_bit_int();\r
+        c = cur_val / 4096;\r
+      }\r
+      break;\r
+\r
+    default:\r
+      {\r
+        back_input();\r
+        scan_left_brace();\r
+        saved(0) = p;\r
+        incr(save_ptr);\r
+        push_math(math_group);\r
+        return;\r
+      }\r
+      break;\r
+  }\r
+\r
+  math_type(p) = math_char;\r
+  character(p) = c % 256;\r
+\r
+  if ((c >= var_code) && ((cur_fam >= 0) && (cur_fam < 16)))\r
+    fam(p) = cur_fam;\r
+  else\r
+    fam(p) = (c / 256) % 16;\r
+}\r
+/* sec 1155 */\r
+void set_math_char_(integer c)\r
+{\r
+  pointer p;\r
+\r
+  if (c >= 32768L)\r
+  {\r
+    cur_cs = cur_chr + active_base;\r
+    cur_cmd = eq_type(cur_cs);\r
+    cur_chr = equiv(cur_cs);\r
+    x_token();\r
+    back_input();\r
+  }\r
+  else\r
+  {\r
+    p = new_noad();\r
+    math_type(nucleus(p)) = math_char;\r
+    character(nucleus(p)) = c % 256;\r
+    fam(nucleus(p)) = (c / 256) % 16;\r
+\r
+    if (c >= var_code)\r
+    {\r
+      if (((cur_fam >= 0) && (cur_fam < 16)))\r
+        fam(nucleus(p)) = cur_fam;\r
+\r
+      type(p) = ord_noad;\r
+    }\r
+    else\r
+      type(p) = ord_noad + (c / 4096);\r
+\r
+    link(tail) = p;\r
+    tail = p;\r
+  }\r
+}\r
+/* sec 1159 */\r
+void math_limit_switch (void)\r
+{\r
+  if (head != tail)\r
+    if (type(tail) == op_noad)\r
+    {\r
+      subtype(tail) = cur_chr;\r
+      return;\r
+    }\r
+\r
+  print_err("Limit controls must follow a math operator");\r
+  help1("I'm ignoring this misplaced \\limits or \\nolimits command.");\r
+  error();\r
+}\r
+/* sec 1160 */\r
+void scan_delimiter_(pointer p, boolean r)\r
+{\r
+   if (r)\r
+     scan_twenty_seven_bit_int();\r
+   else\r
+   {\r
+     do\r
+      {\r
+        get_x_token();\r
+      }\r
+     while (!((cur_cmd != spacer) && (cur_cmd != relax)));\r
+\r
+     switch (cur_cmd)\r
+     {\r
+       case letter:\r
+       case other_char:\r
+         cur_val = del_code(cur_chr);\r
+         break;\r
+\r
+       case delim_num:\r
+         scan_twenty_seven_bit_int();\r
+         break;\r
+\r
+       default:\r
+         cur_val = -1;\r
+         break;\r
+     }\r
+   }\r
+\r
+   if (cur_val < 0)\r
+   {\r
+     print_err("Missing delimiter (. inserted)");\r
+     help6("I was expecting to see something like `(' or `\\{' or",\r
+         "`\\}' here. If you typed, e.g., `{' instead of `\\{', you",\r
+         "should probably delete the `{' by typing `1' now, so that",\r
+         "braces don't get unbalanced. Otherwise just proceed.",\r
+         "Acceptable delimiters are characters whose \\delcode is",\r
+         "nonnegative, or you can use `\\delimiter <delimiter code>'.");\r
+     back_error();\r
+     cur_val = 0;\r
+   }\r
+\r
+   small_fam(p) = (cur_val / 1048576L) % 16;\r
+   small_char(p) = (cur_val / 4096) % 256;\r
+   large_fam(p) = (cur_val / 256) % 16;\r
+   large_char(p) = cur_val % 256;\r
+}\r
+/* sec 1163 */\r
+void math_radical (void)\r
+{\r
+  tail_append(get_node(radical_noad_size));\r
+  type(tail) = radical_noad;\r
+  subtype(tail) = normal;\r
+  mem[nucleus(tail)].hh = empty_field;\r
+  mem[subscr(tail)].hh = empty_field;\r
+  mem[supscr(tail)].hh = empty_field;\r
+  scan_delimiter(left_delimiter(tail), true);\r
+  scan_math(nucleus(tail));\r
+}\r
+/* sec 1165 */\r
+void math_ac (void)\r
+{\r
+  if (cur_cmd == accent)\r
+  {\r
+    print_err("Please use ");\r
+    print_esc("mathaccent");\r
+    prints(" for accents in math mode");\r
+    help2("I'm changing \\accent to \\mathaccent here; wish me luck.",\r
+      "(Accents are not the same in formulas as they are in text.)");\r
+    error();\r
+  }\r
+\r
+  tail_append(get_node(accent_noad_size));\r
+  type(tail) = accent_noad;\r
+  subtype(tail) = normal;\r
+  mem[nucleus(tail)].hh = empty_field;\r
+  mem[subscr(tail)].hh = empty_field;\r
+  mem[supscr(tail)].hh = empty_field;\r
+  math_type(accent_chr(tail)) = math_char;\r
+  scan_fifteen_bit_int();\r
+  character(accent_chr(tail)) = cur_val % 256;\r
+\r
+  if ((cur_val >= var_code) && ((cur_fam >= 0) && (cur_fam < 16)))\r
+    fam(accent_chr(tail)) = cur_fam;\r
+  else\r
+    fam(accent_chr(tail)) = (cur_val / 256) % 16;\r
+\r
+  scan_math(nucleus(tail));\r
+}\r
+/* sec 1172 */\r
+void append_choices (void)\r
+{\r
+  tail_append(new_choice());\r
+  incr(save_ptr);\r
+  saved(-1) = 0;\r
+  push_math(math_choice_group);\r
+  scan_left_brace();\r
+}\r
+/* sec 1184 */\r
+pointer fin_mlist (pointer p)\r
+{\r
+  pointer q;\r
+\r
+  if (incompleat_noad != 0)\r
+  {\r
+    math_type(denominator(incompleat_noad)) = sub_mlist;\r
+    info(denominator(incompleat_noad)) = link(head);\r
+\r
+    if (p == 0)\r
+      q = incompleat_noad;\r
+    else\r
+    {\r
+      q = info(numerator(incompleat_noad));\r
+\r
+      if (type(q) != left_noad)\r
+      {\r
+        confusion("right");\r
+        return 0;\r
+      }\r
+\r
+      info(numerator(incompleat_noad)) = link(q);\r
+      link(q) = incompleat_noad;\r
+      link(incompleat_noad) = p;\r
+    }\r
+  }\r
+  else\r
+  {\r
+    link(tail) = p;\r
+    q = link(head);\r
+  }\r
+\r
+  pop_nest();\r
+\r
+  return q;\r
+}\r
+/* sec 1174 */\r
+void build_choices (void)\r
+{\r
+  pointer p;\r
+\r
+  unsave();\r
+  p = fin_mlist(0);\r
+\r
+  switch (saved(-1))\r
+  {\r
+    case 0:\r
+      display_mlist(tail) = p;\r
+      break;\r
+\r
+    case 1:\r
+      text_mlist(tail) = p;\r
+      break;\r
+\r
+    case 2:\r
+      script_mlist(tail) = p;\r
+      break;\r
+\r
+    case 3:\r
+      {\r
+        script_script_mlist(tail) = p;\r
+        decr(save_ptr);\r
+        return;\r
+      }\r
+      break;\r
+  }\r
+\r
+  incr(saved(-1));\r
+  push_math(math_choice_group);\r
+  scan_left_brace();\r
+}\r
+/* sec 1176 */\r
+void sub_sup (void)\r
+{\r
+  /* small_number t; */\r
+  int t;\r
+  pointer p;\r
+\r
+  t = 0;\r
+  p = 0;\r
+\r
+  if (tail != head)\r
+    if (script_allowed(tail))\r
+    {\r
+      p = supscr(tail) + cur_cmd - sup_mark;\r
+      t = math_type(p);\r
+    }\r
+\r
+  if ((p == 0) || (t != 0))\r
+  {\r
+    tail_append(new_noad());\r
+    p = supscr(tail) + cur_cmd - sup_mark;\r
+\r
+    if (t != 0)\r
+    {\r
+      if (cur_cmd == sup_mark)\r
+      {\r
+        print_err("Double superscript");\r
+        help1("I treat `x^1^2' essentially like `x^1{}^2'.");\r
+      }\r
+      else\r
+      {\r
+        print_err("Double subscript");\r
+        help1("I treat `x_1_2' essentially like `x_1{}_2'.");\r
+      }\r
+\r
+      error();\r
+    }\r
+  }\r
+\r
+  scan_math(p);\r
+}\r
+/* sec 1086 */\r
+void package (small_number c)\r
+{\r
+  scaled h;\r
+  pointer p;\r
+  scaled d;\r
+\r
+  d = box_max_depth;\r
+  unsave();\r
+  save_ptr = save_ptr - 3;\r
+\r
+  if (mode == -hmode)\r
+    cur_box = hpack(link(head), saved(2), saved(1));\r
+  else\r
+  {\r
+    cur_box = vpackage(link(head), saved(2), saved(1), d);\r
+\r
+    if (c == vtop_code)\r
+    {\r
+      h = 0;\r
+      p = list_ptr(cur_box);\r
+\r
+      if (p != 0)\r
+        if (type(p) <= rule_node)\r
+          h = height(p);\r
+\r
+      depth(cur_box) = depth(cur_box) - h + height(cur_box);\r
+      height(cur_box) = h;\r
+    }\r
+  }\r
+\r
+  pop_nest();\r
+  box_end(saved(0));\r
 }
\ No newline at end of file
index 0a9b49d..491fa06 100644 (file)
-/* Copyright 2014 Clerk Ma
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301 USA.  */
-
-#define EXTERN extern
-
-#include "yandytex.h"
-
-/* sec 1181 */
-void math_fraction (void)
-{
-  small_number c;
-
-  c = cur_chr;
-
-  if (incompleat_noad != 0)
-  {
-    if (c >= delimited_code)
-    {
-      scan_delimiter(garbage, false);
-      scan_delimiter(garbage, false);
-    }
-
-    if (c % delimited_code == 0)
-      scan_dimen(false, false, false);
-
-    print_err("Ambiguous; you need another { and }");
-    help3("I'm ignoring this fraction specification, since I don't",
-      "know whether a construction like `x \\over y \\over z'",
-      "means `{x \\over y} \\over z' or `x \\over {y \\over z}'.");
-    error();
-  }
-  else
-  {
-    incompleat_noad = get_node(fraction_noad_size);
-    type(incompleat_noad) = fraction_noad;
-    subtype(incompleat_noad) = normal;
-    math_type(numerator(incompleat_noad)) = sub_mlist;
-    info(numerator(incompleat_noad)) = link(head);
-    mem[denominator(incompleat_noad)].hh = empty_field;
-    mem[left_delimiter(incompleat_noad)].qqqq = null_delimiter;
-    mem[right_delimiter(incompleat_noad)].qqqq = null_delimiter;
-    link(head) = 0;
-    tail = head;
-
-    if (c >= delimited_code)
-    {
-      scan_delimiter(left_delimiter(incompleat_noad), false);
-      scan_delimiter(right_delimiter(incompleat_noad), false);
-    }
-
-    switch (c % delimited_code)
-    {
-      case above_code:
-        scan_dimen(false, false, false);
-        thickness(incompleat_noad) = cur_val;
-        break;
-
-      case over_code:
-        thickness(incompleat_noad) = default_code;
-        break;
-
-      case atop_code:
-        thickness(incompleat_noad) = 0;
-        break;
-    }
-  }
-}
-/* sec 1191 */
-void math_left_right (void)
-{
-  small_number t;
-  pointer p;
-
-  t = cur_chr;
-
-  if ((t == right_noad) && (cur_group != math_left_group))
-  {
-    if (cur_group == math_shift_group)
-    {
-      scan_delimiter(garbage, false);
-      print_err("Extra ");
-      print_esc("right");
-      help1("I'm ignoring a \\right that had no matching \\left.");
-      error();
-    }
-    else
-      off_save();
-  }
-  else
-  {
-    p = new_noad();
-    type(p) = t;
-    scan_delimiter(delimiter(p), false);
-
-    if (t == left_noad)
-    {
-      push_math(math_left_group);
-      link(tail) = p;
-      tail = p;
-    }
-    else
-    {
-      p = fin_mlist(p);
-      unsave();
-      tail_append(new_noad());
-      type(tail) = inner_noad;
-      math_type(nucleus(tail)) = sub_mlist;
-      info(nucleus(tail)) = p;
-    }
-  }
-}
-/* sec 1194 */
-void after_math (void)
-{
-  boolean l;
-  boolean danger;
-  integer m;
-  pointer p;
-  pointer a;
-  pointer b;
-  scaled w;
-  scaled z;
-  scaled e;
-  scaled q;
-  scaled d;
-  scaled s;
-  small_number g1, g2;
-  pointer r;
-  pointer t;
-
-  danger = false;
-  
-  if ((font_params[fam_fnt(2 + text_size)] < total_mathsy_params) ||
-    (font_params[fam_fnt(2 + script_size)] < total_mathsy_params) ||
-    (font_params[fam_fnt(2 + script_script_size)] < total_mathsy_params))
-  {
-    print_err("Math formula deleted: Insufficient symbol fonts");
-    help3("Sorry, but I can't typeset math unless \\textfont 2",
-        "and \\scriptfont 2 and \\scriptscriptfont 2 have all",
-        "the \\fontdimen values needed in math symbol fonts.");
-    error();
-    flush_math();
-    danger = true;
-  }
-  else if ((font_params[fam_fnt(3 + text_size)] < total_mathex_params) ||
-    (font_params[fam_fnt(3 + script_size)] < total_mathex_params) ||
-    (font_params[fam_fnt(3 + script_script_size)] < total_mathex_params))
-  {
-    print_err("Math formula deleted: Insufficient extension fonts");
-    help3("Sorry, but I can't typeset math unless \\textfont 3",
-        "and \\scriptfont 3 and \\scriptscriptfont 3 have all",
-        "the \\fontdimen values needed in math extension fonts.");
-    error();
-    flush_math();
-    danger = true;
-  }
-
-  m = mode;
-  l = false;
-  p = fin_mlist(0);
-
-  if (mode == -m)
-  {
-    {
-      get_x_token();
-
-      if (cur_cmd != math_shift)
-      {
-        print_err("Display math should end with $$");
-        help2("The `$' that I just saw supposedly matches a previous `$$'.",
-            "So I shall assume that you typed `$$' both times.");
-        back_error();
-      }
-    }
-
-    cur_mlist = p;
-    cur_style = text_style;
-    mlist_penalties = false;
-    mlist_to_hlist();
-    a = hpack(link(temp_head), 0, 1);
-    unsave();
-    decr(save_ptr);
-
-    if (saved(0) == 1)
-      l = true;
-
-    danger = false;
-
-    if ((font_params[fam_fnt(2 + text_size)] < total_mathsy_params) ||
-      (font_params[fam_fnt(2 + script_size)] < total_mathsy_params) ||
-      (font_params[fam_fnt(2 + script_script_size)] < total_mathsy_params))
-    {
-      print_err("Math formula deleted: Insufficient symbol fonts");
-      help3("Sorry, but I can't typeset math unless \\textfont 2",
-          "and \\scriptfont 2 and \\scriptscriptfont 2 have all",
-          "the \\fontdimen values needed in math symbol fonts.");
-      error();
-      flush_math();
-      danger = true;
-    }
-    else if ((font_params[fam_fnt(3 + text_size)] < total_mathex_params) ||
-      (font_params[fam_fnt(3 + script_size)] < total_mathex_params) ||
-      (font_params[fam_fnt(3 + script_script_size)] < total_mathex_params))
-    {
-      print_err("Math formula deleted: Insufficient extension fonts");
-      help3("Sorry, but I can't typeset math unless \\textfont 3",
-        "and \\scriptfont 3 and \\scriptscriptfont 3 have all",
-        "the \\fontdimen values needed in math extension fonts.");
-      error();
-      flush_math();
-      danger = true;
-    }
-
-    m = mode;
-    p = fin_mlist(0);
-  }
-  else
-    a = 0;
-
-  if (m < 0)
-  {
-    tail_append(new_math(math_surround, before));
-    cur_mlist = p;
-    cur_style = text_style;
-    mlist_penalties = (mode > 0);
-    mlist_to_hlist();
-    link(tail) = link(temp_head);
-
-    while (link(tail) != 0)
-      tail = link(tail);
-
-    tail_append(new_math(math_surround, after));
-    space_factor = 1000;
-    unsave();
-  }
-  else
-  {
-    if (a == 0)
-    {
-      get_x_token();
-
-      if (cur_cmd != math_shift)
-      {
-        print_err("Display math should end with $$");
-        help2("The `$' that I just saw supposedly matches a previous `$$'.",
-            "So I shall assume that you typed `$$' both times.");
-        back_error();
-      }
-    }
-
-    cur_mlist = p;
-    cur_style = display_style;
-    mlist_penalties = false;
-    mlist_to_hlist();
-    p = link(temp_head);
-    adjust_tail = adjust_head;
-    b = hpack(p, 0, 1);
-    p = list_ptr(b);
-    t = adjust_tail;
-    adjust_tail = 0;
-    w = width(b);
-    z = display_width;
-    s = display_indent;
-
-    if ((a == 0) || danger)
-    {
-      e = 0;
-      q = 0;
-    }
-    else
-    {
-      e = width(a);
-      q = e + math_quad(text_size);
-    }
-
-    if (w + q > z)
-    {
-      if ((e != 0) && ((w - total_shrink[normal] + q <= z) || (total_shrink[fil] != 0) ||
-        (total_shrink[fill] != 0) || (total_shrink[filll] != 0)))
-      {
-        free_node(b, box_node_size);
-        b = hpack(p, z - q, 0);
-      }
-      else
-      {
-        e = 0;
-
-        if (w > z)
-        {
-          free_node(b, box_node_size);
-          b = hpack(p, z, 0);
-        }
-      }
-      w = width(b);
-    }
-
-    d = half(z - w);
-
-    if ((e > 0) && (d < 2 * e))
-    {
-      d = half(z - w - e);
-
-      if (p != 0)
-        if (!is_char_node(p))
-          if (type(p) == glue_node)
-            d = 0;
-    }
-
-    tail_append(new_penalty(pre_display_penalty));
-
-    if ((d + s <= pre_display_size) || l)
-    {
-      g1 = above_display_skip_code;
-      g2 = below_display_skip_code;
-    }
-    else
-    {
-      g1 = above_display_short_skip_code;
-      g2 = below_display_short_skip_code;
-    }
-    if (l && (e == 0))
-    {
-      shift_amount(a) = s;
-      append_to_vlist(a);
-      tail_append(new_penalty(10000));
-    }
-    else
-    {
-      tail_append(new_param_glue(g1));
-    }
-
-    if (e != 0)
-    {
-      r = new_kern(z - w - e - d);
-
-      if (l)
-      {
-        link(a) = r;
-        link(r) = b;
-        b = a;
-        d = 0;
-      }
-      else
-      {
-        link(b) = r;
-        link(r) = a;
-      }
-      b = hpack(b, 0, 1);
-    }
-
-    shift_amount(b) = s + d;
-    append_to_vlist(b);
-
-    if ((a != 0) && (e == 0) && !l)
-    {
-      tail_append(new_penalty(10000));
-      shift_amount(a) = s + z - width(a);
-      append_to_vlist(a);
-      g2 = 0;
-    }
-
-    if (t != adjust_head)
-    {
-      link(tail) = link(adjust_head);
-      tail = t;
-    }
-
-    tail_append(new_penalty(post_display_penalty));
-
-    if (g2 > 0)
-    {
-      tail_append(new_param_glue(g2));
-    }
-
-    resume_after_display();
-  }
-}
-/* sec 1200 */
-void resume_after_display (void)
-{
-  if (cur_group != math_shift_group)
-  {
-    confusion("display");
-    return;
-  }
-
-  unsave();
-  prev_graf = prev_graf + 3;
-  push_nest();
-  mode = hmode;
-  space_factor = 1000;
-  set_cur_lang();
-  clang = cur_lang;
-  prev_graf =(norm_min(left_hyphen_min) * 64 + norm_min(right_hyphen_min)) * 65536L + cur_lang;
-
-  {
-    get_x_token();
-
-    if (cur_cmd != spacer)
-      back_input();
-  }
-
-  if (nest_ptr == 1)
-    build_page();
-}
-/* sec 1215 */
-void get_r_token (void)
-{
-restart:
-  do
-    {
-      get_token();
-    }
-  while (!(cur_tok != space_token));
-
-  if ((cur_cs == 0) || (cur_cs > frozen_control_sequence))
-  {
-    print_err("Missing control sequence inserted");
-    help5("Please don't say `\\def cs{...}', say `\\def\\cs{...}'.",
-      "I've inserted an inaccessible control sequence so that your",
-      "definition will be completed without mixing me up too badly.",
-      "You can recover graciously from this error, if you're",
-      "careful; see exercise 27.2 in The TeXbook.");
-
-    if (cur_cs == 0)
-      back_input();
-
-    cur_tok = cs_token_flag + frozen_protection;
-    ins_error();
-    goto restart;
-  }
-}
-/* sec 1229 */
-void trap_zero_glue (void)
-{
-  if ((width(cur_val) == 0) && (stretch(cur_val) == 0) && (shrink(cur_val) == 0))
-  {
-    add_glue_ref(zero_glue);
-    delete_glue_ref(cur_val);
-    cur_val = 0;
-  }
-}
-/* sec 1236 */
-void do_register_command (small_number a)
-{
-  pointer l, q, r, s;
-  char p;
-
-  q = cur_cmd;
-
-  {
-    if (q != tex_register)
-    {
-      get_x_token();
-
-      if ((cur_cmd >= assign_int) && (cur_cmd <= assign_mu_glue))
-      {
-        l = cur_chr;
-        p = cur_cmd - assign_int;
-        goto found;
-      }
-
-      if (cur_cmd != tex_register)
-      {
-        print_err("You can't use `");
-        print_cmd_chr(cur_cmd, cur_chr);
-        prints("' after ");
-        print_cmd_chr(q, 0);
-        help1("I'm forgetting what you said and not changing anything.");
-        error();
-        return;
-      }
-    }
-
-    p = cur_chr;
-    scan_eight_bit_int();
-
-    switch (p)
-    {
-      case int_val:
-        l = cur_val + count_base;
-        break;
-
-      case dimen_val:
-        l = cur_val + scaled_base;
-        break;
-
-      case glue_val:
-        l = cur_val + skip_base;
-        break;
-
-      case mu_val:
-        l = cur_val + mu_skip_base;
-        break;
-    }
-  }
-
-found:
-  if (q == tex_register)
-    scan_optional_equals();
-  else if (scan_keyword("by"))
-    do_nothing();
-
-  arith_error = false;
-
-  if (q < multiply)
-    if (p < glue_val)
-    {
-      if (p == int_val)
-        scan_int();
-      else
-        scan_dimen(false, false, false);
-
-      if (q == advance)
-        cur_val = cur_val + eqtb[l].cint;
-    }
-    else
-    {
-      scan_glue(p);
-
-      if (q == advance)
-      {
-        q = new_spec(cur_val);
-        r = equiv(l);
-        delete_glue_ref(cur_val);
-        width(q) = width(q) + width(r);
-
-        if (stretch(q) == 0)
-          stretch_order(q) = normal;
-
-        if (stretch_order(q) == stretch_order(r))
-          stretch(q) = stretch(q) + stretch(r);
-        else if ((stretch_order(q) < stretch_order(r)) && (stretch(r) != 0))
-        {
-          stretch(q) = stretch(r);
-          stretch_order(q) = stretch_order(r);
-        }
-
-        if (shrink(q) == 0)
-          shrink_order(q) = normal;
-
-        if (shrink_order(q) == shrink_order(r))
-          shrink(q) = shrink(q) + shrink(r);
-        else if ((shrink_order(q) < shrink_order(r)) && (shrink(r) != 0))
-        {
-          shrink(q) = shrink(r);
-          shrink_order(q) = shrink_order(r);
-        }
-        cur_val = q;
-      }
-    }
-  else
-  {
-    scan_int();
-
-    if (p < glue_val)
-      if (q == multiply)
-        if (p == int_val)
-          cur_val = mult_integers(eqtb[l].cint, cur_val);
-        else
-          cur_val = nx_plus_y(eqtb[l].cint, cur_val, 0);
-      else
-        cur_val = x_over_n(eqtb[l].cint, cur_val);
-    else
-    {
-      s = equiv(l);
-      r = new_spec(s);
-
-      if (q == multiply)
-      {
-        width(r) = nx_plus_y(width(s), cur_val, 0);
-        stretch(r) = nx_plus_y(stretch(s), cur_val, 0);
-        shrink(r) = nx_plus_y(shrink(s), cur_val, 0);
-      }
-      else
-      {
-        width(r) = x_over_n(width(s), cur_val);
-        stretch(r) = x_over_n(stretch(s), cur_val);
-        shrink(r) = x_over_n(shrink(s), cur_val);
-      }
-      cur_val = r;
-    }
-  }
-
-  if (arith_error)
-  {
-    print_err("Arithmetic overflow");
-    help2("I can't carry out that multiplication or division,",
-        "since the result is out of range.");
-
-    if (p >= glue_val)
-      delete_glue_ref(cur_val);
-
-    error();
-    return;
-  }
-
-  if (p < glue_val)
-    word_define(l, cur_val);
-  else
-  {
-    trap_zero_glue();
-    define(l, glue_ref, cur_val);
-  }
-}
-/* sec 1243 */
-void alter_aux (void)
-{
-  halfword c;
-
-  if (cur_chr != abs(mode))
-    report_illegal_case();
-  else
-  {
-    c = cur_chr;
-    scan_optional_equals();
-
-    if (c == vmode)
-    {
-      scan_dimen(false, false, false);
-      prev_depth = cur_val;
-    }
-    else
-    {
-      scan_int();
-
-      if ((cur_val <= 0) || (cur_val > 32767))
-      {
-        print_err("Bad space factor");
-        help1("I allow only values in the range 1..32767 here.");
-        int_error(cur_val);
-      }
-      else
-        space_factor = cur_val;
-    }
-  }
-}
-/* sec 1244 */
-void alter_prev_graf (void)
-{
-  integer p;
-
-  nest[nest_ptr] = cur_list;
-  p = nest_ptr;
-
-  while (abs(nest[p].mode_field) != vmode)
-    decr(p);
-
-  scan_optional_equals();
-  scan_int();
-
-  if (cur_val < 0)
-  {
-    print_err("Bad ");
-    print_esc("prevgraf");
-    help1("I allow only nonnegative values here.");
-    int_error(cur_val);
-  }
-  else
-  {
-    nest[p].pg_field = cur_val;
-    cur_list = nest[nest_ptr];
-  }
-}
-/* sec 1245 */
-void alter_page_so_far (void)
-{
-  char c;
-
-  c = cur_chr;
-  scan_optional_equals();
-  scan_dimen(false, false, false);
-  page_so_far[c] = cur_val;
-}
-/* sec 1246 */
-void alter_integer (void)
-{
-  char c;
-
-  c = cur_chr;
-  scan_optional_equals();
-  scan_int();
-
-  if (c == 0)
-    dead_cycles = cur_val;
-  else
-    insert_penalties = cur_val;
-}
-/* sec 1247 */
-void alter_box_dimen (void)
-{
-  small_number c;
-  eight_bits b;
-
-  c = cur_chr;
-  scan_eight_bit_int();
-  b = cur_val;
-  scan_optional_equals();
-  scan_dimen(false, false, false);
-
-  if (box(b) != 0)
-    mem[box(b) + c].cint = cur_val;
-}
-/* sec 1257 */
-void new_font (small_number a)
-{
-  pointer u;
-  scaled s;
-  internal_font_number f;
-  str_number t;
-  char old_setting;
-  str_number flushable_string;
-
-  if (job_name == 0)
-    open_log_file();
-
-  get_r_token();
-  u = cur_cs;
-
-  if (u >= hash_base)
-    t = text(u);
-  else if (u >= single_base)
-    if (u == null_cs)
-      t = 1213; /* FONT */
-    else
-      t = u - single_base;
-  else
-  {
-    old_setting = selector;
-    selector = new_string;
-    prints("FONT");
-    print(u - active_base);
-    selector = old_setting;
-    str_room(1);
-    t = make_string();
-  }
-
-  define(u, set_font, null_font);
-  scan_optional_equals();
-  scan_file_name();
-
-  name_in_progress = true;
-
-  if (scan_keyword("at"))
-  {
-    scan_dimen(false, false, false);
-    s = cur_val; 
-
-    if ((s <= 0) || (s >= 134217728L)) /* 2^27 */
-    {
-      print_err("Improper `at' size (");
-      print_scaled(s);
-      prints("pt), replaced by 10pt");
-      help2("I can only handle fonts at positive sizes that are",
-        "less than 2048pt, so I've changed what you said to 10pt.");
-      error();
-      s = 10 * unity;
-    }
-  }
-  else if (scan_keyword("scaled"))
-  {
-    scan_int();
-    s = -cur_val;
-
-    if ((cur_val <= 0) || (cur_val > 32768L))
-    {
-      print_err("Illegal magnification has been changed to 1000");
-      help1("The magnification ratio must be between 1 and 32768.");
-      int_error(cur_val);
-      s = -1000;
-    }
-  }
-  else
-    s = -1000;
-
-  name_in_progress = false;
-
-  flushable_string = str_ptr - 1;
-
-  if (trace_flag)
-  {
-    int i, k1, k2, l1, l2;
-    char *sch = log_line;
-    k1 = str_start[cur_area];
-    k2 = str_start[cur_name];
-    l1 = length(cur_area);
-    l2 = length(cur_name);
-    wterm_cr();
-    puts("FONT ");
-
-    for (i = 0; i < l1; i++)
-    {
-      *sch++ = str_pool[i + k1];
-    }
-
-    for (i = 0; i < l2; i++)
-    {
-      *sch++ = str_pool[i + k2];
-    }
-
-    *sch++ = ' ';
-    *sch++ = '\0';
-    show_line(log_line, 0);
-  }
-
-  for (f = font_base + 1; f < font_ptr; f++)
-  {
-    if (str_eq_str(font_name[f], cur_name) && str_eq_str(font_area[f], cur_area))
-    {
-      if (cur_name == flushable_string)
-      {
-        flush_string();
-        cur_name = font_name[f];
-      }
-
-      if (s > 0)
-      {
-        if (s == font_size[f])
-        {
-          if (ignore_frozen == 0 || f > frozen_font_ptr)
-          {
-            if (trace_flag)
-              printf("SKIPPING %lld ", s);
-
-            goto common_ending;
-          }
-        }
-      }
-      else if (font_size[f] == xn_over_d(font_dsize[f], - (integer) s, 1000))
-      {
-        if (ignore_frozen == 0 || f > frozen_font_ptr)
-        {
-          if (trace_flag)
-            printf("SKIPPING %lld ", s);
-          goto common_ending;
-        }
-      }
-    }
-  }
-
-  if (trace_flag)
-    show_line("READING ", 0);
-
-  f = read_font_info(u, cur_name, cur_area, s); 
-
-common_ending:
-  if (trace_flag)
-    printf("NEW FONT %lld ", f);
-
-  equiv(u) = f;
-  eqtb[font_id_base + f] = eqtb[u];
-  font_id_text(f) = t;
-}
-/* sec 1265 */
-void new_interaction (void)
-{
-  print_ln();
-  interaction = cur_chr;
-
-  if (interaction == batch_mode)
-    selector = no_print;
-  else
-    selector = term_only;
-
-  if (log_opened)
-    selector = selector + 2;
-}
-/* sec 1270 */
-void do_assignments (void)
-{
-  while (true)
-  {
-    do
-      {
-        get_x_token();
-      }
-    while (!((cur_cmd != spacer) && (cur_cmd != relax)));
-
-    if (cur_cmd <= max_non_prefixed_command)
-      return;
-
-    set_box_allowed = false;
-    prefixed_command();
-    set_box_allowed = true;
-  }
-}
-/* sec 1275 */
-void open_or_close_in (void)
-{
-  char c;
-  char n;
-
-  c = cur_chr;
-  scan_four_bit_int();
-  n = cur_val;
-
-  if (read_open[n] != closed)
-  {
-    a_close(read_file[n]);
-    read_open[n] = closed;
-  }
-
-  if (c != 0)
-  {
-    scan_optional_equals();
-    scan_file_name();
-    pack_file_name(cur_name, cur_area, cur_ext);
-
-    if ((cur_ext != 335) && a_open_in(read_file[n], kpse_tex_format))
-      read_open[n] = 1;
-    else if ((cur_ext != 785) && (name_length + 5 < file_name_size))
-    {
-      strncpy((char *) name_of_file + name_length + 1, ".tex ", 5);
-      name_length = name_length + 4;
-
-      if (a_open_in(read_file[n], kpse_tex_format))
-        read_open[n] = just_open;
-      else
-      {
-        name_length = name_length - 4;
-        name_of_file[name_length + 1] = ' ';
-
-        if ((cur_ext == 335) && a_open_in(read_file[n], kpse_tex_format))
-          read_open[n] = just_open;
-      }
-    }
-  }
-}
-/* sec 1279 */
-void issue_message (void)
-{
-  char old_setting;
-  char c;
-  str_number s;
-
-  c = cur_chr;
-  link(garbage) = scan_toks(false, true);
-  old_setting = selector;
-  selector = new_string;
-  token_show(def_ref);
-  selector = old_setting;
-  flush_list(def_ref);
-  str_room(1);
-  s = make_string();
-
-  if (c == 0)
-  {
-    if (term_offset + length(s) > max_print_line - 2)
-      print_ln();
-    else if ((term_offset > 0) || (file_offset > 0))
-      print_char(' ');
-
-    slow_print(s);
-    update_terminal();
-  }
-  else
-  {
-    print_err("");
-    slow_print(s);
-
-    if (err_help != 0)
-      use_err_help = true;
-    else if (long_help_seen)
-      help1("(That was another \\errmessage.)");
-    else
-    {
-      if (interaction < error_stop_mode)
-        long_help_seen = true;
-
-      help4("This error message was generated by an \\errmessage",
-        "command, so I can't give any explicit help.",
-        "Pretend that you're Hercule Poirot: Examine all clues,",
-        "and deduce the truth by order and method.");
-    }
-
-    error();
-    use_err_help = false;
-  }
-
-  flush_string();
-}
-/* sec 1288 */
-void shift_case (void)
-{
-  pointer b;
-  pointer p;
-  halfword t;
-  eight_bits c;
-
-  b = cur_chr;
-  p = scan_toks(false, false);
-  p = link(def_ref);
-
-  while (p != 0)
-  {
-    t = info(p); 
-
-    if (t < cs_token_flag + single_base)
-    {
-      c = t % 256;
-
-      if (equiv(b + c) != 0)
-        info(p) = t - c + equiv(b + c);
-    }
-
-    p = link(p);
-  }
-
-  begin_token_list(link(def_ref), 3);
-  free_avail(def_ref);
-}
-/* sec 1293 */
-void show_whatever (void)
-{
-  pointer p;
-
-  switch (cur_chr)
-  {
-    case show_lists:
-      {
-        begin_diagnostic();
-        show_activities();
-      }
-      break;
-
-    case show_box_code:
-      {
-        scan_eight_bit_int();
-        begin_diagnostic();
-        print_nl("> \\box");
-        print_int(cur_val);
-        print_char('=');
-
-        if (box(cur_val) == 0)
-          prints("void");
-        else
-          show_box(box(cur_val));
-      }
-      break;
-
-    case show_code:
-      {
-        get_token();
-
-        if (interaction == error_stop_mode)
-          do_nothing();
-
-        print_nl("> ");
-
-        if (cur_cs != 0)
-        {
-          sprint_cs(cur_cs);
-          print_char('=');
-        }
-
-        print_meaning();
-        goto common_ending;
-      }
-      break;
-
-    default:
-      {
-        p = the_toks();
-
-        if (interaction == error_stop_mode)
-          do_nothing();
-
-        print_nl("> ");
-        token_show(temp_head);
-        flush_list(link(temp_head));
-        goto common_ending;
-      }
-      break;
-  }
-
-  end_diagnostic(true);
-  print_err("OK");
-
-  if (selector == term_and_log)
-    if (tracing_online <= 0)
-    {
-      selector = term_only;
-      prints(" (see the transcript file)");
-      selector = term_and_log;
-    }
-
-common_ending:
-
-  if (interaction < error_stop_mode)
-  {
-    help_ptr = 0;
-    decr(error_count);
-  }
-  else if (tracing_online > 0)
-  {
-    help3("This isn't an error message; I'm just \\showing something.",
-      "Type `I\\show...' to show more (e.g., \\show\\cs,",
-      "\\showthe\\count10, \\showbox255, \\showlists).");
-  }
-  else
-  {
-    help5("This isn't an error message; I'm just \\showing something.",
-      "Type `I\\show...' to show more (e.g., \\show\\cs,",
-      "\\showthe\\count10, \\showbox255, \\showlists).",
-      "And type `I\\tracingonline=1\\show...' to show boxes and",
-      "lists on your terminal as well as in the transcript file.");
-  }
-
-  error();
-}
-/* sec 1349 */
-void new_whatsit_(small_number s, small_number w)
-{
-  pointer p;
-
-  p = get_node(w);
-  type(p) = whatsit_node;
-  subtype(p) = s;
-  link(tail) = p;
-  tail = p;
-}
-/* sec 1350 */
-void new_write_whatsit (small_number w)
-{
-  new_whatsit(cur_chr, w);
-
-  if (w != write_node_size)
-    scan_four_bit_int();
-  else
-  {
-    scan_int();
-
-    if (cur_val < 0)
-      cur_val = 17;
-    else if (cur_val > 15)
-      cur_val = 16;
-  }
-
-  write_stream(tail) = cur_val;
-}
-/* sec 1348 */
-void do_extension (void)
-{
-  integer k;
-  pointer p;
-
-  switch (cur_chr)
-  {
-    case open_node:
-      {
-        new_write_whatsit(open_node_size);
-        scan_optional_equals();
-        scan_file_name();
-        open_name(tail) = cur_name;
-        open_area(tail) = cur_area;
-        open_ext(tail) = cur_ext;
-      }
-      break;
-
-    case write_node:
-      {
-        k = cur_cs;
-        new_write_whatsit(write_node_size);
-        cur_cs = k;
-        p = scan_toks(false, false);
-        write_tokens(tail) = def_ref;
-      }
-      break;
-
-    case close_node:
-      {
-        new_write_whatsit(write_node_size);
-        write_tokens(tail) = 0;
-      }
-      break;
-
-    case special_node:
-      {
-        new_whatsit(special_node, write_node_size);
-        write_stream(tail) = 0;
-        p = scan_toks(false, true);
-        write_tokens(tail) = def_ref;
-      }
-      break;
-
-    case immediate_code:
-      {
-        get_x_token();
-
-        if ((cur_cmd == extension) && (cur_chr <= close_node))
-        {
-          p = tail;
-          do_extension();
-          out_what(tail);
-          flush_node_list(tail);
-          tail = p;
-          link(p) = 0;
-        }
-        else
-          back_input();
-      }
-      break;
-
-    case set_language_code:
-      if (abs(mode) != hmode)
-      {
-        report_illegal_case();
-      }
-      else
-      {
-        new_whatsit(language_node, small_node_size);
-        scan_int();
-
-        if (cur_val <= 0)
-          clang = 0;
-        else if (cur_val > 255)
-          clang = 0;
-        else
-          clang = cur_val;
-
-        what_lang(tail) = clang;
-        what_lhm(tail) = norm_min(left_hyphen_min);
-        what_rhm(tail) = norm_min(right_hyphen_min);
-      }
-      break;
-
-    default:
-      {
-        confusion("ext1");
-        return;
-      }
-      break;
-  }
-}
-/* sec 1376 */
-void fix_language (void)
-{
-  /* ASCII_code l; */
-  int l;
-
-  if (language <= 0)
-    l = 0; 
-  else if (language > 255)
-    l = 0;
-  else
-    l = language;
-
-  if (l != clang)
-  {
-    new_whatsit(language_node, small_node_size);
-    what_lang(tail) = l;
-    clang = l;
-    what_lhm(tail) = norm_min(left_hyphen_min);
-    what_rhm(tail) = norm_min(right_hyphen_min);
-  }
-}
-/* sec 1068 */
-void handle_right_brace (void)
-{
-  pointer p, q;
-  scaled d;
-  integer f;
-
-  switch (cur_group)
-  {
-    case simple_group:
-      unsave();
-      break;
-
-    case bottom_level:
-      {
-        print_err("Too many }'s");
-        help2("You've closed more groups than you opened.",
-          "Such booboos are generally harmless, so keep going.");
-        error();
-      }
-      break;
-
-    case semi_simple_group:
-    case math_shift_group:
-    case math_left_group:
-      extra_right_brace();
-      break;
-
-    case hbox_group:
-      package(0);
-      break;
-
-    case adjust_hbox_group:
-      {
-        adjust_tail = adjust_head;
-        package(0);
-      }
-      break;
-
-    case vbox_group:
-      {
-        end_graf();
-        package(0);
-      }
-      break;
-
-    case vtop_group:
-      {
-        end_graf();
-        package(vtop_code);
-      }
-      break;
-
-    case insert_group:
-      {
-        end_graf();
-        q = split_top_skip;
-        add_glue_ref(q);
-        d = split_max_depth;
-        f = floating_penalty;
-        unsave();
-        decr(save_ptr);
-        p = vpackage(link(head), 0, 1, max_dimen);
-        pop_nest();
-
-        if (saved(0) < 255)
-        {
-          tail_append(get_node(ins_node_size));
-          type(tail) = ins_node;
-          subtype(tail) = saved(0);
-          height(tail) = height(p) + depth(p);
-          ins_ptr(tail) = list_ptr(p);
-          split_top_ptr(tail) = q;
-          depth(tail) = d;
-          float_cost(tail) = f;
-        }
-        else
-        {
-          tail_append(get_node(small_node_size));
-          type(tail) = adjust_node;
-          subtype(tail) = 0;
-          adjust_ptr(tail) = list_ptr(p);
-          delete_glue_ref(q);
-        }
-        free_node(p, box_node_size);
-
-        if (nest_ptr == 0)
-          build_page();
-      }
-      break;
-
-    case output_group:
-      {
-        if ((loc != 0) || ((token_type != output_text) && (token_type != backed_up)))
-        {
-          print_err("Unbalanced output routine");
-          help2("Your sneaky output routine has problematic {'s and/or }'s.",
-            "I can't handle that very well; good luck.");
-          error();
-
-          do
-            {
-              get_token();
-            }
-          while (!(loc == 0));
-        }
-
-        end_token_list();
-        end_graf();
-        unsave();
-        output_active = false;
-        insert_penalties = 0;
-
-        if (box(255) != 0)
-        {
-          print_err("Output routine didn't use all of ");
-          print_esc("box");
-          print_int(255);
-          help3("Your \\output commands should empty \\box255,",
-            "e.g., by saying `\\shipout\\box255'.",
-            "Proceed; I'll discard its present contents.");
-          box_error(255);
-        }
-
-        if (tail != head)
-        {
-          link(page_tail) = link(head);
-          page_tail = tail;
-        }
-
-        if (link(page_head) != 0)
-        {
-          if (link(contrib_head) == 0)
-            nest[0].tail_field = page_tail;
-
-          link(page_tail) = link(contrib_head);
-          link(contrib_head) = link(page_head);
-          link(page_head) = 0;
-          page_tail = page_head;
-        }
-
-        pop_nest();
-        build_page();
-      }
-      break;
-
-    case disc_group:
-      build_discretionary();
-      break;
-
-    case align_group:
-      {
-        back_input();
-        cur_tok = cs_token_flag + frozen_cr;
-        print_err("Missing ");
-        print_esc("cr");
-        prints("inserted");
-        help1("I'm guessing that you meant to end an alignment here.");
-        ins_error();
-      }
-      break;
-
-    case no_align_group:
-      {
-        end_graf();
-        unsave();
-        align_peek();
-      }
-      break;
-
-    case vcenter_group:
-      {
-        end_graf();
-        unsave();
-        save_ptr = save_ptr - 2;
-        p = vpackage(link(head), saved(1), saved(0), max_dimen);
-        pop_nest();
-        tail_append(new_noad());
-        type(tail) = vcenter_noad;
-        math_type(nucleus(tail)) = sub_box;
-        info(nucleus(tail)) = p;
-      }
-      break;
-
-    case math_choice_group:
-      build_choices();
-      break;
-
-    case math_group:
-      {
-        unsave();
-        decr(save_ptr);
-        math_type(saved(0)) = sub_mlist;
-        p = fin_mlist(0);
-        info(saved(0)) = p;
-
-        if (p != 0)
-          if (link(p) == 0)
-            if (type(p) == ord_noad)
-            {
-              if (math_type(subscr(p)) == 0)
-                if (math_type(supscr(p)) == 0)
-                {
-                  mem[saved(0)].hh = mem[nucleus(p)].hh;
-                  free_node(p, noad_size);
-                }
-            }
-            else if (type(p) == accent_noad)
-              if (saved(0) == nucleus(tail))
-                if (type(tail) == ord_noad)
-                {
-                  q = head;
-
-                  while (link(q) != tail)
-                    q = link(q);
-
-                  link(q) = p;
-                  free_node(tail, noad_size);
-                  tail = p;
-                }
-      }
-      break;
-    default:
-      {
-        confusion("rightbrace");
-        return;
-      }
-      break;
-  }
-}
-/* sec 1030 */
-void main_control (void) 
-{
-  integer t;
-  boolean bSuppress;
-
-  if (every_job != 0)
-    begin_token_list(every_job, every_job_text);
-
-big_switch:
-  get_x_token();
-
-reswitch:
-  if (interrupt != 0)
-    if (OK_to_interrupt)
-    {
-      back_input();
-      check_interrupt();
-      goto big_switch;
-    }
-
-#ifdef DEBUG
-  if (panicking)
-    check_mem(false);
-#endif
-
-  if (tracing_commands > 0)
-    show_cur_cmd_chr();
-
-  switch (abs(mode) + cur_cmd)
-  {
-    case hmode + letter:
-    case hmode + other_char:
-    case hmode + char_given:
-      goto main_loop;
-      break;
-
-    case hmode + char_num:
-      {
-        scan_char_num();
-        cur_chr = cur_val;
-        goto main_loop;
-      }
-      break;
-
-    case hmode + no_boundary:
-      {
-        get_x_token();
-
-        if ((cur_cmd == letter) || (cur_cmd == other_char) ||
-          (cur_cmd == char_given) || (cur_cmd == char_num))
-          cancel_boundary = true;
-        goto reswitch;
-      }
-      break;
-
-    case hmode + spacer:
-      if (space_factor == 1000)
-        goto append_normal_space;
-      else
-        app_space();
-      break;
-
-    case hmode + ex_space:
-    case mmode + ex_space:
-      goto append_normal_space;
-      break;
-
-    case any_mode(relax):
-    case vmode + spacer:
-    case mmode + spacer:
-    case mmode + no_boundary:
-      do_nothing();
-      break;
-
-    case any_mode(ignore_spaces):
-      {
-        do
-          {
-            get_x_token();
-          }
-        while (!(cur_cmd != spacer));
-        goto reswitch;
-      }
-      break;
-
-    case vmode + stop:
-      if (its_all_over())
-        return;
-      break;
-
-    case vmode + vmove:
-    case hmode + hmove:
-    case mmode + hmove:
-    case any_mode(last_item):
-    case vmode + vadjust:
-    case vmode + ital_corr:
-    case non_math(eq_no):
-    case any_mode(mac_param):
-      report_illegal_case();
-      break;
-
-    case non_math(sup_mark):
-    case non_math(sub_mark):
-    case non_math(math_char_num):
-    case non_math(math_given):
-    case non_math(math_comp):
-    case non_math(delim_num):
-    case non_math(left_right):
-    case non_math(above):
-    case non_math(radical):
-    case non_math(math_style):
-    case non_math(math_choice):
-    case non_math(vcenter):
-    case non_math(non_script):
-    case non_math(mkern):
-    case non_math(limit_switch):
-    case non_math(mskip):
-    case non_math(math_accent):
-    case mmode + endv:
-    case mmode + par_end:
-    case mmode + stop:
-    case mmode + vskip:
-    case mmode + un_vbox:
-    case mmode + valign:
-    case mmode + hrule:
-      insert_dollar_sign();
-      break;
-
-    case vmode + hrule:
-    case hmode + vrule:
-    case mmode + vrule:
-      {
-        tail_append(scan_rule_spec());
-
-        if (abs(mode) == vmode)
-          prev_depth = ignore_depth;
-        else if (abs(mode) == hmode)
-          space_factor = 1000;
-      }
-      break;
-
-    case vmode + vskip:
-    case hmode + hskip:
-    case mmode + hskip:
-    case mmode + mskip:
-      append_glue();
-      break;
-
-    case any_mode(kern):
-    case mmode + mkern:
-      append_kern();
-      break;
-
-    case non_math(left_brace):
-      new_save_level(simple_group);
-      break;
-
-    case any_mode(begin_group):
-      new_save_level(semi_simple_group);
-      break;
-
-    case any_mode(end_group):
-      if (cur_group == semi_simple_group)
-        unsave();
-      else
-        off_save();
-      break;
-
-    case any_mode(right_brace):
-      handle_right_brace();
-      break;
-
-    case vmode + hmove:
-    case hmode + vmove:
-    case mmode + vmove:
-      {
-        t = cur_chr;
-        scan_dimen(false, false, false);
-
-        if (t == 0)
-          scan_box(cur_val);
-        else
-          scan_box(- (integer) cur_val);
-      }
-      break;
-
-    case any_mode(leader_ship):
-      scan_box(leader_flag - a_leaders + cur_chr);
-      break;
-
-    case any_mode(make_box):
-      begin_box(0);
-      break;
-
-    case vmode + start_par:
-      new_graf(cur_chr > 0);
-      break;
-
-    case vmode + letter:
-    case vmode + other_char:
-    case vmode + char_num:
-    case vmode + char_given:
-    case vmode + math_shift:
-    case vmode + un_hbox:
-    case vmode + vrule:
-    case vmode + accent:
-    case vmode + discretionary:
-    case vmode + hskip:
-    case vmode + valign:
-    case vmode + ex_space:
-    case vmode + no_boundary:
-      {
-        back_input();
-        new_graf(true);
-      }
-      break;
-
-    case hmode + start_par:
-    case mmode + start_par:
-      indent_in_hmode();
-      break;
-
-    case vmode + par_end:
-      {
-        normal_paragraph();
-
-        if (mode > 0)
-          build_page();
-      }
-      break;
-
-    case hmode + par_end:
-      {
-        if (align_state < 0)
-          off_save();
-
-        end_graf();
-
-        if (mode == 1)
-          build_page();
-      }
-      break;
-
-    case hmode + stop:
-    case hmode + vskip:
-    case hmode + hrule:
-    case hmode + un_vbox:
-    case hmode + halign:
-      head_for_vmode();
-      break;
-
-    case any_mode(insert):
-    case hmode + vadjust:
-    case mmode + vadjust:
-      begin_insert_or_adjust();
-      break;
-
-    case any_mode(mark):
-      make_mark();
-      break;
-
-    case any_mode(break_penalty):
-      append_penalty();
-      break;
-
-    case any_mode(remove_item):
-      delete_last();
-      break;
-
-    case vmode + un_vbox:
-    case hmode + un_hbox:
-    case mmode + un_hbox:
-      unpackage();
-      break;
-
-    case hmode + ital_corr:
-      append_italic_correction();
-      break;
-
-    case mmode + ital_corr:
-      tail_append(new_kern(0));
-      break;
-
-    case hmode + discretionary:
-    case mmode + discretionary:
-      append_discretionary();
-      break;
-
-    case hmode + accent:
-      make_accent();
-      break;
-
-    case any_mode(car_ret):
-    case any_mode(tab_mark):
-      align_error();
-      break;
-
-    case any_mode(no_align):
-      noalign_error();
-      break;
-
-    case any_mode(omit):
-      omit_error();
-      break;
-
-    case vmode + halign:
-    case hmode + valign:
-      init_align();
-      break;
-
-    case mmode + halign:
-      if (privileged ())
-        if (cur_group == math_shift_group)
-          init_align();
-        else
-          off_save();
-      break;
-
-    case vmode + endv:
-    case hmode + endv:
-      do_endv();
-      break;
-
-    case any_mode(end_cs_name):
-      cs_error();
-      break;
-
-    case hmode + math_shift:
-      init_math();
-      break;
-
-    case mmode + eq_no:
-      if (privileged ())
-        if (cur_group == math_shift_group)
-          start_eq_no();
-        else
-          off_save();
-      break;
-
-    case mmode + left_brace:
-      {
-        tail_append(new_noad());
-        back_input();
-        scan_math(nucleus(tail));
-      }
-      break;
-
-    case mmode + letter:
-    case mmode + other_char:
-    case mmode + char_given:
-      set_math_char(math_code(cur_chr));
-      break;
-
-    case mmode + char_num:
-      {
-        scan_char_num();
-        cur_chr = cur_val;
-        set_math_char(math_code(cur_chr));
-      }
-      break;
-
-    case mmode + math_char_num:
-      {
-        scan_fifteen_bit_int();
-        set_math_char(cur_val);
-      }
-      break;
-
-    case mmode + math_given:
-      set_math_char(cur_chr);
-      break;
-
-    case mmode + delim_num:
-      {
-        scan_twenty_seven_bit_int();
-        set_math_char(cur_val / 4096);
-      }
-      break;
-
-    case mmode + math_comp:
-      {
-        tail_append(new_noad());
-        type(tail) = cur_chr;
-        scan_math(nucleus(tail));
-      }
-      break;
-
-    case mmode + limit_switch:
-      math_limit_switch();
-      break;
-
-    case mmode + radical:
-      math_radical();
-      break;
-
-    case mmode + accent:
-    case mmode + math_accent:
-      math_ac();
-      break;
-
-    case mmode + vcenter:
-      {
-        scan_spec(vcenter_group, false);
-        normal_paragraph();
-        push_nest();
-        mode = -1;
-        prev_depth = ignore_depth;
-
-        if (every_vbox != 0)
-          begin_token_list(every_vbox, every_vbox_text);
-      }
-      break;
-
-    case mmode + math_style:
-      tail_append(new_style(cur_chr));
-      break;
-
-    case mmode + non_script:
-      {
-        tail_append(new_glue(zero_glue));
-        subtype(tail) = cond_math_glue;
-      }
-      break;
-
-    case mmode + math_choice:
-      append_choices();
-      break;
-
-    case mmode + sub_mark:
-    case mmode + sup_mark:
-      sub_sup();
-      break;
-
-    case mmode + above:
-      math_fraction();
-      break;
-
-    case mmode + left_right:
-      math_left_right();
-      break;
-
-    case mmode + math_shift:
-      if (cur_group == math_shift_group)
-        after_math();
-      else
-        off_save();
-      break;
-
-    case any_mode(toks_register):
-    case any_mode(assign_toks):
-    case any_mode(assign_int):
-    case any_mode(assign_dimen):
-    case any_mode(assign_glue):
-    case any_mode(assign_mu_glue):
-    case any_mode(assign_font_dimen):
-    case any_mode(assign_font_int):
-    case any_mode(set_aux):
-    case any_mode(set_prev_graf):
-    case any_mode(set_page_dimen):
-    case any_mode(set_page_int):
-    case any_mode(set_box_dimen):
-    case any_mode(set_shape):
-    case any_mode(def_code):
-    case any_mode(def_family):
-    case any_mode(set_font):
-    case any_mode(def_font):
-    case any_mode(tex_register):
-    case any_mode(advance):
-    case any_mode(multiply):
-    case any_mode(divide):
-    case any_mode(prefix):
-    case any_mode(let):
-    case any_mode(shorthand_def):
-    case any_mode(read_to_cs):
-    case any_mode(def):
-    case any_mode(set_box):
-    case any_mode(hyph_data):
-    case any_mode(set_interaction):
-      prefixed_command();
-      break;
-
-    case any_mode(after_assignment):
-      {
-        get_token();
-        after_token = cur_tok;
-      }
-      break;
-
-    case any_mode(after_group):
-      {
-        get_token();
-        save_for_after(cur_tok);
-      }
-      break;
-
-    case any_mode(in_stream):
-      open_or_close_in();
-      break;
-
-    case any_mode(message):
-      issue_message();
-      break;
-
-    case any_mode(case_shift):
-      shift_case();
-      break;
-
-    case any_mode(xray):
-      show_whatever();
-      break;
-
-    case any_mode(extension):
-      do_extension();
-      break;
-  }
-
-  goto big_switch;
-
-main_loop:
-  adjust_space_factor();
-  main_f = cur_font;
-  bchar = font_bchar[main_f];
-  false_bchar = font_false_bchar[main_f];
-
-  if (mode > 0)
-    if (language != clang)
-      fix_language();
-
-  fast_get_avail(lig_stack);
-  font(lig_stack) = main_f;
-  cur_l = cur_chr;
-  character(lig_stack) = cur_l;
-  cur_q = tail;
-
-  if (cancel_boundary)
-  {
-    cancel_boundary = false;
-    main_k = non_address;
-  }
-  else
-    main_k = bchar_label[main_f];
-
-  if (main_k == non_address)
-    goto main_loop_move_2;
-
-  cur_r = cur_l;
-  cur_l = non_char;
-  goto main_lig_loop_1;
-
-main_loop_wrapup: 
-  wrapup(rt_hit);
-
-main_loop_move:
-  if (lig_stack == 0)
-    goto reswitch;
-
-  cur_q = tail;
-  cur_l = character(lig_stack);
-
-main_loop_move_1:
-  if (!is_char_node(lig_stack))
-    goto main_loop_move_lig;
-
-main_loop_move_2:
-  if ((cur_chr < font_bc[main_f]) || (cur_chr > font_ec[main_f]))
-  {
-    char_warning(main_f, cur_chr);
-    free_avail(lig_stack);
-    goto big_switch;
-  }
-
-  main_i = char_info(main_f, cur_l);
-
-  if (!char_exists(main_i))
-  {
-    char_warning(main_f, cur_chr);
-    free_avail(lig_stack);
-    goto big_switch; 
-  }
-
-  link(tail) = lig_stack;
-  tail = lig_stack;
-
-main_loop_lookahead:
-  get_next();
-
-  if (cur_cmd == letter)
-    goto main_loop_lookahead_1;
-
-  if (cur_cmd == other_char)
-    goto main_loop_lookahead_1;
-
-  if (cur_cmd == char_given)
-    goto main_loop_lookahead_1;
-
-  x_token();
-
-  if (cur_cmd == letter)
-    goto main_loop_lookahead_1;
-
-  if (cur_cmd == other_char)
-    goto main_loop_lookahead_1;
-
-  if (cur_cmd == char_given)
-    goto main_loop_lookahead_1;
-
-  if (cur_cmd == char_num)
-  {
-    scan_char_num();
-    cur_chr = cur_val;
-    goto main_loop_lookahead_1;
-  }
-
-  if (cur_cmd == no_boundary)
-    bchar = non_char;
-
-  cur_r = bchar;
-  lig_stack = 0;
-  goto main_lig_loop;
-
-main_loop_lookahead_1:
-  adjust_space_factor();
-  fast_get_avail(lig_stack);
-  font(lig_stack) = main_f;
-  cur_r = cur_chr;
-  character(lig_stack) = cur_r;
-
-  if (cur_r == false_bchar)
-    cur_r = non_char;
-
-main_lig_loop:
-  if (char_tag(main_i) != lig_tag)
-    goto main_loop_wrapup;
-
-  if (cur_r == non_char)
-    goto main_loop_wrapup;
-
-  main_k = lig_kern_start(main_f, main_i);
-  main_j = font_info[main_k].qqqq;
-
-  if (skip_byte(main_j) <= stop_flag)
-    goto main_lig_loop_2;
-
-  main_k = lig_kern_restart(main_f, main_j);
-
-main_lig_loop_1:
-  main_j = font_info[main_k].qqqq;
-
-main_lig_loop_2:
-  bSuppress = false;
-
-  if (suppress_f_ligs && next_char(main_j) == cur_r && op_byte(main_j) == no_tag)
-  {
-    if (cur_l == 'f')
-      bSuppress = true;
-  }
-
-  if (next_char(main_j) == cur_r && bSuppress == false)
-    if (skip_byte(main_j) <= stop_flag)
-    {
-      if (op_byte(main_j) >= kern_flag)
-      {
-        wrapup(rt_hit);
-        tail_append(new_kern(char_kern(main_f, main_j)));
-        goto main_loop_move;
-      }
-
-      if (cur_l == non_char)
-        lft_hit = true;
-      else if (lig_stack == 0)
-        rt_hit = true;
-
-      check_interrupt();
-
-      switch (op_byte(main_j))
-      {
-        case 1:
-        case 5:
-          {
-            cur_l = rem_byte(main_j);
-            main_i = char_info(main_f, cur_l);
-            ligature_present = true;
-          }
-          break;
-        case 2:
-        case 6:
-          {
-            cur_r = rem_byte(main_j);
-
-            if (lig_stack == 0)
-            {
-              lig_stack = new_lig_item(cur_r);
-              bchar = non_char;
-            }
-            else if (is_char_node(lig_stack))
-            {
-              main_p = lig_stack;
-              lig_stack = new_lig_item(cur_r);
-              lig_ptr(lig_stack) = main_p;
-            }
-            else
-              character(lig_stack) = cur_r;
-          }
-          break;
-        case 3:
-          {
-            cur_r = rem_byte(main_j);
-            main_p = lig_stack;
-            lig_stack = new_lig_item(cur_r);
-            link(lig_stack) = main_p;
-          }
-          break;
-        case 7:
-        case 11:
-          {
-            wrapup(false);
-            cur_q = tail;
-            cur_l = rem_byte(main_j);
-            main_i = char_info(main_f, cur_l);
-            ligature_present = true;
-          }
-          break;
-        default:
-          {
-            cur_l = rem_byte(main_j);
-            ligature_present = true;
-            if (lig_stack == 0)
-              goto main_loop_wrapup;
-            else
-              goto main_loop_move_1;
-          }
-          break;
-      }
-
-      if (op_byte(main_j) > 4)
-        if (op_byte(main_j) != 7)
-          goto main_loop_wrapup;
-
-      if (cur_l < non_char)
-        goto main_lig_loop;
-
-      main_k = bchar_label[main_f];
-      goto main_lig_loop_1;
-    }
-
-    if (skip_byte(main_j) == 0)
-      incr(main_k);
-    else
-    {
-      if (skip_byte(main_j) >= stop_flag)
-        goto main_loop_wrapup;
-
-      main_k = main_k + skip_byte(main_j) + 1;
-    }
-
-    goto main_lig_loop_1;
-
-main_loop_move_lig:
-  main_p = lig_ptr(lig_stack);
-
-  if (main_p != 0)
-    tail_append(main_p);
-
-  temp_ptr = lig_stack;
-  lig_stack = link(temp_ptr);
-  free_node(temp_ptr, small_node_size);
-  main_i = char_info(main_f, cur_l);
-  ligature_present = true;
-
-  if (lig_stack == 0)
-    if (main_p != 0)
-      goto main_loop_lookahead;
-    else
-      cur_r = bchar;
-  else
-    cur_r = character(lig_stack);
-
-  goto main_lig_loop;
-
-append_normal_space:
-  if (space_skip == 0)
-  {
-    {
-      main_p = font_glue[cur_font];
-
-      if (main_p == 0)
-      {
-        main_p = new_spec(zero_glue);
-        main_k = param_base[cur_font] + space_code;
-        width(main_p) = font_info[main_k].cint;
-        stretch(main_p) = font_info[main_k + 1].cint;
-        shrink(main_p) = font_info[main_k + 2].cint;
-        font_glue[cur_font] = main_p;
-      }
-    }
-
-    temp_ptr = new_glue(main_p);
-  }
-  else
-    temp_ptr = new_param_glue(space_skip_code);
-
-  link(tail) = temp_ptr;
-  tail = temp_ptr;
-
-  goto big_switch;
+/* Copyright 2014 Clerk Ma\r
+\r
+   This program is free software; you can redistribute it and/or modify\r
+   it under the terms of the GNU General Public License as published by\r
+   the Free Software Foundation; either version 2 of the License, or\r
+   (at your option) any later version.\r
+\r
+   This program is distributed in the hope that it will be useful, but\r
+   WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+   General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with this program; if not, write to the Free Software\r
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA\r
+   02110-1301 USA.  */\r
+\r
+#define EXTERN extern\r
+\r
+#include "yandytex.h"\r
+\r
+/* sec 1181 */\r
+void math_fraction (void)\r
+{\r
+  small_number c;\r
+\r
+  c = cur_chr;\r
+\r
+  if (incompleat_noad != 0)\r
+  {\r
+    if (c >= delimited_code)\r
+    {\r
+      scan_delimiter(garbage, false);\r
+      scan_delimiter(garbage, false);\r
+    }\r
+\r
+    if (c % delimited_code == 0)\r
+      scan_dimen(false, false, false);\r
+\r
+    print_err("Ambiguous; you need another { and }");\r
+    help3("I'm ignoring this fraction specification, since I don't",\r
+      "know whether a construction like `x \\over y \\over z'",\r
+      "means `{x \\over y} \\over z' or `x \\over {y \\over z}'.");\r
+    error();\r
+  }\r
+  else\r
+  {\r
+    incompleat_noad = get_node(fraction_noad_size);\r
+    type(incompleat_noad) = fraction_noad;\r
+    subtype(incompleat_noad) = normal;\r
+    math_type(numerator(incompleat_noad)) = sub_mlist;\r
+    info(numerator(incompleat_noad)) = link(head);\r
+    mem[denominator(incompleat_noad)].hh = empty_field;\r
+    mem[left_delimiter(incompleat_noad)].qqqq = null_delimiter;\r
+    mem[right_delimiter(incompleat_noad)].qqqq = null_delimiter;\r
+    link(head) = 0;\r
+    tail = head;\r
+\r
+    if (c >= delimited_code)\r
+    {\r
+      scan_delimiter(left_delimiter(incompleat_noad), false);\r
+      scan_delimiter(right_delimiter(incompleat_noad), false);\r
+    }\r
+\r
+    switch (c % delimited_code)\r
+    {\r
+      case above_code:\r
+        scan_dimen(false, false, false);\r
+        thickness(incompleat_noad) = cur_val;\r
+        break;\r
+\r
+      case over_code:\r
+        thickness(incompleat_noad) = default_code;\r
+        break;\r
+\r
+      case atop_code:\r
+        thickness(incompleat_noad) = 0;\r
+        break;\r
+    }\r
+  }\r
+}\r
+/* sec 1191 */\r
+void math_left_right (void)\r
+{\r
+  small_number t;\r
+  pointer p;\r
+\r
+  t = cur_chr;\r
+\r
+  if ((t == right_noad) && (cur_group != math_left_group))\r
+  {\r
+    if (cur_group == math_shift_group)\r
+    {\r
+      scan_delimiter(garbage, false);\r
+      print_err("Extra ");\r
+      print_esc("right");\r
+      help1("I'm ignoring a \\right that had no matching \\left.");\r
+      error();\r
+    }\r
+    else\r
+      off_save();\r
+  }\r
+  else\r
+  {\r
+    p = new_noad();\r
+    type(p) = t;\r
+    scan_delimiter(delimiter(p), false);\r
+\r
+    if (t == left_noad)\r
+    {\r
+      push_math(math_left_group);\r
+      link(tail) = p;\r
+      tail = p;\r
+    }\r
+    else\r
+    {\r
+      p = fin_mlist(p);\r
+      unsave();\r
+      tail_append(new_noad());\r
+      type(tail) = inner_noad;\r
+      math_type(nucleus(tail)) = sub_mlist;\r
+      info(nucleus(tail)) = p;\r
+    }\r
+  }\r
+}\r
+/* sec 1194 */\r
+void after_math (void)\r
+{\r
+  boolean l;\r
+  boolean danger;\r
+  integer m;\r
+  pointer p;\r
+  pointer a;\r
+  pointer b;\r
+  scaled w;\r
+  scaled z;\r
+  scaled e;\r
+  scaled q;\r
+  scaled d;\r
+  scaled s;\r
+  small_number g1, g2;\r
+  pointer r;\r
+  pointer t;\r
+\r
+  danger = false;\r
+  \r
+  if ((font_params[fam_fnt(2 + text_size)] < total_mathsy_params) ||\r
+    (font_params[fam_fnt(2 + script_size)] < total_mathsy_params) ||\r
+    (font_params[fam_fnt(2 + script_script_size)] < total_mathsy_params))\r
+  {\r
+    print_err("Math formula deleted: Insufficient symbol fonts");\r
+    help3("Sorry, but I can't typeset math unless \\textfont 2",\r
+        "and \\scriptfont 2 and \\scriptscriptfont 2 have all",\r
+        "the \\fontdimen values needed in math symbol fonts.");\r
+    error();\r
+    flush_math();\r
+    danger = true;\r
+  }\r
+  else if ((font_params[fam_fnt(3 + text_size)] < total_mathex_params) ||\r
+    (font_params[fam_fnt(3 + script_size)] < total_mathex_params) ||\r
+    (font_params[fam_fnt(3 + script_script_size)] < total_mathex_params))\r
+  {\r
+    print_err("Math formula deleted: Insufficient extension fonts");\r
+    help3("Sorry, but I can't typeset math unless \\textfont 3",\r
+        "and \\scriptfont 3 and \\scriptscriptfont 3 have all",\r
+        "the \\fontdimen values needed in math extension fonts.");\r
+    error();\r
+    flush_math();\r
+    danger = true;\r
+  }\r
+\r
+  m = mode;\r
+  l = false;\r
+  p = fin_mlist(0);\r
+\r
+  if (mode == -m)\r
+  {\r
+    {\r
+      get_x_token();\r
+\r
+      if (cur_cmd != math_shift)\r
+      {\r
+        print_err("Display math should end with $$");\r
+        help2("The `$' that I just saw supposedly matches a previous `$$'.",\r
+            "So I shall assume that you typed `$$' both times.");\r
+        back_error();\r
+      }\r
+    }\r
+\r
+    cur_mlist = p;\r
+    cur_style = text_style;\r
+    mlist_penalties = false;\r
+    mlist_to_hlist();\r
+    a = hpack(link(temp_head), 0, 1);\r
+    unsave();\r
+    decr(save_ptr);\r
+\r
+    if (saved(0) == 1)\r
+      l = true;\r
+\r
+    danger = false;\r
+\r
+    if ((font_params[fam_fnt(2 + text_size)] < total_mathsy_params) ||\r
+      (font_params[fam_fnt(2 + script_size)] < total_mathsy_params) ||\r
+      (font_params[fam_fnt(2 + script_script_size)] < total_mathsy_params))\r
+    {\r
+      print_err("Math formula deleted: Insufficient symbol fonts");\r
+      help3("Sorry, but I can't typeset math unless \\textfont 2",\r
+          "and \\scriptfont 2 and \\scriptscriptfont 2 have all",\r
+          "the \\fontdimen values needed in math symbol fonts.");\r
+      error();\r
+      flush_math();\r
+      danger = true;\r
+    }\r
+    else if ((font_params[fam_fnt(3 + text_size)] < total_mathex_params) ||\r
+      (font_params[fam_fnt(3 + script_size)] < total_mathex_params) ||\r
+      (font_params[fam_fnt(3 + script_script_size)] < total_mathex_params))\r
+    {\r
+      print_err("Math formula deleted: Insufficient extension fonts");\r
+      help3("Sorry, but I can't typeset math unless \\textfont 3",\r
+        "and \\scriptfont 3 and \\scriptscriptfont 3 have all",\r
+        "the \\fontdimen values needed in math extension fonts.");\r
+      error();\r
+      flush_math();\r
+      danger = true;\r
+    }\r
+\r
+    m = mode;\r
+    p = fin_mlist(0);\r
+  }\r
+  else\r
+    a = 0;\r
+\r
+  if (m < 0)\r
+  {\r
+    tail_append(new_math(math_surround, before));\r
+    cur_mlist = p;\r
+    cur_style = text_style;\r
+    mlist_penalties = (mode > 0);\r
+    mlist_to_hlist();\r
+    link(tail) = link(temp_head);\r
+\r
+    while (link(tail) != 0)\r
+      tail = link(tail);\r
+\r
+    tail_append(new_math(math_surround, after));\r
+    space_factor = 1000;\r
+    unsave();\r
+  }\r
+  else\r
+  {\r
+    if (a == 0)\r
+    {\r
+      get_x_token();\r
+\r
+      if (cur_cmd != math_shift)\r
+      {\r
+        print_err("Display math should end with $$");\r
+        help2("The `$' that I just saw supposedly matches a previous `$$'.",\r
+            "So I shall assume that you typed `$$' both times.");\r
+        back_error();\r
+      }\r
+    }\r
+\r
+    cur_mlist = p;\r
+    cur_style = display_style;\r
+    mlist_penalties = false;\r
+    mlist_to_hlist();\r
+    p = link(temp_head);\r
+    adjust_tail = adjust_head;\r
+    b = hpack(p, 0, 1);\r
+    p = list_ptr(b);\r
+    t = adjust_tail;\r
+    adjust_tail = 0;\r
+    w = width(b);\r
+    z = display_width;\r
+    s = display_indent;\r
+\r
+    if ((a == 0) || danger)\r
+    {\r
+      e = 0;\r
+      q = 0;\r
+    }\r
+    else\r
+    {\r
+      e = width(a);\r
+      q = e + math_quad(text_size);\r
+    }\r
+\r
+    if (w + q > z)\r
+    {\r
+      if ((e != 0) && ((w - total_shrink[normal] + q <= z) || (total_shrink[fil] != 0) ||\r
+        (total_shrink[fill] != 0) || (total_shrink[filll] != 0)))\r
+      {\r
+        free_node(b, box_node_size);\r
+        b = hpack(p, z - q, 0);\r
+      }\r
+      else\r
+      {\r
+        e = 0;\r
+\r
+        if (w > z)\r
+        {\r
+          free_node(b, box_node_size);\r
+          b = hpack(p, z, 0);\r
+        }\r
+      }\r
+      w = width(b);\r
+    }\r
+\r
+    d = half(z - w);\r
+\r
+    if ((e > 0) && (d < 2 * e))\r
+    {\r
+      d = half(z - w - e);\r
+\r
+      if (p != 0)\r
+        if (!is_char_node(p))\r
+          if (type(p) == glue_node)\r
+            d = 0;\r
+    }\r
+\r
+    tail_append(new_penalty(pre_display_penalty));\r
+\r
+    if ((d + s <= pre_display_size) || l)\r
+    {\r
+      g1 = above_display_skip_code;\r
+      g2 = below_display_skip_code;\r
+    }\r
+    else\r
+    {\r
+      g1 = above_display_short_skip_code;\r
+      g2 = below_display_short_skip_code;\r
+    }\r
+    if (l && (e == 0))\r
+    {\r
+      shift_amount(a) = s;\r
+      append_to_vlist(a);\r
+      tail_append(new_penalty(10000));\r
+    }\r
+    else\r
+    {\r
+      tail_append(new_param_glue(g1));\r
+    }\r
+\r
+    if (e != 0)\r
+    {\r
+      r = new_kern(z - w - e - d);\r
+\r
+      if (l)\r
+      {\r
+        link(a) = r;\r
+        link(r) = b;\r
+        b = a;\r
+        d = 0;\r
+      }\r
+      else\r
+      {\r
+        link(b) = r;\r
+        link(r) = a;\r
+      }\r
+      b = hpack(b, 0, 1);\r
+    }\r
+\r
+    shift_amount(b) = s + d;\r
+    append_to_vlist(b);\r
+\r
+    if ((a != 0) && (e == 0) && !l)\r
+    {\r
+      tail_append(new_penalty(10000));\r
+      shift_amount(a) = s + z - width(a);\r
+      append_to_vlist(a);\r
+      g2 = 0;\r
+    }\r
+\r
+    if (t != adjust_head)\r
+    {\r
+      link(tail) = link(adjust_head);\r
+      tail = t;\r
+    }\r
+\r
+    tail_append(new_penalty(post_display_penalty));\r
+\r
+    if (g2 > 0)\r
+    {\r
+      tail_append(new_param_glue(g2));\r
+    }\r
+\r
+    resume_after_display();\r
+  }\r
+}\r
+/* sec 1200 */\r
+void resume_after_display (void)\r
+{\r
+  if (cur_group != math_shift_group)\r
+  {\r
+    confusion("display");\r
+    return;\r
+  }\r
+\r
+  unsave();\r
+  prev_graf = prev_graf + 3;\r
+  push_nest();\r
+  mode = hmode;\r
+  space_factor = 1000;\r
+  set_cur_lang();\r
+  clang = cur_lang;\r
+  prev_graf =(norm_min(left_hyphen_min) * 64 + norm_min(right_hyphen_min)) * 65536L + cur_lang;\r
+\r
+  {\r
+    get_x_token();\r
+\r
+    if (cur_cmd != spacer)\r
+      back_input();\r
+  }\r
+\r
+  if (nest_ptr == 1)\r
+    build_page();\r
+}\r
+/* sec 1215 */\r
+void get_r_token (void)\r
+{\r
+restart:\r
+  do\r
+    {\r
+      get_token();\r
+    }\r
+  while (!(cur_tok != space_token));\r
+\r
+  if ((cur_cs == 0) || (cur_cs > frozen_control_sequence))\r
+  {\r
+    print_err("Missing control sequence inserted");\r
+    help5("Please don't say `\\def cs{...}', say `\\def\\cs{...}'.",\r
+      "I've inserted an inaccessible control sequence so that your",\r
+      "definition will be completed without mixing me up too badly.",\r
+      "You can recover graciously from this error, if you're",\r
+      "careful; see exercise 27.2 in The TeXbook.");\r
+\r
+    if (cur_cs == 0)\r
+      back_input();\r
+\r
+    cur_tok = cs_token_flag + frozen_protection;\r
+    ins_error();\r
+    goto restart;\r
+  }\r
+}\r
+/* sec 1229 */\r
+void trap_zero_glue (void)\r
+{\r
+  if ((width(cur_val) == 0) && (stretch(cur_val) == 0) && (shrink(cur_val) == 0))\r
+  {\r
+    add_glue_ref(zero_glue);\r
+    delete_glue_ref(cur_val);\r
+    cur_val = 0;\r
+  }\r
+}\r
+/* sec 1236 */\r
+void do_register_command (small_number a)\r
+{\r
+  pointer l, q, r, s;\r
+  char p;\r
+\r
+  q = cur_cmd;\r
+\r
+  {\r
+    if (q != tex_register)\r
+    {\r
+      get_x_token();\r
+\r
+      if ((cur_cmd >= assign_int) && (cur_cmd <= assign_mu_glue))\r
+      {\r
+        l = cur_chr;\r
+        p = cur_cmd - assign_int;\r
+        goto found;\r
+      }\r
+\r
+      if (cur_cmd != tex_register)\r
+      {\r
+        print_err("You can't use `");\r
+        print_cmd_chr(cur_cmd, cur_chr);\r
+        prints("' after ");\r
+        print_cmd_chr(q, 0);\r
+        help1("I'm forgetting what you said and not changing anything.");\r
+        error();\r
+        return;\r
+      }\r
+    }\r
+\r
+    p = cur_chr;\r
+    scan_eight_bit_int();\r
+\r
+    switch (p)\r
+    {\r
+      case int_val:\r
+        l = cur_val + count_base;\r
+        break;\r
+\r
+      case dimen_val:\r
+        l = cur_val + scaled_base;\r
+        break;\r
+\r
+      case glue_val:\r
+        l = cur_val + skip_base;\r
+        break;\r
+\r
+      case mu_val:\r
+        l = cur_val + mu_skip_base;\r
+        break;\r
+    }\r
+  }\r
+\r
+found:\r
+  if (q == tex_register)\r
+    scan_optional_equals();\r
+  else if (scan_keyword("by"))\r
+    do_nothing();\r
+\r
+  arith_error = false;\r
+\r
+  if (q < multiply)\r
+    if (p < glue_val)\r
+    {\r
+      if (p == int_val)\r
+        scan_int();\r
+      else\r
+        scan_dimen(false, false, false);\r
+\r
+      if (q == advance)\r
+        cur_val = cur_val + eqtb[l].cint;\r
+    }\r
+    else\r
+    {\r
+      scan_glue(p);\r
+\r
+      if (q == advance)\r
+      {\r
+        q = new_spec(cur_val);\r
+        r = equiv(l);\r
+        delete_glue_ref(cur_val);\r
+        width(q) = width(q) + width(r);\r
+\r
+        if (stretch(q) == 0)\r
+          stretch_order(q) = normal;\r
+\r
+        if (stretch_order(q) == stretch_order(r))\r
+          stretch(q) = stretch(q) + stretch(r);\r
+        else if ((stretch_order(q) < stretch_order(r)) && (stretch(r) != 0))\r
+        {\r
+          stretch(q) = stretch(r);\r
+          stretch_order(q) = stretch_order(r);\r
+        }\r
+\r
+        if (shrink(q) == 0)\r
+          shrink_order(q) = normal;\r
+\r
+        if (shrink_order(q) == shrink_order(r))\r
+          shrink(q) = shrink(q) + shrink(r);\r
+        else if ((shrink_order(q) < shrink_order(r)) && (shrink(r) != 0))\r
+        {\r
+          shrink(q) = shrink(r);\r
+          shrink_order(q) = shrink_order(r);\r
+        }\r
+        cur_val = q;\r
+      }\r
+    }\r
+  else\r
+  {\r
+    scan_int();\r
+\r
+    if (p < glue_val)\r
+      if (q == multiply)\r
+        if (p == int_val)\r
+          cur_val = mult_integers(eqtb[l].cint, cur_val);\r
+        else\r
+          cur_val = nx_plus_y(eqtb[l].cint, cur_val, 0);\r
+      else\r
+        cur_val = x_over_n(eqtb[l].cint, cur_val);\r
+    else\r
+    {\r
+      s = equiv(l);\r
+      r = new_spec(s);\r
+\r
+      if (q == multiply)\r
+      {\r
+        width(r) = nx_plus_y(width(s), cur_val, 0);\r
+        stretch(r) = nx_plus_y(stretch(s), cur_val, 0);\r
+        shrink(r) = nx_plus_y(shrink(s), cur_val, 0);\r
+      }\r
+      else\r
+      {\r
+        width(r) = x_over_n(width(s), cur_val);\r
+        stretch(r) = x_over_n(stretch(s), cur_val);\r
+        shrink(r) = x_over_n(shrink(s), cur_val);\r
+      }\r
+      cur_val = r;\r
+    }\r
+  }\r
+\r
+  if (arith_error)\r
+  {\r
+    print_err("Arithmetic overflow");\r
+    help2("I can't carry out that multiplication or division,",\r
+        "since the result is out of range.");\r
+\r
+    if (p >= glue_val)\r
+      delete_glue_ref(cur_val);\r
+\r
+    error();\r
+    return;\r
+  }\r
+\r
+  if (p < glue_val)\r
+    word_define(l, cur_val);\r
+  else\r
+  {\r
+    trap_zero_glue();\r
+    define(l, glue_ref, cur_val);\r
+  }\r
+}\r
+/* sec 1243 */\r
+void alter_aux (void)\r
+{\r
+  halfword c;\r
+\r
+  if (cur_chr != abs(mode))\r
+    report_illegal_case();\r
+  else\r
+  {\r
+    c = cur_chr;\r
+    scan_optional_equals();\r
+\r
+    if (c == vmode)\r
+    {\r
+      scan_dimen(false, false, false);\r
+      prev_depth = cur_val;\r
+    }\r
+    else\r
+    {\r
+      scan_int();\r
+\r
+      if ((cur_val <= 0) || (cur_val > 32767))\r
+      {\r
+        print_err("Bad space factor");\r
+        help1("I allow only values in the range 1..32767 here.");\r
+        int_error(cur_val);\r
+      }\r
+      else\r
+        space_factor = cur_val;\r
+    }\r
+  }\r
+}\r
+/* sec 1244 */\r
+void alter_prev_graf (void)\r
+{\r
+  integer p;\r
+\r
+  nest[nest_ptr] = cur_list;\r
+  p = nest_ptr;\r
+\r
+  while (abs(nest[p].mode_field) != vmode)\r
+    decr(p);\r
+\r
+  scan_optional_equals();\r
+  scan_int();\r
+\r
+  if (cur_val < 0)\r
+  {\r
+    print_err("Bad ");\r
+    print_esc("prevgraf");\r
+    help1("I allow only nonnegative values here.");\r
+    int_error(cur_val);\r
+  }\r
+  else\r
+  {\r
+    nest[p].pg_field = cur_val;\r
+    cur_list = nest[nest_ptr];\r
+  }\r
+}\r
+/* sec 1245 */\r
+void alter_page_so_far (void)\r
+{\r
+  char c;\r
+\r
+  c = cur_chr;\r
+  scan_optional_equals();\r
+  scan_dimen(false, false, false);\r
+  page_so_far[c] = cur_val;\r
+}\r
+/* sec 1246 */\r
+void alter_integer (void)\r
+{\r
+  char c;\r
+\r
+  c = cur_chr;\r
+  scan_optional_equals();\r
+  scan_int();\r
+\r
+  if (c == 0)\r
+    dead_cycles = cur_val;\r
+  else\r
+    insert_penalties = cur_val;\r
+}\r
+/* sec 1247 */\r
+void alter_box_dimen (void)\r
+{\r
+  small_number c;\r
+  eight_bits b;\r
+\r
+  c = cur_chr;\r
+  scan_eight_bit_int();\r
+  b = cur_val;\r
+  scan_optional_equals();\r
+  scan_dimen(false, false, false);\r
+\r
+  if (box(b) != 0)\r
+    mem[box(b) + c].cint = cur_val;\r
+}\r
+/* sec 1257 */\r
+void new_font (small_number a)\r
+{\r
+  pointer u;\r
+  scaled s;\r
+  internal_font_number f;\r
+  str_number t;\r
+  char old_setting;\r
+  str_number flushable_string;\r
+\r
+  if (job_name == 0)\r
+    open_log_file();\r
+\r
+  get_r_token();\r
+  u = cur_cs;\r
+\r
+  if (u >= hash_base)\r
+    t = text(u);\r
+  else if (u >= single_base)\r
+    if (u == null_cs)\r
+      t = 1213; /* FONT */\r
+    else\r
+      t = u - single_base;\r
+  else\r
+  {\r
+    old_setting = selector;\r
+    selector = new_string;\r
+    prints("FONT");\r
+    print(u - active_base);\r
+    selector = old_setting;\r
+    str_room(1);\r
+    t = make_string();\r
+  }\r
+\r
+  define(u, set_font, null_font);\r
+  scan_optional_equals();\r
+  scan_file_name();\r
+\r
+  name_in_progress = true;\r
+\r
+  if (scan_keyword("at"))\r
+  {\r
+    scan_dimen(false, false, false);\r
+    s = cur_val; \r
+\r
+    if ((s <= 0) || (s >= 134217728L)) /* 2^27 */\r
+    {\r
+      print_err("Improper `at' size (");\r
+      print_scaled(s);\r
+      prints("pt), replaced by 10pt");\r
+      help2("I can only handle fonts at positive sizes that are",\r
+        "less than 2048pt, so I've changed what you said to 10pt.");\r
+      error();\r
+      s = 10 * unity;\r
+    }\r
+  }\r
+  else if (scan_keyword("scaled"))\r
+  {\r
+    scan_int();\r
+    s = -cur_val;\r
+\r
+    if ((cur_val <= 0) || (cur_val > 32768L))\r
+    {\r
+      print_err("Illegal magnification has been changed to 1000");\r
+      help1("The magnification ratio must be between 1 and 32768.");\r
+      int_error(cur_val);\r
+      s = -1000;\r
+    }\r
+  }\r
+  else\r
+    s = -1000;\r
+\r
+  name_in_progress = false;\r
+\r
+  flushable_string = str_ptr - 1;\r
+\r
+  if (trace_flag)\r
+  {\r
+    int i, k1, k2, l1, l2;\r
+    char *sch = log_line;\r
+    k1 = str_start[cur_area];\r
+    k2 = str_start[cur_name];\r
+    l1 = length(cur_area);\r
+    l2 = length(cur_name);\r
+    wterm_cr();\r
+    puts("FONT ");\r
+\r
+    for (i = 0; i < l1; i++)\r
+    {\r
+      *sch++ = str_pool[i + k1];\r
+    }\r
+\r
+    for (i = 0; i < l2; i++)\r
+    {\r
+      *sch++ = str_pool[i + k2];\r
+    }\r
+\r
+    *sch++ = ' ';\r
+    *sch++ = '\0';\r
+    show_line(log_line, 0);\r
+  }\r
+\r
+  for (f = font_base + 1; f < font_ptr; f++)\r
+  {\r
+    if (str_eq_str(font_name[f], cur_name) && str_eq_str(font_area[f], cur_area))\r
+    {\r
+      if (cur_name == flushable_string)\r
+      {\r
+        flush_string();\r
+        cur_name = font_name[f];\r
+      }\r
+\r
+      if (s > 0)\r
+      {\r
+        if (s == font_size[f])\r
+        {\r
+          if (ignore_frozen == 0 || f > frozen_font_ptr)\r
+          {\r
+            if (trace_flag)\r
+              printf("SKIPPING %lld ", s);\r
+\r
+            goto common_ending;\r
+          }\r
+        }\r
+      }\r
+      else if (font_size[f] == xn_over_d(font_dsize[f], - (integer) s, 1000))\r
+      {\r
+        if (ignore_frozen == 0 || f > frozen_font_ptr)\r
+        {\r
+          if (trace_flag)\r
+            printf("SKIPPING %lld ", s);\r
+          goto common_ending;\r
+        }\r
+      }\r
+    }\r
+  }\r
+\r
+  if (trace_flag)\r
+    show_line("READING ", 0);\r
+\r
+  f = read_font_info(u, cur_name, cur_area, s); \r
+\r
+common_ending:\r
+  if (trace_flag)\r
+    printf("NEW FONT %lld ", f);\r
+\r
+  equiv(u) = f;\r
+  eqtb[font_id_base + f] = eqtb[u];\r
+  font_id_text(f) = t;\r
+}\r
+/* sec 1265 */\r
+void new_interaction (void)\r
+{\r
+  print_ln();\r
+  interaction = cur_chr;\r
+\r
+  if (interaction == batch_mode)\r
+    selector = no_print;\r
+  else\r
+    selector = term_only;\r
+\r
+  if (log_opened)\r
+    selector = selector + 2;\r
+}\r
+/* sec 1270 */\r
+void do_assignments (void)\r
+{\r
+  while (true)\r
+  {\r
+    do\r
+      {\r
+        get_x_token();\r
+      }\r
+    while (!((cur_cmd != spacer) && (cur_cmd != relax)));\r
+\r
+    if (cur_cmd <= max_non_prefixed_command)\r
+      return;\r
+\r
+    set_box_allowed = false;\r
+    prefixed_command();\r
+    set_box_allowed = true;\r
+  }\r
+}\r
+/* sec 1275 */\r
+void open_or_close_in (void)\r
+{\r
+  char c;\r
+  char n;\r
+\r
+  c = cur_chr;\r
+  scan_four_bit_int();\r
+  n = cur_val;\r
+\r
+  if (read_open[n] != closed)\r
+  {\r
+    a_close(read_file[n]);\r
+    read_open[n] = closed;\r
+  }\r
+\r
+  if (c != 0)\r
+  {\r
+    scan_optional_equals();\r
+    scan_file_name();\r
+    pack_file_name(cur_name, cur_area, cur_ext);\r
+\r
+    if ((cur_ext != 335) && a_open_in(read_file[n], kpse_tex_format))\r
+      read_open[n] = 1;\r
+    else if ((cur_ext != 785) && (name_length + 5 < file_name_size))\r
+    {\r
+      strncpy((char *) name_of_file + name_length + 1, ".tex ", 5);\r
+      name_length = name_length + 4;\r
+\r
+      if (a_open_in(read_file[n], kpse_tex_format))\r
+        read_open[n] = just_open;\r
+      else\r
+      {\r
+        name_length = name_length - 4;\r
+        name_of_file[name_length + 1] = ' ';\r
+\r
+        if ((cur_ext == 335) && a_open_in(read_file[n], kpse_tex_format))\r
+          read_open[n] = just_open;\r
+      }\r
+    }\r
+  }\r
+}\r
+/* sec 1279 */\r
+void issue_message (void)\r
+{\r
+  char old_setting;\r
+  char c;\r
+  str_number s;\r
+\r
+  c = cur_chr;\r
+  link(garbage) = scan_toks(false, true);\r
+  old_setting = selector;\r
+  selector = new_string;\r
+  token_show(def_ref);\r
+  selector = old_setting;\r
+  flush_list(def_ref);\r
+  str_room(1);\r
+  s = make_string();\r
+\r
+  if (c == 0)\r
+  {\r
+    if (term_offset + length(s) > max_print_line - 2)\r
+      print_ln();\r
+    else if ((term_offset > 0) || (file_offset > 0))\r
+      print_char(' ');\r
+\r
+    slow_print(s);\r
+    update_terminal();\r
+  }\r
+  else\r
+  {\r
+    print_err("");\r
+    slow_print(s);\r
+\r
+    if (err_help != 0)\r
+      use_err_help = true;\r
+    else if (long_help_seen)\r
+      help1("(That was another \\errmessage.)");\r
+    else\r
+    {\r
+      if (interaction < error_stop_mode)\r
+        long_help_seen = true;\r
+\r
+      help4("This error message was generated by an \\errmessage",\r
+        "command, so I can't give any explicit help.",\r
+        "Pretend that you're Hercule Poirot: Examine all clues,",\r
+        "and deduce the truth by order and method.");\r
+    }\r
+\r
+    error();\r
+    use_err_help = false;\r
+  }\r
+\r
+  flush_string();\r
+}\r
+/* sec 1288 */\r
+void shift_case (void)\r
+{\r
+  pointer b;\r
+  pointer p;\r
+  halfword t;\r
+  eight_bits c;\r
+\r
+  b = cur_chr;\r
+  p = scan_toks(false, false);\r
+  p = link(def_ref);\r
+\r
+  while (p != 0)\r
+  {\r
+    t = info(p); \r
+\r
+    if (t < cs_token_flag + single_base)\r
+    {\r
+      c = t % 256;\r
+\r
+      if (equiv(b + c) != 0)\r
+        info(p) = t - c + equiv(b + c);\r
+    }\r
+\r
+    p = link(p);\r
+  }\r
+\r
+  begin_token_list(link(def_ref), 3);\r
+  free_avail(def_ref);\r
+}\r
+/* sec 1293 */\r
+void show_whatever (void)\r
+{\r
+  pointer p;\r
+\r
+  switch (cur_chr)\r
+  {\r
+    case show_lists:\r
+      {\r
+        begin_diagnostic();\r
+        show_activities();\r
+      }\r
+      break;\r
+\r
+    case show_box_code:\r
+      {\r
+        scan_eight_bit_int();\r
+        begin_diagnostic();\r
+        print_nl("> \\box");\r
+        print_int(cur_val);\r
+        print_char('=');\r
+\r
+        if (box(cur_val) == 0)\r
+          prints("void");\r
+        else\r
+          show_box(box(cur_val));\r
+      }\r
+      break;\r
+\r
+    case show_code:\r
+      {\r
+        get_token();\r
+\r
+        if (interaction == error_stop_mode)\r
+          do_nothing();\r
+\r
+        print_nl("> ");\r
+\r
+        if (cur_cs != 0)\r
+        {\r
+          sprint_cs(cur_cs);\r
+          print_char('=');\r
+        }\r
+\r
+        print_meaning();\r
+        goto common_ending;\r
+      }\r
+      break;\r
+\r
+    default:\r
+      {\r
+        p = the_toks();\r
+\r
+        if (interaction == error_stop_mode)\r
+          do_nothing();\r
+\r
+        print_nl("> ");\r
+        token_show(temp_head);\r
+        flush_list(link(temp_head));\r
+        goto common_ending;\r
+      }\r
+      break;\r
+  }\r
+\r
+  end_diagnostic(true);\r
+  print_err("OK");\r
+\r
+  if (selector == term_and_log)\r
+    if (tracing_online <= 0)\r
+    {\r
+      selector = term_only;\r
+      prints(" (see the transcript file)");\r
+      selector = term_and_log;\r
+    }\r
+\r
+common_ending:\r
+\r
+  if (interaction < error_stop_mode)\r
+  {\r
+    help_ptr = 0;\r
+    decr(error_count);\r
+  }\r
+  else if (tracing_online > 0)\r
+  {\r
+    help3("This isn't an error message; I'm just \\showing something.",\r
+      "Type `I\\show...' to show more (e.g., \\show\\cs,",\r
+      "\\showthe\\count10, \\showbox255, \\showlists).");\r
+  }\r
+  else\r
+  {\r
+    help5("This isn't an error message; I'm just \\showing something.",\r
+      "Type `I\\show...' to show more (e.g., \\show\\cs,",\r
+      "\\showthe\\count10, \\showbox255, \\showlists).",\r
+      "And type `I\\tracingonline=1\\show...' to show boxes and",\r
+      "lists on your terminal as well as in the transcript file.");\r
+  }\r
+\r
+  error();\r
+}\r
+/* sec 1349 */\r
+void new_whatsit_(small_number s, small_number w)\r
+{\r
+  pointer p;\r
+\r
+  p = get_node(w);\r
+  type(p) = whatsit_node;\r
+  subtype(p) = s;\r
+  link(tail) = p;\r
+  tail = p;\r
+}\r
+/* sec 1350 */\r
+void new_write_whatsit (small_number w)\r
+{\r
+  new_whatsit(cur_chr, w);\r
+\r
+  if (w != write_node_size)\r
+    scan_four_bit_int();\r
+  else\r
+  {\r
+    scan_int();\r
+\r
+    if (cur_val < 0)\r
+      cur_val = 17;\r
+    else if (cur_val > 15)\r
+      cur_val = 16;\r
+  }\r
+\r
+  write_stream(tail) = cur_val;\r
+}\r
+/* sec 1348 */\r
+void do_extension (void)\r
+{\r
+  integer k;\r
+  pointer p;\r
+\r
+  switch (cur_chr)\r
+  {\r
+    case open_node:\r
+      {\r
+        new_write_whatsit(open_node_size);\r
+        scan_optional_equals();\r
+        scan_file_name();\r
+        open_name(tail) = cur_name;\r
+        open_area(tail) = cur_area;\r
+        open_ext(tail) = cur_ext;\r
+      }\r
+      break;\r
+\r
+    case write_node:\r
+      {\r
+        k = cur_cs;\r
+        new_write_whatsit(write_node_size);\r
+        cur_cs = k;\r
+        p = scan_toks(false, false);\r
+        write_tokens(tail) = def_ref;\r
+      }\r
+      break;\r
+\r
+    case close_node:\r
+      {\r
+        new_write_whatsit(write_node_size);\r
+        write_tokens(tail) = 0;\r
+      }\r
+      break;\r
+\r
+    case special_node:\r
+      {\r
+        new_whatsit(special_node, write_node_size);\r
+        write_stream(tail) = 0;\r
+        p = scan_toks(false, true);\r
+        write_tokens(tail) = def_ref;\r
+      }\r
+      break;\r
+\r
+    case immediate_code:\r
+      {\r
+        get_x_token();\r
+\r
+        if ((cur_cmd == extension) && (cur_chr <= close_node))\r
+        {\r
+          p = tail;\r
+          do_extension();\r
+          out_what(tail);\r
+          flush_node_list(tail);\r
+          tail = p;\r
+          link(p) = 0;\r
+        }\r
+        else\r
+          back_input();\r
+      }\r
+      break;\r
+\r
+    case set_language_code:\r
+      if (abs(mode) != hmode)\r
+      {\r
+        report_illegal_case();\r
+      }\r
+      else\r
+      {\r
+        new_whatsit(language_node, small_node_size);\r
+        scan_int();\r
+\r
+        if (cur_val <= 0)\r
+          clang = 0;\r
+        else if (cur_val > 255)\r
+          clang = 0;\r
+        else\r
+          clang = cur_val;\r
+\r
+        what_lang(tail) = clang;\r
+        what_lhm(tail) = norm_min(left_hyphen_min);\r
+        what_rhm(tail) = norm_min(right_hyphen_min);\r
+      }\r
+      break;\r
+\r
+    default:\r
+      {\r
+        confusion("ext1");\r
+        return;\r
+      }\r
+      break;\r
+  }\r
+}\r
+/* sec 1376 */\r
+void fix_language (void)\r
+{\r
+  /* ASCII_code l; */\r
+  int l;\r
+\r
+  if (language <= 0)\r
+    l = 0; \r
+  else if (language > 255)\r
+    l = 0;\r
+  else\r
+    l = language;\r
+\r
+  if (l != clang)\r
+  {\r
+    new_whatsit(language_node, small_node_size);\r
+    what_lang(tail) = l;\r
+    clang = l;\r
+    what_lhm(tail) = norm_min(left_hyphen_min);\r
+    what_rhm(tail) = norm_min(right_hyphen_min);\r
+  }\r
+}\r
+/* sec 1068 */\r
+void handle_right_brace (void)\r
+{\r
+  pointer p, q;\r
+  scaled d;\r
+  integer f;\r
+\r
+  switch (cur_group)\r
+  {\r
+    case simple_group:\r
+      unsave();\r
+      break;\r
+\r
+    case bottom_level:\r
+      {\r
+        print_err("Too many }'s");\r
+        help2("You've closed more groups than you opened.",\r
+          "Such booboos are generally harmless, so keep going.");\r
+        error();\r
+      }\r
+      break;\r
+\r
+    case semi_simple_group:\r
+    case math_shift_group:\r
+    case math_left_group:\r
+      extra_right_brace();\r
+      break;\r
+\r
+    case hbox_group:\r
+      package(0);\r
+      break;\r
+\r
+    case adjust_hbox_group:\r
+      {\r
+        adjust_tail = adjust_head;\r
+        package(0);\r
+      }\r
+      break;\r
+\r
+    case vbox_group:\r
+      {\r
+        end_graf();\r
+        package(0);\r
+      }\r
+      break;\r
+\r
+    case vtop_group:\r
+      {\r
+        end_graf();\r
+        package(vtop_code);\r
+      }\r
+      break;\r
+\r
+    case insert_group:\r
+      {\r
+        end_graf();\r
+        q = split_top_skip;\r
+        add_glue_ref(q);\r
+        d = split_max_depth;\r
+        f = floating_penalty;\r
+        unsave();\r
+        decr(save_ptr);\r
+        p = vpackage(link(head), 0, 1, max_dimen);\r
+        pop_nest();\r
+\r
+        if (saved(0) < 255)\r
+        {\r
+          tail_append(get_node(ins_node_size));\r
+          type(tail) = ins_node;\r
+          subtype(tail) = saved(0);\r
+          height(tail) = height(p) + depth(p);\r
+          ins_ptr(tail) = list_ptr(p);\r
+          split_top_ptr(tail) = q;\r
+          depth(tail) = d;\r
+          float_cost(tail) = f;\r
+        }\r
+        else\r
+        {\r
+          tail_append(get_node(small_node_size));\r
+          type(tail) = adjust_node;\r
+          subtype(tail) = 0;\r
+          adjust_ptr(tail) = list_ptr(p);\r
+          delete_glue_ref(q);\r
+        }\r
+        free_node(p, box_node_size);\r
+\r
+        if (nest_ptr == 0)\r
+          build_page();\r
+      }\r
+      break;\r
+\r
+    case output_group:\r
+      {\r
+        if ((loc != 0) || ((token_type != output_text) && (token_type != backed_up)))\r
+        {\r
+          print_err("Unbalanced output routine");\r
+          help2("Your sneaky output routine has problematic {'s and/or }'s.",\r
+            "I can't handle that very well; good luck.");\r
+          error();\r
+\r
+          do\r
+            {\r
+              get_token();\r
+            }\r
+          while (!(loc == 0));\r
+        }\r
+\r
+        end_token_list();\r
+        end_graf();\r
+        unsave();\r
+        output_active = false;\r
+        insert_penalties = 0;\r
+\r
+        if (box(255) != 0)\r
+        {\r
+          print_err("Output routine didn't use all of ");\r
+          print_esc("box");\r
+          print_int(255);\r
+          help3("Your \\output commands should empty \\box255,",\r
+            "e.g., by saying `\\shipout\\box255'.",\r
+            "Proceed; I'll discard its present contents.");\r
+          box_error(255);\r
+        }\r
+\r
+        if (tail != head)\r
+        {\r
+          link(page_tail) = link(head);\r
+          page_tail = tail;\r
+        }\r
+\r
+        if (link(page_head) != 0)\r
+        {\r
+          if (link(contrib_head) == 0)\r
+            nest[0].tail_field = page_tail;\r
+\r
+          link(page_tail) = link(contrib_head);\r
+          link(contrib_head) = link(page_head);\r
+          link(page_head) = 0;\r
+          page_tail = page_head;\r
+        }\r
+\r
+        pop_nest();\r
+        build_page();\r
+      }\r
+      break;\r
+\r
+    case disc_group:\r
+      build_discretionary();\r
+      break;\r
+\r
+    case align_group:\r
+      {\r
+        back_input();\r
+        cur_tok = cs_token_flag + frozen_cr;\r
+        print_err("Missing ");\r
+        print_esc("cr");\r
+        prints("inserted");\r
+        help1("I'm guessing that you meant to end an alignment here.");\r
+        ins_error();\r
+      }\r
+      break;\r
+\r
+    case no_align_group:\r
+      {\r
+        end_graf();\r
+        unsave();\r
+        align_peek();\r
+      }\r
+      break;\r
+\r
+    case vcenter_group:\r
+      {\r
+        end_graf();\r
+        unsave();\r
+        save_ptr = save_ptr - 2;\r
+        p = vpackage(link(head), saved(1), saved(0), max_dimen);\r
+        pop_nest();\r
+        tail_append(new_noad());\r
+        type(tail) = vcenter_noad;\r
+        math_type(nucleus(tail)) = sub_box;\r
+        info(nucleus(tail)) = p;\r
+      }\r
+      break;\r
+\r
+    case math_choice_group:\r
+      build_choices();\r
+      break;\r
+\r
+    case math_group:\r
+      {\r
+        unsave();\r
+        decr(save_ptr);\r
+        math_type(saved(0)) = sub_mlist;\r
+        p = fin_mlist(0);\r
+        info(saved(0)) = p;\r
+\r
+        if (p != 0)\r
+          if (link(p) == 0)\r
+            if (type(p) == ord_noad)\r
+            {\r
+              if (math_type(subscr(p)) == 0)\r
+                if (math_type(supscr(p)) == 0)\r
+                {\r
+                  mem[saved(0)].hh = mem[nucleus(p)].hh;\r
+                  free_node(p, noad_size);\r
+                }\r
+            }\r
+            else if (type(p) == accent_noad)\r
+              if (saved(0) == nucleus(tail))\r
+                if (type(tail) == ord_noad)\r
+                {\r
+                  q = head;\r
+\r
+                  while (link(q) != tail)\r
+                    q = link(q);\r
+\r
+                  link(q) = p;\r
+                  free_node(tail, noad_size);\r
+                  tail = p;\r
+                }\r
+      }\r
+      break;\r
+    default:\r
+      {\r
+        confusion("rightbrace");\r
+        return;\r
+      }\r
+      break;\r
+  }\r
+}\r
+/* sec 1030 */\r
+void main_control (void) \r
+{\r
+  integer t;\r
+  boolean bSuppress;\r
+\r
+  if (every_job != 0)\r
+    begin_token_list(every_job, every_job_text);\r
+\r
+big_switch:\r
+  get_x_token();\r
+\r
+reswitch:\r
+  if (interrupt != 0)\r
+    if (OK_to_interrupt)\r
+    {\r
+      back_input();\r
+      check_interrupt();\r
+      goto big_switch;\r
+    }\r
+\r
+#ifdef DEBUG\r
+  if (panicking)\r
+    check_mem(false);\r
+#endif\r
+\r
+  if (tracing_commands > 0)\r
+    show_cur_cmd_chr();\r
+\r
+  switch (abs(mode) + cur_cmd)\r
+  {\r
+    case hmode + letter:\r
+    case hmode + other_char:\r
+    case hmode + char_given:\r
+      goto main_loop;\r
+      break;\r
+\r
+    case hmode + char_num:\r
+      {\r
+        scan_char_num();\r
+        cur_chr = cur_val;\r
+        goto main_loop;\r
+      }\r
+      break;\r
+\r
+    case hmode + no_boundary:\r
+      {\r
+        get_x_token();\r
+\r
+        if ((cur_cmd == letter) || (cur_cmd == other_char) ||\r
+          (cur_cmd == char_given) || (cur_cmd == char_num))\r
+          cancel_boundary = true;\r
+        goto reswitch;\r
+      }\r
+      break;\r
+\r
+    case hmode + spacer:\r
+      if (space_factor == 1000)\r
+        goto append_normal_space;\r
+      else\r
+        app_space();\r
+      break;\r
+\r
+    case hmode + ex_space:\r
+    case mmode + ex_space:\r
+      goto append_normal_space;\r
+      break;\r
+\r
+    case any_mode(relax):\r
+    case vmode + spacer:\r
+    case mmode + spacer:\r
+    case mmode + no_boundary:\r
+      do_nothing();\r
+      break;\r
+\r
+    case any_mode(ignore_spaces):\r
+      {\r
+        do\r
+          {\r
+            get_x_token();\r
+          }\r
+        while (!(cur_cmd != spacer));\r
+        goto reswitch;\r
+      }\r
+      break;\r
+\r
+    case vmode + stop:\r
+      if (its_all_over())\r
+        return;\r
+      break;\r
+\r
+    case vmode + vmove:\r
+    case hmode + hmove:\r
+    case mmode + hmove:\r
+    case any_mode(last_item):\r
+    case vmode + vadjust:\r
+    case vmode + ital_corr:\r
+    case non_math(eq_no):\r
+    case any_mode(mac_param):\r
+      report_illegal_case();\r
+      break;\r
+\r
+    case non_math(sup_mark):\r
+    case non_math(sub_mark):\r
+    case non_math(math_char_num):\r
+    case non_math(math_given):\r
+    case non_math(math_comp):\r
+    case non_math(delim_num):\r
+    case non_math(left_right):\r
+    case non_math(above):\r
+    case non_math(radical):\r
+    case non_math(math_style):\r
+    case non_math(math_choice):\r
+    case non_math(vcenter):\r
+    case non_math(non_script):\r
+    case non_math(mkern):\r
+    case non_math(limit_switch):\r
+    case non_math(mskip):\r
+    case non_math(math_accent):\r
+    case mmode + endv:\r
+    case mmode + par_end:\r
+    case mmode + stop:\r
+    case mmode + vskip:\r
+    case mmode + un_vbox:\r
+    case mmode + valign:\r
+    case mmode + hrule:\r
+      insert_dollar_sign();\r
+      break;\r
+\r
+    case vmode + hrule:\r
+    case hmode + vrule:\r
+    case mmode + vrule:\r
+      {\r
+        tail_append(scan_rule_spec());\r
+\r
+        if (abs(mode) == vmode)\r
+          prev_depth = ignore_depth;\r
+        else if (abs(mode) == hmode)\r
+          space_factor = 1000;\r
+      }\r
+      break;\r
+\r
+    case vmode + vskip:\r
+    case hmode + hskip:\r
+    case mmode + hskip:\r
+    case mmode + mskip:\r
+      append_glue();\r
+      break;\r
+\r
+    case any_mode(kern):\r
+    case mmode + mkern:\r
+      append_kern();\r
+      break;\r
+\r
+    case non_math(left_brace):\r
+      new_save_level(simple_group);\r
+      break;\r
+\r
+    case any_mode(begin_group):\r
+      new_save_level(semi_simple_group);\r
+      break;\r
+\r
+    case any_mode(end_group):\r
+      if (cur_group == semi_simple_group)\r
+        unsave();\r
+      else\r
+        off_save();\r
+      break;\r
+\r
+    case any_mode(right_brace):\r
+      handle_right_brace();\r
+      break;\r
+\r
+    case vmode + hmove:\r
+    case hmode + vmove:\r
+    case mmode + vmove:\r
+      {\r
+        t = cur_chr;\r
+        scan_dimen(false, false, false);\r
+\r
+        if (t == 0)\r
+          scan_box(cur_val);\r
+        else\r
+          scan_box(- (integer) cur_val);\r
+      }\r
+      break;\r
+\r
+    case any_mode(leader_ship):\r
+      scan_box(leader_flag - a_leaders + cur_chr);\r
+      break;\r
+\r
+    case any_mode(make_box):\r
+      begin_box(0);\r
+      break;\r
+\r
+    case vmode + start_par:\r
+      new_graf(cur_chr > 0);\r
+      break;\r
+\r
+    case vmode + letter:\r
+    case vmode + other_char:\r
+    case vmode + char_num:\r
+    case vmode + char_given:\r
+    case vmode + math_shift:\r
+    case vmode + un_hbox:\r
+    case vmode + vrule:\r
+    case vmode + accent:\r
+    case vmode + discretionary:\r
+    case vmode + hskip:\r
+    case vmode + valign:\r
+    case vmode + ex_space:\r
+    case vmode + no_boundary:\r
+      {\r
+        back_input();\r
+        new_graf(true);\r
+      }\r
+      break;\r
+\r
+    case hmode + start_par:\r
+    case mmode + start_par:\r
+      indent_in_hmode();\r
+      break;\r
+\r
+    case vmode + par_end:\r
+      {\r
+        normal_paragraph();\r
+\r
+        if (mode > 0)\r
+          build_page();\r
+      }\r
+      break;\r
+\r
+    case hmode + par_end:\r
+      {\r
+        if (align_state < 0)\r
+          off_save();\r
+\r
+        end_graf();\r
+\r
+        if (mode == 1)\r
+          build_page();\r
+      }\r
+      break;\r
+\r
+    case hmode + stop:\r
+    case hmode + vskip:\r
+    case hmode + hrule:\r
+    case hmode + un_vbox:\r
+    case hmode + halign:\r
+      head_for_vmode();\r
+      break;\r
+\r
+    case any_mode(insert):\r
+    case hmode + vadjust:\r
+    case mmode + vadjust:\r
+      begin_insert_or_adjust();\r
+      break;\r
+\r
+    case any_mode(mark):\r
+      make_mark();\r
+      break;\r
+\r
+    case any_mode(break_penalty):\r
+      append_penalty();\r
+      break;\r
+\r
+    case any_mode(remove_item):\r
+      delete_last();\r
+      break;\r
+\r
+    case vmode + un_vbox:\r
+    case hmode + un_hbox:\r
+    case mmode + un_hbox:\r
+      unpackage();\r
+      break;\r
+\r
+    case hmode + ital_corr:\r
+      append_italic_correction();\r
+      break;\r
+\r
+    case mmode + ital_corr:\r
+      tail_append(new_kern(0));\r
+      break;\r
+\r
+    case hmode + discretionary:\r
+    case mmode + discretionary:\r
+      append_discretionary();\r
+      break;\r
+\r
+    case hmode + accent:\r
+      make_accent();\r
+      break;\r
+\r
+    case any_mode(car_ret):\r
+    case any_mode(tab_mark):\r
+      align_error();\r
+      break;\r
+\r
+    case any_mode(no_align):\r
+      noalign_error();\r
+      break;\r
+\r
+    case any_mode(omit):\r
+      omit_error();\r
+      break;\r
+\r
+    case vmode + halign:\r
+    case hmode + valign:\r
+      init_align();\r
+      break;\r
+\r
+    case mmode + halign:\r
+      if (privileged ())\r
+        if (cur_group == math_shift_group)\r
+          init_align();\r
+        else\r
+          off_save();\r
+      break;\r
+\r
+    case vmode + endv:\r
+    case hmode + endv:\r
+      do_endv();\r
+      break;\r
+\r
+    case any_mode(end_cs_name):\r
+      cs_error();\r
+      break;\r
+\r
+    case hmode + math_shift:\r
+      init_math();\r
+      break;\r
+\r
+    case mmode + eq_no:\r
+      if (privileged ())\r
+        if (cur_group == math_shift_group)\r
+          start_eq_no();\r
+        else\r
+          off_save();\r
+      break;\r
+\r
+    case mmode + left_brace:\r
+      {\r
+        tail_append(new_noad());\r
+        back_input();\r
+        scan_math(nucleus(tail));\r
+      }\r
+      break;\r
+\r
+    case mmode + letter:\r
+    case mmode + other_char:\r
+    case mmode + char_given:\r
+      set_math_char(math_code(cur_chr));\r
+      break;\r
+\r
+    case mmode + char_num:\r
+      {\r
+        scan_char_num();\r
+        cur_chr = cur_val;\r
+        set_math_char(math_code(cur_chr));\r
+      }\r
+      break;\r
+\r
+    case mmode + math_char_num:\r
+      {\r
+        scan_fifteen_bit_int();\r
+        set_math_char(cur_val);\r
+      }\r
+      break;\r
+\r
+    case mmode + math_given:\r
+      set_math_char(cur_chr);\r
+      break;\r
+\r
+    case mmode + delim_num:\r
+      {\r
+        scan_twenty_seven_bit_int();\r
+        set_math_char(cur_val / 4096);\r
+      }\r
+      break;\r
+\r
+    case mmode + math_comp:\r
+      {\r
+        tail_append(new_noad());\r
+        type(tail) = cur_chr;\r
+        scan_math(nucleus(tail));\r
+      }\r
+      break;\r
+\r
+    case mmode + limit_switch:\r
+      math_limit_switch();\r
+      break;\r
+\r
+    case mmode + radical:\r
+      math_radical();\r
+      break;\r
+\r
+    case mmode + accent:\r
+    case mmode + math_accent:\r
+      math_ac();\r
+      break;\r
+\r
+    case mmode + vcenter:\r
+      {\r
+        scan_spec(vcenter_group, false);\r
+        normal_paragraph();\r
+        push_nest();\r
+        mode = -1;\r
+        prev_depth = ignore_depth;\r
+\r
+        if (every_vbox != 0)\r
+          begin_token_list(every_vbox, every_vbox_text);\r
+      }\r
+      break;\r
+\r
+    case mmode + math_style:\r
+      tail_append(new_style(cur_chr));\r
+      break;\r
+\r
+    case mmode + non_script:\r
+      {\r
+        tail_append(new_glue(zero_glue));\r
+        subtype(tail) = cond_math_glue;\r
+      }\r
+      break;\r
+\r
+    case mmode + math_choice:\r
+      append_choices();\r
+      break;\r
+\r
+    case mmode + sub_mark:\r
+    case mmode + sup_mark:\r
+      sub_sup();\r
+      break;\r
+\r
+    case mmode + above:\r
+      math_fraction();\r
+      break;\r
+\r
+    case mmode + left_right:\r
+      math_left_right();\r
+      break;\r
+\r
+    case mmode + math_shift:\r
+      if (cur_group == math_shift_group)\r
+        after_math();\r
+      else\r
+        off_save();\r
+      break;\r
+\r
+    case any_mode(toks_register):\r
+    case any_mode(assign_toks):\r
+    case any_mode(assign_int):\r
+    case any_mode(assign_dimen):\r
+    case any_mode(assign_glue):\r
+    case any_mode(assign_mu_glue):\r
+    case any_mode(assign_font_dimen):\r
+    case any_mode(assign_font_int):\r
+    case any_mode(set_aux):\r
+    case any_mode(set_prev_graf):\r
+    case any_mode(set_page_dimen):\r
+    case any_mode(set_page_int):\r
+    case any_mode(set_box_dimen):\r
+    case any_mode(set_shape):\r
+    case any_mode(def_code):\r
+    case any_mode(def_family):\r
+    case any_mode(set_font):\r
+    case any_mode(def_font):\r
+    case any_mode(tex_register):\r
+    case any_mode(advance):\r
+    case any_mode(multiply):\r
+    case any_mode(divide):\r
+    case any_mode(prefix):\r
+    case any_mode(let):\r
+    case any_mode(shorthand_def):\r
+    case any_mode(read_to_cs):\r
+    case any_mode(def):\r
+    case any_mode(set_box):\r
+    case any_mode(hyph_data):\r
+    case any_mode(set_interaction):\r
+      prefixed_command();\r
+      break;\r
+\r
+    case any_mode(after_assignment):\r
+      {\r
+        get_token();\r
+        after_token = cur_tok;\r
+      }\r
+      break;\r
+\r
+    case any_mode(after_group):\r
+      {\r
+        get_token();\r
+        save_for_after(cur_tok);\r
+      }\r
+      break;\r
+\r
+    case any_mode(in_stream):\r
+      open_or_close_in();\r
+      break;\r
+\r
+    case any_mode(message):\r
+      issue_message();\r
+      break;\r
+\r
+    case any_mode(case_shift):\r
+      shift_case();\r
+      break;\r
+\r
+    case any_mode(xray):\r
+      show_whatever();\r
+      break;\r
+\r
+    case any_mode(extension):\r
+      do_extension();\r
+      break;\r
+  }\r
+\r
+  goto big_switch;\r
+\r
+main_loop:\r
+  adjust_space_factor();\r
+  main_f = cur_font;\r
+  bchar = font_bchar[main_f];\r
+  false_bchar = font_false_bchar[main_f];\r
+\r
+  if (mode > 0)\r
+    if (language != clang)\r
+      fix_language();\r
+\r
+  fast_get_avail(lig_stack);\r
+  font(lig_stack) = main_f;\r
+  cur_l = cur_chr;\r
+  character(lig_stack) = cur_l;\r
+  cur_q = tail;\r
+\r
+  if (cancel_boundary)\r
+  {\r
+    cancel_boundary = false;\r
+    main_k = non_address;\r
+  }\r
+  else\r
+    main_k = bchar_label[main_f];\r
+\r
+  if (main_k == non_address)\r
+    goto main_loop_move_2;\r
+\r
+  cur_r = cur_l;\r
+  cur_l = non_char;\r
+  goto main_lig_loop_1;\r
+\r
+main_loop_wrapup: \r
+  wrapup(rt_hit);\r
+\r
+main_loop_move:\r
+  if (lig_stack == 0)\r
+    goto reswitch;\r
+\r
+  cur_q = tail;\r
+  cur_l = character(lig_stack);\r
+\r
+main_loop_move_1:\r
+  if (!is_char_node(lig_stack))\r
+    goto main_loop_move_lig;\r
+\r
+main_loop_move_2:\r
+  if ((cur_chr < font_bc[main_f]) || (cur_chr > font_ec[main_f]))\r
+  {\r
+    char_warning(main_f, cur_chr);\r
+    free_avail(lig_stack);\r
+    goto big_switch;\r
+  }\r
+\r
+  main_i = char_info(main_f, cur_l);\r
+\r
+  if (!char_exists(main_i))\r
+  {\r
+    char_warning(main_f, cur_chr);\r
+    free_avail(lig_stack);\r
+    goto big_switch; \r
+  }\r
+\r
+  link(tail) = lig_stack;\r
+  tail = lig_stack;\r
+\r
+main_loop_lookahead:\r
+  get_next();\r
+\r
+  if (cur_cmd == letter)\r
+    goto main_loop_lookahead_1;\r
+\r
+  if (cur_cmd == other_char)\r
+    goto main_loop_lookahead_1;\r
+\r
+  if (cur_cmd == char_given)\r
+    goto main_loop_lookahead_1;\r
+\r
+  x_token();\r
+\r
+  if (cur_cmd == letter)\r
+    goto main_loop_lookahead_1;\r
+\r
+  if (cur_cmd == other_char)\r
+    goto main_loop_lookahead_1;\r
+\r
+  if (cur_cmd == char_given)\r
+    goto main_loop_lookahead_1;\r
+\r
+  if (cur_cmd == char_num)\r
+  {\r
+    scan_char_num();\r
+    cur_chr = cur_val;\r
+    goto main_loop_lookahead_1;\r
+  }\r
+\r
+  if (cur_cmd == no_boundary)\r
+    bchar = non_char;\r
+\r
+  cur_r = bchar;\r
+  lig_stack = 0;\r
+  goto main_lig_loop;\r
+\r
+main_loop_lookahead_1:\r
+  adjust_space_factor();\r
+  fast_get_avail(lig_stack);\r
+  font(lig_stack) = main_f;\r
+  cur_r = cur_chr;\r
+  character(lig_stack) = cur_r;\r
+\r
+  if (cur_r == false_bchar)\r
+    cur_r = non_char;\r
+\r
+main_lig_loop:\r
+  if (char_tag(main_i) != lig_tag)\r
+    goto main_loop_wrapup;\r
+\r
+  if (cur_r == non_char)\r
+    goto main_loop_wrapup;\r
+\r
+  main_k = lig_kern_start(main_f, main_i);\r
+  main_j = font_info[main_k].qqqq;\r
+\r
+  if (skip_byte(main_j) <= stop_flag)\r
+    goto main_lig_loop_2;\r
+\r
+  main_k = lig_kern_restart(main_f, main_j);\r
+\r
+main_lig_loop_1:\r
+  main_j = font_info[main_k].qqqq;\r
+\r
+main_lig_loop_2:\r
+  bSuppress = false;\r
+\r
+  if (suppress_f_ligs && next_char(main_j) == cur_r && op_byte(main_j) == no_tag)\r
+  {\r
+    if (cur_l == 'f')\r
+      bSuppress = true;\r
+  }\r
+\r
+  if (next_char(main_j) == cur_r && bSuppress == false)\r
+    if (skip_byte(main_j) <= stop_flag)\r
+    {\r
+      if (op_byte(main_j) >= kern_flag)\r
+      {\r
+        wrapup(rt_hit);\r
+        tail_append(new_kern(char_kern(main_f, main_j)));\r
+        goto main_loop_move;\r
+      }\r
+\r
+      if (cur_l == non_char)\r
+        lft_hit = true;\r
+      else if (lig_stack == 0)\r
+        rt_hit = true;\r
+\r
+      check_interrupt();\r
+\r
+      switch (op_byte(main_j))\r
+      {\r
+        case 1:\r
+        case 5:\r
+          {\r
+            cur_l = rem_byte(main_j);\r
+            main_i = char_info(main_f, cur_l);\r
+            ligature_present = true;\r
+          }\r
+          break;\r
+        case 2:\r
+        case 6:\r
+          {\r
+            cur_r = rem_byte(main_j);\r
+\r
+            if (lig_stack == 0)\r
+            {\r
+              lig_stack = new_lig_item(cur_r);\r
+              bchar = non_char;\r
+            }\r
+            else if (is_char_node(lig_stack))\r
+            {\r
+              main_p = lig_stack;\r
+              lig_stack = new_lig_item(cur_r);\r
+              lig_ptr(lig_stack) = main_p;\r
+            }\r
+            else\r
+              character(lig_stack) = cur_r;\r
+          }\r
+          break;\r
+        case 3:\r
+          {\r
+            cur_r = rem_byte(main_j);\r
+            main_p = lig_stack;\r
+            lig_stack = new_lig_item(cur_r);\r
+            link(lig_stack) = main_p;\r
+          }\r
+          break;\r
+        case 7:\r
+        case 11:\r
+          {\r
+            wrapup(false);\r
+            cur_q = tail;\r
+            cur_l = rem_byte(main_j);\r
+            main_i = char_info(main_f, cur_l);\r
+            ligature_present = true;\r
+          }\r
+          break;\r
+        default:\r
+          {\r
+            cur_l = rem_byte(main_j);\r
+            ligature_present = true;\r
\r
+            if (lig_stack == 0)\r
+              goto main_loop_wrapup;\r
+            else\r
+              goto main_loop_move_1;\r
+          }\r
+          break;\r
+      }\r
+\r
+      if (op_byte(main_j) > 4)\r
+        if (op_byte(main_j) != 7)\r
+          goto main_loop_wrapup;\r
+\r
+      if (cur_l < non_char)\r
+        goto main_lig_loop;\r
+\r
+      main_k = bchar_label[main_f];\r
+      goto main_lig_loop_1;\r
+    }\r
+\r
+    if (skip_byte(main_j) == 0)\r
+      incr(main_k);\r
+    else\r
+    {\r
+      if (skip_byte(main_j) >= stop_flag)\r
+        goto main_loop_wrapup;\r
+\r
+      main_k = main_k + skip_byte(main_j) + 1;\r
+    }\r
+\r
+    goto main_lig_loop_1;\r
+\r
+main_loop_move_lig:\r
+  main_p = lig_ptr(lig_stack);\r
+\r
+  if (main_p != 0)\r
+    tail_append(main_p);\r
+\r
+  temp_ptr = lig_stack;\r
+  lig_stack = link(temp_ptr);\r
+  free_node(temp_ptr, small_node_size);\r
+  main_i = char_info(main_f, cur_l);\r
+  ligature_present = true;\r
+\r
+  if (lig_stack == 0)\r
+    if (main_p != 0)\r
+      goto main_loop_lookahead;\r
+    else\r
+      cur_r = bchar;\r
+  else\r
+    cur_r = character(lig_stack);\r
+\r
+  goto main_lig_loop;\r
+\r
+append_normal_space:\r
+  if (space_skip == 0)\r
+  {\r
+    {\r
+      main_p = font_glue[cur_font];\r
+\r
+      if (main_p == 0)\r
+      {\r
+        main_p = new_spec(zero_glue);\r
+        main_k = param_base[cur_font] + space_code;\r
+        width(main_p) = font_info[main_k].cint;\r
+        stretch(main_p) = font_info[main_k + 1].cint;\r
+        shrink(main_p) = font_info[main_k + 2].cint;\r
+        font_glue[cur_font] = main_p;\r
+      }\r
+    }\r
+\r
+    temp_ptr = new_glue(main_p);\r
+  }\r
+  else\r
+    temp_ptr = new_param_glue(space_skip_code);\r
+\r
+  link(tail) = temp_ptr;\r
+  tail = temp_ptr;\r
+\r
+  goto big_switch;\r
 }
\ No newline at end of file
index 003a139..9225dd2 100644 (file)
-/* Copyright 2014 Clerk Ma
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301 USA.  */
-
-#define EXTERN extern
-
-#include "yandytex.h"
-
-extern void pdf_init_fontmaps(void);
-extern void pdf_close_fontmaps(void);
-
-extern void pdf_doc_set_creator(const char * creator);
-
-// primitive \pdfminorversion
-extern void pdf_set_version(unsigned version);
-// pdfobj.c
-extern void pdf_set_compression(int level);
-extern void pdf_files_init(void);
-extern void pdf_files_close(void);
-
-extern void pdf_init_device(double dvi2pts, int precision, int black_and_white);
-extern void pdf_close_device(void);
-
-extern void pdf_open_document(const char *filename,
-  int do_encryption,
-  double media_width, double media_height,
-  double annot_grow_amount, int bookmark_open_depth,
-  int check_gotos);
-extern void pdf_close_document(void);
-extern void pdf_doc_begin_page(double scale, double x_origin, double y_origin);
-extern void pdf_doc_end_page(void);
-extern int spc_exec_at_begin_document(void);
-extern int spc_exec_at_end_document(void);
-extern int spc_exec_at_begin_page(void);
-extern int spc_exec_at_end_page(void);
-
-typedef signed long spt_t;
-extern int  pdf_dev_locate_font(const char *font_name, spt_t ptsize);
-extern void pdf_dev_set_rule(spt_t xpos, spt_t ypos, spt_t width, spt_t height);
-extern void pdf_dev_set_string(spt_t xpos, spt_t ypos,
-  const void *instr_ptr, int instr_len,
-  spt_t width,
-  int   font_id, int ctype);
-
-/* sec 1284 */
-void give_err_help (void)
-{
-  token_show(err_help);
-}
-/* sec 0524 */
-boolean open_fmt_file (void)
-{
-  integer j;
-
-  j = loc;
-
-  if (buffer[loc] == '&' || buffer[loc] == '+')
-  {
-    incr(loc);
-    j = loc;
-    buffer[last] = ' ';
-
-    while (buffer[j] != ' ')
-      incr(j);
-
-    pack_buffered_name(0, loc, j - 1);
-
-    if (w_open_in(fmt_file))
-      goto found;
-  
-    if (knuth_flag)
-      printf("%s;%s\n", "Sorry, I can't find that format", " will try the default.");
-    else
-    {
-      name_of_file[name_length + 1] = '\0';
-      printf("%s (%s);%s\n", "Sorry, I can't find that format",
-        name_of_file + 1, " will try the default."); 
-      name_of_file[name_length + 1] = ' ';
-      printf("(Perhaps your %s environment variable is not set correctly)\n",
-        "TEXFORMATS");
-    }
-
-    update_terminal();
-  }
-
-  pack_buffered_name(format_default_length - 4, 1, 0);
-
-  if (!w_open_in(fmt_file))
-  {
-    if (knuth_flag)
-      printf("%s!\n", "I can't find the default format file");
-    else
-    {
-      name_of_file[name_length + 1] = '\0';
-      printf("%s (%s)!\n", "I can't find the default format file", name_of_file + 1);
-      name_of_file[name_length + 1] = ' ';
-      printf("(Perhaps your %s environment variable is not set correctly)\n", "TEXFORMATS");
-    }
-
-    return false;
-  }
-
-found:
-  loc = j;
-
-  return true;
-}
-/* sec 1333 */
-void close_files_and_terminate (void)
-{
-  integer k; 
-
-  if (trace_flag)
-    puts("\nclose_files_and_terminate() ");
-
-  for (k = 0; k <= 15; k++)
-    if (write_open[k])
-      a_close(write_file[k]);
-
-#ifdef STAT
-  if (tracing_stats > 0 || verbose_flag != 0)
-    if (log_opened)
-    {
-      fprintf(log_file, "%c\n", ' ');
-      fprintf(log_file, "\n");
-      fprintf(log_file, "%s%s\n", "Here is how much of TeX's memory", " you used:");
-      fprintf(log_file, "%c%lld%s", ' ', (integer)(str_ptr - init_str_ptr), " string");
-
-      if (str_ptr != init_str_ptr + 1)
-        putc('s', log_file);
-
-#ifdef ALLOCATESTRING
-      if (show_current)
-        fprintf(log_file, "%s%d\n", " out of ", (int)(current_max_strings - init_str_ptr));
-      else
-#endif
-        fprintf(log_file, "%s%d\n", " out of ", (int)(max_strings - init_str_ptr));
-
-#ifdef ALLOCATESTRING
-      if (show_current)
-        fprintf(log_file, "%c%lld%s%lld\n", ' ', (integer)(pool_ptr - init_pool_ptr), " string characters out of ", current_pool_size - init_pool_ptr);
-      else
-#endif
-        fprintf(log_file, "%c%lld%s%lld\n", ' ', (integer)(pool_ptr - init_pool_ptr), " string characters out of ", pool_size - init_pool_ptr);
-
-#ifdef ALLOCATEMAIN
-      if (show_current)
-        fprintf(log_file, "%c%lld%s%d\n", ' ', (integer)(lo_mem_max - mem_min + mem_end - hi_mem_min + 2), " words of memory out of ", current_mem_size);
-      else
-#endif
-        fprintf(log_file, "%c%lld%s%lld\n", ' ', (integer)(lo_mem_max - mem_min + mem_end - hi_mem_min + 2), " words of memory out of ", mem_end + 1 - mem_min);
-
-      fprintf(log_file, "%c%lld%s%d\n", ' ', (cs_count), " multiletter control sequences out of ", (hash_size + hash_extra));
-      fprintf(log_file, "%c%lld%s%lld%s", ' ', (fmem_ptr), " words of font info for ", (font_ptr - font_base), " font");
-
-      if (font_ptr != 1)
-        wlog('s');
-
-#ifdef ALLOCATEFONT
-      if (show_current)
-        fprintf(log_file, "%s%d%s%d\n", ", out of ", current_font_mem_size, " for ", font_max - font_base);
-      else
-#endif
-        fprintf(log_file, "%s%lu%s%d\n", ", out of ", font_mem_size, " for ", font_max - font_base);
-
-      fprintf(log_file, "%c%lld%s", ' ', hyph_count, " hyphenation exception");
-
-      if (hyph_count != 1)
-        wlog('s');
-
-      fprintf(log_file, "%s%lld\n", " out of ", hyphen_prime);
-      fprintf(log_file, " ");
-      fprintf(log_file, "%d%s", (int) max_in_stack, "i,");
-      fprintf(log_file, "%d%s", (int) max_nest_stack, "n,");
-      fprintf(log_file, "%d%s", (int) max_param_stack, "p,");
-      fprintf(log_file, "%d%s", (int) max_buf_stack + 1, "b,");
-      fprintf(log_file, "%d%s", (int) max_save_stack + 6, "s");
-      fprintf(log_file, " stack positions out of ");
-
-#ifdef ALLOCATESAVESTACK
-      if (show_current)
-        fprintf(log_file, "%d%s", current_stack_size, "i,");
-      else
-#endif
-        fprintf(log_file, "%d%s", stack_size, "i,");
-
-#ifdef ALLOCATENESTSTACK
-      if (show_current)
-        fprintf(log_file, "%d%s", current_nest_size, "n,");
-      else
-#endif
-        fprintf(log_file, "%d%s", nest_size, "n,");
-
-#ifdef ALLOCATEPARAMSTACK
-      if (show_current)
-        fprintf(log_file, "%d%s", current_param_size, "p,");
-      else
-#endif
-        fprintf(log_file, "%d%s", param_size, "p,");
-
-#ifdef ALLOCATEBUFFER
-      if (show_current)
-        fprintf(log_file, "%d%s", current_buf_size, "b,");
-      else
-#endif
-        fprintf(log_file, "%ld%s", buf_size, "b,");
-
-#ifdef ALLOCATESAVESTACK
-      if (show_current)
-        fprintf(log_file, "%d%s", current_save_size, "s");
-      else
-#endif
-        fprintf(log_file, "%d%s", save_size, "s");
-
-      fprintf(log_file, "\n");
-
-      if (!knuth_flag)
-        fprintf(log_file, " (i = in_stack, n = nest_stack, p = param_stack, b = buf_stack, s = save_stack)\n");
-
-      if (!knuth_flag)
-        fprintf(log_file, " %lld inputs open max out of %d\n", high_in_open, max_in_open);
-
-      if (show_line_break_stats && first_pass_count > 0)
-      {
-        int first_count, second_count, third_count;
-
-        fprintf(log_file, "\nSuccess at breaking %d paragraph%s:", first_pass_count, (first_pass_count == 1) ? "" : "s");
-
-        if (single_line > 0)
-          fprintf(log_file, "\n %d single line `paragraph%s'", single_line, (single_line == 1) ? "" : "s");
-
-        first_count = first_pass_count - single_line - second_pass_count;
-
-        if (first_count < 0)
-          first_count = 0;
-
-        second_count = second_pass_count - final_pass_count;
-        third_count = final_pass_count - paragraph_failed;
-
-        if (first_pass_count > 0)
-          fprintf(log_file, "\n %d first pass (\\pretolerance = %lld)", first_pass_count, pretolerance);
-
-        if (second_pass_count > 0)
-          fprintf(log_file, "\n %d second pass (\\tolerance = %lld)", second_pass_count, tolerance);
-
-        if (final_pass_count > 0 || emergency_stretch > 0)
-          fprintf(log_file, "\n %d third pass (\\emergencystretch = %lgpt)",
-            final_pass_count, (double) emergency_stretch / 65536.0);
-
-        if (paragraph_failed > 0)
-          fprintf(log_file, "\n %d failed", paragraph_failed);
-
-        putc('\n', log_file);
-
-        if (overfull_hbox > 0)
-          fprintf(log_file, "\n %d overfull \\hbox%s", overfull_hbox, (overfull_hbox > 1) ? "es" : "");
-
-        if (underfull_hbox > 0)
-          fprintf(log_file, "\n %d underfull \\hbox%s", underfull_hbox, (underfull_hbox > 1) ? "es" : "");
-
-        if (overfull_vbox > 0)
-          fprintf(log_file, "\n %d overfull \\vbox%s", overfull_vbox, (overfull_vbox > 1) ? "es" : "");
-
-        if (underfull_vbox > 0)
-          fprintf(log_file, "\n %d underfull \\vbox%s", underfull_vbox, (underfull_vbox > 1) ? "es" : "");
-
-        if (overfull_hbox || underfull_hbox || overfull_vbox || underfull_vbox)
-          putc('\n', log_file);
-      }
-  }
-#endif
-///*
-  {
-    spc_exec_at_end_document();
-    pdf_close_document();
-    pdf_close_device();
-    pdf_files_close();
-    pdf_close_fontmaps();
-
-    if (total_pages == 0)
-      print_nl("No pages of output.");
-    else
-    {
-      if (total_pages >= 65536)
-      {
-        sprintf(log_line, "\nWARNING: page count (dvi_t) in DVI file will be %lld not %lld\n",
-          (total_pages % 65536), total_pages);
-
-        if (log_opened)
-          fputs(log_line, log_file);
-
-        show_line(log_line, 1);
-      }
-
-      print_nl("Output written on ");
-
-      if (full_file_name_flag && pdf_file_name != NULL)
-        prints(pdf_file_name);
-      else
-        slow_print(output_file_name);
-
-      prints(" (");
-      print_int(total_pages);
-      prints(" page");
-
-      if (total_pages != 1)
-        print_char('s');
-
-      prints(", ");
-      print_int(pdf_output_stats());
-      prints(" bytes).");
-      b_close(pdf_file);
-    }
-  }
-//*/
-/*
-{
-  pdf_set_version(5);
-  pdf_set_compression(0);
-  pdf_doc_set_creator("Y&Y TeX 2.3.0");
-  pdf_files_init();
-  pdf_init_device(1, 2, 0);
-  pdf_open_document("test.pdf", 0, 595.0, 842.0, 0, 0, (1 << 4));
-  pdf_doc_begin_page(1, 0, 0);
-  spc_exec_at_begin_page();
-  spc_exec_at_end_page();
-  pdf_doc_end_page();
-  pdf_close_document(); // bytes written
-  pdf_close_device();
-  pdf_files_close();
-}
-*/
-/*
-  switch (shipout_flag)
-  {
-    case out_dvi_flag:
-    case out_xdv_flag:
-      {
-        while (cur_s > -1)
-        {
-          if (cur_s > 0) 
-            dvi_out(pop);
-          else
-          {
-            dvi_out(eop);
-            incr(total_pages);
-          }
-
-          decr(cur_s);
-        }
-
-        if (total_pages == 0)
-          print_nl("No pages of output.");
-        else
-        {
-          dvi_out(post);
-          dvi_four(last_bop);
-          last_bop = dvi_offset + dvi_ptr - 5;
-          dvi_four(25400000L);
-          dvi_four(473628672L);
-          prepare_mag();
-          dvi_four(mag);
-          dvi_four(max_v);
-          dvi_four(max_h);
-          dvi_out(max_push / 256);
-          dvi_out(max_push % 256);
-
-          if (total_pages >= 65536)
-          {
-            sprintf(log_line, "\nWARNING: page count (dvi_t) in DVI file will be %lld not %lld\n",
-              (total_pages % 65536), total_pages);
-
-            if (log_opened)
-              fputs(log_line, log_file);
-
-            show_line(log_line, 1);
-          }
-
-          dvi_out((total_pages / 256) % 256);
-          dvi_out(total_pages % 256);
-
-          if (show_fonts_used && log_opened)
-            show_font_info();
-
-          while (font_ptr > 0)
-          {
-            if (font_used[font_ptr])
-              dvi_font_def(font_ptr);
-
-            decr(font_ptr);
-          }
-
-          dvi_out(post_post);
-          dvi_four(last_bop);
-          dvi_out(id_byte);
-          k = 4 + ((dvi_buf_size - dvi_ptr) % 4);
-
-          while (k > 0)
-          {
-            dvi_out(223);
-            decr(k);
-          }
-
-          if (trace_flag)
-            printf("\ndvi_write %lld", dvi_gone);
-
-          if (dvi_limit == half_buf)
-            write_dvi(half_buf, dvi_buf_size - 1);
-
-          if (dvi_ptr > 0)
-            write_dvi(0, dvi_ptr - 1); 
-
-          print_nl("Output written on ");
-
-          if (full_file_name_flag && dvi_file_name != NULL)
-            prints(dvi_file_name);
-          else
-            slow_print(output_file_name);
-
-          prints(" (");
-          print_int(total_pages);
-          prints(" page");
-
-          if (total_pages != 1)
-            print_char('s');
-
-          prints(", ");
-          print_int(dvi_offset + dvi_ptr);
-          prints(" bytes).");
-          b_close(dvi_file);
-        }
-      }
-      break;
-  }
-*/
-  if (log_opened)
-  {
-    wlog_cr();
-    a_close(log_file);
-    selector = selector - 2;
-
-    if (selector == term_only)
-    {
-      print_nl("Transcript written on ");
-
-      if (full_file_name_flag && log_file_name != NULL)
-        prints(log_file_name);
-      else
-        slow_print(log_name);
-
-      print_char('.');
-    }
-  }
-
-  print_ln();
-
-  if ((edit_name_start != 0) && (interaction > 0))
-    call_edit(str_pool, edit_name_start, edit_name_length, edit_line);
-}
-#ifdef DEBUG
-/* sec 1338 */
-void debug_help (void) 
-{
-  integer k, l, m, n;
-
-  while (true)
-  { 
-    print_nl(" debug # (-1 to exit):");
-
-#ifndef _WINDOWS
-    fflush(stdout); 
-#endif
-
-    read(stdin, m);  // ???
-
-    if (m < 0)
-      return;
-    else if (m == 0)
-      dumpcore();
-    else
-    {
-      read(stdin, n);
-
-      switch (m)
-      {
-        case 1:
-          print_word(mem[n]);
-          break;
-
-        case 2:
-          print_int(mem[n].hh.lh);
-          break;
-          
-        case 3:
-          print_int(mem[n].hh.rh);
-          break;
-        
-        case 4:
-          print_word(eqtb[n]);
-          break;
-
-        case 5:
-#ifdef SHORTFONTINFO
-          print_scaled(font_info[n].sc);
-          print_char(' ');
-          print_int(font_info[n].b0);
-          print_char(':');
-          print_int(font_info[n].b1);
-          print_char(':');
-          print_int(font_info[n].b2);
-          print_char(':');
-          print_int(font_info[n].b3);
-#else
-          print_word(font_info[n]); 
-#endif
-          break;
-        
-        case 6:
-          print_word(save_stack[n]);
-          break;
-          
-        case 7:
-          show_box(n);
-          break;
-        
-        case 8:
-          {
-            breadth_max = 10000;
-#ifdef ALLOCATESTRING
-            if (pool_ptr + 32000 > current_pool_size)
-              str_pool = realloc_str_pool (increment_pool_size);
-#endif
-#ifdef ALLOCATESTRING
-            depth_threshold = current_pool_size - pool_ptr - 10;
-#else
-            depth_threshold = pool_size - pool_ptr - 10;
-#endif
-            show_node_list(n);
-          }
-          break;
-        
-        case 9:
-          show_token_list(n, 0, 1000);
-          break;
-        
-        case 10:
-          slow_print(n);
-          break;
-        
-        case 11:
-          check_mem(n > 0);
-          break;
-        
-        case 12:
-          search_mem(n);
-          break;
-        
-        case 13:
-          {
-            read(stdin, l);
-            print_cmd_chr(n, l);
-          }
-          break;
-        
-        case 14:
-          {
-            for (k = 0; k <= n; k++)
-              print(buffer[k]);
-          }
-          break;
-        
-        case 15:
-          {
-            font_in_short_display = 0;
-            short_display(n);
-          }
-          break;
-        
-        case 16:
-          panicking = !panicking;
-          break;
-        
-        default:
-          print('?');
-          break;
-      }
-    }
-  }
-}
-#endif
+/* Copyright 2014 Clerk Ma\r
+\r
+   This program is free software; you can redistribute it and/or modify\r
+   it under the terms of the GNU General Public License as published by\r
+   the Free Software Foundation; either version 2 of the License, or\r
+   (at your option) any later version.\r
+\r
+   This program is distributed in the hope that it will be useful, but\r
+   WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+   General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with this program; if not, write to the Free Software\r
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA\r
+   02110-1301 USA.  */\r
+\r
+#define EXTERN extern\r
+\r
+#include "yandytex.h"\r
+\r
+extern void pdf_init_fontmaps(void);\r
+extern void pdf_close_fontmaps(void);\r
+\r
+extern void pdf_doc_set_creator(const char * creator);\r
+\r
+// primitive \pdfminorversion\r
+extern void pdf_set_version(unsigned version);\r
+// pdfobj.c\r
+extern void pdf_set_compression(int level);\r
+extern void pdf_files_init(void);\r
+extern void pdf_files_close(void);\r
+\r
+extern void pdf_init_device(double dvi2pts, int precision, int black_and_white);\r
+extern void pdf_close_device(void);\r
+\r
+extern void pdf_open_document(const char *filename,\r
+  int do_encryption,\r
+  double media_width, double media_height,\r
+  double annot_grow_amount, int bookmark_open_depth,\r
+  int check_gotos);\r
+extern void pdf_close_document(void);\r
+extern void pdf_doc_begin_page(double scale, double x_origin, double y_origin);\r
+extern void pdf_doc_end_page(void);\r
+extern int spc_exec_at_begin_document(void);\r
+extern int spc_exec_at_end_document(void);\r
+extern int spc_exec_at_begin_page(void);\r
+extern int spc_exec_at_end_page(void);\r
+\r
+typedef signed long spt_t;\r
+extern int  pdf_dev_locate_font(const char *font_name, spt_t ptsize);\r
+extern void pdf_dev_set_rule(spt_t xpos, spt_t ypos, spt_t width, spt_t height);\r
+extern void pdf_dev_set_string(spt_t xpos, spt_t ypos,\r
+  const void *instr_ptr, int instr_len,\r
+  spt_t width,\r
+  int   font_id, int ctype);\r
+\r
+/* sec 1284 */\r
+void give_err_help (void)\r
+{\r
+  token_show(err_help);\r
+}\r
+/* sec 0524 */\r
+boolean open_fmt_file (void)\r
+{\r
+  integer j;\r
+\r
+  j = loc;\r
+\r
+  if (buffer[loc] == '&' || buffer[loc] == '+')\r
+  {\r
+    incr(loc);\r
+    j = loc;\r
+    buffer[last] = ' ';\r
+\r
+    while (buffer[j] != ' ')\r
+      incr(j);\r
+\r
+    pack_buffered_name(0, loc, j - 1);\r
+\r
+    if (w_open_in(fmt_file))\r
+      goto found;\r
+  \r
+    if (knuth_flag)\r
+      printf("%s;%s\n", "Sorry, I can't find that format", " will try the default.");\r
+    else\r
+    {\r
+      name_of_file[name_length + 1] = '\0';\r
+      printf("%s (%s);%s\n", "Sorry, I can't find that format",\r
+        name_of_file + 1, " will try the default."); \r
+      name_of_file[name_length + 1] = ' ';\r
+      printf("(Perhaps your %s environment variable is not set correctly)\n",\r
+        "TEXFORMATS");\r
+    }\r
+\r
+    update_terminal();\r
+  }\r
+\r
+  pack_buffered_name(format_default_length - 4, 1, 0);\r
+\r
+  if (!w_open_in(fmt_file))\r
+  {\r
+    if (knuth_flag)\r
+      printf("%s!\n", "I can't find the default format file");\r
+    else\r
+    {\r
+      name_of_file[name_length + 1] = '\0';\r
+      printf("%s (%s)!\n", "I can't find the default format file", name_of_file + 1);\r
+      name_of_file[name_length + 1] = ' ';\r
+      printf("(Perhaps your %s environment variable is not set correctly)\n", "TEXFORMATS");\r
+    }\r
+\r
+    return false;\r
+  }\r
+\r
+found:\r
+  loc = j;\r
+\r
+  return true;\r
+}\r
+/* sec 1333 */\r
+void close_files_and_terminate (void)\r
+{\r
+  integer k; \r
+\r
+  if (trace_flag)\r
+    puts("\nclose_files_and_terminate() ");\r
+\r
+  for (k = 0; k <= 15; k++)\r
+    if (write_open[k])\r
+      a_close(write_file[k]);\r
+\r
+#ifdef STAT\r
+  if (tracing_stats > 0 || verbose_flag != 0)\r
+    if (log_opened)\r
+    {\r
+      fprintf(log_file, "%c\n", ' ');\r
+      fprintf(log_file, "\n");\r
+      fprintf(log_file, "%s%s\n", "Here is how much of TeX's memory", " you used:");\r
+      fprintf(log_file, "%c%lld%s", ' ', (integer)(str_ptr - init_str_ptr), " string");\r
+\r
+      if (str_ptr != init_str_ptr + 1)\r
+        putc('s', log_file);\r
+\r
+#ifdef ALLOCATESTRING\r
+      if (show_current)\r
+        fprintf(log_file, "%s%d\n", " out of ", (int)(current_max_strings - init_str_ptr));\r
+      else\r
+#endif\r
+        fprintf(log_file, "%s%d\n", " out of ", (int)(max_strings - init_str_ptr));\r
+\r
+#ifdef ALLOCATESTRING\r
+      if (show_current)\r
+        fprintf(log_file, "%c%lld%s%lld\n", ' ', (integer)(pool_ptr - init_pool_ptr), " string characters out of ", current_pool_size - init_pool_ptr);\r
+      else\r
+#endif\r
+        fprintf(log_file, "%c%lld%s%lld\n", ' ', (integer)(pool_ptr - init_pool_ptr), " string characters out of ", pool_size - init_pool_ptr);\r
+\r
+#ifdef ALLOCATEMAIN\r
+      if (show_current)\r
+        fprintf(log_file, "%c%lld%s%d\n", ' ', (integer)(lo_mem_max - mem_min + mem_end - hi_mem_min + 2), " words of memory out of ", current_mem_size);\r
+      else\r
+#endif\r
+        fprintf(log_file, "%c%lld%s%lld\n", ' ', (integer)(lo_mem_max - mem_min + mem_end - hi_mem_min + 2), " words of memory out of ", mem_end + 1 - mem_min);\r
+\r
+      fprintf(log_file, "%c%lld%s%d\n", ' ', (cs_count), " multiletter control sequences out of ", (hash_size + hash_extra));\r
+      fprintf(log_file, "%c%lld%s%lld%s", ' ', (fmem_ptr), " words of font info for ", (font_ptr - font_base), " font");\r
+\r
+      if (font_ptr != 1)\r
+        wlog('s');\r
+\r
+#ifdef ALLOCATEFONT\r
+      if (show_current)\r
+        fprintf(log_file, "%s%d%s%d\n", ", out of ", current_font_mem_size, " for ", font_max - font_base);\r
+      else\r
+#endif\r
+        fprintf(log_file, "%s%lu%s%d\n", ", out of ", font_mem_size, " for ", font_max - font_base);\r
+\r
+      fprintf(log_file, "%c%lld%s", ' ', hyph_count, " hyphenation exception");\r
+\r
+      if (hyph_count != 1)\r
+        wlog('s');\r
+\r
+      fprintf(log_file, "%s%lld\n", " out of ", hyphen_prime);\r
+      fprintf(log_file, " ");\r
+      fprintf(log_file, "%d%s", (int) max_in_stack, "i,");\r
+      fprintf(log_file, "%d%s", (int) max_nest_stack, "n,");\r
+      fprintf(log_file, "%d%s", (int) max_param_stack, "p,");\r
+      fprintf(log_file, "%d%s", (int) max_buf_stack + 1, "b,");\r
+      fprintf(log_file, "%d%s", (int) max_save_stack + 6, "s");\r
+      fprintf(log_file, " stack positions out of ");\r
+\r
+#ifdef ALLOCATESAVESTACK\r
+      if (show_current)\r
+        fprintf(log_file, "%d%s", current_stack_size, "i,");\r
+      else\r
+#endif\r
+        fprintf(log_file, "%d%s", stack_size, "i,");\r
+\r
+#ifdef ALLOCATENESTSTACK\r
+      if (show_current)\r
+        fprintf(log_file, "%d%s", current_nest_size, "n,");\r
+      else\r
+#endif\r
+        fprintf(log_file, "%d%s", nest_size, "n,");\r
+\r
+#ifdef ALLOCATEPARAMSTACK\r
+      if (show_current)\r
+        fprintf(log_file, "%d%s", current_param_size, "p,");\r
+      else\r
+#endif\r
+        fprintf(log_file, "%d%s", param_size, "p,");\r
+\r
+#ifdef ALLOCATEBUFFER\r
+      if (show_current)\r
+        fprintf(log_file, "%d%s", current_buf_size, "b,");\r
+      else\r
+#endif\r
+        fprintf(log_file, "%ld%s", buf_size, "b,");\r
+\r
+#ifdef ALLOCATESAVESTACK\r
+      if (show_current)\r
+        fprintf(log_file, "%d%s", current_save_size, "s");\r
+      else\r
+#endif\r
+        fprintf(log_file, "%d%s", save_size, "s");\r
+\r
+      fprintf(log_file, "\n");\r
+\r
+      if (!knuth_flag)\r
+        fprintf(log_file, " (i = in_stack, n = nest_stack, p = param_stack, b = buf_stack, s = save_stack)\n");\r
+\r
+      if (!knuth_flag)\r
+        fprintf(log_file, " %lld inputs open max out of %d\n", high_in_open, max_in_open);\r
+\r
+      if (show_line_break_stats && first_pass_count > 0)\r
+      {\r
+        int first_count, second_count, third_count;\r
+\r
+        fprintf(log_file, "\nSuccess at breaking %d paragraph%s:", first_pass_count, (first_pass_count == 1) ? "" : "s");\r
+\r
+        if (single_line > 0)\r
+          fprintf(log_file, "\n %d single line `paragraph%s'", single_line, (single_line == 1) ? "" : "s");\r
+\r
+        first_count = first_pass_count - single_line - second_pass_count;\r
+\r
+        if (first_count < 0)\r
+          first_count = 0;\r
+\r
+        second_count = second_pass_count - final_pass_count;\r
+        third_count = final_pass_count - paragraph_failed;\r
+\r
+        if (first_pass_count > 0)\r
+          fprintf(log_file, "\n %d first pass (\\pretolerance = %lld)", first_pass_count, pretolerance);\r
+\r
+        if (second_pass_count > 0)\r
+          fprintf(log_file, "\n %d second pass (\\tolerance = %lld)", second_pass_count, tolerance);\r
+\r
+        if (final_pass_count > 0 || emergency_stretch > 0)\r
+          fprintf(log_file, "\n %d third pass (\\emergencystretch = %lgpt)",\r
+            final_pass_count, (double) emergency_stretch / 65536.0);\r
+\r
+        if (paragraph_failed > 0)\r
+          fprintf(log_file, "\n %d failed", paragraph_failed);\r
+\r
+        putc('\n', log_file);\r
+\r
+        if (overfull_hbox > 0)\r
+          fprintf(log_file, "\n %d overfull \\hbox%s", overfull_hbox, (overfull_hbox > 1) ? "es" : "");\r
+\r
+        if (underfull_hbox > 0)\r
+          fprintf(log_file, "\n %d underfull \\hbox%s", underfull_hbox, (underfull_hbox > 1) ? "es" : "");\r
+\r
+        if (overfull_vbox > 0)\r
+          fprintf(log_file, "\n %d overfull \\vbox%s", overfull_vbox, (overfull_vbox > 1) ? "es" : "");\r
+\r
+        if (underfull_vbox > 0)\r
+          fprintf(log_file, "\n %d underfull \\vbox%s", underfull_vbox, (underfull_vbox > 1) ? "es" : "");\r
+\r
+        if (overfull_hbox || underfull_hbox || overfull_vbox || underfull_vbox)\r
+          putc('\n', log_file);\r
+      }\r
+  }\r
+#endif\r
+///*\r
+  {\r
+    spc_exec_at_end_document();\r
+    pdf_close_document();\r
+    pdf_close_device();\r
+    pdf_files_close();\r
+    pdf_close_fontmaps();\r
+\r
+    if (total_pages == 0)\r
+      print_nl("No pages of output.");\r
+    else\r
+    {\r
+      if (total_pages >= 65536)\r
+      {\r
+        sprintf(log_line, "\nWARNING: page count (dvi_t) in DVI file will be %lld not %lld\n",\r
+          (total_pages % 65536), total_pages);\r
+\r
+        if (log_opened)\r
+          fputs(log_line, log_file);\r
+\r
+        show_line(log_line, 1);\r
+      }\r
+\r
+      print_nl("Output written on ");\r
+\r
+      if (full_file_name_flag && pdf_file_name != NULL)\r
+        prints(pdf_file_name);\r
+      else\r
+        slow_print(output_file_name);\r
+\r
+      prints(" (");\r
+      print_int(total_pages);\r
+      prints(" page");\r
+\r
+      if (total_pages != 1)\r
+        print_char('s');\r
+\r
+      prints(", ");\r
+      print_int(pdf_output_stats());\r
+      prints(" bytes).");\r
+      b_close(pdf_file);\r
+    }\r
+  }\r
+//*/\r
+/*\r
+{\r
+  pdf_set_version(5);\r
+  pdf_set_compression(0);\r
+  pdf_doc_set_creator("Y&Y TeX 2.3.0");\r
+  pdf_files_init();\r
+  pdf_init_device(1, 2, 0);\r
+  pdf_open_document("test.pdf", 0, 595.0, 842.0, 0, 0, (1 << 4));\r
+  pdf_doc_begin_page(1, 0, 0);\r
+  spc_exec_at_begin_page();\r
+  spc_exec_at_end_page();\r
+  pdf_doc_end_page();\r
+  pdf_close_document(); // bytes written\r
+  pdf_close_device();\r
+  pdf_files_close();\r
+}\r
+*/\r
+/*\r
+  switch (shipout_flag)\r
+  {\r
+    case out_dvi_flag:\r
+    case out_xdv_flag:\r
+      {\r
+        while (cur_s > -1)\r
+        {\r
+          if (cur_s > 0) \r
+            dvi_out(pop);\r
+          else\r
+          {\r
+            dvi_out(eop);\r
+            incr(total_pages);\r
+          }\r
+\r
+          decr(cur_s);\r
+        }\r
+\r
+        if (total_pages == 0)\r
+          print_nl("No pages of output.");\r
+        else\r
+        {\r
+          dvi_out(post);\r
+          dvi_four(last_bop);\r
+          last_bop = dvi_offset + dvi_ptr - 5;\r
+          dvi_four(25400000L);\r
+          dvi_four(473628672L);\r
+          prepare_mag();\r
+          dvi_four(mag);\r
+          dvi_four(max_v);\r
+          dvi_four(max_h);\r
+          dvi_out(max_push / 256);\r
+          dvi_out(max_push % 256);\r
+\r
+          if (total_pages >= 65536)\r
+          {\r
+            sprintf(log_line, "\nWARNING: page count (dvi_t) in DVI file will be %lld not %lld\n",\r
+              (total_pages % 65536), total_pages);\r
+\r
+            if (log_opened)\r
+              fputs(log_line, log_file);\r
+\r
+            show_line(log_line, 1);\r
+          }\r
+\r
+          dvi_out((total_pages / 256) % 256);\r
+          dvi_out(total_pages % 256);\r
+\r
+          if (show_fonts_used && log_opened)\r
+            show_font_info();\r
+\r
+          while (font_ptr > 0)\r
+          {\r
+            if (font_used[font_ptr])\r
+              dvi_font_def(font_ptr);\r
+\r
+            decr(font_ptr);\r
+          }\r
+\r
+          dvi_out(post_post);\r
+          dvi_four(last_bop);\r
+          dvi_out(id_byte);\r
+          k = 4 + ((dvi_buf_size - dvi_ptr) % 4);\r
+\r
+          while (k > 0)\r
+          {\r
+            dvi_out(223);\r
+            decr(k);\r
+          }\r
+\r
+          if (trace_flag)\r
+            printf("\ndvi_write %lld", dvi_gone);\r
+\r
+          if (dvi_limit == half_buf)\r
+            write_dvi(half_buf, dvi_buf_size - 1);\r
+\r
+          if (dvi_ptr > 0)\r
+            write_dvi(0, dvi_ptr - 1); \r
+\r
+          print_nl("Output written on ");\r
+\r
+          if (full_file_name_flag && dvi_file_name != NULL)\r
+            prints(dvi_file_name);\r
+          else\r
+            slow_print(output_file_name);\r
+\r
+          prints(" (");\r
+          print_int(total_pages);\r
+          prints(" page");\r
+\r
+          if (total_pages != 1)\r
+            print_char('s');\r
+\r
+          prints(", ");\r
+          print_int(dvi_offset + dvi_ptr);\r
+          prints(" bytes).");\r
+          b_close(dvi_file);\r
+        }\r
+      }\r
+      break;\r
+  }\r
+*/\r
+  if (log_opened)\r
+  {\r
+    wlog_cr();\r
+    a_close(log_file);\r
+    selector = selector - 2;\r
+\r
+    if (selector == term_only)\r
+    {\r
+      print_nl("Transcript written on ");\r
+\r
+      if (full_file_name_flag && log_file_name != NULL)\r
+        prints(log_file_name);\r
+      else\r
+        slow_print(log_name);\r
+\r
+      print_char('.');\r
+    }\r
+  }\r
+\r
+  print_ln();\r
+\r
+  if ((edit_name_start != 0) && (interaction > 0))\r
+    call_edit(str_pool, edit_name_start, edit_name_length, edit_line);\r
+}\r
+#ifdef DEBUG\r
+/* sec 1338 */\r
+void debug_help (void) \r
+{\r
+  integer k, l, m, n;\r
+\r
+  while (true)\r
+  { \r
+    print_nl(" debug # (-1 to exit):");\r
+\r
+#ifndef _WINDOWS\r
+    fflush(stdout); \r
+#endif\r
+\r
+    read(stdin, m);  // ???\r
+\r
+    if (m < 0)\r
+      return;\r
+    else if (m == 0)\r
+      dumpcore();\r
+    else\r
+    {\r
+      read(stdin, n);\r
+\r
+      switch (m)\r
+      {\r
+        case 1:\r
+          print_word(mem[n]);\r
+          break;\r
+\r
+        case 2:\r
+          print_int(mem[n].hh.lh);\r
+          break;\r
+          \r
+        case 3:\r
+          print_int(mem[n].hh.rh);\r
+          break;\r
+        \r
+        case 4:\r
+          print_word(eqtb[n]);\r
+          break;\r
+\r
+        case 5:\r
+#ifdef SHORTFONTINFO\r
+          print_scaled(font_info[n].sc);\r
+          print_char(' ');\r
+          print_int(font_info[n].b0);\r
+          print_char(':');\r
+          print_int(font_info[n].b1);\r
+          print_char(':');\r
+          print_int(font_info[n].b2);\r
+          print_char(':');\r
+          print_int(font_info[n].b3);\r
+#else\r
+          print_word(font_info[n]); \r
+#endif\r
+          break;\r
+        \r
+        case 6:\r
+          print_word(save_stack[n]);\r
+          break;\r
+          \r
+        case 7:\r
+          show_box(n);\r
+          break;\r
+        \r
+        case 8:\r
+          {\r
+            breadth_max = 10000;\r
+#ifdef ALLOCATESTRING\r
+            if (pool_ptr + 32000 > current_pool_size)\r
+              str_pool = realloc_str_pool (increment_pool_size);\r
+#endif\r
+#ifdef ALLOCATESTRING\r
+            depth_threshold = current_pool_size - pool_ptr - 10;\r
+#else\r
+            depth_threshold = pool_size - pool_ptr - 10;\r
+#endif\r
+            show_node_list(n);\r
+          }\r
+          break;\r
+        \r
+        case 9:\r
+          show_token_list(n, 0, 1000);\r
+          break;\r
+        \r
+        case 10:\r
+          slow_print(n);\r
+          break;\r
+        \r
+        case 11:\r
+          check_mem(n > 0);\r
+          break;\r
+        \r
+        case 12:\r
+          search_mem(n);\r
+          break;\r
+        \r
+        case 13:\r
+          {\r
+            read(stdin, l);\r
+            print_cmd_chr(n, l);\r
+          }\r
+          break;\r
+        \r
+        case 14:\r
+          {\r
+            for (k = 0; k <= n; k++)\r
+              print(buffer[k]);\r
+          }\r
+          break;\r
+        \r
+        case 15:\r
+          {\r
+            font_in_short_display = 0;\r
+            short_display(n);\r
+          }\r
+          break;\r
+        \r
+        case 16:\r
+          panicking = !panicking;\r
+          break;\r
+        \r
+        default:\r
+          print('?');\r
+          break;\r
+      }\r
+    }\r
+  }\r
+}\r
+#endif\r
index dfa5fc4..6579de4 100644 (file)
-/* Copyright 2014 Clerk Ma
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301 USA.  */
-
-#ifndef _YANDYTEX_TEXD_H
-#define _YANDYTEX_TEXD_H
-/* headers and pragmas */
-
-#ifdef _WIN32
-  #pragma warning(disable:4201) // nameless struct/union
-  #pragma warning(disable:4267)
-  #pragma warning(disable:4996) // a function that was marked with deprecated
-  #pragma warning(disable:4701) // potentially uninitialized local variable 'name' used
-  #pragma warning(disable:4135) // conversion between different integral types
-  #pragma warning(disable:4127) // conditional expression is constant
-#endif
-
-#include <stdarg.h>
-#include <setjmp.h>
-#include <time.h>
-#include <math.h>
-#include <signal.h>
-
-#include <kpathsea/c-auto.h>
-#include <kpathsea/c-std.h>
-#include <kpathsea/c-pathmx.h>
-#include <kpathsea/c-pathch.h>
-#include <kpathsea/c-fopen.h>
-#include <kpathsea/c-ctype.h>
-#include <kpathsea/c-proto.h>
-#include <kpathsea/config.h>
-#include <kpathsea/getopt.h>
-#include <kpathsea/lib.h>
-#include <kpathsea/line.h>
-#include <kpathsea/readable.h>
-#include <kpathsea/types.h>
-#include <kpathsea/tex-file.h>
-#include <kpathsea/variable.h>
-#include <kpathsea/absolute.h>
-#ifdef _WIN32
-  #include <kpathsea/win32lib.h>
-  #include <kpathsea/concatn.h>
-#endif
-#include "zlib.h"
-#include "md5.h"
-
-typedef long long integer;
-typedef double    glue_ratio;
-typedef double    real;
-typedef FILE * alpha_file;
-typedef FILE * byte_file;
-typedef FILE * word_file;
-typedef unsigned char  ASCII_code;
-typedef unsigned short KANJI_code;
-typedef unsigned char  eight_bits;
-typedef unsigned short sixteen_bits;
-typedef integer pool_pointer;
-typedef integer str_number;
-typedef unsigned char packed_ASCII_code;
-typedef integer scaled;
-typedef integer nonnegative_integer;
-typedef unsigned char small_number;
-
-#ifdef link
-  #undef link
-#endif
-
-//#define abs(x)   ((integer)(x) >= 0 ? (integer)(x) : (integer)-(x))
-//#define fabs(x)  ((x) >= 0.0 ? (x) : -(x))
-#define chr(x)   (x)
-#define odd(x)   ((x) % 2)
-#define round(x) web2c_round((double) (x))
-#define decr(x)  --(x)
-#define incr(x)  ++(x)
-#define toint(x) ((integer) (x))
-
-EXTERN integer web2c_round (double r);
-EXTERN boolean open_input  (FILE ** f, kpse_file_format_type file_fmt, const char * fopen_mode);
-EXTERN boolean open_output (FILE ** f, const char * fopen_mode);
-EXTERN int check_fclose    (FILE * f);
-
-#define show_line(str, flag) (void) fputs(str, stdout)
-
-#define wterm(s)    (void) putc(s, stdout)
-#define wlog(s)     (void) putc(s, log_file)
-#define wterm_cr()  (void) putc('\n', stdout);
-#define wlog_cr()   (void) putc('\n', log_file);
-
-enum
-{
-  out_dvi_flag = (1 << 0),
-  out_pdf_flag = (1 << 1),
-  out_xdv_flag = (1 << 2),
-  out_dpx_flag = (1 << 3),
-};
-
-EXTERN boolean input_line (FILE * f);
-#define input_ln(stream, flag) input_line(stream)
-/* sec 0027 */
-#define a_open_in(f, p) open_input  (&(f), p, FOPEN_R_MODE)
-#define a_open_out(f)   open_output (&(f), FOPEN_W_MODE)
-#define b_open_in(f)    open_input  (&(f), kpse_tfm_format, FOPEN_RBIN_MODE)
-#define b_open_out(f)   open_output (&(f), FOPEN_WBIN_MODE)
-#define w_open_in(f)    open_input  (&(f), kpse_fmt_format, FOPEN_RBIN_MODE)
-#define w_open_out(f)   open_output (&(f), FOPEN_WBIN_MODE)
-#define a_close(f)         (void) check_fclose(f)
-#define b_close         a_close
-#define w_close         a_close
-#define gz_w_close      gzclose
-
-/* If we're running under Unix, use system calls instead of standard I/O
-to read and write the output files; also, be able to make a core dump. */
-#ifndef unix
-  #define dumpcore() exit(1)
-#else /* unix */
-  #define dumpcore abort
-#endif
-
-#ifdef COMPACTFORMAT
-EXTERN int do_dump(char * p, int item_size, int nitems, gzFile out_file);
-EXTERN int do_undump(char * p, int item_size, int nitems, gzFile out_file);
-#define dump_file gz_fmt_file
-#else
-EXTERN int do_dump(char * p, int item_size, int nitems, FILE * out_file);
-EXTERN int do_undump(char * p, int item_size, int nitems, FILE * out_file);
-#define dump_file fmt_file
-#endif
-
-#define dumpthings(base, len)           \
-  do_dump   ((char *) &(base), sizeof (base), (int) (len), dump_file)
-
-#define undumpthings(base, len)         \
-  do_undump ((char *) &(base), sizeof (base), (int) (len), dump_file)
-
-/* Use the above for all the other dumping and undumping. */
-#define generic_dump(x)   dumpthings(x, 1)
-#define generic_undump(x) undumpthings(x, 1)
-
-#define dump_wd     generic_dump
-#define undump_wd   generic_undump
-#define dump_hh     generic_dump
-#define undump_hh   generic_undump
-#define dump_qqqq   generic_dump
-#define undump_qqqq generic_undump
-
-#define dump_int(x)       \
-do                        \
-  {                       \
-    integer x_val = (x);  \
-    generic_dump (x_val); \
-  }                       \
-while (0)
-
-#define undump_int  generic_undump
-
-#define undump_size(arg1, arg2, arg3, arg4)                     \
-do                                                              \
-{                                                               \
-  undump_int(x);                                                \
-                                                                \
-  if (x < arg1)                                                 \
-    goto bad_fmt;                                               \
-                                                                \
-  if (x > arg2)                                                 \
-  {                                                             \
-    fprintf(stdout, "%s%s\n", "---! Must increase the " , arg3);\
-    goto bad_fmt;                                               \
-  }                                                             \
-  else                                                          \
-    arg4 = x;                                                   \
-}                                                               \
-while (0)
-
-#endif
\ No newline at end of file
+/* Copyright 2014 Clerk Ma\r
+\r
+   This program is free software; you can redistribute it and/or modify\r
+   it under the terms of the GNU General Public License as published by\r
+   the Free Software Foundation; either version 2 of the License, or\r
+   (at your option) any later version.\r
+\r
+   This program is distributed in the hope that it will be useful, but\r
+   WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+   General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with this program; if not, write to the Free Software\r
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA\r
+   02110-1301 USA.  */\r
+\r
+#ifndef _YANDYTEX_TEXD_H\r
+#define _YANDYTEX_TEXD_H\r
+/* headers and pragmas */\r
+\r
+#ifdef _WIN32\r
+  #pragma warning(disable:4201) // nameless struct/union\r
+  #pragma warning(disable:4267)\r
+  #pragma warning(disable:4996) // a function that was marked with deprecated\r
+  #pragma warning(disable:4701) // potentially uninitialized local variable 'name' used\r
+  #pragma warning(disable:4135) // conversion between different integral types\r
+  #pragma warning(disable:4127) // conditional expression is constant\r
+#endif\r
+\r
+#include <stdarg.h>\r
+#include <setjmp.h>\r
+#include <time.h>\r
+#include <math.h>\r
+#include <signal.h>\r
+\r
+#include <kpathsea/c-auto.h>\r
+#include <kpathsea/c-std.h>\r
+#include <kpathsea/c-pathmx.h>\r
+#include <kpathsea/c-pathch.h>\r
+#include <kpathsea/c-fopen.h>\r
+#include <kpathsea/c-ctype.h>\r
+#include <kpathsea/c-proto.h>\r
+#include <kpathsea/config.h>\r
+#include <kpathsea/getopt.h>\r
+#include <kpathsea/lib.h>\r
+#include <kpathsea/line.h>\r
+#include <kpathsea/readable.h>\r
+#include <kpathsea/types.h>\r
+#include <kpathsea/tex-file.h>\r
+#include <kpathsea/variable.h>\r
+#include <kpathsea/absolute.h>\r
+#ifdef _WIN32\r
+  #include <kpathsea/win32lib.h>\r
+  #include <kpathsea/concatn.h>\r
+#endif\r
+#include "zlib.h"\r
+\r
+typedef long long integer;\r
+typedef double    glue_ratio;\r
+typedef double    real;\r
+typedef FILE * alpha_file;\r
+typedef FILE * byte_file;\r
+typedef FILE * word_file;\r
+typedef unsigned char  ASCII_code;\r
+typedef unsigned short KANJI_code;\r
+typedef unsigned char  eight_bits;\r
+typedef unsigned short sixteen_bits;\r
+typedef integer pool_pointer;\r
+typedef integer str_number;\r
+typedef unsigned char packed_ASCII_code;\r
+typedef integer scaled;\r
+typedef integer nonnegative_integer;\r
+typedef unsigned char small_number;\r
+\r
+#ifdef link\r
+  #undef link\r
+#endif\r
+\r
+//#define abs(x)   ((integer)(x) >= 0 ? (integer)(x) : (integer)-(x))\r
+//#define fabs(x)  ((x) >= 0.0 ? (x) : -(x))\r
+#define chr(x)   (x)\r
+#define odd(x)   ((x) % 2)\r
+#define round(x) web2c_round((double) (x))\r
+#define decr(x)  --(x)\r
+#define incr(x)  ++(x)\r
+#define toint(x) ((integer) (x))\r
+\r
+EXTERN integer web2c_round (double r);\r
+EXTERN boolean open_input  (FILE ** f, kpse_file_format_type file_fmt, const char * fopen_mode);\r
+EXTERN boolean open_output (FILE ** f, const char * fopen_mode);\r
+EXTERN int check_fclose    (FILE * f);\r
+\r
+#define show_line(str, flag) (void) fputs(str, stdout)\r
+\r
+#define wterm(s)    (void) putc(s, stdout)\r
+#define wlog(s)     (void) putc(s, log_file)\r
+#define wterm_cr()  (void) putc('\n', stdout);\r
+#define wlog_cr()   (void) putc('\n', log_file);\r
+\r
+enum\r
+{\r
+  out_dvi_flag = (1 << 0),\r
+  out_pdf_flag = (1 << 1),\r
+  out_xdv_flag = (1 << 2),\r
+  out_dpx_flag = (1 << 3),\r
+};\r
+\r
+EXTERN boolean input_line (FILE * f);\r
+#define input_ln(stream, flag) input_line(stream)\r
+/* sec 0027 */\r
+#define a_open_in(f, p) open_input  (&(f), p, FOPEN_R_MODE)\r
+#define a_open_out(f)   open_output (&(f), FOPEN_W_MODE)\r
+#define b_open_in(f)    open_input  (&(f), kpse_tfm_format, FOPEN_RBIN_MODE)\r
+#define b_open_out(f)   open_output (&(f), FOPEN_WBIN_MODE)\r
+#define w_open_in(f)    open_input  (&(f), kpse_fmt_format, FOPEN_RBIN_MODE)\r
+#define w_open_out(f)   open_output (&(f), FOPEN_WBIN_MODE)\r
+#define a_close(f)         (void) check_fclose(f)\r
+#define b_close         a_close\r
+#define w_close         a_close\r
+#define gz_w_close      gzclose\r
+\r
+/* If we're running under Unix, use system calls instead of standard I/O\r
+to read and write the output files; also, be able to make a core dump. */\r
+#ifndef unix\r
+  #define dumpcore() exit(1)\r
+#else /* unix */\r
+  #define dumpcore abort\r
+#endif\r
+\r
+#ifdef COMPACTFORMAT\r
+EXTERN int do_dump(char * p, int item_size, int nitems, gzFile out_file);\r
+EXTERN int do_undump(char * p, int item_size, int nitems, gzFile out_file);\r
+#define dump_file gz_fmt_file\r
+#else\r
+EXTERN int do_dump(char * p, int item_size, int nitems, FILE * out_file);\r
+EXTERN int do_undump(char * p, int item_size, int nitems, FILE * out_file);\r
+#define dump_file fmt_file\r
+#endif\r
+\r
+#define dumpthings(base, len)           \\r
+  do_dump   ((char *) &(base), sizeof (base), (int) (len), dump_file)\r
+\r
+#define undumpthings(base, len)         \\r
+  do_undump ((char *) &(base), sizeof (base), (int) (len), dump_file)\r
+\r
+/* Use the above for all the other dumping and undumping. */\r
+#define generic_dump(x)   dumpthings(x, 1)\r
+#define generic_undump(x) undumpthings(x, 1)\r
+\r
+#define dump_wd     generic_dump\r
+#define undump_wd   generic_undump\r
+#define dump_hh     generic_dump\r
+#define undump_hh   generic_undump\r
+#define dump_qqqq   generic_dump\r
+#define undump_qqqq generic_undump\r
+\r
+#define dump_int(x)       \\r
+do                        \\r
+  {                       \\r
+    integer x_val = (x);  \\r
+    generic_dump (x_val); \\r
+  }                       \\r
+while (0)\r
+\r
+#define undump_int  generic_undump\r
+\r
+#define undump_size(arg1, arg2, arg3, arg4)                     \\r
+do                                                              \\r
+{                                                               \\r
+  undump_int(x);                                                \\r
+                                                                \\r
+  if (x < arg1)                                                 \\r
+    goto bad_fmt;                                               \\r
+                                                                \\r
+  if (x > arg2)                                                 \\r
+  {                                                             \\r
+    fprintf(stdout, "%s%s\n", "---! Must increase the " , arg3);\\r
+    goto bad_fmt;                                               \\r
+  }                                                             \\r
+  else                                                          \\r
+    arg4 = x;                                                   \\r
+}                                                               \\r
+while (0)\r
+\r
+#endif\r
index d849680..d7906e2 100644 (file)
-/* Copyright 2014 Clerk Ma
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301 USA.  */
-
-#define EXTERN extern
-
-#include "yandytex.h"
-
-/* sec 0016 */
-void do_nothing(void)
-{
-  /* todo */
-}
-/* sec 0034 */
-void update_terminal(void)
-{
-  fflush(stdout);
-}
-/* sec 0042 */
-void append_char (ASCII_code c)
-{
-  str_pool[pool_ptr] = c;
-  incr(pool_ptr);
-}
-/* sec 0042 */
-void str_room(int val)
-{
-#ifdef ALLOCATESTRING
-  if (pool_ptr + val > current_pool_size)
-    str_pool = realloc_str_pool(increment_pool_size);
-
-  if (pool_ptr + val > current_pool_size)
-    overflow("pool size", current_pool_size - init_pool_ptr);
-#else
-  if (pool_ptr + val > pool_size)
-    overflow("pool size", pool_size - init_pool_ptr);
-#endif
-}
-/* sec 0044 */
-void flush_string (void)
-{
-  decr(str_ptr);
-  pool_ptr = str_start[str_ptr];
-}
-/* sec 0048 */
-void append_lc_hex (ASCII_code c)
-{
-  if (c < 10)
-    append_char(c + '0');
-  else
-    append_char(c - 10 + 'a');
-}
-/* sec 0056 */
-/* sec 0073 */
-void print_err (const char * s)
-{
-  if (interaction == error_stop_mode)
-    do_nothing();
-  
-  print_nl("! ");
-  prints(s);
-}
-/* sec 0071 */
-void prompt_input(const char * s)
-{
-  prints(s);
-  term_input();
-}
-/* sec 0079 */
-void tex_help (unsigned int n, ...)
-{
-  int i;
-  va_list help_arg;
-
-  if (n > 6)
-    n = 6;
-
-  help_ptr = n;
-  va_start(help_arg, n);
-
-  for (i = n - 1; i > -1; --i)
-    help_line[i] = va_arg(help_arg, char *);
-
-  va_end(help_arg);
-}
-/* sec 0093 */
-void succumb (void)
-{
-  if (interaction == error_stop_mode)
-    interaction = scroll_mode;
-
-  if (log_opened)
-    error();
-
-#ifdef DEBUG
-  if (interaction > 0)
-    debug_help();
-#endif
-
-  history = error_stop_mode;
-  jump_out();
-}
-/* sec 0121 */
-void free_avail_(halfword p)
-{
-  link(p) = avail;
-  avail = p;
-#ifdef STAT
-  decr(dyn_used);
-#endif
-}
-/* sec 0180 */
-void node_list_display (integer p)
-{
-  append_char('.');
-  show_node_list(p);
-  decr(pool_ptr);
-}
-/* sec 0214 */
-void tail_append_ (pointer val)
-{
-  link(tail) = val;
-  tail = link(tail);
-}
-/* sec 0273 */
-void check_full_save_stack(void)
-{
-  if (save_ptr > max_save_stack)
-  {
-    max_save_stack = save_ptr;
-
-#ifdef ALLOCATESAVESTACK
-    if (max_save_stack > current_save_size - 6)
-      save_stack = realloc_save_stack(increment_save_size);
-
-    if (max_save_stack > current_save_size - 6)
-    {
-      overflow("save size", current_save_size);
-      return;
-    }
-#else
-    if (max_save_stack > save_size - 6)
-    {
-      overflow("save size", save_size);
-      return;
-    }
-#endif
-  }
-}
-/* sec 0321 */
-void push_input(void)
-{
-  if (input_ptr > max_in_stack)
-  {
-    max_in_stack = input_ptr;
-
-#ifdef ALLOCATEINPUTSTACK
-    if (input_ptr == current_stack_size)
-      input_stack = realloc_input_stack(increment_stack_size);
-    
-    if (input_ptr == current_stack_size)
-    {
-      overflow("input stack size", current_stack_size);
-      return;
-    }
-#else
-    if (input_ptr == stack_size)
-    {
-      overflow("input stack size", stack_size);
-      return;
-    }
-#endif
-  }
-  
-  input_stack[input_ptr] = cur_input;
-  incr(input_ptr);
-}
-/* sec 0322 */
-void pop_input(void)
-{
-  decr(input_ptr);
-  cur_input = input_stack[input_ptr];
-}
-/* sec 0532 */
-void ensure_dvi_open (void)
-{
-  if (output_file_name == 0)
-  {
-    if (job_name == 0)
-      open_log_file();
-
-    pack_job_name(".dvi");
-
-    while (!b_open_out(dvi_file))
-      prompt_file_name("file name for output", ".dvi");
-
-    output_file_name = b_make_name_string(dvi_file);
-  }
-}
-/* sec 0564 */
-void fget (void)
-{
-  fbyte = getc(tfm_file);
-}
-/* sec 0597 */
-void write_dvi(size_t a, size_t b)
-{
-  if (fwrite((char *)&dvi_buf[a], sizeof(dvi_buf[a]),
-    (b - a + 1), dvi_file) != (b - a + 1))
-    FATAL_PERROR("\n! dvi file");
-}
-/* sec 0598 */
-void dvi_out_(ASCII_code op)
-{
-  dvi_buf[dvi_ptr] = op;
-  incr(dvi_ptr);
-
-  if (dvi_ptr == dvi_limit)
-    dvi_swap();
-}
-/* sec 0616 */
-void synch_h (void)
-{
-  if (cur_h != dvi_h)
-  {
-    movement(cur_h - dvi_h, right1);
-    dvi_h = cur_h;
-  }
-}
-/* sec 0616 */
-void synch_v (void)
-{
-  if (cur_v != dvi_v)
-  {
-    movement(cur_v - dvi_v, down1);
-    dvi_v = cur_v;
-  }
-}
-/* sec 0934 */
-void set_cur_lang (void)
-{
-  if (language <= 0)
-    cur_lang = 0;
-  else if (language > 255)
-    cur_lang = 0;
-  else
-    cur_lang = language;
-}
-/* sec 0985 */
-void print_plus (int i, const char * s)
-{
-  if (page_so_far[i] != 0)
-  {
-    prints(" plus ");
-    print_scaled(page_so_far[i]);
-    prints(s);
-  }
+/* Copyright 2014 Clerk Ma\r
+\r
+   This program is free software; you can redistribute it and/or modify\r
+   it under the terms of the GNU General Public License as published by\r
+   the Free Software Foundation; either version 2 of the License, or\r
+   (at your option) any later version.\r
+\r
+   This program is distributed in the hope that it will be useful, but\r
+   WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+   General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with this program; if not, write to the Free Software\r
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA\r
+   02110-1301 USA.  */\r
+\r
+#define EXTERN extern\r
+\r
+#include "yandytex.h"\r
+\r
+/* sec 0016 */\r
+void do_nothing(void)\r
+{\r
+  /* todo */\r
+}\r
+/* sec 0034 */\r
+void update_terminal(void)\r
+{\r
+  fflush(stdout);\r
+}\r
+/* sec 0042 */\r
+void append_char (ASCII_code c)\r
+{\r
+  str_pool[pool_ptr] = c;\r
+  incr(pool_ptr);\r
+}\r
+/* sec 0042 */\r
+void str_room(int val)\r
+{\r
+#ifdef ALLOCATESTRING\r
+  if (pool_ptr + val > current_pool_size)\r
+    str_pool = realloc_str_pool(increment_pool_size);\r
+\r
+  if (pool_ptr + val > current_pool_size)\r
+    overflow("pool size", current_pool_size - init_pool_ptr);\r
+#else\r
+  if (pool_ptr + val > pool_size)\r
+    overflow("pool size", pool_size - init_pool_ptr);\r
+#endif\r
+}\r
+/* sec 0044 */\r
+void flush_string (void)\r
+{\r
+  decr(str_ptr);\r
+  pool_ptr = str_start[str_ptr];\r
+}\r
+/* sec 0048 */\r
+void append_lc_hex (ASCII_code c)\r
+{\r
+  if (c < 10)\r
+    append_char(c + '0');\r
+  else\r
+    append_char(c - 10 + 'a');\r
+}\r
+/* sec 0056 */\r
+/* sec 0073 */\r
+void print_err (const char * s)\r
+{\r
+  if (interaction == error_stop_mode)\r
+    do_nothing();\r
+  \r
+  print_nl("! ");\r
+  prints(s);\r
+}\r
+/* sec 0071 */\r
+void prompt_input(const char * s)\r
+{\r
+  prints(s);\r
+  term_input();\r
+}\r
+/* sec 0079 */\r
+void tex_help (unsigned int n, ...)\r
+{\r
+  int i;\r
+  va_list help_arg;\r
+\r
+  if (n > 6)\r
+    n = 6;\r
+\r
+  help_ptr = n;\r
+  va_start(help_arg, n);\r
+\r
+  for (i = n - 1; i > -1; --i)\r
+    help_line[i] = va_arg(help_arg, char *);\r
+\r
+  va_end(help_arg);\r
+}\r
+/* sec 0093 */\r
+void succumb (void)\r
+{\r
+  if (interaction == error_stop_mode)\r
+    interaction = scroll_mode;\r
+\r
+  if (log_opened)\r
+    error();\r
+\r
+#ifdef DEBUG\r
+  if (interaction > 0)\r
+    debug_help();\r
+#endif\r
+\r
+  history = error_stop_mode;\r
+  jump_out();\r
+}\r
+/* sec 0121 */\r
+void free_avail_(halfword p)\r
+{\r
+  link(p) = avail;\r
+  avail = p;\r
+#ifdef STAT\r
+  decr(dyn_used);\r
+#endif\r
+}\r
+/* sec 0180 */\r
+void node_list_display (integer p)\r
+{\r
+  append_char('.');\r
+  show_node_list(p);\r
+  decr(pool_ptr);\r
+}\r
+/* sec 0214 */\r
+void tail_append_ (pointer val)\r
+{\r
+  link(tail) = val;\r
+  tail = link(tail);\r
+}\r
+/* sec 0273 */\r
+void check_full_save_stack(void)\r
+{\r
+  if (save_ptr > max_save_stack)\r
+  {\r
+    max_save_stack = save_ptr;\r
+\r
+#ifdef ALLOCATESAVESTACK\r
+    if (max_save_stack > current_save_size - 6)\r
+      save_stack = realloc_save_stack(increment_save_size);\r
+\r
+    if (max_save_stack > current_save_size - 6)\r
+    {\r
+      overflow("save size", current_save_size);\r
+      return;\r
+    }\r
+#else\r
+    if (max_save_stack > save_size - 6)\r
+    {\r
+      overflow("save size", save_size);\r
+      return;\r
+    }\r
+#endif\r
+  }\r
+}\r
+/* sec 0321 */\r
+void push_input(void)\r
+{\r
+  if (input_ptr > max_in_stack)\r
+  {\r
+    max_in_stack = input_ptr;\r
+\r
+#ifdef ALLOCATEINPUTSTACK\r
+    if (input_ptr == current_stack_size)\r
+      input_stack = realloc_input_stack(increment_stack_size);\r
+    \r
+    if (input_ptr == current_stack_size)\r
+    {\r
+      overflow("input stack size", current_stack_size);\r
+      return;\r
+    }\r
+#else\r
+    if (input_ptr == stack_size)\r
+    {\r
+      overflow("input stack size", stack_size);\r
+      return;\r
+    }\r
+#endif\r
+  }\r
+  \r
+  input_stack[input_ptr] = cur_input;\r
+  incr(input_ptr);\r
+}\r
+/* sec 0322 */\r
+void pop_input(void)\r
+{\r
+  decr(input_ptr);\r
+  cur_input = input_stack[input_ptr];\r
+}\r
+/* sec 0532 */\r
+void ensure_dvi_open (void)\r
+{\r
+  if (output_file_name == 0)\r
+  {\r
+    if (job_name == 0)\r
+      open_log_file();\r
+\r
+    pack_job_name(".dvi");\r
+\r
+    while (!b_open_out(dvi_file))\r
+      prompt_file_name("file name for output", ".dvi");\r
+\r
+    output_file_name = b_make_name_string(dvi_file);\r
+  }\r
+}\r
+/* sec 0564 */\r
+void fget (void)\r
+{\r
+  fbyte = getc(tfm_file);\r
+}\r
+/* sec 0597 */\r
+void write_dvi(size_t a, size_t b)\r
+{\r
+  if (fwrite((char *)&dvi_buf[a], sizeof(dvi_buf[a]),\r
+    (b - a + 1), dvi_file) != (b - a + 1))\r
+    FATAL_PERROR("\n! dvi file");\r
+}\r
+/* sec 0598 */\r
+void dvi_out_(ASCII_code op)\r
+{\r
+  dvi_buf[dvi_ptr] = op;\r
+  incr(dvi_ptr);\r
+\r
+  if (dvi_ptr == dvi_limit)\r
+    dvi_swap();\r
+}\r
+/* sec 0616 */\r
+void synch_h (void)\r
+{\r
+  if (cur_h != dvi_h)\r
+  {\r
+    movement(cur_h - dvi_h, right1);\r
+    dvi_h = cur_h;\r
+  }\r
+}\r
+/* sec 0616 */\r
+void synch_v (void)\r
+{\r
+  if (cur_v != dvi_v)\r
+  {\r
+    movement(cur_v - dvi_v, down1);\r
+    dvi_v = cur_v;\r
+  }\r
+}\r
+/* sec 0934 */\r
+void set_cur_lang (void)\r
+{\r
+  if (language <= 0)\r
+    cur_lang = 0;\r
+  else if (language > 255)\r
+    cur_lang = 0;\r
+  else\r
+    cur_lang = language;\r
+}\r
+/* sec 0985 */\r
+void print_plus (int i, const char * s)\r
+{\r
+  if (page_so_far[i] != 0)\r
+  {\r
+    prints(" plus ");\r
+    print_scaled(page_so_far[i]);\r
+    prints(s);\r
+  }\r
 }
\ No newline at end of file
index 133b50d..fefec3e 100644 (file)
-/* Copyright 1992 Karl Berry
-   Copyright 2007 TeX Users Group
-   Copyright 2014 Clerk Ma
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301 USA.  */
-
-#define EXTERN
-
-#include "yandytex.h"
-
-#define dump_ext_length     4
-#define edit_value          tex_edit_value
-
-extern char * replacement[];
-int    gargc;
-char **gargv;
-
-int jump_used = 0;
-
-jmp_buf jumpbuffer;
-
-int main (int ac, char *av[])
-{
-  int flag = 0, ret = 0;
-
-  gargc = ac;
-  gargv = av;
-
-  if (main_init(gargc, gargv))
-    return -1;
-
-  TEX_format_default = " plain.fmt";
-  format_default_length = strlen(TEX_format_default + 1);
-
-  jump_used = 0;
-
-  ret = setjmp(jumpbuffer);
-
-  if (ret == 0)
-  {
-    flag = main_program();
-
-    if (trace_flag)
-      printf("EXITING at %s: flag = %d, ret = %d, jump_used = %d\n", "main", flag, ret, jump_used);
-  }
-  else
-  {
-    if (trace_flag)
-      printf("EXITING at %s: flag = %d, ret = %d, jump_used =  %d\n", "jump_out", flag, ret, jump_used);
-  }
-
-  if (endit(flag) != 0)
-    flag = 1; /* do final clean up in local.c */
-
-  if (flag == 0)
-    return 0;
-  else
-    exit (flag);
-}
-
-/* texk/web2c/lib/texmfmp.c */
-void t_open_in (void)
-{
-  int i;
-
-  buffer[first] = 0;
-
-  if (gargc > optind && optind > 0)
-  {
-    for (i = optind; i < gargc; i++)
-    {
-      if (allow_quoted_names && strchr(gargv[i], ' ') != NULL)
-      {
-        (void) strcat ((char *) &buffer[first], "\"");
-        (void) strcat ((char *) &buffer[first], gargv[i]);
-        (void) strcat ((char *) &buffer[first], "\"");
-      }
-      else
-        (void) strcat ((char *) &buffer[first], gargv[i]);
-
-      (void) strcat ((char *) &buffer[first], " ");
-    }
-    
-    gargc = 0;
-  }
-
-  /* Find the end of the buffer.  */
-  for (last = first; buffer[last]; ++last)
-    do_nothing();
-
-  for (--last; last >= first && ISBLANK (buffer[last]) && buffer[last] != '\r'; --last)
-    do_nothing();
-
-  last++;
-
-/* One more time, this time converting to TeX's internal character
-   representation.  */ /* for command line input in this case */
-  if (non_ascii)
-  {
-    for (i = first; i < last; i++)
-      buffer[i] = xord[buffer[i]];
-  }
-}
-
-static void catch_interrupt (int err)
-{
-  (void) err;
-  (void) signal(SIGINT, SIG_IGN);
-
-  if (interrupt++ >= 3)
-    exit(1);
-
-  (void) signal(SIGINT, catch_interrupt);
-}
-
-void fix_date_and_time (void)
-{
-  time_t clock;
-  struct tm *tmptr;
-
-  (void) time(&clock);
-
-  if (trace_flag)
-    printf("The time is %lld\n", (long long)clock);
-
-  if (clock < 0)
-    puts("Time not available!");
-
-  tmptr = localtime (&clock);
-
-  if (tmptr == NULL)
-  {
-    printf("Cannot convert time (%0lld)!\n", (long long)clock);
-    year     = 2038;
-    month    = 1;
-    day      = 18;
-    tex_time = 22 * 60 + 14;
-  }
-  else
-  {
-    tex_time = tmptr->tm_hour * 60 + tmptr->tm_min;
-    day      = tmptr->tm_mday;
-    month    = tmptr->tm_mon + 1;
-    year     = tmptr->tm_year + 1900;
-
-    if (trace_flag)
-      printf("%d-%d-%d %d:%d\n",
-        tmptr->tm_year + 1900,
-        tmptr->tm_mon + 1,
-        tmptr->tm_mday,
-        tmptr->tm_hour,
-        tmptr->tm_min);
-  }
-
-  {
-#ifdef _WIN32
-    if (signal(SIGINT, catch_interrupt) == SIG_ERR)
-    {
-      puts(" CTRL-C handler not installed");
-      uexit(EXIT_FAILURE);
-    }
-#else
-    void (*old_handler)();
-
-    old_handler = signal(SIGINT, catch_interrupt);
-
-    if (old_handler != SIG_DFL)
-      (void) signal(SIGINT, old_handler);
-#endif
-  }
-}
-
-/* I/O for TeX and Metafont. */
-void complain_line (FILE * output)
-{
-  show_line("\n", 0);
-
-#ifdef ALLOCATEBUFFER
-  sprintf(log_line, "! Unable to read an entire line---buf_size=%d.\n", current_buf_size);
-#else
-  sprintf(log_line, "! Unable to read an entire line---buf_size=%d.\n", buf_size);
-#endif
-
-  fputs(log_line, output);
-  puts("  (File may have a line termination problem.)");
-}
-
-void show_bad_line (FILE * output, int first, int last)
-{
-  int i, c, d, ch;
-  char *s = log_line;
-
-  for (i = first; i <= last; i++)
-  {
-    ch = buffer[i];
-
-    if (show_in_hex && (ch > 127))
-    {
-      c = ch >> 4;
-      d = ch & 15;
-
-      if (c > 9)
-        c = c + 'a' - 10;
-      else
-        c = c + '0';
-
-      if (d > 9)
-        d = d + 'a' - 10;
-      else
-        d = d + '0';
-
-      *s++ = '^';
-      *s++ = '^';
-
-      *s++ = (char) c;
-      *s++ = (char) d;
-    }
-    else if (ch < 32)
-    {
-      *s++ = '^';
-      *s++ = '^';
-      *s++ = (char) (ch + 64);
-    }
-    else if (ch == 127)
-    {
-      *s++ = '^';
-      *s++ = '^';
-      *s++ = (char) (ch - 64);
-    }
-    else
-    {
-      *s++ = (char) ch;
-    }
-  }
-
-  *s++ = ' ';
-  *s++ = '\0';
-
-  fputs(log_line, output);   // log_file
-}
-
-boolean input_line_finish (void)
-{
-  int i = '\0';
-  int ch, flag;
-
-  buffer[last] = ' ';
-
-  if (last >= max_buf_stack)
-    max_buf_stack = last;
-
-  while (last > first)
-  {
-    i = buffer[last - 1];
-
-    if (i == ' ' || i == '\t')
-      --last;
-    else
-      break;
-  }
-
-  if (restrict_to_ascii)
-  {
-    flag = 0;
-
-    for (i = first; i <= last; i++)
-    {
-      ch = buffer[i];
-
-      if (ch > 126 ||  (ch < ' ' && ch != '\t' && ch != '\f' && ch != '\r' && ch != '\n'))
-      {
-        sprintf(log_line, "\n! non ASCII char (%d) in line: ", ch);
-        show_line(log_line, 1);
-
-        if (log_opened)
-          fprintf(log_file, "\n! non ASCII char (%d) in line: ", ch);
-
-        flag = 1;
-        break;
-      }
-    }
-
-    if (flag)
-    {
-      show_bad_line(errout, first, last);
-
-      if (log_opened)
-        show_bad_line(log_file, first, last);
-    }
-  }
-
-  if (non_ascii)
-  {
-    for (i = first; i <= last; i++)
-      buffer[i] = xord[buffer[i]];
-  }
-
-  return true;
-}
-
-/* Read a line of input into buffer as efficiently as possible (ha ha)
-   while still looking like Pascal.
-   We set `last' to `first' and return `false' if we get to eof.
-   Otherwise, we return `true' and set last = first +
-   length(line except trailing whitespace).  */
-
-boolean input_line (FILE * f)
-{
-  char * u;        /* 1994/July/3 for key_replace */
-  int i = '\0';
-
-  last = first;
-/*  following is new version with tab expansion and key replacement */
-/*  may want to expand out separately for speed 1994/July/3 */
-/*  different versions depending on return_flag / tabexpand / key_replace */
-/*  while (last < buf_size && (i = getc (f)) != EOF)  */
-#ifdef ALLOCATEBUFFER
-  for ( ; ; ) 
-#else
-  while (last < buf_size) 
-#endif
-  {
-    i = getc(f);
-
-    if (i < ' ')
-    {
-      if (i == EOF || i == '\n' || (i == '\r' && return_flag))
-        break;
-      else if (i == '\t' && tab_step != 0)
-      {
-        buffer[last++] = (ASCII_code) ' ';
-
-#ifdef ALLOCATEBUFFER
-        if (last >= current_buf_size)
-        {
-          buffer = realloc_buffer(increment_buf_size);  
-
-          if (last >= current_buf_size)
-            break;
-        }
-#endif
-
-#ifdef ALLOCATEBUFFER
-        while ((last - first) % tab_step != 0) 
-#else
-        while (last < buf_size && (last - first) % tab_step != 0)
-#endif
-        {
-
-          buffer[last++] = (ASCII_code) ' ';
-
-#ifdef ALLOCATEBUFFER
-          if (last >= current_buf_size)
-          {
-            buffer = realloc_buffer(increment_buf_size);
-
-            if (last >= current_buf_size)
-              break;
-          }
-#endif
-        }
-
-        continue;
-      }
-    }
-
-    if (key_replace && (u = replacement[i]) != NULL)
-    {
-#ifdef ALLOCATEBUFFER
-      while (*u != '\0') 
-#else
-      while (last < buf_size && *u != '\0')  
-#endif
-      {
-        buffer[last++] = (ASCII_code) *u++;
-
-#ifdef ALLOCATEBUFFER
-        if (last >= current_buf_size)
-        {
-          buffer = realloc_buffer(increment_buf_size);
-
-          if (last >= current_buf_size)
-            break;
-        }
-#endif
-      }
-    }
-    else       /* normal case */
-    {
-      buffer[last++] = (ASCII_code) i;
-
-#ifdef ALLOCATEBUFFER
-      if (last >= current_buf_size)
-      {
-        buffer = realloc_buffer(increment_buf_size);
-
-        if (last >= current_buf_size)
-          break;
-      }
-#endif
-    }
-  }
-
-  if (return_flag)    /* let return terminate line as well as newline */
-  {
-    if (i == '\r')      /* see whether return followed by newline */
-    {
-      i = getc (f);       /* in which case throw away the newline */
-
-      if (i != '\n')
-      {
-        ungetc (i, f);
-        i = '\r';
-      }
-/*      else  buffer[last-1] = (ASCII_code) i; */
-    }
-  }
-
-  //  Turn Ctrl-Z at end of file into newline 2000 June 22
-  if (i == EOF && trimeof && buffer[last - 1] == 26)
-  {
-    last--;
-  }
-
-  if (i == EOF && last == first)
-    return false;
-
-/*  Didn't get the whole line because buffer was too small?  */
-/*  This shouldn't happen anymore 99/Jan/23 */
-  if (i != EOF && i != '\n' && i != '\r')
-  {
-    complain_line(errout);
-
-    if (log_opened)
-      complain_line(log_file);
-
-    /* This may no longer be needed ... now that we grow it */
-    if (truncate_long_lines)
-    {
-      while (i != EOF && i != '\n' && i != '\r')
-      {
-        i = getc (f);     // discard rest of line
-      }
-
-      last--;       /* just in case */
-    }
-    else
-      uexit(EXIT_FAILURE);      /* line too long */
-  }
-
-  return input_line_finish();
-}
-
-static char * edit_value = "c:\\yandy\\WinEdt\\WinEdt.exe [Open('%s');SelLine(%d,7)]";
-
-static inline int Isspace (char c)
-{
-  return (c == ' ' || c == '\t');
-}
-
-void call_edit (ASCII_code * filename, pool_pointer fnstart, integer fnlength, integer linenumber)
-{
-  char *temp, *command, *fullcmd;
-  char c;
-  int sdone, ddone, i;
-
-#ifdef WIN32
-  char *fp, *ffp, *env, editorname[256], buffer[256];
-  int cnt = 0;
-  int dontchange = 0;
-#endif
-
-  sdone = ddone = 0;
-  filename += fnstart;
-
-  /* Close any open input files, since we're going to kill the job.  */
-  for (i = 1; i <= in_open; i++)
-#ifdef XeTeX
-    xfclose (input_file[i]->f, "inputfile");
-#else
-    xfclose (input_file[i], "inputfile");
-#endif
-
-  /* Replace the default with the value of the appropriate environment
-     variable or config file value, if it's set.  */
-  temp = kpse_var_value("TEXEDIT");
-
-  if (temp != NULL)
-    edit_value = temp;
-
-  /* Construct the command string.  The `11' is the maximum length an
-     integer might be.  */
-  command = (char *) xmalloc (strlen (edit_value) + fnlength + 11);
-
-  /* So we can construct it as we go.  */
-  temp = command;
-
-#ifdef WIN32
-  fp = editorname;
-  if ((isalpha(*edit_value) && *(edit_value + 1) == ':'
-        && IS_DIR_SEP (*(edit_value + 2)))
-      || (*edit_value == '"' && isalpha(*(edit_value + 1))
-        && *(edit_value + 2) == ':'
-        && IS_DIR_SEP (*(edit_value + 3)))
-     )
-    dontchange = 1;
-#endif
-
-  while ((c = *edit_value++) != 0)
-  {
-    if (c == '%')
-    {
-      switch (c = *edit_value++)
-      {
-        case 'd':
-          if (ddone)
-            FATAL ("call_edit: `%%d' appears twice in editor command");
-          sprintf (temp, "%ld", (long int)linenumber);
-          while (*temp != '\0')
-            temp++;
-          ddone = 1;
-          break;
-        
-        case 's':
-          if (sdone)
-            FATAL ("call_edit: `%%s' appears twice in editor command");
-          for (i = 0; i < fnlength; i++)
-            *temp++ = xchr[(filename[i])];
-          sdone = 1;
-          break;
-        
-        case '\0':
-          *temp++ = '%';
-          /* Back up to the null to force termination.  */
-          edit_value--;
-          break;
-        
-        default:
-          *temp++ = '%';
-          *temp++ = c;
-          break;
-      }
-    }
-    else
-    {
-#ifdef WIN32
-      if (dontchange)
-        *temp++ = c;
-      else 
-      { 
-        if(Isspace(c) && cnt == 0)
-        {
-          cnt++;
-          temp = command;
-          *temp++ = c;
-          *fp = '\0';
-        }
-        else if(!Isspace(c) && cnt == 0)
-        {
-          *fp++ = c;
-        }
-        else
-        {
-          *temp++ = c;
-        }
-      }
-#else
-      *temp++ = c;
-#endif
-    }
-  }
-
-  *temp = 0;
-
-#ifdef WIN32
-  if (dontchange == 0) {
-    if(editorname[0] == '.' ||
-       editorname[0] == '/' ||
-       editorname[0] == '\\') {
-      fprintf(stderr, "%s is not allowed to execute.\n", editorname);
-      uexit(1);
-    }
-    env = (char *)getenv("PATH");
-    if(SearchPath(env, editorname, ".exe", 256, buffer, &ffp)==0) {
-      if(SearchPath(env, editorname, ".bat", 256, buffer, &ffp)==0) {
-        fprintf(stderr, "I cannot find %s in the PATH.\n", editorname);
-        uexit(1);
-      }
-    }
-    fullcmd = (char *)xmalloc(strlen(buffer)+strlen(command)+5);
-    strcpy(fullcmd, "\"");
-    strcat(fullcmd, buffer);
-    strcat(fullcmd, "\"");
-    strcat(fullcmd, command);
-  } else
-#endif
-  fullcmd = command;
-
-  /* Execute the command.  */
-  if (system (fullcmd) != 0)
-    fprintf(stderr, "! Trouble executing `%s'.\n", command);
-
-  /* Quit, since we found an error.  */
-  uexit(1);
-}
-
-
-#if !defined (WORDS_BIGENDIAN) && !defined (NO_FMTBASE_SWAP)
-
-/* We don't REALLY care what `endian' the machine is after all ! */
-
-// #ifdef MYDEBUG
-// char swapmarkerstring="ERROR: SWAPPING - NOT BigEndian AND NOT NoFmtBaseSwap";
-// #endif
-
-/* This macro is always invoked as a statement.  It assumes a variable
-   `temp'.  */
-   
-#define SWAP(x, y) temp = (x); (x) = (y); (y) = temp;
-
-
-/* Make the NITEMS items pointed at by P, each of size SIZE, be the
-   opposite-endianness of whatever they are now.  */
-
-static int swap_items (char *p, int nitems, int size)
-{
-  char temp;
-
-  /* Since `size' does not change, we can write a while loop for each
-     case, and avoid testing `size' for each time.  */
-  switch (size)
-  {
-    case 8:
-      while (nitems--)
-      {
-        SWAP (p[0], p[7]);
-        SWAP (p[1], p[6]);
-        SWAP (p[2], p[5]);
-        SWAP (p[3], p[4]);
-        p += size;
-      }
-      break;
-
-    case 4:
-      while (nitems--)
-      {
-        SWAP (p[0], p[3]);
-        SWAP (p[1], p[2]);
-        p += size;
-      }
-      break;
-
-    case 2:
-      while (nitems--)
-      {
-        SWAP (p[0], p[1]);
-        p += size;
-      }
-      break;
-
-    case 1:
-    /* Nothing to do.  */
-      break;
-
-    default:
-      show_line("\n", 0);
-      sprintf(log_line, "! I can't (un)dump a %d byte item.\n", size);
-      show_line(log_line, 1);
-      uexit(EXIT_FAILURE);
-  }
-  return 0;
-}
-#endif /* not WORDS_BIGENDIAN and not NO_FMTBASE_SWAP */
-
-#ifdef COMPACTFORMAT
-int do_dump (char *p, int item_size, int nitems, gzFile out_file)
-#else
-int do_dump (char *p, int item_size, int nitems, FILE *out_file)
-#endif
-{
-#if !defined (WORDS_BIGENDIAN) && !defined (NO_FMTBASE_SWAP)
-  swap_items (p, nitems, item_size);
-#endif
-
-#ifdef COMPACTFORMAT
-  if (gzwrite(out_file, p, (item_size * nitems)) != (item_size * nitems))
-#else
-  if ((int) fwrite(p, item_size, nitems, out_file) != nitems)
-#endif
-  {
-    printf("\n! Could not write %d %d-byte item%s.\n",
-               nitems, item_size, (nitems > 1) ? "s" : "");
-    uexit(EXIT_FAILURE);
-  }
-
-/* Have to restore the old contents of memory, since some of it might get used again.  */
-#if !defined (WORDS_BIGENDIAN) && !defined (NO_FMTBASE_SWAP)
-  swap_items (p, nitems, item_size);
-#endif
-
-  return 0;
-}
-
-#ifdef COMPACTFORMAT
-int do_undump (char *p, int item_size, int nitems, gzFile in_file)
-#else
-int do_undump (char *p, int item_size, int nitems, FILE *in_file)
-#endif
-{
-#ifdef COMPACTFORMAT
-  if (gzread(in_file, (void *) p, (unsigned int) (item_size * nitems)) <= 0)
-#else
-  if ((int) fread((void *) p, item_size, nitems, in_file) != nitems)
-#endif
-  {
-    printf("\n! Could not read %d %d-byte item%s.\n",
-               nitems, item_size, (nitems > 1) ? "s" : "");
-    uexit(EXIT_FAILURE);
-  }
-
-#if !defined (WORDS_BIGENDIAN) && !defined (NO_FMTBASE_SWAP)
-  swap_items (p, nitems, item_size);
-#endif
-
-  return 0;
-}
-
-#ifdef FUNNY_CORE_DUMP
-
-void funny_core_dump (void)
-{
-  int pid, w;
-  union wait status;
-
-  switch (pid = vfork ())
-  {
-    case -1:
-      perrormod ("vfork");
-      exit (-1);
-
-    case 0:
-       (void) signal (SIGQUIT, SIG_DFL);
-       (void) kill (getpid (), SIGQUIT);
-       (void) write (2, "how did we get here?\n", 21);
-       exit (1);
-
-    default:
-      while ((w = wait (&status)) != pid && w != -1)
-        ;
-
-      if (status.w_coredump)
-        exit (0);
-
-      (void) write (2, "attempt to dump core failed\n", 28);
-      exit (1);
-  }
-}
+/* Copyright 1992 Karl Berry\r
+   Copyright 2007 TeX Users Group\r
+   Copyright 2014 Clerk Ma\r
+\r
+   This program is free software; you can redistribute it and/or modify\r
+   it under the terms of the GNU General Public License as published by\r
+   the Free Software Foundation; either version 2 of the License, or\r
+   (at your option) any later version.\r
+\r
+   This program is distributed in the hope that it will be useful, but\r
+   WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+   General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with this program; if not, write to the Free Software\r
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA\r
+   02110-1301 USA.  */\r
+\r
+#define EXTERN\r
+\r
+#include "yandytex.h"\r
+\r
+#define dump_ext_length     4\r
+#define edit_value          tex_edit_value\r
+\r
+extern char * replacement[];\r
+int    gargc;\r
+char **gargv;\r
+\r
+int jump_used = 0;\r
+\r
+jmp_buf jumpbuffer;\r
+\r
+int main (int ac, char *av[])\r
+{\r
+  int flag = 0, ret = 0;\r
+\r
+  gargc = ac;\r
+  gargv = av;\r
+\r
+  if (main_init(gargc, gargv))\r
+    return -1;\r
+\r
+  TEX_format_default = " plain.fmt";\r
+  format_default_length = strlen(TEX_format_default + 1);\r
+\r
+  jump_used = 0;\r
+\r
+  ret = setjmp(jumpbuffer);\r
+\r
+  if (ret == 0)\r
+  {\r
+    flag = main_program();\r
+\r
+    if (trace_flag)\r
+      printf("EXITING at %s: flag = %d, ret = %d, jump_used = %d\n", "main", flag, ret, jump_used);\r
+  }\r
+  else\r
+  {\r
+    if (trace_flag)\r
+      printf("EXITING at %s: flag = %d, ret = %d, jump_used =  %d\n", "jump_out", flag, ret, jump_used);\r
+  }\r
+\r
+  if (endit(flag) != 0)\r
+    flag = 1; /* do final clean up in local.c */\r
+\r
+  if (flag == 0)\r
+    return 0;\r
+  else\r
+    exit (flag);\r
+}\r
+\r
+/* texk/web2c/lib/texmfmp.c */\r
+void t_open_in (void)\r
+{\r
+  int i;\r
+\r
+  buffer[first] = 0;\r
+\r
+  if (gargc > optind && optind > 0)\r
+  {\r
+    for (i = optind; i < gargc; i++)\r
+    {\r
+      if (allow_quoted_names && strchr(gargv[i], ' ') != NULL)\r
+      {\r
+        (void) strcat ((char *) &buffer[first], "\"");\r
+        (void) strcat ((char *) &buffer[first], gargv[i]);\r
+        (void) strcat ((char *) &buffer[first], "\"");\r
+      }\r
+      else\r
+        (void) strcat ((char *) &buffer[first], gargv[i]);\r
+\r
+      (void) strcat ((char *) &buffer[first], " ");\r
+    }\r
+    \r
+    gargc = 0;\r
+  }\r
+\r
+  /* Find the end of the buffer.  */\r
+  for (last = first; buffer[last]; ++last)\r
+    do_nothing();\r
+\r
+  for (--last; last >= first && ISBLANK (buffer[last]) && buffer[last] != '\r'; --last)\r
+    do_nothing();\r
+\r
+  last++;\r
+\r
+/* One more time, this time converting to TeX's internal character\r
+   representation.  */ /* for command line input in this case */\r
+  if (non_ascii)\r
+  {\r
+    for (i = first; i < last; i++)\r
+      buffer[i] = xord[buffer[i]];\r
+  }\r
+}\r
+\r
+static void catch_interrupt (int err)\r
+{\r
+  (void) err;\r
+  (void) signal(SIGINT, SIG_IGN);\r
+\r
+  if (interrupt++ >= 3)\r
+    exit(1);\r
+\r
+  (void) signal(SIGINT, catch_interrupt);\r
+}\r
+\r
+void fix_date_and_time (void)\r
+{\r
+  time_t clock;\r
+  struct tm *tmptr;\r
+\r
+  (void) time(&clock);\r
+\r
+  if (trace_flag)\r
+    printf("The time is %lld\n", (long long)clock);\r
+\r
+  if (clock < 0)\r
+    puts("Time not available!");\r
+\r
+  tmptr = localtime (&clock);\r
+\r
+  if (tmptr == NULL)\r
+  {\r
+    printf("Cannot convert time (%0lld)!\n", (long long)clock);\r
+    year     = 2038;\r
+    month    = 1;\r
+    day      = 18;\r
+    tex_time = 22 * 60 + 14;\r
+  }\r
+  else\r
+  {\r
+    tex_time = tmptr->tm_hour * 60 + tmptr->tm_min;\r
+    day      = tmptr->tm_mday;\r
+    month    = tmptr->tm_mon + 1;\r
+    year     = tmptr->tm_year + 1900;\r
+\r
+    if (trace_flag)\r
+      printf("%d-%d-%d %d:%d\n",\r
+        tmptr->tm_year + 1900,\r
+        tmptr->tm_mon + 1,\r
+        tmptr->tm_mday,\r
+        tmptr->tm_hour,\r
+        tmptr->tm_min);\r
+  }\r
+\r
+  {\r
+#ifdef _WIN32\r
+    if (signal(SIGINT, catch_interrupt) == SIG_ERR)\r
+    {\r
+      puts(" CTRL-C handler not installed");\r
+      uexit(EXIT_FAILURE);\r
+    }\r
+#else\r
+    void (*old_handler)();\r
+\r
+    old_handler = signal(SIGINT, catch_interrupt);\r
+\r
+    if (old_handler != SIG_DFL)\r
+      (void) signal(SIGINT, old_handler);\r
+#endif\r
+  }\r
+}\r
+\r
+/* I/O for TeX and Metafont. */\r
+void complain_line (FILE * output)\r
+{\r
+  show_line("\n", 0);\r
+\r
+#ifdef ALLOCATEBUFFER\r
+  sprintf(log_line, "! Unable to read an entire line---buf_size=%d.\n", current_buf_size);\r
+#else\r
+  sprintf(log_line, "! Unable to read an entire line---buf_size=%d.\n", buf_size);\r
+#endif\r
+\r
+  fputs(log_line, output);\r
+  puts("  (File may have a line termination problem.)");\r
+}\r
+\r
+void show_bad_line (FILE * output, int first, int last)\r
+{\r
+  int i, c, d, ch;\r
+  char *s = log_line;\r
+\r
+  for (i = first; i <= last; i++)\r
+  {\r
+    ch = buffer[i];\r
+\r
+    if (show_in_hex && (ch > 127))\r
+    {\r
+      c = ch >> 4;\r
+      d = ch & 15;\r
+\r
+      if (c > 9)\r
+        c = c + 'a' - 10;\r
+      else\r
+        c = c + '0';\r
+\r
+      if (d > 9)\r
+        d = d + 'a' - 10;\r
+      else\r
+        d = d + '0';\r
+\r
+      *s++ = '^';\r
+      *s++ = '^';\r
+\r
+      *s++ = (char) c;\r
+      *s++ = (char) d;\r
+    }\r
+    else if (ch < 32)\r
+    {\r
+      *s++ = '^';\r
+      *s++ = '^';\r
+      *s++ = (char) (ch + 64);\r
+    }\r
+    else if (ch == 127)\r
+    {\r
+      *s++ = '^';\r
+      *s++ = '^';\r
+      *s++ = (char) (ch - 64);\r
+    }\r
+    else\r
+    {\r
+      *s++ = (char) ch;\r
+    }\r
+  }\r
+\r
+  *s++ = ' ';\r
+  *s++ = '\0';\r
+\r
+  fputs(log_line, output);   // log_file\r
+}\r
+\r
+boolean input_line_finish (void)\r
+{\r
+  int i = '\0';\r
+  int ch, flag;\r
+\r
+  buffer[last] = ' ';\r
+\r
+  if (last >= max_buf_stack)\r
+    max_buf_stack = last;\r
+\r
+  while (last > first)\r
+  {\r
+    i = buffer[last - 1];\r
+\r
+    if (i == ' ' || i == '\t')\r
+      --last;\r
+    else\r
+      break;\r
+  }\r
+\r
+  if (restrict_to_ascii)\r
+  {\r
+    flag = 0;\r
+\r
+    for (i = first; i <= last; i++)\r
+    {\r
+      ch = buffer[i];\r
+\r
+      if (ch > 126 ||  (ch < ' ' && ch != '\t' && ch != '\f' && ch != '\r' && ch != '\n'))\r
+      {\r
+        sprintf(log_line, "\n! non ASCII char (%d) in line: ", ch);\r
+        show_line(log_line, 1);\r
+\r
+        if (log_opened)\r
+          fprintf(log_file, "\n! non ASCII char (%d) in line: ", ch);\r
+\r
+        flag = 1;\r
+        break;\r
+      }\r
+    }\r
+\r
+    if (flag)\r
+    {\r
+      show_bad_line(errout, first, last);\r
+\r
+      if (log_opened)\r
+        show_bad_line(log_file, first, last);\r
+    }\r
+  }\r
+\r
+  if (non_ascii)\r
+  {\r
+    for (i = first; i <= last; i++)\r
+      buffer[i] = xord[buffer[i]];\r
+  }\r
+\r
+  return true;\r
+}\r
+\r
+/* Read a line of input into buffer as efficiently as possible (ha ha)\r
+   while still looking like Pascal.\r
+   We set `last' to `first' and return `false' if we get to eof.\r
+   Otherwise, we return `true' and set last = first +\r
+   length(line except trailing whitespace).  */\r
+\r
+boolean input_line (FILE * f)\r
+{\r
+  char * u;        /* 1994/July/3 for key_replace */\r
+  int i = '\0';\r
+\r
+  last = first;\r
+/*  following is new version with tab expansion and key replacement */\r
+/*  may want to expand out separately for speed 1994/July/3 */\r
+/*  different versions depending on return_flag / tabexpand / key_replace */\r
+/*  while (last < buf_size && (i = getc (f)) != EOF)  */\r
+#ifdef ALLOCATEBUFFER\r
+  for ( ; ; ) \r
+#else\r
+  while (last < buf_size) \r
+#endif\r
+  {\r
+    i = getc(f);\r
+\r
+    if (i < ' ')\r
+    {\r
+      if (i == EOF || i == '\n' || (i == '\r' && return_flag))\r
+        break;\r
+      else if (i == '\t' && tab_step != 0)\r
+      {\r
+        buffer[last++] = (ASCII_code) ' ';\r
+\r
+#ifdef ALLOCATEBUFFER\r
+        if (last >= current_buf_size)\r
+        {\r
+          buffer = realloc_buffer(increment_buf_size);  \r
+\r
+          if (last >= current_buf_size)\r
+            break;\r
+        }\r
+#endif\r
+\r
+#ifdef ALLOCATEBUFFER\r
+        while ((last - first) % tab_step != 0) \r
+#else\r
+        while (last < buf_size && (last - first) % tab_step != 0)\r
+#endif\r
+        {\r
+\r
+          buffer[last++] = (ASCII_code) ' ';\r
+\r
+#ifdef ALLOCATEBUFFER\r
+          if (last >= current_buf_size)\r
+          {\r
+            buffer = realloc_buffer(increment_buf_size);\r
+\r
+            if (last >= current_buf_size)\r
+              break;\r
+          }\r
+#endif\r
+        }\r
+\r
+        continue;\r
+      }\r
+    }\r
+\r
+    if (key_replace && (u = replacement[i]) != NULL)\r
+    {\r
+#ifdef ALLOCATEBUFFER\r
+      while (*u != '\0') \r
+#else\r
+      while (last < buf_size && *u != '\0')  \r
+#endif\r
+      {\r
+        buffer[last++] = (ASCII_code) *u++;\r
+\r
+#ifdef ALLOCATEBUFFER\r
+        if (last >= current_buf_size)\r
+        {\r
+          buffer = realloc_buffer(increment_buf_size);\r
+\r
+          if (last >= current_buf_size)\r
+            break;\r
+        }\r
+#endif\r
+      }\r
+    }\r
+    else       /* normal case */\r
+    {\r
+      buffer[last++] = (ASCII_code) i;\r
+\r
+#ifdef ALLOCATEBUFFER\r
+      if (last >= current_buf_size)\r
+      {\r
+        buffer = realloc_buffer(increment_buf_size);\r
+\r
+        if (last >= current_buf_size)\r
+          break;\r
+      }\r
+#endif\r
+    }\r
+  }\r
+\r
+  if (return_flag)    /* let return terminate line as well as newline */\r
+  {\r
+    if (i == '\r')      /* see whether return followed by newline */\r
+    {\r
+      i = getc (f);       /* in which case throw away the newline */\r
+\r
+      if (i != '\n')\r
+      {\r
+        ungetc (i, f);\r
+        i = '\r';\r
+      }\r
+/*      else  buffer[last-1] = (ASCII_code) i; */\r
+    }\r
+  }\r
+\r
+  //  Turn Ctrl-Z at end of file into newline 2000 June 22\r
+  if (i == EOF && trimeof && buffer[last - 1] == 26)\r
+  {\r
+    last--;\r
+  }\r
+\r
+  if (i == EOF && last == first)\r
+    return false;\r
+\r
+/*  Didn't get the whole line because buffer was too small?  */\r
+/*  This shouldn't happen anymore 99/Jan/23 */\r
+  if (i != EOF && i != '\n' && i != '\r')\r
+  {\r
+    complain_line(errout);\r
+\r
+    if (log_opened)\r
+      complain_line(log_file);\r
+\r
+    /* This may no longer be needed ... now that we grow it */\r
+    if (truncate_long_lines)\r
+    {\r
+      while (i != EOF && i != '\n' && i != '\r')\r
+      {\r
+        i = getc (f);     // discard rest of line\r
+      }\r
+\r
+      last--;       /* just in case */\r
+    }\r
+    else\r
+      uexit(EXIT_FAILURE);      /* line too long */\r
+  }\r
+\r
+  return input_line_finish();\r
+}\r
+\r
+static char * edit_value = "c:\\yandy\\WinEdt\\WinEdt.exe [Open('%s');SelLine(%d,7)]";\r
+\r
+static inline int Isspace (char c)\r
+{\r
+  return (c == ' ' || c == '\t');\r
+}\r
+\r
+void call_edit (ASCII_code * filename, pool_pointer fnstart, integer fnlength, integer linenumber)\r
+{\r
+  char *temp, *command, *fullcmd;\r
+  char c;\r
+  int sdone, ddone, i;\r
+\r
+#ifdef WIN32\r
+  char *fp, *ffp, *env, editorname[256], buffer[256];\r
+  int cnt = 0;\r
+  int dontchange = 0;\r
+#endif\r
+\r
+  sdone = ddone = 0;\r
+  filename += fnstart;\r
+\r
+  /* Close any open input files, since we're going to kill the job.  */\r
+  for (i = 1; i <= in_open; i++)\r
+#ifdef XeTeX\r
+    xfclose (input_file[i]->f, "inputfile");\r
+#else\r
+    xfclose (input_file[i], "inputfile");\r
+#endif\r
+\r
+  /* Replace the default with the value of the appropriate environment\r
+     variable or config file value, if it's set.  */\r
+  temp = kpse_var_value("TEXEDIT");\r
+\r
+  if (temp != NULL)\r
+    edit_value = temp;\r
+\r
+  /* Construct the command string.  The `11' is the maximum length an\r
+     integer might be.  */\r
+  command = (char *) xmalloc (strlen (edit_value) + fnlength + 11);\r
+\r
+  /* So we can construct it as we go.  */\r
+  temp = command;\r
+\r
+#ifdef WIN32\r
+  fp = editorname;\r
+  if ((isalpha(*edit_value) && *(edit_value + 1) == ':'\r
+        && IS_DIR_SEP (*(edit_value + 2)))\r
+      || (*edit_value == '"' && isalpha(*(edit_value + 1))\r
+        && *(edit_value + 2) == ':'\r
+        && IS_DIR_SEP (*(edit_value + 3)))\r
+     )\r
+    dontchange = 1;\r
+#endif\r
+\r
+  while ((c = *edit_value++) != 0)\r
+  {\r
+    if (c == '%')\r
+    {\r
+      switch (c = *edit_value++)\r
+      {\r
+        case 'd':\r
+          if (ddone)\r
+            FATAL ("call_edit: `%%d' appears twice in editor command");\r
+          sprintf (temp, "%ld", (long int)linenumber);\r
+          while (*temp != '\0')\r
+            temp++;\r
+          ddone = 1;\r
+          break;\r
+        \r
+        case 's':\r
+          if (sdone)\r
+            FATAL ("call_edit: `%%s' appears twice in editor command");\r
+          for (i = 0; i < fnlength; i++)\r
+            *temp++ = xchr[(filename[i])];\r
+          sdone = 1;\r
+          break;\r
+        \r
+        case '\0':\r
+          *temp++ = '%';\r
+          /* Back up to the null to force termination.  */\r
+          edit_value--;\r
+          break;\r
+        \r
+        default:\r
+          *temp++ = '%';\r
+          *temp++ = c;\r
+          break;\r
+      }\r
+    }\r
+    else\r
+    {\r
+#ifdef WIN32\r
+      if (dontchange)\r
+        *temp++ = c;\r
+      else \r
+      { \r
+        if(Isspace(c) && cnt == 0)\r
+        {\r
+          cnt++;\r
+          temp = command;\r
+          *temp++ = c;\r
+          *fp = '\0';\r
+        }\r
+        else if(!Isspace(c) && cnt == 0)\r
+        {\r
+          *fp++ = c;\r
+        }\r
+        else\r
+        {\r
+          *temp++ = c;\r
+        }\r
+      }\r
+#else\r
+      *temp++ = c;\r
+#endif\r
+    }\r
+  }\r
+\r
+  *temp = 0;\r
+\r
+#ifdef WIN32\r
+  if (dontchange == 0) {\r
+    if(editorname[0] == '.' ||\r
+       editorname[0] == '/' ||\r
+       editorname[0] == '\\') {\r
+      fprintf(stderr, "%s is not allowed to execute.\n", editorname);\r
+      uexit(1);\r
+    }\r
+    env = (char *)getenv("PATH");\r
+    if(SearchPath(env, editorname, ".exe", 256, buffer, &ffp)==0) {\r
+      if(SearchPath(env, editorname, ".bat", 256, buffer, &ffp)==0) {\r
+        fprintf(stderr, "I cannot find %s in the PATH.\n", editorname);\r
+        uexit(1);\r
+      }\r
+    }\r
+    fullcmd = (char *)xmalloc(strlen(buffer)+strlen(command)+5);\r
+    strcpy(fullcmd, "\"");\r
+    strcat(fullcmd, buffer);\r
+    strcat(fullcmd, "\"");\r
+    strcat(fullcmd, command);\r
+  } else\r
+#endif\r
+  fullcmd = command;\r
+\r
+  /* Execute the command.  */\r
+  if (system (fullcmd) != 0)\r
+    fprintf(stderr, "! Trouble executing `%s'.\n", command);\r
+\r
+  /* Quit, since we found an error.  */\r
+  uexit(1);\r
+}\r
+\r
+\r
+#if !defined (WORDS_BIGENDIAN) && !defined (NO_FMTBASE_SWAP)\r
+\r
+/* We don't REALLY care what `endian' the machine is after all ! */\r
+\r
+// #ifdef MYDEBUG\r
+// char swapmarkerstring="ERROR: SWAPPING - NOT BigEndian AND NOT NoFmtBaseSwap";\r
+// #endif\r
+\r
+/* This macro is always invoked as a statement.  It assumes a variable\r
+   `temp'.  */\r
+   \r
+#define SWAP(x, y) temp = (x); (x) = (y); (y) = temp;\r
+\r
+\r
+/* Make the NITEMS items pointed at by P, each of size SIZE, be the\r
+   opposite-endianness of whatever they are now.  */\r
+\r
+static int swap_items (char *p, int nitems, int size)\r
+{\r
+  char temp;\r
+\r
+  /* Since `size' does not change, we can write a while loop for each\r
+     case, and avoid testing `size' for each time.  */\r
+  switch (size)\r
+  {\r
+    case 8:\r
+      while (nitems--)\r
+      {\r
+        SWAP (p[0], p[7]);\r
+        SWAP (p[1], p[6]);\r
+        SWAP (p[2], p[5]);\r
+        SWAP (p[3], p[4]);\r
+        p += size;\r
+      }\r
+      break;\r
+\r
+    case 4:\r
+      while (nitems--)\r
+      {\r
+        SWAP (p[0], p[3]);\r
+        SWAP (p[1], p[2]);\r
+        p += size;\r
+      }\r
+      break;\r
+\r
+    case 2:\r
+      while (nitems--)\r
+      {\r
+        SWAP (p[0], p[1]);\r
+        p += size;\r
+      }\r
+      break;\r
+\r
+    case 1:\r
+    /* Nothing to do.  */\r
+      break;\r
+\r
+    default:\r
+      show_line("\n", 0);\r
+      sprintf(log_line, "! I can't (un)dump a %d byte item.\n", size);\r
+      show_line(log_line, 1);\r
+      uexit(EXIT_FAILURE);\r
+  }\r
+  return 0;\r
+}\r
+#endif /* not WORDS_BIGENDIAN and not NO_FMTBASE_SWAP */\r
+\r
+#ifdef COMPACTFORMAT\r
+int do_dump (char *p, int item_size, int nitems, gzFile out_file)\r
+#else\r
+int do_dump (char *p, int item_size, int nitems, FILE *out_file)\r
+#endif\r
+{\r
+#if !defined (WORDS_BIGENDIAN) && !defined (NO_FMTBASE_SWAP)\r
+  swap_items (p, nitems, item_size);\r
+#endif\r
+\r
+#ifdef COMPACTFORMAT\r
+  if (gzwrite(out_file, p, (item_size * nitems)) != (item_size * nitems))\r
+#else\r
+  if ((int) fwrite(p, item_size, nitems, out_file) != nitems)\r
+#endif\r
+  {\r
+    printf("\n! Could not write %d %d-byte item%s.\n",\r
+               nitems, item_size, (nitems > 1) ? "s" : "");\r
+    uexit(EXIT_FAILURE);\r
+  }\r
+\r
+/* Have to restore the old contents of memory, since some of it might get used again.  */\r
+#if !defined (WORDS_BIGENDIAN) && !defined (NO_FMTBASE_SWAP)\r
+  swap_items (p, nitems, item_size);\r
+#endif\r
+\r
+  return 0;\r
+}\r
+\r
+#ifdef COMPACTFORMAT\r
+int do_undump (char *p, int item_size, int nitems, gzFile in_file)\r
+#else\r
+int do_undump (char *p, int item_size, int nitems, FILE *in_file)\r
+#endif\r
+{\r
+#ifdef COMPACTFORMAT\r
+  if (gzread(in_file, (void *) p, (unsigned int) (item_size * nitems)) <= 0)\r
+#else\r
+  if ((int) fread((void *) p, item_size, nitems, in_file) != nitems)\r
+#endif\r
+  {\r
+    printf("\n! Could not read %d %d-byte item%s.\n",\r
+               nitems, item_size, (nitems > 1) ? "s" : "");\r
+    uexit(EXIT_FAILURE);\r
+  }\r
+\r
+#if !defined (WORDS_BIGENDIAN) && !defined (NO_FMTBASE_SWAP)\r
+  swap_items (p, nitems, item_size);\r
+#endif\r
+\r
+  return 0;\r
+}\r
+\r
+#ifdef FUNNY_CORE_DUMP\r
+\r
+void funny_core_dump (void)\r
+{\r
+  int pid, w;\r
+  union wait status;\r
+\r
+  switch (pid = vfork ())\r
+  {\r
+    case -1:\r
+      perrormod ("vfork");\r
+      exit (-1);\r
+\r
+    case 0:\r
+       (void) signal (SIGQUIT, SIG_DFL);\r
+       (void) kill (getpid (), SIGQUIT);\r
+       (void) write (2, "how did we get here?\n", 21);\r
+       exit (1);\r
+\r
+    default:\r
+      while ((w = wait (&status)) != pid && w != -1)\r
+        ;\r
+\r
+      if (status.w_coredump)\r
+        exit (0);\r
+\r
+      (void) write (2, "attempt to dump core failed\n", 28);\r
+      exit (1);\r
+  }\r
+}\r
 #endif /* FUNNY_CORE_DUMP */
\ No newline at end of file
index dbaf3af..ae073cd 100644 (file)
-#ifndef _YANDYTEX_H
-#define _YANDYTEX_H
-
-#define ALLOCATEINI        /* allocate iniTeX (550 k) trie_c, trie_o, trie_l, trie_r, trie_hash, trie_taken */
-#define ALLOCATEMAIN       /* allocate main memory for TeX (2 Meg) */
-#define ALLOCATEFONT       /* allocate font_info (800 k) (dynamically now) */
-#define ALLOCATETRIES      /* allocate hyphenation trie stuff (270 k) trie_trl, trie_tro, trie_trc */
-#define ALLOCATEHYPHEN     /* allocate hyphenation exception tables */
-#define VARIABLETRIESIZE   /* allow trie_size to be variable */
-#define ALLOCATESTRING     /* allocate strings and string pointers (184 k) str_pool & str_start */
-#define ALLOCATESAVESTACK  /* experiment to dynamically deal with save_stack   */
-#define ALLOCATEINPUTSTACK /* experiment to dynamically deal with input_stack  */
-#define ALLOCATENESTSTACK  /* experiment to dynamically deal with nest_stack   */
-#define ALLOCATEPARAMSTACK /* experiment to dynamically deal with param_stack  */
-#define ALLOCATEBUFFER     /* experiment to dynamically deal with input buffer */
-#define INCREASEFIXED      /* max_in_open */
-#define INCREASEFONTS      /* 65536 fonts */
-#define INCREASETRIEOP     /* tire_* */
-#define COMPACTFORMAT      /* .fmt file with zlib */
-#define STAT               /* TeX's statistics (tex82) */
-#define INITEX             /* invoke initex */
-#define WORDS_BIGENDIAN 0  /* about format file */
-
-#include "texd.h"
-
-#define file_name_size PATH_MAX
-
-#define min_halfword -2147483647L /* LONG_MIN, for 64 bit memory word (signed) */
-#define max_halfword  2147483647L /* LONG_MAX, for 64 bit memory word (signed) */
-
-#define block_size 1000 /* block_size for variable length node alloc */
-
-#define min_quarterword 0
-#ifdef INCREASEFONTS
-  #define max_quarterword 65535L
-#else
-  #define max_quarterword 255
-#endif
-
-#define default_mem_top 262140L  /* usual big TeX allocation 2 Meg bytes */
-/* #define default_mem_top 131070L */ /* usual big TeX allocation 1 Meg bytes */
-/* #define default_mem_top 65534L  */ /* usual small TeX allocation 0.5 Meg   */
-
-#define mem_bot 0
-
-#ifdef ALLOCATEMAIN
-  EXTERN integer mem_top;
-  EXTERN integer mem_max;
-  EXTERN integer mem_min;
-  #define max_mem_size (max_halfword / sizeof(memory_word) - 1)
-#else
-  #define mem_top 262140L
-  #define mem_max mem_top
-  #define mem_min 0
-#endif
-
-#ifdef ALLOCATEBUFFER
-  #define initial_buf_size   1000
-  #define increment_buf_size 2000
-  #define buf_size           2000000L
-  EXTERN ASCII_code *        buffer;
-#else
-  #define buf_size           20000
-  EXTERN ASCII_code          buffer[buf_size + 4];
-#endif
-
-EXTERN integer first; 
-EXTERN integer last; 
-EXTERN integer max_buf_stack; 
-
-#define error_line      79
-#define half_error_line 50
-#define max_print_line  79
-
-#ifdef INCREASEFIXED
-  #define max_in_open 127
-#else
-  #define max_in_open 15
-#endif
-
-#ifdef INCREASEFONTS
-  #define font_max 65535
-#else
-  #define font_max 255
-#endif
-
-#ifdef ALLOCATEFONT
-  #define font_mem_size (max_halfword / sizeof(memory_word) - 1)
-  #define initial_font_mem_size   20000
-  #define increment_font_mem_size 40000
-#else
-  #define font_mem_size 100000L
-#endif
-
-#ifdef ALLOCATESTRING
-  #define max_strings (max_halfword / sizeof(pool_pointer) - 1)
-  #define pool_size (max_halfword - 1)
-#else
-  #define max_strings 16384
-  #define pool_size 124000L
-#endif
-
-#define string_vacancies 100000L
-
-#ifdef VARIABLETRIESIZE
-  EXTERN integer trie_size;
-  #define default_trie_size 60000
-#else
-  #define trie_size 30000
-#endif
-
-#ifdef INCREASETRIEOP
-  #define trie_op_size      3001
-  #define neg_trie_op_size -3001
-  #define min_trie_op       0
-  #define max_trie_op       1000
-#else
-  #define trie_op_size      751
-  #define neg_trie_op_size -751
-  #define min_trie_op       0
-  #define max_trie_op       500
-#endif
-
-
-#define dvi_buf_size 16384
-
-#define hash_extra (255 - font_max)
-#define hash_prime 27197 // (prime ~ 85% * (hash_size + hash_extra))
-#define hash_size  97280 // 32768 9500 25000
-
-#if (hash_extra != 255 - font_max)
-  #error ERROR: hash_extra not equal to (255 - font_max)
-#endif
-
-/* sec 0113 */
-#ifdef INCREASEFONTS
-  typedef unsigned short quarterword;
-#else
-  typedef unsigned char quarterword;
-#endif
-
-/* typedef unsigned long halfword; NO NO: since mem_min may be < 0 */
-/* sec 0113 */
-typedef int32_t halfword;
-typedef halfword pointer;
-typedef char two_choices;
-typedef char four_choices;
-/* sec 0113 */
-#include "memory.h"
-#include "macros.h"
-/* sec 0150 */
-typedef char glue_ord; 
-/* sec 0212 */
-typedef struct
-{
-  int mode_field;
-  halfword head_field, tail_field;
-  integer pg_field, ml_field;
-  memory_word aux_field;
-} list_state_record;
-/* sec 0269 */
-typedef char group_code;
-/* sec 0300 */
-typedef struct
-{
-  quarterword state_field, index_field; 
-  halfword start_field, loc_field, limit_field, name_field;
-} in_state_record; 
-/* sec 0548 */
-typedef integer internal_font_number;
-typedef integer font_index;
-/* sec 0594 */
-typedef integer dvi_index;
-/* sec 0920 */
-typedef integer trie_op_code;
-/* sec 0925 */
-typedef integer trie_pointer;
-typedef integer hyph_pointer;
-
-EXTERN integer bad;
-EXTERN ASCII_code xord[256];
-EXTERN ASCII_code xchr[256];
-EXTERN ASCII_code name_of_file[file_name_size + 4];
-EXTERN integer name_length;
-
-#ifdef ALLOCATESTRING
-  #define initial_pool_size     40000
-  #define increment_pool_size   80000
-  EXTERN packed_ASCII_code *    str_pool;
-  #define initial_max_strings   5000
-  #define increment_max_strings 10000
-  EXTERN pool_pointer *         str_start;
-#else
-  EXTERN packed_ASCII_code      str_pool[pool_size + 1]; 
-  EXTERN pool_pointer           str_start[max_strings + 1]; 
-#endif
-
-EXTERN pool_pointer pool_ptr;
-EXTERN str_number   str_ptr;
-EXTERN pool_pointer init_pool_ptr;
-EXTERN str_number   init_str_ptr;
-
-#ifdef INITEX
-  EXTERN alpha_file pool_file; 
-#endif
-
-EXTERN alpha_file log_file; 
-EXTERN int selector;
-EXTERN char dig[23 + 1];
-EXTERN integer tally;
-EXTERN integer term_offset;
-EXTERN integer file_offset;
-EXTERN ASCII_code trick_buf[error_line + 1];
-EXTERN integer trick_count;
-EXTERN integer first_count;
-EXTERN int interaction;
-EXTERN boolean deletions_allowed;
-EXTERN boolean set_box_allowed;
-EXTERN int history;
-EXTERN int error_count;
-EXTERN char * help_line[6];
-EXTERN int help_ptr;
-EXTERN boolean use_err_help;
-EXTERN volatile integer interrupt;
-EXTERN boolean OK_to_interrupt;
-EXTERN boolean arith_error;
-EXTERN scaled tex_remainder;
-EXTERN halfword temp_ptr;
-
-/* sec 0116 */
-#ifdef ALLOCATEMAIN
-  EXTERN memory_word * main_memory;
-  EXTERN memory_word * mem;
-#else
-  EXTERN memory_word zzzaa[mem_max - mem_bot + 1];
-  #define zmem (zzzaa - (int)(mem_bot))
-#endif
-
-EXTERN pointer lo_mem_max;
-EXTERN pointer hi_mem_min;
-EXTERN integer var_used, dyn_used;
-/* sec 0118 */
-EXTERN pointer avail;
-EXTERN pointer mem_end;
-EXTERN pointer mem_start;
-/* sec 0124 */
-EXTERN pointer rover;
-/* sec 0165 */
-/* NOTE: the following really also need to be dynamically allocated */
-#ifdef DEBUG
-  #ifdef ALLOCATEMAIN
-    EXTERN char * zzzab;
-  #else
-
-  EXTERN char
-#define freearr (zzzab - (int)(mem_bot))
-  zzzab[mem_max - mem_bot + 1]; 
-#endif
-
-#ifdef ALLOCATEMAIN
-  EXTERN char *zzzac;
-#else
-/* EXTERN boolean */   /* save (4 - 1) * mem_max - mem_min */
-EXTERN char
-/* #define wasfree (zzzac - (int)(mem_min)) */
-#define wasfree (zzzac - (int)(mem_bot))
-/*  zzzac[mem_max - mem_min + 1];  */
-  zzzac[mem_max - mem_bot + 1]; 
-#endif
-
-EXTERN pointer was_mem_end, was_lo_max, was_hi_min;
-EXTERN boolean panicking;
-#endif /* DEBUG */
-
-EXTERN integer font_in_short_display;
-EXTERN integer depth_threshold;
-EXTERN integer breadth_max;
-EXTERN int shown_mode;
-EXTERN int old_setting;
-
-#ifdef INCREASEFONTS
-  #define eqtb_extra (font_max - 255 + hash_extra)
-#else
-  #define eqtb_extra 0
-#endif
-
-#if (eqtb_extra != 0)
-  #error ERROR: eqtb_extra is not zero (need hash_extra equal 255 - font_max)
-#endif
-
-#ifdef INCREASEFONTS
-  EXTERN memory_word eqtb[eqtb_size + 1 + eqtb_extra];
-#else
-  EXTERN memory_word eqtb[eqtb_size + 1];
-#endif
-
-#ifdef INCREASEFONTS
-  #define xeq_level (zzzad - (int_base + eqtb_extra))
-#else
-  #define xeq_level (zzzad - (int_base))
-#endif
-
-EXTERN quarterword zzzad[eqtb_size - int_base + 1];
-
-#ifdef ALLOCATEHASH
-  EXTERN two_halves *zzzae;
-  #define hash (zzzae - hash_base)
-#else
-  #ifdef INCREASEFONTS
-    EXTERN two_halves zzzae[undefined_control_sequence - hash_base + eqtb_extra];
-  #else
-    EXTERN two_halves zzzae[undefined_control_sequence - hash_base];
-  #endif
-
-  #define hash (zzzae - hash_base)
-#endif
-
-EXTERN pointer hash_used;
-EXTERN boolean no_new_control_sequence;
-EXTERN integer cs_count;
-
-/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */
-/* using allocated save stack slows it down 1% to 2%                       */
-/* despite reallocation, we still limit it to something finite             */
-/* to avoid soaking up all of machine memory in case of infinite loop      */
-#ifdef ALLOCATESAVESTACK
-  #define save_size           65536
-  #define initial_save_size   1000
-  #define increment_save_size 2000
-  EXTERN memory_word * save_stack;
-#else
-  #define save_size 8000
-  EXTERN memory_word save_stack[save_size + 1];
-#endif
-
-EXTERN integer save_ptr;
-EXTERN integer max_save_stack;
-EXTERN int cur_level;
-EXTERN int cur_group;
-EXTERN integer cur_boundary;
-EXTERN integer mag_set;
-EXTERN int cur_cmd;
-EXTERN halfword cur_chr;
-EXTERN pointer cur_cs;
-EXTERN halfword cur_tok;
-
-#ifdef ALLOCATENESTSTACK
-  #define nest_size           65536
-  #define initial_nest_size   100
-  #define increment_nest_size 200
-  EXTERN list_state_record * nest;
-#else
-  #define nest_size 200
-  EXTERN list_state_record nest[nest_size + 1];
-#endif
-
-EXTERN integer nest_ptr;
-EXTERN integer max_nest_stack;
-EXTERN list_state_record cur_list;
-
-#ifdef ALLOCATEPARAMSTACK
-  #define param_size           65536
-  #define initial_param_size   100
-  #define increment_param_size 200
-  EXTERN pointer * param_stack;
-#else
-  #define param_size 500
-  EXTERN pointer param_stack[param_size + 1];
-#endif
-
-EXTERN integer param_ptr;
-EXTERN integer max_param_stack;
-
-#ifdef ALLOCATEINPUTSTACK
-  #define stack_size           65536
-  #define initial_stack_size   100
-  #define increment_stack_size 200
-  EXTERN in_state_record * input_stack;
-#else
-  #define stack_size 800
-  EXTERN in_state_record input_stack[stack_size + 1];
-#endif
-
-EXTERN integer input_ptr;
-EXTERN integer max_in_stack;
-EXTERN integer high_in_open;
-EXTERN in_state_record cur_input;
-EXTERN int in_open;
-EXTERN integer open_parens;
-EXTERN integer max_open_parens;
-EXTERN alpha_file input_file[max_in_open + 1];
-EXTERN integer line;
-EXTERN integer line_stack[max_in_open + 1];
-EXTERN int scanner_status;
-EXTERN pointer warning_index;
-EXTERN pointer def_ref;
-EXTERN integer align_state;
-EXTERN integer base_ptr;
-EXTERN pointer par_loc;
-EXTERN halfword par_token;
-EXTERN boolean force_eof;
-EXTERN pointer cur_mark[6];
-EXTERN int long_state;
-EXTERN pointer pstack[10];
-EXTERN integer cur_val;
-EXTERN int cur_val_level;
-EXTERN int radix;
-EXTERN int cur_order;
-EXTERN alpha_file read_file[16];
-EXTERN char read_open[20];
-EXTERN pointer cond_ptr;
-EXTERN int if_limit;
-EXTERN int cur_if;
-EXTERN integer if_line;
-EXTERN integer skip_line;
-EXTERN str_number cur_name;
-EXTERN str_number cur_area;
-EXTERN str_number cur_ext;
-EXTERN pool_pointer area_delimiter;
-EXTERN pool_pointer ext_delimiter;
-EXTERN integer format_default_length;
-EXTERN char * TEX_format_default;
-EXTERN boolean name_in_progress;
-EXTERN boolean log_opened;
-EXTERN boolean quoted_file_name;
-EXTERN str_number job_name;
-EXTERN const char * c_job_name;
-EXTERN str_number output_file_name;
-EXTERN str_number log_name;
-EXTERN byte_file dvi_file;
-EXTERN byte_file tfm_file;
-EXTERN byte_file pdf_file;
-EXTERN char * dvi_file_name;
-EXTERN char * pdf_file_name;
-EXTERN char * log_file_name;
-
-#ifdef ALLOCATEFONT
-  EXTERN memory_word * font_info;
-#else
-  EXTERN memory_word font_info[font_mem_size + 1];
-#endif
-
-EXTERN font_index fmem_ptr;
-EXTERN internal_font_number font_ptr;
-EXTERN internal_font_number frozen_font_ptr;
-EXTERN four_quarters font_check[font_max + 1];
-EXTERN int    font_id[font_max + 1];
-EXTERN scaled font_size[font_max + 1];
-EXTERN scaled font_dsize[font_max + 1];
-EXTERN font_index font_params[font_max + 1];
-EXTERN str_number font_name[font_max + 1];
-EXTERN str_number font_area[font_max + 1];
-EXTERN eight_bits font_bc[font_max + 1];
-EXTERN eight_bits font_ec[font_max + 1];
-EXTERN pointer font_glue[font_max + 1];
-EXTERN boolean font_used[font_max + 1];
-EXTERN integer hyphen_char[font_max + 1];
-EXTERN integer skew_char[font_max + 1];
-EXTERN font_index bchar_label[font_max + 1];
-EXTERN short font_bchar[font_max + 1];
-EXTERN short font_false_bchar[font_max + 1];
-EXTERN integer char_base[font_max + 1];
-EXTERN integer width_base[font_max + 1];
-EXTERN integer height_base[font_max + 1];
-EXTERN integer depth_base[font_max + 1];
-EXTERN integer italic_base[font_max + 1];
-EXTERN integer lig_kern_base[font_max + 1];
-EXTERN integer kern_base[font_max + 1];
-EXTERN integer exten_base[font_max + 1];
-EXTERN integer param_base[font_max + 1];
-EXTERN four_quarters null_character;
-EXTERN integer total_pages;
-EXTERN scaled max_v;
-EXTERN scaled max_h;
-EXTERN integer max_push;
-EXTERN integer last_bop;
-EXTERN integer dead_cycles;
-EXTERN boolean doing_leaders;
-EXTERN quarterword c, f;
-EXTERN scaled rule_ht, rule_dp, rule_wd;
-EXTERN pointer g;
-EXTERN integer lq, lr;
-EXTERN eight_bits dvi_buf[dvi_buf_size + 4];
-EXTERN dvi_index half_buf;
-EXTERN dvi_index dvi_limit;
-EXTERN dvi_index dvi_ptr;
-EXTERN integer dvi_offset;
-EXTERN integer pdf_offset;
-EXTERN integer dvi_gone;
-EXTERN pointer down_ptr, right_ptr;
-EXTERN scaled dvi_h, dvi_v;
-EXTERN scaled cur_h, cur_v;
-EXTERN internal_font_number dvi_f;
-EXTERN integer cur_s;
-EXTERN scaled total_stretch[4], total_shrink[4];
-EXTERN integer last_badness;
-EXTERN pointer adjust_tail;
-EXTERN integer pack_begin_line;
-EXTERN two_halves empty_field;
-EXTERN four_quarters null_delimiter;
-EXTERN pointer cur_mlist;
-EXTERN small_number cur_style;
-EXTERN small_number cur_size;
-EXTERN scaled cur_mu;
-EXTERN boolean mlist_penalties;
-EXTERN internal_font_number cur_f;
-EXTERN quarterword cur_c;
-EXTERN four_quarters cur_i;
-EXTERN integer magic_offset;
-EXTERN pointer cur_align;
-EXTERN pointer cur_span;
-EXTERN pointer cur_loop;
-EXTERN pointer align_ptr;
-EXTERN pointer cur_head, cur_tail;
-EXTERN pointer just_box;
-EXTERN pointer passive;
-EXTERN pointer printed_node;
-EXTERN halfword pass_number;
-EXTERN scaled active_width[8];
-EXTERN scaled cur_active_width[8];
-EXTERN scaled background[8];
-EXTERN scaled break_width[8];
-EXTERN boolean no_shrink_error_yet;
-EXTERN pointer cur_p;
-EXTERN boolean second_pass;
-EXTERN boolean final_pass;
-EXTERN integer threshold;
-EXTERN integer minimal_demerits[4];
-EXTERN integer minimum_demerits;
-EXTERN pointer best_place[4];
-EXTERN halfword best_pl_line[4];
-EXTERN scaled disc_width;
-EXTERN halfword easy_line;
-EXTERN halfword last_special_line;
-EXTERN scaled first_width;
-EXTERN scaled second_width;
-EXTERN scaled first_indent;
-EXTERN scaled second_indent;
-EXTERN pointer best_bet;
-EXTERN integer fewest_demerits;
-EXTERN halfword best_line;
-EXTERN integer actual_looseness;
-EXTERN integer line_diff;
-EXTERN int hc[66];
-EXTERN int hn;
-EXTERN halfword ha, hb;
-EXTERN int hf;
-EXTERN int hu[66];
-EXTERN int hyf_char;
-EXTERN int cur_lang, init_cur_lang;
-EXTERN integer l_hyf, r_hyf;
-EXTERN integer init_l_hyf, init_r_hyf;
-EXTERN halfword hyf_bchar;
-EXTERN char hyf[68];
-EXTERN pointer init_list;
-EXTERN boolean init_lig;
-EXTERN boolean init_lft;
-EXTERN int hyphen_passed;
-EXTERN halfword cur_l, cur_r;
-EXTERN pointer cur_q;
-EXTERN pointer lig_stack;
-EXTERN boolean ligature_present;
-EXTERN boolean lft_hit, rt_hit;
-
-#ifdef ALLOCATETRIES
-  EXTERN halfword * trie_trl;
-  EXTERN halfword * trie_tro;
-  EXTERN quarterword * trie_trc;
-#else
-  EXTERN halfword trie_trl[trie_size + 1];
-  EXTERN halfword trie_tro[trie_size + 1];
-  EXTERN quarterword trie_trc[trie_size + 1];
-#endif
-
-EXTERN small_number hyf_distance[trie_op_size + 1];
-EXTERN small_number hyf_num[trie_op_size + 1];
-EXTERN trie_op_code hyf_next[trie_op_size + 1];
-EXTERN integer op_start[256];
-
-#ifdef ALLOCATEHYPHEN
-  #define default_hyphen_prime 1009
-  EXTERN str_number * hyph_word;
-  EXTERN pointer * hyph_list;
-  EXTERN integer hyphen_prime;
-#else
-  #define hyphen_prime 607
-  EXTERN str_number hyph_word[hyphen_prime + 1];
-  EXTERN pointer hyph_list[hyphen_prime + 1];
-#endif
-
-EXTERN hyph_pointer hyph_count;
-
-#ifdef INITEX
-  EXTERN integer trie_op_hash_C[trie_op_size - neg_trie_op_size + 1];
-  #define trie_op_hash (trie_op_hash_C - (int)(neg_trie_op_size)) 
-  EXTERN trie_op_code trie_used[256];
-  EXTERN ASCII_code trie_op_lang[trie_op_size + 1];
-  EXTERN trie_op_code trie_op_val[trie_op_size + 1];
-  EXTERN integer trie_op_ptr;
-#endif
-
-EXTERN trie_op_code max_op_used;
-
-#ifdef INITEX
-  #ifdef ALLOCATEINI
-    EXTERN packed_ASCII_code * trie_c; /* characters to match */
-    EXTERN trie_op_code * trie_o;      /* operations to perform */
-    EXTERN trie_pointer * trie_l;      /* left subtrie links */
-    EXTERN trie_pointer * trie_r;      /* right subtrie links */
-    EXTERN trie_pointer * trie_hash;   /* used to identify equivlent subtries */
-  #else
-    EXTERN packed_ASCII_code trie_c[trie_size + 1];
-    EXTERN trie_op_code trie_o[trie_size + 1];
-    EXTERN trie_pointer trie_l[trie_size + 1];
-    EXTERN trie_pointer trie_r[trie_size + 1];
-    EXTERN trie_pointer trie_hash[trie_size + 1];
-  #endif
-
-  EXTERN trie_pointer trie_ptr;
-#endif
-
-#ifdef INITEX
-  #ifdef ALLOCATEINI
-    EXTERN char * trie_taken;
-  #else
-    EXTERN boolean trie_taken[trie_size + 1];
-  #endif
-
-  EXTERN trie_pointer trie_min[256];
-  EXTERN trie_pointer trie_max;
-  EXTERN boolean trie_not_ready;
-#endif
-
-EXTERN scaled best_height_plus_depth;
-EXTERN pointer page_tail;
-EXTERN int page_contents;
-
-#if (half_error_line < 30) || (half_error_line > error_line - 15)
-  #error ERROR: (half_error_line < 30) || (half_error_line > error_line - 15) BAD 1
-#endif
-
-#if (max_print_line < 60)
-  #error ERROR: (max_print_line < 60) BAD 2
-#endif
-
-#if (hash_prime > hash_size)
-  #error ERROR: (hash_prime > hash_size) BAD 5
-#endif
-
-#if (max_in_open > 127)
-  #error ERROR: (max_in_open > 127) BAD 6
-#endif
-
-#if (min_quarterword > 0) || (max_quarterword < 127)
-  #error ERROR: (min_quarterword > 0) || (max_quarterword < 127) BAD 11
-#endif
-
-#if (min_halfword > 0) || (max_halfword < 32767)
-  #error ERROR:  (min_halfword > 0) || (max_halfword < 32767) BAD 12
-#endif
-
-#if (min_quarterword < min_halfword) || (max_quarterword > max_halfword)
-  #error ERROR: (min_quarterword < min_halfword) || (max_quarterword > max_halfword) BAD 13
-#endif
-
-#if (font_max > max_quarterword)
-  #error ERROR: (font_max > max_quarterword) BAD 15
-#endif
-
-#if (save_size > max_halfword)
-  #error ERROR: (save_size > max_halfword) BAD 17
-#endif
-
-#if (buf_size > max_halfword)
-  #error ERROR:  (buf_size > max_halfword) BAD 18
-#endif
-
-#if (max_quarterword - min_quarterword) < 255
-  #error (max_quarterword - min_quarterword) < 255 BAD 19
-#endif
-
-EXTERN scaled page_max_depth;
-EXTERN pointer best_page_break;
-EXTERN integer least_page_cost;
-EXTERN scaled best_size;
-EXTERN scaled page_so_far[8];
-EXTERN pointer last_glue;
-EXTERN integer last_penalty;
-EXTERN scaled last_kern;
-EXTERN integer insert_penalties;
-EXTERN boolean output_active;
-/* sec 1032 */
-EXTERN internal_font_number main_f;
-EXTERN four_quarters main_i;
-EXTERN four_quarters main_j;
-EXTERN font_index main_k;
-EXTERN pointer main_p;
-EXTERN integer main_s;
-EXTERN halfword bchar;
-EXTERN halfword false_bchar;
-EXTERN boolean cancel_boundary;
-EXTERN boolean ins_disc;
-/* sec 1074 */
-EXTERN pointer cur_box;
-EXTERN halfword after_token;
-EXTERN boolean long_help_seen;
-EXTERN str_number format_ident;
-EXTERN word_file fmt_file;
-EXTERN gzFile gz_fmt_file;
-/* sec 1331 */
-EXTERN integer ready_already;
-/* sec 1342 */
-EXTERN alpha_file write_file[16];
-EXTERN boolean write_open[18];
-/* sec 1345 */
-EXTERN pointer write_loc;
-EXTERN pool_pointer edit_name_start;
-EXTERN integer edit_name_length, edit_line;
-EXTERN int fbyte;
-/* new variables defined in local.c */
-EXTERN boolean is_initex;
-EXTERN boolean verbose_flag;
-EXTERN boolean trace_flag;
-EXTERN boolean open_trace_flag;
-EXTERN boolean knuth_flag;
-EXTERN boolean c_style_flag;
-EXTERN boolean non_ascii;
-EXTERN boolean key_replace;
-EXTERN boolean deslash;
-EXTERN boolean trimeof;
-EXTERN boolean allow_patterns;
-EXTERN boolean show_fonts_used;
-EXTERN boolean reset_exceptions;
-EXTERN boolean show_current;
-EXTERN boolean return_flag;
-EXTERN boolean civilize_flag;
-EXTERN boolean show_numeric;
-EXTERN boolean restrict_to_ascii;
-EXTERN boolean show_missing;
-EXTERN boolean full_file_name_flag;
-EXTERN int mem_initex;
-EXTERN int mem_extra_high;
-EXTERN int mem_extra_low;
-EXTERN int new_hyphen_prime;
-EXTERN int missing_characters;
-EXTERN boolean show_in_hex;
-EXTERN boolean show_in_dos;
-EXTERN boolean show_fmt_flag;
-EXTERN boolean show_tfm_flag;
-EXTERN boolean truncate_long_lines;
-EXTERN boolean show_cs_names;
-EXTERN int tab_step;
-EXTERN int pseudo_tilde;
-EXTERN int pseudo_space;
-EXTERN boolean allow_quoted_names;
-EXTERN int default_rule;
-EXTERN char * format_file;
-EXTERN char * source_direct;
-EXTERN char * format_name;
-EXTERN boolean show_line_break_stats;
-EXTERN int first_pass_count;
-EXTERN int second_pass_count;
-EXTERN int final_pass_count;
-EXTERN int underfull_hbox;
-EXTERN int overfull_hbox;
-EXTERN int underfull_vbox;
-EXTERN int overfull_vbox;
-EXTERN int paragraph_failed;
-EXTERN int single_line;
-EXTERN FILE * errout;
-EXTERN int ignore_frozen;
-EXTERN boolean suppress_f_ligs;
-EXTERN int jump_used;
-EXTERN jmp_buf jumpbuffer;
-extern int current_pool_size;
-extern int current_max_strings;
-extern int current_mem_size;
-extern int current_font_mem_size;
-extern int current_save_size;
-extern int current_stack_size;
-extern int current_nest_size;
-extern int current_param_size;
-extern int current_buf_size;
-extern const char * banner;
-extern const char * application;
-extern const char * yandyversion;
-extern unsigned char wintodos[128];
-extern char log_line[256];
-extern char * dvi_directory;
-extern char * log_directory;
-extern char * aux_directory;
-extern char * fmt_directory;
-extern char * pdf_directory;
-extern clock_t start_time, main_time, finish_time;
-
-extern memory_word * allocate_main_memory (int size);
-extern memory_word * realloc_main (int lo_size, int hi_size);
-extern packed_ASCII_code * realloc_str_pool (int size);
-extern pool_pointer * realloc_str_start (int size);
-extern memory_word * realloc_save_stack (int size);
-extern list_state_record * realloc_nest_stack (int size);
-extern in_state_record * realloc_input_stack (int size);
-extern halfword * realloc_param_stack (int size);
-extern ASCII_code * realloc_buffer (int size);
-extern memory_word * realloc_font_info (int size);
-extern int realloc_hyphen (int hyphen_prime);
-extern int allocate_tries (int trie_max);
-extern void probe_memory (void);
-extern void print_cs_names (FILE * output, int pass);
-extern void perrormod (const char * s);
-extern char * grabenv (const char * varname);
-extern void flush_trailing_slash (char * directory);
-extern boolean prime (int x);
-extern int endit (int flag);
-extern void uexit (int unix_code);
-extern void t_open_in (void);
-extern void call_edit (ASCII_code * filename, pool_pointer fnstart,
-  integer fnlength, integer linenumber);
-extern void add_variable_space (int size);
-extern char * unixify (char * t);
-
-#include "coerce.h"
-
-/* sec 79 */
-extern void node_list_display (integer p);
-extern void do_nothing (void);
-extern void update_terminal (void);
-extern void check_full_save_stack (void);
-extern void push_input (void);
-extern void pop_input (void);
-extern void print_err (const char * s);
-extern void ensure_dvi_open (void);
-extern void write_dvi (size_t a, size_t b);
-extern void prompt_input (const char * s);
-extern void synch_h (void);
-extern void synch_v (void);
-extern void set_cur_lang (void);
-extern char * md5_file (FILE * in_file);
-extern void str_room (int val);
-extern void tail_append_ (pointer val);
-#define tail_append(a) tail_append_((pointer) a)
-extern void tex_help (unsigned int n, ...);
-extern void append_char (ASCII_code c);
-extern void append_lc_hex (ASCII_code c);
-extern void succumb (void);
-extern void dvi_out_ (ASCII_code op);
-#define dvi_out(op) dvi_out_((ASCII_code) (op))
-extern void free_avail_ (halfword p);
-#define free_avail(p) free_avail_((halfword) (p))
-extern void flush_string (void);
-extern str_number load_pool_strings (integer spare_size);
-extern str_number make_string_pool (const char * s);
-extern void print_plus (int i, const char * s);
-#define help0()     tex_help(0)
-#define help1(...)  tex_help(1, __VA_ARGS__)
-#define help2(...)  tex_help(2, __VA_ARGS__)
-#define help3(...)  tex_help(3, __VA_ARGS__)
-#define help4(...)  tex_help(4, __VA_ARGS__)
-#define help5(...)  tex_help(5, __VA_ARGS__)
-#define help6(...)  tex_help(6, __VA_ARGS__)
-extern char * md5_file_name(const char * file_name);
-extern void fget (void);
-extern str_number get_job_name (str_number job);
-extern void show_font_info (void);
-
-EXTERN int shipout_flag;
-#endif
+#ifndef _YANDYTEX_H\r
+#define _YANDYTEX_H\r
+\r
+#define ALLOCATEINI        /* allocate iniTeX (550 k) trie_c, trie_o, trie_l, trie_r, trie_hash, trie_taken */\r
+#define ALLOCATEMAIN       /* allocate main memory for TeX (2 Meg) */\r
+#define ALLOCATEFONT       /* allocate font_info (800 k) (dynamically now) */\r
+#define ALLOCATETRIES      /* allocate hyphenation trie stuff (270 k) trie_trl, trie_tro, trie_trc */\r
+#define ALLOCATEHYPHEN     /* allocate hyphenation exception tables */\r
+#define VARIABLETRIESIZE   /* allow trie_size to be variable */\r
+#define ALLOCATESTRING     /* allocate strings and string pointers (184 k) str_pool & str_start */\r
+#define ALLOCATESAVESTACK  /* experiment to dynamically deal with save_stack   */\r
+#define ALLOCATEINPUTSTACK /* experiment to dynamically deal with input_stack  */\r
+#define ALLOCATENESTSTACK  /* experiment to dynamically deal with nest_stack   */\r
+#define ALLOCATEPARAMSTACK /* experiment to dynamically deal with param_stack  */\r
+#define ALLOCATEBUFFER     /* experiment to dynamically deal with input buffer */\r
+#define INCREASEFIXED      /* max_in_open */\r
+#define INCREASEFONTS      /* 65536 fonts */\r
+#define INCREASETRIEOP     /* tire_* */\r
+#define COMPACTFORMAT      /* .fmt file with zlib */\r
+#define STAT               /* TeX's statistics (tex82) */\r
+#define INITEX             /* invoke initex */\r
+#define WORDS_BIGENDIAN 0  /* about format file */\r
+\r
+#include "texd.h"\r
+\r
+#define file_name_size PATH_MAX\r
+\r
+#define min_halfword -2147483647L /* LONG_MIN, for 64 bit memory word (signed) */\r
+#define max_halfword  2147483647L /* LONG_MAX, for 64 bit memory word (signed) */\r
+\r
+#define block_size 1000 /* block_size for variable length node alloc */\r
+\r
+#define min_quarterword 0\r
+#ifdef INCREASEFONTS\r
+  #define max_quarterword 65535L\r
+#else\r
+  #define max_quarterword 255\r
+#endif\r
+\r
+#define default_mem_top 262140L  /* usual big TeX allocation 2 Meg bytes */\r
+/* #define default_mem_top 131070L */ /* usual big TeX allocation 1 Meg bytes */\r
+/* #define default_mem_top 65534L  */ /* usual small TeX allocation 0.5 Meg   */\r
+\r
+#define mem_bot 0\r
+\r
+#ifdef ALLOCATEMAIN\r
+  EXTERN integer mem_top;\r
+  EXTERN integer mem_max;\r
+  EXTERN integer mem_min;\r
+  #define max_mem_size (max_halfword / sizeof(memory_word) - 1)\r
+#else\r
+  #define mem_top 262140L\r
+  #define mem_max mem_top\r
+  #define mem_min 0\r
+#endif\r
+\r
+#ifdef ALLOCATEBUFFER\r
+  #define initial_buf_size   1000\r
+  #define increment_buf_size 2000\r
+  #define buf_size           2000000L\r
+  EXTERN ASCII_code *        buffer;\r
+#else\r
+  #define buf_size           20000\r
+  EXTERN ASCII_code          buffer[buf_size + 4];\r
+#endif\r
+\r
+EXTERN integer first; \r
+EXTERN integer last; \r
+EXTERN integer max_buf_stack; \r
+\r
+#define error_line      79\r
+#define half_error_line 50\r
+#define max_print_line  79\r
+\r
+#ifdef INCREASEFIXED\r
+  #define max_in_open 127\r
+#else\r
+  #define max_in_open 15\r
+#endif\r
+\r
+#ifdef INCREASEFONTS\r
+  #define font_max 65535\r
+#else\r
+  #define font_max 255\r
+#endif\r
+\r
+#ifdef ALLOCATEFONT\r
+  #define font_mem_size (max_halfword / sizeof(memory_word) - 1)\r
+  #define initial_font_mem_size   20000\r
+  #define increment_font_mem_size 40000\r
+#else\r
+  #define font_mem_size 100000L\r
+#endif\r
+\r
+#ifdef ALLOCATESTRING\r
+  #define max_strings (max_halfword / sizeof(pool_pointer) - 1)\r
+  #define pool_size (max_halfword - 1)\r
+#else\r
+  #define max_strings 16384\r
+  #define pool_size 124000L\r
+#endif\r
+\r
+#define string_vacancies 100000L\r
+\r
+#ifdef VARIABLETRIESIZE\r
+  EXTERN integer trie_size;\r
+  #define default_trie_size 60000\r
+#else\r
+  #define trie_size 30000\r
+#endif\r
+\r
+#ifdef INCREASETRIEOP\r
+  #define trie_op_size      3001\r
+  #define neg_trie_op_size -3001\r
+  #define min_trie_op       0\r
+  #define max_trie_op       1000\r
+#else\r
+  #define trie_op_size      751\r
+  #define neg_trie_op_size -751\r
+  #define min_trie_op       0\r
+  #define max_trie_op       500\r
+#endif\r
+\r
+\r
+#define dvi_buf_size 16384\r
+\r
+#define hash_extra (255 - font_max)\r
+#define hash_prime 27197 // (prime ~ 85% * (hash_size + hash_extra))\r
+#define hash_size  97280 // 32768 9500 25000\r
+\r
+#if (hash_extra != 255 - font_max)\r
+  #error ERROR: hash_extra not equal to (255 - font_max)\r
+#endif\r
+\r
+/* sec 0113 */\r
+#ifdef INCREASEFONTS\r
+  typedef unsigned short quarterword;\r
+#else\r
+  typedef unsigned char quarterword;\r
+#endif\r
+\r
+/* typedef unsigned long halfword; NO NO: since mem_min may be < 0 */\r
+/* sec 0113 */\r
+typedef int32_t halfword;\r
+typedef halfword pointer;\r
+typedef char two_choices;\r
+typedef char four_choices;\r
+/* sec 0113 */\r
+#include "memory.h"\r
+#include "macros.h"\r
+/* sec 0150 */\r
+typedef char glue_ord; \r
+/* sec 0212 */\r
+typedef struct\r
+{\r
+  int mode_field;\r
+  halfword head_field, tail_field;\r
+  integer pg_field, ml_field;\r
+  memory_word aux_field;\r
+} list_state_record;\r
+/* sec 0269 */\r
+typedef char group_code;\r
+/* sec 0300 */\r
+typedef struct\r
+{\r
+  quarterword state_field, index_field; \r
+  halfword start_field, loc_field, limit_field, name_field;\r
+} in_state_record; \r
+/* sec 0548 */\r
+typedef integer internal_font_number;\r
+typedef integer font_index;\r
+/* sec 0594 */\r
+typedef integer dvi_index;\r
+/* sec 0920 */\r
+typedef integer trie_op_code;\r
+/* sec 0925 */\r
+typedef integer trie_pointer;\r
+typedef integer hyph_pointer;\r
+\r
+EXTERN integer bad;\r
+EXTERN ASCII_code xord[256];\r
+EXTERN ASCII_code xchr[256];\r
+EXTERN ASCII_code name_of_file[file_name_size + 4];\r
+EXTERN integer name_length;\r
+\r
+#ifdef ALLOCATESTRING\r
+  #define initial_pool_size     40000\r
+  #define increment_pool_size   80000\r
+  EXTERN packed_ASCII_code *    str_pool;\r
+  #define initial_max_strings   5000\r
+  #define increment_max_strings 10000\r
+  EXTERN pool_pointer *         str_start;\r
+#else\r
+  EXTERN packed_ASCII_code      str_pool[pool_size + 1]; \r
+  EXTERN pool_pointer           str_start[max_strings + 1]; \r
+#endif\r
+\r
+EXTERN pool_pointer pool_ptr;\r
+EXTERN str_number   str_ptr;\r
+EXTERN pool_pointer init_pool_ptr;\r
+EXTERN str_number   init_str_ptr;\r
+\r
+#ifdef INITEX\r
+  EXTERN alpha_file pool_file; \r
+#endif\r
+\r
+EXTERN alpha_file log_file; \r
+EXTERN int selector;\r
+EXTERN char dig[23 + 1];\r
+EXTERN integer tally;\r
+EXTERN integer term_offset;\r
+EXTERN integer file_offset;\r
+EXTERN ASCII_code trick_buf[error_line + 1];\r
+EXTERN integer trick_count;\r
+EXTERN integer first_count;\r
+EXTERN int interaction;\r
+EXTERN boolean deletions_allowed;\r
+EXTERN boolean set_box_allowed;\r
+EXTERN int history;\r
+EXTERN int error_count;\r
+EXTERN char * help_line[6];\r
+EXTERN int help_ptr;\r
+EXTERN boolean use_err_help;\r
+EXTERN volatile integer interrupt;\r
+EXTERN boolean OK_to_interrupt;\r
+EXTERN boolean arith_error;\r
+EXTERN scaled tex_remainder;\r
+EXTERN halfword temp_ptr;\r
+\r
+/* sec 0116 */\r
+#ifdef ALLOCATEMAIN\r
+  EXTERN memory_word * main_memory;\r
+  EXTERN memory_word * mem;\r
+#else\r
+  EXTERN memory_word zzzaa[mem_max - mem_bot + 1];\r
+  #define zmem (zzzaa - (int)(mem_bot))\r
+#endif\r
+\r
+EXTERN pointer lo_mem_max;\r
+EXTERN pointer hi_mem_min;\r
+EXTERN integer var_used, dyn_used;\r
+/* sec 0118 */\r
+EXTERN pointer avail;\r
+EXTERN pointer mem_end;\r
+EXTERN pointer mem_start;\r
+/* sec 0124 */\r
+EXTERN pointer rover;\r
+/* sec 0165 */\r
+/* NOTE: the following really also need to be dynamically allocated */\r
+#ifdef DEBUG\r
+  #ifdef ALLOCATEMAIN\r
+    EXTERN char * zzzab;\r
+  #else\r
+\r
+  EXTERN char\r
+#define freearr (zzzab - (int)(mem_bot))\r
+  zzzab[mem_max - mem_bot + 1]; \r
+#endif\r
+\r
+#ifdef ALLOCATEMAIN\r
+  EXTERN char *zzzac;\r
+#else\r
+/* EXTERN boolean */   /* save (4 - 1) * mem_max - mem_min */\r
+EXTERN char\r
+/* #define wasfree (zzzac - (int)(mem_min)) */\r
+#define wasfree (zzzac - (int)(mem_bot))\r
+/*  zzzac[mem_max - mem_min + 1];  */\r
+  zzzac[mem_max - mem_bot + 1]; \r
+#endif\r
+\r
+EXTERN pointer was_mem_end, was_lo_max, was_hi_min;\r
+EXTERN boolean panicking;\r
+#endif /* DEBUG */\r
+\r
+EXTERN integer font_in_short_display;\r
+EXTERN integer depth_threshold;\r
+EXTERN integer breadth_max;\r
+EXTERN int shown_mode;\r
+EXTERN int old_setting;\r
+\r
+#ifdef INCREASEFONTS\r
+  #define eqtb_extra (font_max - 255 + hash_extra)\r
+#else\r
+  #define eqtb_extra 0\r
+#endif\r
+\r
+#if (eqtb_extra != 0)\r
+  #error ERROR: eqtb_extra is not zero (need hash_extra equal 255 - font_max)\r
+#endif\r
+\r
+#ifdef INCREASEFONTS\r
+  EXTERN memory_word eqtb[eqtb_size + 1 + eqtb_extra];\r
+#else\r
+  EXTERN memory_word eqtb[eqtb_size + 1];\r
+#endif\r
+\r
+#ifdef INCREASEFONTS\r
+  #define xeq_level (zzzad - (int_base + eqtb_extra))\r
+#else\r
+  #define xeq_level (zzzad - (int_base))\r
+#endif\r
+\r
+EXTERN quarterword zzzad[eqtb_size - int_base + 1];\r
+\r
+#ifdef ALLOCATEHASH\r
+  EXTERN two_halves *zzzae;\r
+  #define hash (zzzae - hash_base)\r
+#else\r
+  #ifdef INCREASEFONTS\r
+    EXTERN two_halves zzzae[undefined_control_sequence - hash_base + eqtb_extra];\r
+  #else\r
+    EXTERN two_halves zzzae[undefined_control_sequence - hash_base];\r
+  #endif\r
+\r
+  #define hash (zzzae - hash_base)\r
+#endif\r
+\r
+EXTERN pointer hash_used;\r
+EXTERN boolean no_new_control_sequence;\r
+EXTERN integer cs_count;\r
+\r
+/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */\r
+/* using allocated save stack slows it down 1% to 2%                       */\r
+/* despite reallocation, we still limit it to something finite             */\r
+/* to avoid soaking up all of machine memory in case of infinite loop      */\r
+#ifdef ALLOCATESAVESTACK\r
+  #define save_size           65536\r
+  #define initial_save_size   1000\r
+  #define increment_save_size 2000\r
+  EXTERN memory_word * save_stack;\r
+#else\r
+  #define save_size 8000\r
+  EXTERN memory_word save_stack[save_size + 1];\r
+#endif\r
+\r
+EXTERN integer save_ptr;\r
+EXTERN integer max_save_stack;\r
+EXTERN int cur_level;\r
+EXTERN int cur_group;\r
+EXTERN integer cur_boundary;\r
+EXTERN integer mag_set;\r
+EXTERN int cur_cmd;\r
+EXTERN halfword cur_chr;\r
+EXTERN pointer cur_cs;\r
+EXTERN halfword cur_tok;\r
+\r
+#ifdef ALLOCATENESTSTACK\r
+  #define nest_size           65536\r
+  #define initial_nest_size   100\r
+  #define increment_nest_size 200\r
+  EXTERN list_state_record * nest;\r
+#else\r
+  #define nest_size 200\r
+  EXTERN list_state_record nest[nest_size + 1];\r
+#endif\r
+\r
+EXTERN integer nest_ptr;\r
+EXTERN integer max_nest_stack;\r
+EXTERN list_state_record cur_list;\r
+\r
+#ifdef ALLOCATEPARAMSTACK\r
+  #define param_size           65536\r
+  #define initial_param_size   100\r
+  #define increment_param_size 200\r
+  EXTERN pointer * param_stack;\r
+#else\r
+  #define param_size 500\r
+  EXTERN pointer param_stack[param_size + 1];\r
+#endif\r
+\r
+EXTERN integer param_ptr;\r
+EXTERN integer max_param_stack;\r
+\r
+#ifdef ALLOCATEINPUTSTACK\r
+  #define stack_size           65536\r
+  #define initial_stack_size   100\r
+  #define increment_stack_size 200\r
+  EXTERN in_state_record * input_stack;\r
+#else\r
+  #define stack_size 800\r
+  EXTERN in_state_record input_stack[stack_size + 1];\r
+#endif\r
+\r
+EXTERN integer input_ptr;\r
+EXTERN integer max_in_stack;\r
+EXTERN integer high_in_open;\r
+EXTERN in_state_record cur_input;\r
+EXTERN int in_open;\r
+EXTERN integer open_parens;\r
+EXTERN integer max_open_parens;\r
+EXTERN alpha_file input_file[max_in_open + 1];\r
+EXTERN integer line;\r
+EXTERN integer line_stack[max_in_open + 1];\r
+EXTERN int scanner_status;\r
+EXTERN pointer warning_index;\r
+EXTERN pointer def_ref;\r
+EXTERN integer align_state;\r
+EXTERN integer base_ptr;\r
+EXTERN pointer par_loc;\r
+EXTERN halfword par_token;\r
+EXTERN boolean force_eof;\r
+EXTERN pointer cur_mark[6];\r
+EXTERN int long_state;\r
+EXTERN pointer pstack[10];\r
+EXTERN integer cur_val;\r
+EXTERN int cur_val_level;\r
+EXTERN int radix;\r
+EXTERN int cur_order;\r
+EXTERN alpha_file read_file[16];\r
+EXTERN char read_open[20];\r
+EXTERN pointer cond_ptr;\r
+EXTERN int if_limit;\r
+EXTERN int cur_if;\r
+EXTERN integer if_line;\r
+EXTERN integer skip_line;\r
+EXTERN str_number cur_name;\r
+EXTERN str_number cur_area;\r
+EXTERN str_number cur_ext;\r
+EXTERN pool_pointer area_delimiter;\r
+EXTERN pool_pointer ext_delimiter;\r
+EXTERN integer format_default_length;\r
+EXTERN char * TEX_format_default;\r
+EXTERN boolean name_in_progress;\r
+EXTERN boolean log_opened;\r
+EXTERN boolean quoted_file_name;\r
+EXTERN str_number job_name;\r
+EXTERN const char * c_job_name;\r
+EXTERN str_number output_file_name;\r
+EXTERN str_number log_name;\r
+EXTERN byte_file dvi_file;\r
+EXTERN byte_file tfm_file;\r
+EXTERN byte_file pdf_file;\r
+EXTERN char * dvi_file_name;\r
+EXTERN char * pdf_file_name;\r
+EXTERN char * log_file_name;\r
+\r
+#ifdef ALLOCATEFONT\r
+  EXTERN memory_word * font_info;\r
+#else\r
+  EXTERN memory_word font_info[font_mem_size + 1];\r
+#endif\r
+\r
+EXTERN font_index fmem_ptr;\r
+EXTERN internal_font_number font_ptr;\r
+EXTERN internal_font_number frozen_font_ptr;\r
+EXTERN four_quarters font_check[font_max + 1];\r
+EXTERN int    font_id[font_max + 1];\r
+EXTERN scaled font_size[font_max + 1];\r
+EXTERN scaled font_dsize[font_max + 1];\r
+EXTERN font_index font_params[font_max + 1];\r
+EXTERN str_number font_name[font_max + 1];\r
+EXTERN str_number font_area[font_max + 1];\r
+EXTERN eight_bits font_bc[font_max + 1];\r
+EXTERN eight_bits font_ec[font_max + 1];\r
+EXTERN pointer font_glue[font_max + 1];\r
+EXTERN boolean font_used[font_max + 1];\r
+EXTERN integer hyphen_char[font_max + 1];\r
+EXTERN integer skew_char[font_max + 1];\r
+EXTERN font_index bchar_label[font_max + 1];\r
+EXTERN short font_bchar[font_max + 1];\r
+EXTERN short font_false_bchar[font_max + 1];\r
+EXTERN integer char_base[font_max + 1];\r
+EXTERN integer width_base[font_max + 1];\r
+EXTERN integer height_base[font_max + 1];\r
+EXTERN integer depth_base[font_max + 1];\r
+EXTERN integer italic_base[font_max + 1];\r
+EXTERN integer lig_kern_base[font_max + 1];\r
+EXTERN integer kern_base[font_max + 1];\r
+EXTERN integer exten_base[font_max + 1];\r
+EXTERN integer param_base[font_max + 1];\r
+EXTERN four_quarters null_character;\r
+EXTERN integer total_pages;\r
+EXTERN scaled max_v;\r
+EXTERN scaled max_h;\r
+EXTERN integer max_push;\r
+EXTERN integer last_bop;\r
+EXTERN integer dead_cycles;\r
+EXTERN boolean doing_leaders;\r
+EXTERN quarterword c, f;\r
+EXTERN scaled rule_ht, rule_dp, rule_wd;\r
+EXTERN pointer g;\r
+EXTERN integer lq, lr;\r
+EXTERN eight_bits dvi_buf[dvi_buf_size + 4];\r
+EXTERN dvi_index half_buf;\r
+EXTERN dvi_index dvi_limit;\r
+EXTERN dvi_index dvi_ptr;\r
+EXTERN integer dvi_offset;\r
+EXTERN integer pdf_offset;\r
+EXTERN integer dvi_gone;\r
+EXTERN pointer down_ptr, right_ptr;\r
+EXTERN scaled dvi_h, dvi_v;\r
+EXTERN scaled cur_h, cur_v;\r
+EXTERN internal_font_number dvi_f;\r
+EXTERN integer cur_s;\r
+EXTERN scaled total_stretch[4], total_shrink[4];\r
+EXTERN integer last_badness;\r
+EXTERN pointer adjust_tail;\r
+EXTERN integer pack_begin_line;\r
+EXTERN two_halves empty_field;\r
+EXTERN four_quarters null_delimiter;\r
+EXTERN pointer cur_mlist;\r
+EXTERN small_number cur_style;\r
+EXTERN small_number cur_size;\r
+EXTERN scaled cur_mu;\r
+EXTERN boolean mlist_penalties;\r
+EXTERN internal_font_number cur_f;\r
+EXTERN quarterword cur_c;\r
+EXTERN four_quarters cur_i;\r
+EXTERN integer magic_offset;\r
+EXTERN pointer cur_align;\r
+EXTERN pointer cur_span;\r
+EXTERN pointer cur_loop;\r
+EXTERN pointer align_ptr;\r
+EXTERN pointer cur_head, cur_tail;\r
+EXTERN pointer just_box;\r
+EXTERN pointer passive;\r
+EXTERN pointer printed_node;\r
+EXTERN halfword pass_number;\r
+EXTERN scaled active_width[8];\r
+EXTERN scaled cur_active_width[8];\r
+EXTERN scaled background[8];\r
+EXTERN scaled break_width[8];\r
+EXTERN boolean no_shrink_error_yet;\r
+EXTERN pointer cur_p;\r
+EXTERN boolean second_pass;\r
+EXTERN boolean final_pass;\r
+EXTERN integer threshold;\r
+EXTERN integer minimal_demerits[4];\r
+EXTERN integer minimum_demerits;\r
+EXTERN pointer best_place[4];\r
+EXTERN halfword best_pl_line[4];\r
+EXTERN scaled disc_width;\r
+EXTERN halfword easy_line;\r
+EXTERN halfword last_special_line;\r
+EXTERN scaled first_width;\r
+EXTERN scaled second_width;\r
+EXTERN scaled first_indent;\r
+EXTERN scaled second_indent;\r
+EXTERN pointer best_bet;\r
+EXTERN integer fewest_demerits;\r
+EXTERN halfword best_line;\r
+EXTERN integer actual_looseness;\r
+EXTERN integer line_diff;\r
+EXTERN int hc[66];\r
+EXTERN int hn;\r
+EXTERN halfword ha, hb;\r
+EXTERN int hf;\r
+EXTERN int hu[66];\r
+EXTERN int hyf_char;\r
+EXTERN int cur_lang, init_cur_lang;\r
+EXTERN integer l_hyf, r_hyf;\r
+EXTERN integer init_l_hyf, init_r_hyf;\r
+EXTERN halfword hyf_bchar;\r
+EXTERN char hyf[68];\r
+EXTERN pointer init_list;\r
+EXTERN boolean init_lig;\r
+EXTERN boolean init_lft;\r
+EXTERN int hyphen_passed;\r
+EXTERN halfword cur_l, cur_r;\r
+EXTERN pointer cur_q;\r
+EXTERN pointer lig_stack;\r
+EXTERN boolean ligature_present;\r
+EXTERN boolean lft_hit, rt_hit;\r
+\r
+#ifdef ALLOCATETRIES\r
+  EXTERN halfword * trie_trl;\r
+  EXTERN halfword * trie_tro;\r
+  EXTERN quarterword * trie_trc;\r
+#else\r
+  EXTERN halfword trie_trl[trie_size + 1];\r
+  EXTERN halfword trie_tro[trie_size + 1];\r
+  EXTERN quarterword trie_trc[trie_size + 1];\r
+#endif\r
+\r
+EXTERN small_number hyf_distance[trie_op_size + 1];\r
+EXTERN small_number hyf_num[trie_op_size + 1];\r
+EXTERN trie_op_code hyf_next[trie_op_size + 1];\r
+EXTERN integer op_start[256];\r
+\r
+#ifdef ALLOCATEHYPHEN\r
+  #define default_hyphen_prime 1009\r
+  EXTERN str_number * hyph_word;\r
+  EXTERN pointer * hyph_list;\r
+  EXTERN integer hyphen_prime;\r
+#else\r
+  #define hyphen_prime 607\r
+  EXTERN str_number hyph_word[hyphen_prime + 1];\r
+  EXTERN pointer hyph_list[hyphen_prime + 1];\r
+#endif\r
+\r
+EXTERN hyph_pointer hyph_count;\r
+\r
+#ifdef INITEX\r
+  EXTERN integer trie_op_hash_C[trie_op_size - neg_trie_op_size + 1];\r
+  #define trie_op_hash (trie_op_hash_C - (int)(neg_trie_op_size)) \r
+  EXTERN trie_op_code trie_used[256];\r
+  EXTERN ASCII_code trie_op_lang[trie_op_size + 1];\r
+  EXTERN trie_op_code trie_op_val[trie_op_size + 1];\r
+  EXTERN integer trie_op_ptr;\r
+#endif\r
+\r
+EXTERN trie_op_code max_op_used;\r
+\r
+#ifdef INITEX\r
+  #ifdef ALLOCATEINI\r
+    EXTERN packed_ASCII_code * trie_c; /* characters to match */\r
+    EXTERN trie_op_code * trie_o;      /* operations to perform */\r
+    EXTERN trie_pointer * trie_l;      /* left subtrie links */\r
+    EXTERN trie_pointer * trie_r;      /* right subtrie links */\r
+    EXTERN trie_pointer * trie_hash;   /* used to identify equivlent subtries */\r
+  #else\r
+    EXTERN packed_ASCII_code trie_c[trie_size + 1];\r
+    EXTERN trie_op_code trie_o[trie_size + 1];\r
+    EXTERN trie_pointer trie_l[trie_size + 1];\r
+    EXTERN trie_pointer trie_r[trie_size + 1];\r
+    EXTERN trie_pointer trie_hash[trie_size + 1];\r
+  #endif\r
+\r
+  EXTERN trie_pointer trie_ptr;\r
+#endif\r
+\r
+#ifdef INITEX\r
+  #ifdef ALLOCATEINI\r
+    EXTERN char * trie_taken;\r
+  #else\r
+    EXTERN boolean trie_taken[trie_size + 1];\r
+  #endif\r
+\r
+  EXTERN trie_pointer trie_min[256];\r
+  EXTERN trie_pointer trie_max;\r
+  EXTERN boolean trie_not_ready;\r
+#endif\r
+\r
+EXTERN scaled best_height_plus_depth;\r
+EXTERN pointer page_tail;\r
+EXTERN int page_contents;\r
+\r
+#if (half_error_line < 30) || (half_error_line > error_line - 15)\r
+  #error ERROR: (half_error_line < 30) || (half_error_line > error_line - 15) BAD 1\r
+#endif\r
+\r
+#if (max_print_line < 60)\r
+  #error ERROR: (max_print_line < 60) BAD 2\r
+#endif\r
+\r
+#if (hash_prime > hash_size)\r
+  #error ERROR: (hash_prime > hash_size) BAD 5\r
+#endif\r
+\r
+#if (max_in_open > 127)\r
+  #error ERROR: (max_in_open > 127) BAD 6\r
+#endif\r
+\r
+#if (min_quarterword > 0) || (max_quarterword < 127)\r
+  #error ERROR: (min_quarterword > 0) || (max_quarterword < 127) BAD 11\r
+#endif\r
+\r
+#if (min_halfword > 0) || (max_halfword < 32767)\r
+  #error ERROR:  (min_halfword > 0) || (max_halfword < 32767) BAD 12\r
+#endif\r
+\r
+#if (min_quarterword < min_halfword) || (max_quarterword > max_halfword)\r
+  #error ERROR: (min_quarterword < min_halfword) || (max_quarterword > max_halfword) BAD 13\r
+#endif\r
+\r
+#if (font_max > max_quarterword)\r
+  #error ERROR: (font_max > max_quarterword) BAD 15\r
+#endif\r
+\r
+#if (save_size > max_halfword)\r
+  #error ERROR: (save_size > max_halfword) BAD 17\r
+#endif\r
+\r
+#if (buf_size > max_halfword)\r
+  #error ERROR:  (buf_size > max_halfword) BAD 18\r
+#endif\r
+\r
+#if (max_quarterword - min_quarterword) < 255\r
+  #error (max_quarterword - min_quarterword) < 255 BAD 19\r
+#endif\r
+\r
+EXTERN scaled page_max_depth;\r
+EXTERN pointer best_page_break;\r
+EXTERN integer least_page_cost;\r
+EXTERN scaled best_size;\r
+EXTERN scaled page_so_far[8];\r
+EXTERN pointer last_glue;\r
+EXTERN integer last_penalty;\r
+EXTERN scaled last_kern;\r
+EXTERN integer insert_penalties;\r
+EXTERN boolean output_active;\r
+/* sec 1032 */\r
+EXTERN internal_font_number main_f;\r
+EXTERN four_quarters main_i;\r
+EXTERN four_quarters main_j;\r
+EXTERN font_index main_k;\r
+EXTERN pointer main_p;\r
+EXTERN integer main_s;\r
+EXTERN halfword bchar;\r
+EXTERN halfword false_bchar;\r
+EXTERN boolean cancel_boundary;\r
+EXTERN boolean ins_disc;\r
+/* sec 1074 */\r
+EXTERN pointer cur_box;\r
+EXTERN halfword after_token;\r
+EXTERN boolean long_help_seen;\r
+EXTERN str_number format_ident;\r
+EXTERN word_file fmt_file;\r
+EXTERN gzFile gz_fmt_file;\r
+/* sec 1331 */\r
+EXTERN integer ready_already;\r
+/* sec 1342 */\r
+EXTERN alpha_file write_file[16];\r
+EXTERN boolean write_open[18];\r
+/* sec 1345 */\r
+EXTERN pointer write_loc;\r
+EXTERN pool_pointer edit_name_start;\r
+EXTERN integer edit_name_length, edit_line;\r
+EXTERN int fbyte;\r
+/* new variables defined in local.c */\r
+EXTERN boolean is_initex;\r
+EXTERN boolean verbose_flag;\r
+EXTERN boolean trace_flag;\r
+EXTERN boolean open_trace_flag;\r
+EXTERN boolean knuth_flag;\r
+EXTERN boolean c_style_flag;\r
+EXTERN boolean non_ascii;\r
+EXTERN boolean key_replace;\r
+EXTERN boolean deslash;\r
+EXTERN boolean trimeof;\r
+EXTERN boolean allow_patterns;\r
+EXTERN boolean show_fonts_used;\r
+EXTERN boolean reset_exceptions;\r
+EXTERN boolean show_current;\r
+EXTERN boolean return_flag;\r
+EXTERN boolean civilize_flag;\r
+EXTERN boolean show_numeric;\r
+EXTERN boolean restrict_to_ascii;\r
+EXTERN boolean show_missing;\r
+EXTERN boolean full_file_name_flag;\r
+EXTERN int mem_initex;\r
+EXTERN int mem_extra_high;\r
+EXTERN int mem_extra_low;\r
+EXTERN int new_hyphen_prime;\r
+EXTERN int missing_characters;\r
+EXTERN boolean show_in_hex;\r
+EXTERN boolean show_in_dos;\r
+EXTERN boolean show_fmt_flag;\r
+EXTERN boolean show_tfm_flag;\r
+EXTERN boolean truncate_long_lines;\r
+EXTERN boolean show_cs_names;\r
+EXTERN int tab_step;\r
+EXTERN int pseudo_tilde;\r
+EXTERN int pseudo_space;\r
+EXTERN boolean allow_quoted_names;\r
+EXTERN int default_rule;\r
+EXTERN char * format_file;\r
+EXTERN char * source_direct;\r
+EXTERN char * format_name;\r
+EXTERN boolean show_line_break_stats;\r
+EXTERN int first_pass_count;\r
+EXTERN int second_pass_count;\r
+EXTERN int final_pass_count;\r
+EXTERN int underfull_hbox;\r
+EXTERN int overfull_hbox;\r
+EXTERN int underfull_vbox;\r
+EXTERN int overfull_vbox;\r
+EXTERN int paragraph_failed;\r
+EXTERN int single_line;\r
+EXTERN FILE * errout;\r
+EXTERN int ignore_frozen;\r
+EXTERN boolean suppress_f_ligs;\r
+EXTERN int jump_used;\r
+EXTERN jmp_buf jumpbuffer;\r
+extern int current_pool_size;\r
+extern int current_max_strings;\r
+extern int current_mem_size;\r
+extern int current_font_mem_size;\r
+extern int current_save_size;\r
+extern int current_stack_size;\r
+extern int current_nest_size;\r
+extern int current_param_size;\r
+extern int current_buf_size;\r
+extern const char * banner;\r
+extern const char * application;\r
+extern const char * yandyversion;\r
+extern unsigned char wintodos[128];\r
+extern char log_line[256];\r
+extern char * dvi_directory;\r
+extern char * log_directory;\r
+extern char * aux_directory;\r
+extern char * fmt_directory;\r
+extern char * pdf_directory;\r
+extern clock_t start_time, main_time, finish_time;\r
+\r
+extern memory_word * allocate_main_memory (int size);\r
+extern memory_word * realloc_main (int lo_size, int hi_size);\r
+extern packed_ASCII_code * realloc_str_pool (int size);\r
+extern pool_pointer * realloc_str_start (int size);\r
+extern memory_word * realloc_save_stack (int size);\r
+extern list_state_record * realloc_nest_stack (int size);\r
+extern in_state_record * realloc_input_stack (int size);\r
+extern halfword * realloc_param_stack (int size);\r
+extern ASCII_code * realloc_buffer (int size);\r
+extern memory_word * realloc_font_info (int size);\r
+extern int realloc_hyphen (int hyphen_prime);\r
+extern int allocate_tries (int trie_max);\r
+extern void probe_memory (void);\r
+extern void print_cs_names (FILE * output, int pass);\r
+extern void perrormod (const char * s);\r
+extern char * grabenv (const char * varname);\r
+extern void flush_trailing_slash (char * directory);\r
+extern boolean prime (int x);\r
+extern int endit (int flag);\r
+extern void uexit (int unix_code);\r
+extern void t_open_in (void);\r
+extern void call_edit (ASCII_code * filename, pool_pointer fnstart,\r
+  integer fnlength, integer linenumber);\r
+extern void add_variable_space (int size);\r
+extern char * unixify (char * t);\r
+\r
+#include "coerce.h"\r
+\r
+/* sec 79 */\r
+extern void node_list_display (integer p);\r
+extern void do_nothing (void);\r
+extern void update_terminal (void);\r
+extern void check_full_save_stack (void);\r
+extern void push_input (void);\r
+extern void pop_input (void);\r
+extern void print_err (const char * s);\r
+extern void ensure_dvi_open (void);\r
+extern void write_dvi (size_t a, size_t b);\r
+extern void prompt_input (const char * s);\r
+extern void synch_h (void);\r
+extern void synch_v (void);\r
+extern void set_cur_lang (void);\r
+extern void str_room (int val);\r
+extern void tail_append_ (pointer val);\r
+#define tail_append(a) tail_append_((pointer) a)\r
+extern void tex_help (unsigned int n, ...);\r
+extern void append_char (ASCII_code c);\r
+extern void append_lc_hex (ASCII_code c);\r
+extern void succumb (void);\r
+extern void dvi_out_ (ASCII_code op);\r
+#define dvi_out(op) dvi_out_((ASCII_code) (op))\r
+extern void free_avail_ (halfword p);\r
+#define free_avail(p) free_avail_((halfword) (p))\r
+extern void flush_string (void);\r
+extern str_number load_pool_strings (integer spare_size);\r
+extern str_number make_string_pool (const char * s);\r
+extern void print_plus (int i, const char * s);\r
+#define help0()     tex_help(0)\r
+#define help1(...)  tex_help(1, __VA_ARGS__)\r
+#define help2(...)  tex_help(2, __VA_ARGS__)\r
+#define help3(...)  tex_help(3, __VA_ARGS__)\r
+#define help4(...)  tex_help(4, __VA_ARGS__)\r
+#define help5(...)  tex_help(5, __VA_ARGS__)\r
+#define help6(...)  tex_help(6, __VA_ARGS__)\r
+extern char * md5_file_name(const char * file_name);\r
+extern void fget (void);\r
+extern str_number get_job_name (str_number job);\r
+extern void show_font_info (void);\r
+\r
+EXTERN int shipout_flag;\r
+#endif\r
index b3db8e7..4bfaa7d 100644 (file)
@@ -1,43 +1,43 @@
-/* Copyright 2014 Clerk Ma.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301 USA.  */
-
-#include <windows.h>
-
-VS_VERSION_INFO VERSIONINFO
-  FILEVERSION    0,3,0,0
-  PRODUCTVERSION 2,3,0,0
-  FILEOS         VOS__WINDOWS32
-  FILETYPE       VFT_APP
-{
-  BLOCK "StringFileInfo"
-  {
-    BLOCK "040904b0"
-    {
-      VALUE "CompanyName",        "Project Fandol.\0"
-      VALUE "FileDescription",    "Y&Y TeX 2.3.0 (WIN32)\0"
-      VALUE "FileVersion",        "0.3.0.0\0"
-      VALUE "LegalCopyright",     "(C) 2014 Clerk Ma.\0"
-      VALUE "OriginalFilename",   "yandytex.exe\0"
-      VALUE "ProductName",        "Y&Y TeX\0"
-      VALUE "ProductVersion",     "2.3.0.0\0"
-    }
-  }
-  BLOCK "VarFileInfo"
-  {
-    VALUE "Translation", 0x409, 1252
-  }
-}
+/* Copyright 2014 Clerk Ma.\r
+\r
+   This program is free software; you can redistribute it and/or modify\r
+   it under the terms of the GNU General Public License as published by\r
+   the Free Software Foundation; either version 2 of the License, or\r
+   (at your option) any later version.\r
+\r
+   This program is distributed in the hope that it will be useful, but\r
+   WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+   General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with this program; if not, write to the Free Software\r
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA\r
+   02110-1301 USA.  */\r
+\r
+#include <windows.h>\r
+\r
+VS_VERSION_INFO VERSIONINFO\r
+  FILEVERSION    0,3,0,0\r
+  PRODUCTVERSION 2,3,0,0\r
+  FILEOS         VOS__WINDOWS32\r
+  FILETYPE       VFT_APP\r
+{\r
+  BLOCK "StringFileInfo"\r
+  {\r
+    BLOCK "040904b0"\r
+    {\r
+      VALUE "CompanyName",        "Project Fandol.\0"\r
+      VALUE "FileDescription",    "Y&Y TeX 2.3.0 (WIN32)\0"\r
+      VALUE "FileVersion",        "0.3.0.0\0"\r
+      VALUE "LegalCopyright",     "(C) 2014 Clerk Ma.\0"\r
+      VALUE "OriginalFilename",   "yandytex.exe\0"\r
+      VALUE "ProductName",        "Y&Y TeX\0"\r
+      VALUE "ProductVersion",     "2.3.0.0\0"\r
+    }\r
+  }\r
+  BLOCK "VarFileInfo"\r
+  {\r
+    VALUE "Translation", 0x409, 1252\r
+  }\r
+}\r
index acf3b16..5e5f1f3 100644 (file)
@@ -1,7 +1,7 @@
-del *.exe
-del *.map
-del *.obj
-del *.res
-del *.exp
-del *.lib
-del *~
+del *.exe\r
+del *.map\r
+del *.obj\r
+del *.res\r
+del *.exp\r
+del *.lib\r
+del *~\r