-#
-# 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
-#
-# 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
-#
-# 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
-#
-# 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
-# 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
-# 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
-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
-/* 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
-/* 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
-/* 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
+++ /dev/null
-/*
- 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));
-}
+++ /dev/null
-/*
- 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 */
+++ /dev/null
-/*
- 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;
-}
-/* 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) ¶m_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) ¶m_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) ¶m_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) ¶m_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
-/* 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
-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
-/* 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
-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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-#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
-/* 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
-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