aboutsummaryrefslogtreecommitdiffstats
path: root/externs.h
diff options
context:
space:
mode:
Diffstat (limited to 'externs.h')
-rw-r--r--externs.h3407
1 files changed, 3407 insertions, 0 deletions
diff --git a/externs.h b/externs.h
new file mode 100644
index 0000000..a68ff4c
--- /dev/null
+++ b/externs.h
@@ -0,0 +1,3407 @@
+/*@externs.h:External Declarations:Directories and file conventions@**********/
+/* */
+/* THE LOUT DOCUMENT FORMATTING SYSTEM (VERSION 3.17) */
+/* COPYRIGHT (C) 1991, 1999 Jeffrey H. Kingston */
+/* */
+/* Jeffrey H. Kingston (jeff@cs.usyd.edu.au) */
+/* Basser Department of Computer Science */
+/* The University of Sydney 2006 */
+/* AUSTRALIA */
+/* */
+/* 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, 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., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA */
+/* */
+/* FILE: externs.h */
+/* MODULE: External Declarations */
+/* */
+/*****************************************************************************/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include <locale.h>
+
+#if LOCALE_ON
+#include <nl_types.h>
+extern nl_catd MsgCat;
+#define condcatgets(cat, set, msg, s) catgets(cat, set, msg, s)
+#else
+#define condcatgets(cat, set, msg, s) s
+#endif
+
+
+/*****************************************************************************/
+/* */
+/* Include, font and database directories, and the DEBUG_ON and ASSERT_ON */
+/* flags (defined by -D options on the cc command line in the makefile). */
+/* */
+/* LATIN Non-zero means compile for ISO-LATIN-1 char set. */
+/* LIB_DIR The system directory where library files are kept */
+/* INCL_DIR The subdirectory of LIB_DIR where @Include files are kept */
+/* FONT_DIR The subdirectory of LIB_DIR where .AFM font files are kept */
+/* MAPS_DIR The subdirectory of LIB_DIR where .LCM files are kept */
+/* DATA_DIR The subdirectory of LIB_DIR where database files are kept */
+/* HYPH_DIR The subdirectory of LIB_DIR where hyphenation files kept */
+/* LOCALE_DIR The subdirectory of LIB_DIR where locale files are kept */
+/* CHAR_IN Determines assignment of input chars to lex classes */
+/* CHAR_OUT Determines appearance of literal chars in output */
+/* DEBUG_ON Non-zero means compile debug code (lout -d) */
+/* ASSERT_ON Non-zero means test assertions */
+/* LOCALE_ON Non-zero means compile setlocale() etc. code */
+/* */
+/* #define LIB_DIR "/usr/local/lib/lout" */
+/* #define INCL_DIR "include" */
+/* #define FONT_DIR "font" */
+/* #define MAPS_DIR "maps" */
+/* #define DATA_DIR "data" */
+/* #define HYPH_DIR "hyph" */
+/* #define LOCALE_DIR "locale" (only used if LOCALE_ON) */
+/* #define CHAR_IN 0 */
+/* #define CHAR_OUT 0 */
+/* #define DEBUG_ON 0 */
+/* #define ASSERT_ON 1 */
+/* #define LOCALE_ON 1 */
+/* */
+/*****************************************************************************/
+
+
+/*@::File naming conventions and version@*************************************/
+/* */
+/* File naming conventions and version */
+/* */
+/* LOUT_VERSION Version information */
+/* CROSS_DB The default name of the cross reference database */
+/* SOURCE_SUFFIX Optional suffix of source files and include files */
+/* INDEX_SUFFIX The suffix of database index files */
+/* NEW_INDEX_SUFFIX The suffix of new database index files */
+/* DATA_SUFFIX The suffix of database data files */
+/* NEW_DATA_SUFFIX The additional suffix of new database data files */
+/* HYPH_SUFFIX The suffix of unpacked hyphenation files */
+/* HYPH_PACKED_SUFFIX The suffix of packed hyphenation files */
+/* FILTER_IN The prefix of the name of the input file to filters */
+/* FILTER_OUT The prefix of the name of the output file to filters */
+/* FILTER_ERR The name of the error file to filters */
+/* */
+/*****************************************************************************/
+
+#define LOUT_VERSION AsciiToFull("Basser Lout Version 3.17 (September 1999)")
+#define CROSS_DB AsciiToFull("lout")
+#define SOURCE_SUFFIX AsciiToFull(".lt")
+#define INDEX_SUFFIX AsciiToFull(".li")
+#define NEW_INDEX_SUFFIX AsciiToFull(".lix")
+#define DATA_SUFFIX AsciiToFull(".ld")
+#define NEW_DATA_SUFFIX AsciiToFull("x")
+#define HYPH_SUFFIX AsciiToFull(".lh")
+#define HYPH_PACKED_SUFFIX AsciiToFull(".lp")
+#define FILTER_IN AsciiToFull("louti")
+#define FILTER_OUT AsciiToFull("lout")
+#define FILTER_ERR AsciiToFull("lout.err")
+
+
+/*****************************************************************************/
+/* */
+/* Operating system dependent things */
+/* */
+/* (1) File read and write modes for binary files, and directory character */
+/* */
+/* MS-DOS text file line endings differ from Unix line endings. This is */
+/* usually ignorable but causes problems with binary files and files where */
+/* you do arithmetic on fseek() values. In Lout the problematic files are */
+/* compressed trie and hyphenation files, and database index files. So */
+/* we must read and write these files in "binary mode" in MS-DOS. For */
+/* completeness we have included synonyms for all file modes used by Lout: */
+/* */
+/* READ_BINARY Mode passed to fopen() when reading a "binary file" */
+/* WRITE_BINARY Mode passed to fopen() when writing a "binary file" */
+/* READ_TEXT Mode passed to fopen() when reading a "text file" */
+/* APPEND_TEXT Mode passed to fopen() when appending to "text file" */
+/* WRITE_TEXT Mode passed to fopen() when writing a "text file" */
+/* STR_DIR Directory character used in file path names */
+/* */
+/* (2) System command and file name for uncompressing EPS files */
+/* */
+/* UNCOMPRESS_COM System command for uncompressing compressed EPS file */
+/* LOUT_EPS Name of temporary uncompressed EPS file */
+/* */
+/* There is one further call to system() in the Lout source code: the one */
+/* that implements filtered parameters such as c2lout. The strings passed */
+/* to this call to system() are the values of @Filter symbols within Lout */
+/* definitions. */
+/* */
+/*****************************************************************************/
+
+#if OS_UNIX
+#define READ_BINARY "r"
+#define WRITE_BINARY "w"
+#define READ_TEXT "r"
+#define APPEND_TEXT "a"
+#define WRITE_TEXT "w"
+#define STR_DIR AsciiToFull("/")
+#define UNCOMPRESS_COM "gunzip -c %s > %s"
+#define LOUT_EPS "lout.eps"
+#else
+#if OS_DOS
+#define READ_BINARY "rb"
+#define WRITE_BINARY "wb"
+#define READ_TEXT "rt"
+#define APPEND_TEXT "at"
+#define WRITE_TEXT "wt"
+#define STR_DIR AsciiToFull("/")
+#define UNCOMPRESS_COM "gunzip -c %s > %s"
+#define LOUT_EPS "lout.eps"
+#else
+#if OS_MAC
+#define READ_BINARY "r"
+#define WRITE_BINARY "w"
+#define READ_TEXT "r"
+#define APPEND_TEXT "a"
+#define WRITE_TEXT "w"
+#define STR_DIR AsciiToFull(":")
+#define UNCOMPRESS_COM "gunzip -c %s > %s"
+#define LOUT_EPS "lout.eps"
+#else
+If you're compiling this, you've got the wrong settings in the makefile!
+#endif
+#endif
+#endif
+
+/*@::Significant limits@******************************************************/
+/* */
+/* Significant Limits (other insignificant ones appear in other files) */
+/* */
+/* MAX_FULL_LENGTH The maximum value storable in type FULL_LENGTH. */
+/* NB this cannot be 2**31 - 1 because there are */
+/* intermediate results that exceed MAX_FULL_LENGTH */
+/* and are subsequently reduced to MAX_FULL_LENGTH. */
+/* For example, some intermediate results may exceed */
+/* MAX_FULL_LENGTH by a factor of SF, which is defined */
+/* below to be 128 (2**7). The value given is 2**23-1, */
+/* which is about 148 metres in Lout's precision. */
+/* */
+/* MAX_SHORT_LENGTH The maximum value storable in type SHORT_LENGTH. */
+/* */
+/* MAX_FILES The maximum number of files. This could only be */
+/* increased if the file_num() field of type FILE_POS */
+/* is enlarged beyond its present 16 bits. */
+/* */
+/* MAX_LINE 1 + the maximum length of an input line in source */
+/* and database files. This is used for the lexical */
+/* analyser's input line buffer only, and could be */
+/* increased immediately to 4096, and even further if */
+/* more than the current 12 bits was assigned to the */
+/* col_num() field of type FILE_POS. */
+/* */
+/* MAX_WORD 1 + the maximum length of a word storable in an */
+/* object record, which includes all file path names */
+/* too. It is reasonable to make this MAX_LINE, since */
+/* a word longer than MAX_LINE cannot be read in. */
+/* */
+/* MAX_OBJECT_REC 1 + the maximum size of an object record, measured */
+/* in ALIGNs. The value chosen should exceed */
+/* ceiling( (wr + MAX_WORD - 4) / sizeof(ALIGN) ) */
+/* where wr = sizeof(struct word_rec), so that words of */
+/* length MAX_WORD-1 can be stored in an object record. */
+/* */
+/* MAX_BUFF 1 + the maximum length of a "standard buffer"; these */
+/* buffers are used in a variety of places throughout */
+/* the program for holding one line of a font file, */
+/* one file path name, one symbol full name, etc. This */
+/* may be increased immediately without limit. */
+/* */
+/* MAX_FONT The maximum number of sized fonts allowed. This */
+/* can be increased beyond 4096 only by setting aside */
+/* a larger word_font() field. */
+/* */
+/* MAX_COLOUR The maximum number of distinct left parameters of */
+/* @SetColour and @SetColor symbols allowed (after */
+/* evaluation). This can be increased beyond 4096 */
+/* only by setting aside a larger word_colour() field. */
+/* */
+/* MAX_LANGUAGE The maximum number of distinct languages allowed. */
+/* This can be increased beyond 256 only by setting */
+/* aside a larger word_language() field. */
+/* */
+/* MAX_LEX_STACK The maximum depth of @Includes and @Databases. This */
+/* can be increased immediately by any small amount. */
+/* */
+/* MAX_CHARS The maximimum number of characters in a font. This */
+/* cannot be increased easily. */
+/* */
+/*****************************************************************************/
+
+#define MAX_FULL_LENGTH 8388607 /* 2**23 - 1, about 148 metres */
+#define MAX_SHORT_LENGTH 32767
+#define MAX_FILES 65535
+#define MAX_LINE 2048
+#define MAX_WORD 2048
+#define MAX_OBJECT_REC ceiling(sizeof(struct word_type)+MAX_WORD,sizeof(ALIGN))
+#define MAX_BUFF 512
+#define MAX_FONT 4096
+#define MAX_COLOUR 4096
+#define MAX_LANGUAGE 64
+#define MAX_LEX_STACK 10
+#define MAX_CHARS 256
+
+/*****************************************************************************/
+/* */
+/* Miscellaneous Macros */
+/* */
+/*****************************************************************************/
+
+#define BOOLEAN unsigned
+#define FALSE 0
+#define TRUE 1
+#define bool(x) (x ? AsciiToFull("TRUE") : AsciiToFull("FALSE") )
+#define CHILD 0
+#define PARENT 1
+#define COLM 0
+#define ROWM 1
+#define dimen(x) (x == COLM ? AsciiToFull("COLM") : AsciiToFull("ROWM") )
+#define nilobj ( (OBJECT) NULL )
+#define null ( (FILE *) NULL )
+
+#define find_max(a, b) ((a) < (b) ? (b) : (a))
+#define find_min(a, b) ((a) < (b) ? (a) : (b))
+#define ceiling(a, b) ( ((a) - 1)/(b) + 1 ) /* ceiling(a/b) */
+#define is_odd(x) ( (x) & 1 ) /* TRUE if x is odd number */
+
+/*@::ALIGN, FULL_LENGTH, FONT_NUM, COLOUR_NUM, LANGUAGE_NUM, FULL_CHAR@*******/
+/* */
+/* typedef ALIGN - used for forcing record alignment. */
+/* */
+/*****************************************************************************/
+
+typedef char *ALIGN;
+
+
+/*****************************************************************************/
+/* */
+/* typedef FULL_LENGTH - an integer physical distance. */
+/* */
+/*****************************************************************************/
+
+typedef int FULL_LENGTH;
+
+
+/*****************************************************************************/
+/* */
+/* typedef SHORT_LENGTH - an short integer physical distance. */
+/* */
+/*****************************************************************************/
+
+typedef short int SHORT_LENGTH;
+
+
+/*****************************************************************************/
+/* */
+/* FONT_NUM - internal name for a font. */
+/* */
+/*****************************************************************************/
+
+typedef unsigned FONT_NUM;
+
+
+/*****************************************************************************/
+/* */
+/* COLOUR_NUM - internal name for a colour. */
+/* */
+/*****************************************************************************/
+
+typedef unsigned COLOUR_NUM;
+
+
+/*****************************************************************************/
+/* */
+/* LANGUAGE_NUM - internal name for a language. */
+/* */
+/*****************************************************************************/
+
+typedef unsigned LANGUAGE_NUM;
+
+
+/*****************************************************************************/
+/* */
+/* MAPPING - internal name for a character mapping vector. */
+/* */
+/*****************************************************************************/
+
+typedef unsigned MAPPING;
+
+
+/*****************************************************************************/
+/* */
+/* LINE - a line from a database index file. */
+/* */
+/*****************************************************************************/
+
+typedef char *LINE;
+
+
+/*****************************************************************************/
+/* */
+/* typedef FULL_CHAR - one of the characters manipulated by Lout. */
+/* */
+/* This program does not deal with 7-bit ASCII characters. Instead, its */
+/* characters are defined by the FULL_CHAR typedef, and could be anything */
+/* from 7-bit ASCII to 8-bit ISO-LATIN-1 to 16-bit UNICODE and beyond. */
+/* */
+/* Unfortunately C favours signed 8-bit characters: literal strings are */
+/* pointers to them, argv[] and the standard libraries assume them. We get */
+/* around these problems by using our own library, including AsciiToFull() */
+/* to convert an ASCII string (such as a C string) into a FULL_CHAR string. */
+/* */
+/* Formally this library appears in module z39.c; however since this */
+/* implementation uses 8-bit unsigned characters, most of the routines */
+/* can be implemented by macros containing type-cast calls to C standard */
+/* library routines. These appear in the z39.c externs list below. */
+/* */
+/*****************************************************************************/
+
+typedef unsigned char FULL_CHAR;
+
+/*****************************************************************************/
+/* */
+/* typedef POINTER- name for type of generic pointer */
+/* */
+/*****************************************************************************/
+
+typedef void *POINTER;
+
+
+/*@::Character literals@******************************************************/
+/* */
+/* Character Literals */
+/* */
+/* The following macros ensure that no Lout source is ever compared to a */
+/* literal character other than '\0': */
+/* */
+/*****************************************************************************/
+
+#define CH_FLAG_ALTERR 'a' /* the -a command line flag */
+#define CH_FLAG_CROSS 'c' /* the -c command line flag */
+#define CH_FLAG_ENCPATH 'C' /* the -C command line flag */
+#define CH_FLAG_DEBUG 'd' /* the -d command line flag */
+#define CH_FLAG_DIRPATH 'D' /* the -D command line flag */
+#define CH_FLAG_ERRFILE 'e' /* the -e command line flag */
+#define CH_FLAG_EPSFIRST 'E' /* first letter of the -EPS flag */
+#define CH_FLAG_FNTPATH 'F' /* the -F command line flag */
+#define CH_FLAG_HYPHEN 'h' /* the -h command line flag */
+#define CH_FLAG_HYPPATH 'H' /* the -H command line flag */
+#define CH_FLAG_INCLUDE 'i' /* the -i command line flag */
+#define CH_FLAG_INCPATH 'I' /* the -I command line flag */
+#define CH_FLAG_NOKERN 'k' /* the -k command line flag */
+#define CH_FLAG_NOCOLLATE 'l' /* the -l command line flag */
+#define CH_FLAG_COLLATE 'L' /* the -L command line flag */
+#define CH_FLAG_MEMCHECK 'm' /* the -m command line flag */
+#define CH_FLAG_MEMCR 'M' /* the -M command line flag */
+#define CH_FLAG_OUTFILE 'o' /* the -o command line flag */
+#define CH_FLAG_PLAIN 'p' /* the -p command line flag */
+#define CH_FLAG_FFPLAIN 'P' /* the -P command line flag */
+#define CH_FLAG_SUPPRESS 's' /* the -s command line flag */
+#define CH_FLAG_SAFE 'S' /* the -S command line flag */
+#define CH_FLAG_USAGE 'u' /* the -u command line flag */
+#define CH_FLAG_UNSAFE 'U' /* the -U command line flag */
+#define CH_FLAG_VERSION 'V' /* the -V command line flag */
+#define CH_FLAG_INITALL 'x' /* the -x command line flag */
+#define CH_FLAG_OPTION '-' /* the -- command line flag */
+#define CH_FLAG_WORDS 'w' /* the -w command line flag */
+#define CH_FLAG_PDF 'Z' /* the -Z command line flag */
+
+#define CH_SPACE ' ' /* space character */
+#define CH_NEWLINE '\n' /* the newline character */
+#define CH_SYMSTART '@' /* extra letter symbols may have */
+#define CH_UNDERSCORE '_' /* extra letter symbols may have */
+#define CH_QUOTE '"' /* the quote character */
+#define CH_ZERO '0' /* the first digit character, zero */
+#define CH_EIGHT '8' /* the last even digit character */
+#define CH_NINE '9' /* the last odd digit character */
+#define CH_INCGAP '+' /* begins an incrementing gap */
+#define CH_DECGAP '-' /* begins a decrementing gap */
+#define CH_MINUS '-' /* minus sign */
+#define CH_HYPHEN '-' /* the hyphen character */
+#define CH_NOBREAK 'u' /* `unbreakable' character for gaps */
+
+#define CH_UNIT_CM 'c' /* unit of measurement: centimetres */
+#define CH_UNIT_IN 'i' /* unit of measurement: inches */
+#define CH_UNIT_PT 'p' /* unit of measurement: points */
+#define CH_UNIT_EM 'm' /* unit of measurement: ems */
+#define CH_UNIT_FT 'f' /* unit of measurement: fontsizes */
+#define CH_UNIT_SP 's' /* unit of measurement: spacewidths */
+#define CH_UNIT_VS 'v' /* unit of measurement: vspaces */
+#define CH_UNIT_WD 'w' /* unit of measurement: follwidths */
+#define CH_UNIT_BD 'b' /* unit of measurement: boundwidths */
+#define CH_UNIT_RL 'r' /* unit of measurement: relwidths */
+#define CH_UNIT_DG 'd' /* unit of measurement: degrees */
+#define CH_UNIT_YU 'y' /* unit of measurement: y unit */
+#define CH_UNIT_ZU 'z' /* unit of measurement: z unit */
+
+#define CH_MODE_EDGE 'e' /* spacing mode: edge-to-edge */
+#define CH_MODE_HYPH 'h' /* spacing mode: hyphenation */
+#define CH_MODE_MARK 'x' /* spacing mode: mark-to-mark */
+#define CH_MODE_OVER 'o' /* spacing mode: overstrike */
+#define CH_MODE_KERN 'k' /* spacing mode: kerning */
+#define CH_MODE_TABL 't' /* spacing mode: tabulation */
+
+#define octaldigit(ch) ( (ch) >= '0' && (ch) <= '7' )
+#define decimaldigit(ch) ( (ch) >= '0' && (ch) <= '9' )
+#define digitchartonum(ch) ( (ch) - '0' )
+#define numtodigitchar(ch) ( (ch) + '0' )
+#define beginsbreakstyle(ch) ( (ch) >= 'a' && (ch) <= 'z' )
+#define numericchar(ch) ( decimaldigit(ch) || (ch) == '.' )
+
+
+/*@::String literals, FULL_CHAR type@*****************************************/
+/* */
+/* String Literals. */
+/* */
+/* All significant string literals are defined here. The program has many */
+/* others, however: format strings, debug output, etc. */
+/* */
+/*****************************************************************************/
+
+#define STR_EMPTY AsciiToFull("")
+#define STR_QUOTE AsciiToFull("\"")
+#define STR_ESCAPE AsciiToFull("\\")
+#define STR_COMMENT AsciiToFull("#")
+#define STR_SPACE AsciiToFull(" ")
+#define STR_FORMFEED AsciiToFull("\f")
+#define STR_TAB AsciiToFull("\t")
+#define STR_NEWLINE AsciiToFull("\n")
+#define STR_LETTERS_LOWER AsciiToFull("abcdefghijklmnopqrstuvwxyz")
+#define STR_LETTERS_UPPER AsciiToFull("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
+#define STR_LETTERS_SYMSTART AsciiToFull("@")
+#define STR_LETTERS_UNDERSCORE AsciiToFull("_")
+
+#if CHAR_IN==0
+#define STR_LETTERS_EXTRA0 AsciiToFull("")
+#define STR_LETTERS_EXTRA1 AsciiToFull("")
+#define STR_LETTERS_EXTRA2 AsciiToFull("")
+#define STR_LETTERS_EXTRA3 AsciiToFull("")
+#define STR_LETTERS_EXTRA4 AsciiToFull("")
+#define STR_LETTERS_EXTRA5 AsciiToFull("")
+#define STR_LETTERS_EXTRA6 AsciiToFull("")
+#define STR_LETTERS_EXTRA7 AsciiToFull("")
+#else
+#define STR_LETTERS_EXTRA0 AsciiToFull("\300\301\302\303\304\305\306\307")
+#define STR_LETTERS_EXTRA1 AsciiToFull("\310\311\312\313\314\315\316\317")
+#define STR_LETTERS_EXTRA2 AsciiToFull("\320\321\322\323\324\325\326")
+#define STR_LETTERS_EXTRA3 AsciiToFull("\330\331\332\333\334\335\336\337")
+#define STR_LETTERS_EXTRA4 AsciiToFull("\340\341\342\343\344\345\346\347")
+#define STR_LETTERS_EXTRA5 AsciiToFull("\350\351\352\353\354\355\356\357")
+#define STR_LETTERS_EXTRA6 AsciiToFull("\360\361\362\363\364\365\366")
+#define STR_LETTERS_EXTRA7 AsciiToFull("\370\371\372\373\374\375\376\377")
+#endif
+
+#define STR_STDIN AsciiToFull("-")
+#define STR_STDOUT AsciiToFull("-")
+#define STR_HYPHEN AsciiToFull("-")
+#define STR_EPS AsciiToFull("EPS")
+#define STR_POSTSCRIPT AsciiToFull("PostScript")
+#define STR_PLAINTEXT AsciiToFull("PlainText")
+#define STR_PDF AsciiToFull("PDF")
+#define STR_ELSE AsciiToFull("else")
+#define STR_NOCROSS AsciiToFull("??")
+#define STR_BADKEY AsciiToFull("badkey")
+#define STR_NONE AsciiToFull("none")
+#define STR_NOCHAR AsciiToFull("-none-")
+#define STR_ZERO AsciiToFull("0")
+#define STR_PS_SPACENAME AsciiToFull("space")
+#define STR_FONT_RECODE AsciiToFull("Recode")
+#define STR_FONT_NORECODE AsciiToFull("NoRecode")
+#define STR_COLOUR_NOCHANGE AsciiToFull("nochange")
+
+#define STR_BREAK_HYPHEN AsciiToFull("hyphen")
+#define STR_BREAK_NOHYPHEN AsciiToFull("nohyphen")
+#define STR_BREAK_ADJUST AsciiToFull("adjust")
+#define STR_BREAK_OUTDENT AsciiToFull("outdent")
+#define STR_BREAK_RAGGED AsciiToFull("ragged")
+#define STR_BREAK_CRAGGED AsciiToFull("cragged")
+#define STR_BREAK_RRAGGED AsciiToFull("rragged")
+#define STR_BREAK_ORAGGED AsciiToFull("oragged")
+#define STR_BREAK_LINES AsciiToFull("lines")
+#define STR_BREAK_CLINES AsciiToFull("clines")
+#define STR_BREAK_RLINES AsciiToFull("rlines")
+#define STR_BREAK_NOFIRST AsciiToFull("unbreakablefirst")
+#define STR_BREAK_FIRST AsciiToFull("breakablefirst")
+#define STR_BREAK_NOLAST AsciiToFull("unbreakablelast")
+#define STR_BREAK_LAST AsciiToFull("breakablelast")
+
+#define STR_SPACE_LOUT AsciiToFull("lout")
+#define STR_SPACE_COMPRESS AsciiToFull("compress")
+#define STR_SPACE_SEPARATE AsciiToFull("separate")
+#define STR_SPACE_TROFF AsciiToFull("troff")
+#define STR_SPACE_TEX AsciiToFull("tex")
+
+#define STR_SMALL_CAPS_ON AsciiToFull("smallcaps")
+#define STR_SMALL_CAPS_OFF AsciiToFull("nosmallcaps")
+
+#define STR_GAP_RJUSTIFY AsciiToFull("1rt")
+#define STR_GAP_ZERO_HYPH AsciiToFull("0ch")
+
+
+/*@::GAP, STYLE@**************************************************************/
+/* */
+/* typedef GAP - what separates one object from another. */
+/* */
+/*****************************************************************************/
+
+typedef struct
+{ unsigned ospare : 7; /* left for other things in STYLE */
+ BOOLEAN onobreak : 1; /* TRUE if this gap is unbreakable */
+ BOOLEAN omark : 1; /* TRUE if this gap is marked */
+ BOOLEAN ojoin : 1; /* TRUE if joins exist across gap */
+ unsigned ounits : 3; /* units of measurement: fixed, etc */
+ unsigned omode : 3; /* spacing mode: edge-to-edge, etc */
+ SHORT_LENGTH owidth; /* width of the gap */
+} GAP;
+
+#define nobreak(x) (x).onobreak
+#define mark(x) (x).omark
+#define join(x) (x).ojoin
+#define units(x) (x).ounits
+#define mode(x) (x).omode
+#define width(x) (x).owidth
+
+#define SetGap(x, xnobreak, xmark, xjoin, xunits, xmode, xwidth) \
+( nobreak(x) = xnobreak, mark(x) = xmark, join(x) = xjoin, \
+ units(x) = xunits, mode(x) = xmode, width(x) = xwidth \
+)
+
+#define GapCopy(x, y) \
+( nobreak(x) = nobreak(y), mark(x) = mark(y), join(x) = join(y), \
+ units(x) = units(y), mode(x) = mode(y), width(x) = width(y) \
+)
+
+#define ClearGap(x) SetGap(x, FALSE, FALSE, TRUE, FIXED_UNIT, NO_MODE, 0)
+
+
+/*****************************************************************************/
+/* */
+/* typedef STYLE - information about how to break text, etc. */
+/* */
+/*****************************************************************************/
+
+typedef struct
+{ union {
+ GAP oline_gap; /* separation between lines */
+ struct {
+ BOOLEAN ovadjust : 1; /* @VAdjust in effect */
+ BOOLEAN ohadjust : 1; /* @HAdjust in effect */
+ BOOLEAN opadjust : 1; /* @PAdjust in effect */
+ unsigned osmall_caps : 1; /* small capitals */
+ unsigned ospace_style : 3; /* space style: lout, troff, tex, .. */
+ } oss1;
+ } osu1;
+ union {
+ GAP ospace_gap; /* separation induced by white space */
+ struct {
+ unsigned ohyph_style : 2; /* hyphenation off or on */
+ unsigned ofill_style : 2; /* fill lines with text off/on */
+ unsigned odisplay_style : 3; /* display lines adjusted, ragged... */
+ } oss2;
+ } osu2;
+ SHORT_LENGTH oyunit; /* value of y unit of measurement */
+ SHORT_LENGTH ozunit; /* value of z unit of measurement */
+ FONT_NUM ofont : 12; /* current font */
+ COLOUR_NUM ocolour : 12; /* current colour */
+ LANGUAGE_NUM olanguage : 6; /* current language */
+ BOOLEAN onobreakfirst : 1; /* no break after first line of para */
+ BOOLEAN onobreaklast : 1; /* no break after last line of para */
+} STYLE;
+
+#define line_gap(x) (x).osu1.oline_gap
+#define vadjust(x) (x).osu1.oss1.ovadjust
+#define hadjust(x) (x).osu1.oss1.ohadjust
+#define padjust(x) (x).osu1.oss1.opadjust
+#define small_caps(x) (x).osu1.oss1.osmall_caps
+#define space_style(x) (x).osu1.oss1.ospace_style
+#define space_gap(x) (x).osu2.ospace_gap
+#define hyph_style(x) (x).osu2.oss2.ohyph_style
+#define fill_style(x) (x).osu2.oss2.ofill_style
+#define display_style(x)(x).osu2.oss2.odisplay_style
+#define font(x) (x).ofont
+#define colour(x) (x).ocolour
+#define language(x) (x).olanguage
+#define nobreakfirst(x) (x).onobreaklast
+#define nobreaklast(x) (x).onobreakfirst
+#define yunit(x) (x).oyunit
+#define zunit(x) (x).ozunit
+
+#define StyleCopy(x, y) \
+( GapCopy(line_gap(x), line_gap(y)), \
+ hyph_style(x) = hyph_style(y), \
+ fill_style(x) = fill_style(y), \
+ display_style(x) = display_style(y), \
+ small_caps(x) = small_caps(y), \
+ GapCopy(space_gap(x), space_gap(y)), \
+ font(x) = font(y), \
+ colour(x) = colour(y), \
+ language(x) = language(y), \
+ nobreakfirst(x) = nobreakfirst(y), \
+ nobreaklast(x) = nobreaklast(y), \
+ vadjust(x) = vadjust(y), \
+ hadjust(x) = hadjust(y), \
+ padjust(x) = padjust(y), \
+ space_style(x) = space_style(y), \
+ yunit(x) = yunit(y), \
+ zunit(x) = zunit(y) \
+)
+
+
+/*@::CONSTRAINT, FILE_NUM, FILE_POS, LIST@************************************/
+/* */
+/* typedef CONSTRAINT - a size constraint. */
+/* */
+/*****************************************************************************/
+
+typedef struct
+{ FULL_LENGTH obc;
+ FULL_LENGTH obfc;
+ FULL_LENGTH ofc;
+ FULL_LENGTH osparec;
+} CONSTRAINT;
+
+#define bc(x) (x).obc
+#define bfc(x) (x).obfc
+#define fc(x) (x).ofc
+#define sparec(x) (x).osparec
+#define constrained(x) (bc(x) != MAX_FULL_LENGTH || \
+ bfc(x) != MAX_FULL_LENGTH || fc(x) != MAX_FULL_LENGTH)
+
+#define SetConstraint(c,x,y,z) (bc(c) = (x), bfc(c) = (y), fc(c) = (z))
+#define CopyConstraint(x, y) (bc(x) = bc(y), bfc(x) = bfc(y), fc(x) = fc(y))
+#define FitsConstraint(b, f, c) (b <= bc(c) && b + f <= bfc(c) && f <= fc(c))
+
+#define ig_fnum(x) bc(constraint(x))
+#define ig_xtrans(x) bfc(constraint(x))
+#define ig_ytrans(x) fc(constraint(x))
+
+
+/*****************************************************************************/
+/* */
+/* typedef FILE_NUM - the internal representation of a file. */
+/* */
+/*****************************************************************************/
+
+typedef unsigned short FILE_NUM;
+#define NO_FILE 0
+
+
+/*****************************************************************************/
+/* */
+/* typedef FILE_POS - a position in the set of input files. */
+/* */
+/*****************************************************************************/
+
+typedef struct
+{ unsigned char otype; /* space for object type field */
+ unsigned char orec_size; /* space for object record size */
+ FILE_NUM ofile_num; /* no. of file this record is from */
+ unsigned oline_num : 20; /* the line number of this record */
+ unsigned ocol_num : 12; /* column number this is related to */
+} FILE_POS;
+
+#define file_num(x) (x).ofile_num
+#define col_num(x) (x).ocol_num
+#define line_num(x) (x).oline_num
+
+#define FposCopy(x, y) \
+( file_num(x) = file_num(y), \
+ line_num(x) = line_num(y), \
+ col_num(x) = col_num(y) \
+)
+
+
+/*****************************************************************************/
+/* */
+/* typedef LIST - two pointers used to make one doubly linked list */
+/* */
+/*****************************************************************************/
+
+typedef struct { union rec *opred, *osucc; } LIST;
+
+
+/*@::FIRST_UNION@*************************************************************/
+/* */
+/* typedef FIRST_UNION - first eight bytes of object record (after LISTs). */
+/* */
+/* The fpos is overwritten in WORDs and QWORDs during FixAndPrintObject by */
+/* the horizontal coordinate of the word, which has to be remembered. */
+/* */
+/*****************************************************************************/
+
+typedef union
+{
+ FILE_POS ofpos;
+ struct
+ { unsigned char otype, orec_size;
+ int oword_save_mark;
+ } os11;
+
+} FIRST_UNION;
+
+
+/*@::SECOND_UNION, THIRD_UNION, FOURTH_UNION@*********************************/
+/* */
+/* typedef SECOND_UNION - four bytes holding various flags etc. */
+/* */
+/*****************************************************************************/
+
+typedef union
+{
+ struct /* used by all tokens */
+ { unsigned char oprecedence;
+ unsigned char ohspace, ovspace;
+ } os21;
+
+ struct /* used by WORD objects only, except underline used by all */
+ /* objects, including GAP_OBJ */
+ { FONT_NUM oword_font : 12;
+ COLOUR_NUM oword_colour : 11;
+ LANGUAGE_NUM oword_language : 6;
+ unsigned ounderline : 2;
+ unsigned oword_hyph : 1;
+ } os22;
+
+ struct /* used by non-WORD objects */
+ { unsigned char ofoll_or_prec;
+ unsigned char ocross_type; /* CROSS objects only */
+ BOOLEAN onon_blocking: 1;
+ BOOLEAN osized : 1;
+ BOOLEAN othreaded : 1;
+ BOOLEAN oexternal_hor: 1;
+ BOOLEAN oexternal_ver: 1;
+ BOOLEAN oblocked : 1;
+ BOOLEAN otrigger_ext : 1;
+ BOOLEAN omust_expand : 1;
+ BOOLEAN ogall_dir : 1;
+ BOOLEAN oopt_hyph : 1;
+ BOOLEAN oopt_gazumped: 1;
+ BOOLEAN oadjust_cat : 1;
+ BOOLEAN oforce_gall : 1;
+ unsigned ounderline : 2;
+ /* don't forget ounderline from os22 applies in this union! */
+ } os23;
+
+ struct /* used by WORD and QWORD when they are database nodes */
+ { unsigned short oleft_pos;
+ unsigned char oreading;
+ unsigned char oin_memory;
+ } os24;
+
+ struct /* used by WORD and QWORD when they are font records */
+ { FONT_NUM ofont_num : 12;
+ unsigned short ofont_page;
+ } os25;
+
+ struct /* used by symbol table entries */
+ { unsigned char oprecedence;
+ BOOLEAN ois_tag : 1;
+ BOOLEAN ohas_tag : 1;
+ BOOLEAN ohas_lpar : 1;
+ BOOLEAN ohas_rpar : 1;
+ BOOLEAN oright_assoc : 1;
+ BOOLEAN ois_target : 1;
+ BOOLEAN ohas_target : 1;
+ BOOLEAN oforce_target : 1;
+ BOOLEAN ohas_body : 1;
+ BOOLEAN oindefinite : 1;
+ BOOLEAN orecursive : 1;
+ BOOLEAN ouses_extern_target : 1;
+ BOOLEAN ois_extern_target : 1;
+ BOOLEAN ois_key : 1;
+ BOOLEAN ohas_key : 1;
+ BOOLEAN odirty : 1;
+ BOOLEAN ovisible : 1;
+ BOOLEAN ohas_mark : 1;
+ BOOLEAN ohas_join : 1;
+ BOOLEAN ohas_par : 1;
+ BOOLEAN ouses_galley : 1;
+ BOOLEAN ohoriz_galley : 1;
+ BOOLEAN oimports_encl : 1;
+ } os26;
+
+} SECOND_UNION;
+
+
+/*****************************************************************************/
+/* */
+/* typedef THIRD_UNION - eight bytes usually holding an object size. */
+/* */
+/* In database records this space is used for a file pointer, or a pointer */
+/* to a LINE array if the database is in-memory; in certain */
+/* WORD objects used privately in z10.c it is used for a galley-position. */
+/* In font records it holds the font size, space width, etc. In filter */
+/* words it holds a pointer to the symbol being filtered. */
+/* */
+/*****************************************************************************/
+
+typedef union
+{
+ struct
+ { FULL_LENGTH oback[2];
+ FULL_LENGTH ofwd[2];
+ } os31;
+
+ FILE *odb_filep;
+ LINE *odb_lines;
+
+ struct
+ { FULL_LENGTH ofont_size;
+ FULL_LENGTH ofont_xheight2;
+ FULL_LENGTH ofont_spacewidth;
+ MAPPING ofont_mapping : 7;
+ BOOLEAN ofont_recoded : 1;
+ BOOLEAN ofont_firstpage : 1;
+ } os32;
+
+ struct
+ { unsigned char ocs_type;
+ FILE_NUM ocs_fnum;
+ int ocs_pos;
+ int ocs_lnum;
+ } os33;
+
+ union rec *ofilter_actual;
+
+} THIRD_UNION;
+
+
+/*****************************************************************************/
+/* */
+/* typedef FOURTH_UNION - twelve bytes holding a STYLE or CONSTRAINT. */
+/* */
+/*****************************************************************************/
+
+typedef union
+{
+ STYLE osave_style;
+ CONSTRAINT oconstraint;
+
+} FOURTH_UNION;
+
+
+/*@::OBJECT@******************************************************************/
+/* */
+/* typedef OBJECT - the general-purpose record used throughout Lout. */
+/* */
+/* This record is a complex union type. Which fields are defined in any */
+/* given record depends on its type() tag field, as follows. But first */
+/* we define some collections of fields that are commonly defined together. */
+/* */
+/* ALL - these fields are defined in all objects. They won't be mentioned */
+/* again, but they are always there. */
+/* */
+/* type Tag field for the record */
+/* rec_size Size of this record, in words (for memory allocator) */
+/* succ Next element on list of parents, children */
+/* pred Previous element on list of parents, children */
+/* fpos Position in input file which gave rise to this */
+/* object (could be null; overwritten by word_save_mark */
+/* locally in FixAndPrintOjbect). It sub-fields are: */
+/* */
+/* file_num internal file number */
+/* line_num line number in that file */
+/* col_num column number on that line */
+/* */
+/* Lout attempts to put a meaningful fpos into every */
+/* object, so that error messages related to that */
+/* object can have meaningful line numbers. This has */
+/* not been done in every case; it ought to be. */
+/* */
+/* TOKEN - these fields are defined for all objects that are input tokens, */
+/* They may be overwritten after parsing is completed. */
+/* */
+/* precedence Precedence of this token (0 if has no parameters) */
+/* hspace Horizontal space preceding this token */
+/* vspace Vertical space preceding this token */
+/* */
+/* SIZED - these fields are defined for all objects that represent Lout */
+/* objects and hence have a horizontal and vertical size. They */
+/* will be undefined until after MinSize() is called on the object, */
+/* and defined thereafter. */
+/* */
+/* back[COLM] Horizontal size to left of object's mark */
+/* fwd[COLM] Horizontal size to right of object's mark */
+/* back[ROWM] Vertical size above object's mark */
+/* fwd[ROWM] Vertical size below object's mark */
+/* */
+/* GAP - a gap between two Lout objects. */
+/* */
+/* nobreak TRUE if gap is unbreakable (has u tag) */
+/* mark TRUE if gap is marked (has ^ tag) */
+/* join TRUE if a mark-joining gap (e.g. | not ||) */
+/* units units of measurement (fixed, or r or d etc) */
+/* mode gap mode (mark-to-mark, etc.) */
+/* width width of gap in the given units */
+/* */
+/* STYLE - the style (attributes affecting the appearance) of an object. */
+/* */
+/* line_gap How much to separate lines by */
+/* vadjust TRUE when @VAdjust is in effect */
+/* hadjust TRUE when @HAdjust is in effect */
+/* padjust TRUE when @PAdjust is in effect */
+/* small_caps TRUE when small capitals wanted */
+/* space_style Spacing style (lout, troff etc. from @Space) */
+/* space_gap Object separation given a white space, i.e. "1s" */
+/* hyph_style Hyphenation (undefined, off, on) */
+/* fill_style Fill lines (undefined, off, on) */
+/* display_style Display style for lines (adjust, centre, etc.) */
+/* yunit Value of y unit of measurement */
+/* zunit Value of z unit of measurement */
+/* font Which internal font (including size) to use */
+/* colour Which internal colour to use */
+/* language Which internal language to use */
+/* nobreakfirst TRUE if break not allowed after first line of para */
+/* nobreaklastt TRUE if break not allowed before last line of para */
+/* */
+/* CONSTRAINT - a constraint on how large some object is allowed to be, */
+/* either horizontally or vertically */
+/* */
+/* bc how large back may be (MAX_FULL_LEN if infinite) */
+/* fc how large fwd may be (MAX_FULL_LEN if infinite) */
+/* bfc how large back + fwd may be (MAX_FULL_LEN if inf.) */
+/* */
+/* */
+/* Here now is the list of all object types, what they represent, and */
+/* what fields they contain. The list also indicates what children each */
+/* object of the given type can expect to have. */
+/* */
+/* LINK - one link in the directed acyclic graph which is Lout's universal */
+/* internal data structure. All the other types below are various */
+/* types of nodes. Has ALL only (and no fpos) except see CROSS_SYM */
+/* */
+/* GAP_OBJ - a gap between two Lout objects */
+/* */
+/* gap The gap itself (type GAP) */
+/* underline TRUE if continuous underlining crosses this gap */
+/* save_* These fields used by optimum paragraph breaker only */
+/* first child If the gap is not just white space, the gap object */
+/* */
+/* CLOSURE - an invocation of a user-defined symbol, not yet expanded */
+/* */
+/* TOKEN While still being parsed */
+/* SIZED After sizing if indefinite (the sizes will be zero) */
+/* save_style Style to print this invocation in when expanded */
+/* actual The symbol table record defining this symbol */
+/* threaded TRUE if symbol lies on a vertical thread */
+/* external_ver TRUE if symbol is external in a vertical galley */
+/* external_hor TRUE if symbol is external in a horizontal galley */
+/* children PAR objects whose children are the actual parameters */
+/* */
+/* UNDER_REC - a temporary object inserted by FixAndPrintObject to help */
+/* with working out continuous underlining */
+/* */
+/* back(COLM) Horizontal position of start of underline */
+/* fwd(COLM) Horizontal position of end of underline */
+/* back(ROWM) [type clash] font determining underline appearance */
+/* */
+/* PAGE_LABEL - a @PageLabel object */
+/* */
+/* TOKEN While still being parsed */
+/* SIZED Indefinite, so all sizes will be zero */
+/* first child The parameter of the @PageLabel object */
+/* */
+/* NULL_CLOS - a @Null object */
+/* */
+/* TOKEN While still being parsed */
+/* SIZED Indefinite, so all sizes will be zero */
+/* */
+/* CROSS, FORCE_CROSS - a cross reference (or forcing cross reference) obj */
+/* */
+/* TOKEN While still being parsed */
+/* SIZED Indefinite, so all sizes will be zero */
+/* cross_type Type of cross reference (preceding, following, etc.) */
+/* children The two parameters of the cross reference */
+/* */
+/* HEAD - the header record for a galley invocation */
+/* */
+/* force_gall TRUE if this is a forcing galley (i.e. "force into") */
+/* actual The symbol table record defining this galley */
+/* enclose_obj If galley has @Enclose, the enclose object */
+/* limiter Helps decide whether to break off or scale if stuck */
+/* opt_components If optimizing, the sequence of components */
+/* opt_constraints If optimizing, the sequence of size constraints */
+/* opt_counts If optimizing, the sequence of numbers of components */
+/* In each child of opt_counts, comp_count has the num */
+/* opt_comps_permitted number of components left before opt break */
+/* opt_hyph If optimizing, whether to hyphenate the galley */
+/* opt_gazumped If optimizing, galley has been gazumped recently */
+/* gall_dir Promotion direction (COLM for horizontal galleys) */
+/* ready_galls Galleys read in from cross reference database */
+/* must_expand TRUE if must expand galley object even if indefinite */
+/* sized TRUE after galley object has been sized */
+/* foll_or_prec Direction of search for target (forward, back, etc.) */
+/* whereto Symbol this galley is targeted at */
+/* seen_nojoin TRUE if // op found within galley anywhere */
+/* */
+/* SPLIT - a split object, used for building tables */
+/* */
+/* SIZED The size of the whole object */
+/* first child An object whose horizontal size is the overall size */
+/* second child An object whose vertical size is the overall size */
+/* */
+/* PAR - actual parameter of a symbol invocation (always child of CLOSURE) */
+/* */
+/* TOKEN While still being parsed */
+/* actual The symbol table record defining this parameter */
+/* first child A Lout object, the value of this parameter */
+/* */
+/* WORD, QWORD - a literal word, or a literal word entered in quotes "" */
+/* */
+/* TOKEN While still being parsed */
+/* SIZED The size of the word */
+/* word_font Font to print this word in (from style) */
+/* word_colour Colour to print this word in (from style) */
+/* word_language Language (for hyphenation) of this word (from style) */
+/* underline TRUE if continuous underlining goes under this word */
+/* word_hyph Hyphenation wanted for this word (from style) */
+/* word_save_mark Coord of column mark, temporarily in FixAndPrint */
+/* string[] The characters of the word, null-terminated */
+/* */
+/* WORD, QWORD when used as database header records */
+/* */
+/* string[] Database index file name */
+/* reading TRUE if this database can be read from */
+/* in_memory TRUE if this database's index is held in memory */
+/* db_filep Pointer to database file (if not in_memory) */
+/* left_pos Seek pos of 1st entry in db_filep (if not in_memory) */
+/* db_lines Pointer to database index lines (if in_memory) */
+/* db_lineslen Number of database index lines (if in_memory) */
+/* first child List of symbols held in this database */
+/* other children CROSS_SYM symbols of symbols in this database */
+/* The *links* to these have the following fields: */
+/* number An ID number for this sym in this db */
+/* db_targ TRUE if sym is a galley target */
+/* */
+/* WORD, QWORD when used as font records */
+/* */
+/* string[] Font name */
+/* font_num The number of this font */
+/* font_page Number of most recent page using this font */
+/* font_size Size of this font */
+/* font_xheight2 Half-x height of this font */
+/* font_spacewidth Preferred width of space between words in this font */
+/* font_mapping The mapping to apply with this font */
+/* font_recoded TRUE if font needs recoding in PostScript output */
+/* font_firstpage TRUE if this font is used on the very first page */
+/* */
+/* WORD, QWORD when used in hash table to check whether crs defined twice */
+/* */
+/* db_checksym Symbol of the cross reference */
+/* string[] Tag of the cross reference */
+/* */
+/* HSPANNER (VSPANNER) - An object that spans columns (rows) */
+/* */
+/* TOKEN While still being parsed */
+/* SIZED The size of the object */
+/* spanner_broken TRUE after BreakObject() applied to this object */
+/* spanner_count Number of columns (rows) spanned by this spanner */
+/* spanner_sized Number of cols (rows) of this spanner sized so far */
+/* first child The object that is doing the spanning */
+/* */
+/* COL_THR (ROW_THR) - object representing all objects on a col (row) mark */
+/* */
+/* SIZED The horizontal (vertical) size only */
+/* thr_state Tells whether thread is sized or not yet */
+/* children The objects on the mark */
+/* parents The parents of the children (one-to-one) */
+/* */
+/* ACAT - a paragraph (sequence of objects separated by & or white space) */
+/* */
+/* SIZED The size of the object */
+/* save_style The style to print this paragraph in */
+/* children The paragraph's objects and gaps (obj-gap-obj...obj) */
+/* */
+/* HCAT (VCAT) - a horizontal (vertical) sequence of objects */
+/* */
+/* SIZED The size of the object */
+/* save_style The style to print this object in */
+/* children The objects and gaps (obj-gap-obj...obj) */
+/* adjust_cat Whether to perform adjustment (@VAdjust, etc.) */
+/* */
+/* WIDE (HIGH) - @Wide (@High) object */
+/* */
+/* TOKEN While still being parsed */
+/* SIZED The size of the object */
+/* constraint The horizontal (vertical) size constraint */
+/* first child The right parameter of this symbol */
+/* */
+/* HSHIFT (VSHIFT) - @HShift (@VShift) object */
+/* */
+/* TOKEN While still being parsed */
+/* SIZED The size of the object */
+/* shift_type left, right etc. */
+/* shift_gap The amount to shift */
+/* first child The right parameter of this symbol */
+/* */
+/* HSCALE (VSCALE) - @HScale (@VScale) object */
+/* */
+/* TOKEN While still being parsed */
+/* SIZED The size of the object */
+/* save_mark used temporarily by FixAndPrintObject */
+/* constraint used temporarily by FixAndPrintObject */
+/* first child The right parameter of this symbol */
+/* */
+/* SCALE - @Scale object */
+/* */
+/* TOKEN While still being parsed */
+/* SIZED The size of the object */
+/* bc(constraint) The horizontal scale factor */
+/* fc(constraint) The vertical scale factor */
+/* save_mark used temporarily by FixAndPrintObject */
+/* vert_sized TRUE if vertical size of object is known */
+/* first child The right parameter of this symbol */
+/* */
+/* ONE_COL (ONE_ROW) - @OneCol (@OneRow) object */
+/* HCOVER (VCOVER) - @HCover (@VCover) object */
+/* HCONTRACT (VCONTRACT) - @HContract (@VContract) object */
+/* HEXPAND (VEXPAND) - @HExpand (@VExpand) object */
+/* START_HSPAN, START_VSPAN - @StartHSpan, @StartVSpan */
+/* START_HVSPAN - @StartHVSpan */
+/* HSPAN (VSPAN) - @HSpan (@VSpan) symbols */
+/* KERN_SHRINK - @KernShrink object */
+/* */
+/* TOKEN While still being parsed */
+/* SIZED The size of the object */
+/* first child The right parameter of this symbol */
+/* */
+/* PADJUST (HADJUST, VADJUST) - @PAdjust (@HAdjust, @VAdjust) symbols */
+/* */
+/* TOKEN While still being parsed */
+/* first child The right parameter of this symbol */
+/* */
+/* ROTATE - @Rotate symbol */
+/* */
+/* TOKEN While still being parsed */
+/* SIZED The size of the object */
+/* save_mark used temporarily by FixAndPrintObject */
+/* sparec(cons) Amount to rotate by (after manifesting) */
+/* first child Amount to rotate by (before manifesting) */
+/* last child The right parameter of this symbol */
+/* */
+/* BACKGROUND - @Background symbol */
+/* */
+/* TOKEN While still being parsed */
+/* SIZED The size of the object */
+/* children The two parameters of this symbol */
+/* */
+/* GRAPHIC, PLAIN_GRAPHIC - @Graphic, @PlainGraphic symbols */
+/* */
+/* TOKEN While still being parsed */
+/* SIZED The size of the object */
+/* save_mark used temporarily by FixAndPrintObject */
+/* children The two parameters of this symbol */
+/* */
+/* CASE - @Case symbol */
+/* */
+/* TOKEN While still being parsed */
+/* first child The left parameter of @Case */
+/* last child The right parameter (sequence of @Yield objects) */
+/* */
+/* VERBATIM (RAWVERBATIM) - @Verbatim (@RawVerbatim) symbol */
+/* */
+/* TOKEN While still being parsed */
+/* first child The right parameter of this symbol */
+/* */
+/* FILTERED - object recording filtered Lout object */
+/* */
+/* filter_use_begin TRUE if filter enclosed in @Begin ... @End */
+/* filter_actual The symbol this is an invocation of */
+/* first child WORD containing file name of filter output */
+/* */
+/* XCHAR - @Char symbol */
+/* NEXT - @Next symbol */
+/* ONE_OF - @OneOf symbol */
+/* UNDERLINE - @Underline symbol */
+/* */
+/* TOKEN While still being parsed */
+/* last child The right parameter of this symbol */
+/* */
+/* FONT, SPACE, BREAK - @Font, @Space, @Break symbols */
+/* YUNIT, ZUNIT, COLOUR, LANGUAGE - @YUnit, @ZUnit, @Colour, @Language syms */
+/* PLUS, MINUS, - @Plus, @Minus symbols */
+/* MELD, COMMON, RUMP, INSERT - @Meld, @Common, @Rump, @Insert symbols */
+/* OPEN, TAGGED - @Open, @Tagged symbols */
+/* YIELD - @Yield symbol */
+/* */
+/* TOKEN While still being parsed */
+/* first child The left parameter of this symbol */
+/* last child The right parameter of this symbol */
+/* */
+/* ENV_OBJ - a Lout object with environment attached */
+/* */
+/* first child The Lout object */
+/* last child Its environment (ENV object) */
+/* */
+/* ENV - environment of some Lout object */
+/* */
+/* children Components of the environment */
+/* */
+/* INCGRAPHIC, SINCGRAPHIC - @IncludeGraphic, @SysIncludeGraphic symbols */
+/* */
+/* TOKEN While still being parsed */
+/* SIZED The size of the object */
+/* save_mark used temporarily by FixAndPrintObject */
+/* incgraphic_ok TRUE if file name pans out OK */
+/* last child The right parameter of this symbol */
+/* */
+/* TSPACE, TJUXTA - tokens representing white space */
+/* */
+/* TOKEN While still being parsed */
+/* mark(gap) FALSE */
+/* join(gap) TRUE */
+/* */
+/* BEGIN - @Begin symbol */
+/* */
+/* TOKEN While still being parsed */
+/* actual Symbol this @Begin starts parameter of */
+/* */
+/* END - @End symbol */
+/* LBR, RBR - tokens representing left brace and right brace */
+/* USE, NOT_REVEALED - @Use, @NotRevealed symbols */
+/* GSTUB_EXT, GSTUB_INT, GSTUB_NONE - stubs for transferred galleys */
+/* UNEXPECTED_EOF - unexpected end of file token */
+/* INCLUDE, SYS_INCLUDE - @Include, @SysInclude symbols */
+/* PREPEND, SYS_PREPEND - @PrependGraphic, @SysPrependGraphic symbols */
+/* ENVA, ENVB, ENVC, ENVD - @LEnvA, @LEnvB, @LEnvC, @LEnvD tokens only */
+/* CENV, CLOS, LVIS, LUSE, LEO - @LCEnv, @LClos, @LVis, @LUse, @LEO tokens */
+/* BACKEND - @BackEnd symbol */
+/* CURR_LANG, CURR_FAMILY, CURR_FACE - @CurrLang, @CurrFamily, @CurrFace */
+/* */
+/* TOKEN While still being parsed */
+/* */
+/* DEAD - an index of a dead galley */
+/* */
+/* UNATTACHED - the index of an unattached galley */
+/* */
+/* actual The galley referred to */
+/* non_blocking TRUE if this index should not block galley flushing */
+/* blocked TRUE if this index is now blocking galley flushing */
+/* pinpoint Exact anchor point of this index */
+/* */
+/* RECEPTIVE, RECEIVING - the index of a receptive or receiving object */
+/* */
+/* actual The object (symbol invocation) referred to */
+/* trigger_externs TRUE is this index's galley has external galleys */
+/* non_blocking TRUE if this index should not block galley flushing */
+/* blocked TRUE if this index is now blocking galley flushing */
+/* */
+/* RECURSIVE - the index of a recursive but definite object */
+/* */
+/* actual The recursive symbol invocation referred to */
+/* */
+/* PRECEDES - an index recording a precedes/follows flushing constraint */
+/* */
+/* first child Other parent of this is the corresponding FOLLOWS */
+/* */
+/* FOLLOWS - an index recording a precedes/follows flushing constraint */
+/* */
+/* blocked TRUE if this index is now blocking galley flushing */
+/* first child Other parent of this is the corresponding PRECEDES */
+/* */
+/* CROSS_LIT - not actually an object at all */
+/* */
+/* CROSS_PREC, CROSS_FOLL, CROSS_FOLL_OR_PREC - the index of a cross ref */
+/* */
+/* actual The cross reference referred to */
+/* underline TRUE if continuous underline goes through here */
+/* first child Equal to actual */
+/* */
+/* GALL_PREC, GALL_FOLL, GALL_FOLL_OR_PREC - index of a galley */
+/* */
+/* actual The galley referred to */
+/* underline TRUE if continuous underline goes through here */
+/* pinpoint Exact anchor point of this index */
+/* */
+/* GALL_TARG - index of the target of a galley */
+/* */
+/* actual The galley target (symbol invocation) referred to */
+/* underline TRUE if continuous underline goes through here */
+/* */
+/* PAGE_LABEL_IND - the index of a @PageLabel object */
+/* */
+/* actual The @PageLabel object referred to */
+/* underline TRUE if continuous underline goes through here */
+/* first child Equal to actual */
+/* */
+/* SCALE_IND - the index of a @Scale symbol with empty left parameter */
+/* COVER_IND - the index of an @HCover or @VCover object */
+/* EXPAND_IND - the index of an @HExpand or @VExpand object */
+/* */
+/* actual The object referred to */
+/* underline TRUE if continuous underline goes through here */
+/* */
+/* THREAD - a sequence of threads (basically local to Manifest) */
+/* */
+/* children The threads */
+/* */
+/* CROSS_SYM - a record of the cross reference state of some symbol */
+/* */
+/* target_state Whether we currently have a preceding target */
+/* target_file Which file target is written to */
+/* target_val Value of target (if target_state == SEEN_TARGET) */
+/* target_seq A sequence number */
+/* target_pos Seek position of target in target_file */
+/* target_lnum Line number of target in target_file */
+/* gall_seq Sequence number for galleys targeted to here */
+/* symb The symbol table record of the symbol this is for */
+/* gall_tag I forget! */
+/* gall_tfile The most recent cr database file for this sym */
+/* children Cross references and galleys waiting for a target */
+/* These children have the following fields: */
+/* */
+/* string[] The sequence number */
+/* cs_type The cross reference type */
+/* cs_fnum File number where value written */
+/* cs_pos File seek position */
+/* cs_lnum File line number */
+/* */
+/* CR_ROOT - all CROSS_SYM objects are children of this singleton */
+/* */
+/* children All CROSS_SYM symbols */
+/* */
+/* MACRO - a symbol table entry for a symbol which is a macro */
+/* LOCAL - a symbol table entry for a symbol which is a local symbol */
+/* LPAR - a symbol table entry for a symbol which is a left parameter */
+/* RPAR - a symbol table entry for a symbol which is a right parameter */
+/* NPAR - a symbol table entry for a symbol which is a named parameter */
+/* */
+/* enclosing The symbol that this one is defined within, if any */
+/* sym_body The symbol body (token sequence if MACRO) */
+/* base_uses Local to symbol table, for calculating call graph */
+/* uses Call graph info */
+/* marker For call graph calculation */
+/* imports The import list preceding this symbol, if any */
+/* filter Child @Filter symbol, if any */
+/* use_invocation A @Use clause containing this symbol, if any */
+/* predefined If predefined symbol, its non-zero enum code */
+/* has_compulsory Number of parameters with "compulsory" tag */
+/* uses_count Number of times this symbol is used */
+/* npar_code One-letter abbreviation for this NPAR */
+/* cross_sym The CROSS_SYM record for this symbol, if any */
+/* recursive TRUE if symbol is recursive */
+/* has_body TRUE if symbol has a body parameter */
+/* imports_encl TRUE if symbol imports the symbol enclosing itself */
+/* right_assoc TRUE if this symbol has "associativity right" */
+/* precedence The precedence of this symbol */
+/* indefinite TRUE if this symbol is indefinite (e.g. receptive) */
+/* recursive TRUE if symbol is recursive */
+/* is_extern_target TRUE if symbol is the target of external galley */
+/* uses_extern_target TRUE if symbol uses target of an external galley */
+/* visible TRUE if symbol is exported */
+/* uses_galley TRUE if symbol uses a galley */
+/* horiz_galley if galley, ROWM if vertical, COLM if horizontal */
+/* is_compulsory TRUE if this is a parameter with "compulsory" tag */
+/* dirty TRUE if must copy this parameter, not link it */
+/* has_par TRUE if this symbol has at least one parameter */
+/* has_lpar TRUE if this symbol has a left parameter */
+/* has_rpar TRUE if this symbol has a right or body parameter */
+/* has_target TRUE if this symbol has a target (is a galley) */
+/* force_target TRUE if this symbol has a forcing target */
+/* is_target TRUE if this symbol is @Target, defining a target */
+/* has_tag TRUE if this symbol has a @Tag parameter */
+/* is_tag TRUE if this symbol is a @Tag parameter */
+/* has_key TRUE if this symbol has a @Key parameter */
+/* is_key TRUE if this symbol is a @Key parameter */
+/* has_optimize TRUE if this symbol has an @Optimize parameter */
+/* is_optimize TRUE if this symbol is an @Optimize parameter */
+/* has_merge TRUE if this symbol has a @Merge parameter */
+/* is_merge TRUE if this symbol is a @Merge parameter */
+/* has_enclose TRUE if this symbol has an @Enclose parameter */
+/* is_enclose TRUE if this symbol is an @Enclose parameter */
+/* */
+/* EXT_GALL - a record of an external galley, not actually read in yet */
+/* */
+/* eg_fnum Number of file read from */
+/* eg_fpos Position in that file */
+/* eg_lnum Line number in that file */
+/* eg_cont Continuation (where to look for next galley) */
+/* eg_symbol The symbol that is the target of this galley */
+/* first child The galley tag */
+/* second child The galley sequence string */
+/* */
+/* CR_LIST - a list of cross references */
+/* */
+/* children The cross-references */
+/* */
+/* DISPOSED - a disposed object (available for reallocation) */
+/* */
+/*****************************************************************************/
+
+typedef union rec
+{
+ struct word_type /* all fields of WORD and QWORD, token and object */
+ { LIST olist[2];
+ FIRST_UNION ou1;
+ SECOND_UNION ou2;
+ THIRD_UNION ou3;
+ FULL_CHAR ostring[4];
+ } os1;
+
+ struct closure_type /* all fields of CLOSURE, both as token and object */
+ { LIST olist[2];
+ FIRST_UNION ou1;
+ SECOND_UNION ou2;
+ THIRD_UNION ou3;
+ FOURTH_UNION ou4;
+ union rec *oactual;
+ union
+ { union rec *owhereto;
+ union rec *opinpoint;
+ FULL_LENGTH osave_mark;
+ } oux;
+ /* union rec *oready_galls; */
+ } os2;
+
+ struct head_type /* all fields of HEAD, both as token and object */
+ { LIST olist[2];
+ FIRST_UNION ou1;
+ SECOND_UNION ou2;
+ THIRD_UNION ou3;
+ FOURTH_UNION ou4;
+ union rec *oactual;
+ union
+ { union rec *owhereto;
+ union rec *opinpoint;
+ FULL_LENGTH osave_mark;
+ } oux;
+ union rec *oready_galls;
+ union rec *oopt_components;
+ union rec *oopt_constraints;
+ union rec *oopt_counts;
+ union rec *olimiter;
+ union rec *oenclose_obj;
+ int oopt_comps_permitted;
+ } os2a;
+
+ struct object_type /* the general OBJECT */
+ { LIST olist[2];
+ FIRST_UNION ou1;
+ SECOND_UNION ou2;
+ THIRD_UNION ou3;
+ FOURTH_UNION ou4;
+ } os3;
+
+ struct link_type /* LINK */
+ { LIST olist[2];
+ unsigned char otype;
+ unsigned char onumber;
+ unsigned char odb_targ;
+ } os4;
+
+ struct gapobj_type /* GAP_OBJ */
+ { LIST olist[2];
+ FIRST_UNION ou1;
+ SECOND_UNION ou2;
+ GAP ogap;
+ int osave_badness; /* optimum paragraph breaker */
+ SHORT_LENGTH osave_space; /* optimum paragraph breaker */
+ SHORT_LENGTH osave_actual_gap; /* optimum paragraph breaker */
+ union rec *osave_prev; /* optimum paragraph breaker */
+ union rec *osave_cwid; /* optimum paragraph breaker */
+ } os5;
+
+ struct symbol_type
+ { LIST olist[2];
+ FIRST_UNION ou1;
+ SECOND_UNION ou2;
+ union rec *oenclosing;
+ union rec *osym_body;
+ union rec *obase_uses;
+ union rec *ouses;
+ union rec *omarker;
+ union rec *ocross_sym;
+ union rec *oimports;
+ union rec *ofilter;
+ union rec *ouse_invocation;
+ short unsigned opredefined;
+ short unsigned ohas_compulsory;
+ unsigned char ouses_count;
+ unsigned char onpar_code;
+ BOOLEAN ois_optimize : 1;
+ BOOLEAN ohas_optimize : 1;
+ BOOLEAN ois_merge : 1;
+ BOOLEAN ohas_merge : 1;
+ BOOLEAN ois_enclose : 1;
+ BOOLEAN ohas_enclose : 1;
+ BOOLEAN ois_compulsory : 1;
+ } os6;
+
+ struct cr_type
+ { LIST olist[2];
+ unsigned char otype;
+ unsigned char otarget_state;
+ FILE_NUM otarget_file;
+ /* FILE_NUM ocr_file; unused */
+ union rec *otarget_val;
+ int otarget_seq;
+ int otarget_pos;
+ int otarget_lnum;
+ /* int ocr_seq; unused */
+ int ogall_seq;
+ union rec *osymb;
+ union rec *ogall_tag;
+ FILE_NUM ogall_tfile;
+ } os7;
+
+ struct ext_gall_type
+ { LIST olist[2];
+ unsigned char otype;
+ FILE_NUM oeg_fnum;
+ int oeg_lnum;
+ long oeg_fpos;
+ long oeg_cont;
+ union rec *oeg_symbol;
+ } os8;
+
+ struct uses_type
+ { union rec *oitem;
+ union rec *onext;
+ } os9;
+#define USES_SIZE ceiling( sizeof(struct uses_type), sizeof(ALIGN) )
+
+ struct hash_entry_type
+ { LIST olist[1];
+ } os10;
+
+} *OBJECT;
+
+
+/*@::macros for fields of OBJECT@*********************************************/
+/* */
+/* Macros for fields of OBJECT. */
+/* */
+/*****************************************************************************/
+
+#define succ(x, dim) (x)->os1.olist[dim].osucc
+#define pred(x, dim) (x)->os1.olist[dim].opred
+
+#define type(x) (x)->os1.ou1.os11.otype
+#define rec_size(x) (x)->os1.ou1.os11.orec_size
+#define precedence(x) (x)->os1.ou2.os21.oprecedence
+#define hspace(x) (x)->os1.ou2.os21.ohspace
+#define vspace(x) (x)->os1.ou2.os21.ovspace
+
+#define word_font(x) (x)->os1.ou2.os22.oword_font
+#define spanner_count(x) word_font(x)
+#define word_colour(x) (x)->os1.ou2.os22.oword_colour
+#define spanner_sized(x) word_colour(x)
+#define word_language(x) (x)->os1.ou2.os22.oword_language
+#define spanner_broken(x) word_language(x)
+#define underline(x) (x)->os1.ou2.os22.ounderline
+#define word_hyph(x) (x)->os1.ou2.os22.oword_hyph
+#define filter_use_begin(x) (x)->os1.ou2.os22.oword_colour
+
+#define non_blocking(x) (x)->os1.ou2.os23.onon_blocking
+#define vert_sized(x) non_blocking(x)
+#define sized(x) (x)->os1.ou2.os23.osized
+#define threaded(x) (x)->os1.ou2.os23.othreaded
+#define external_ver(x) (x)->os1.ou2.os23.oexternal_ver
+#define external_hor(x) (x)->os1.ou2.os23.oexternal_hor
+#define blocked(x) (x)->os1.ou2.os23.oblocked
+#define seen_nojoin(x) blocked(x)
+#define trigger_externs(x) (x)->os1.ou2.os23.otrigger_ext
+#define must_expand(x) (x)->os1.ou2.os23.omust_expand
+#define gall_dir(x) (x)->os1.ou2.os23.ogall_dir
+#define opt_hyph(x) (x)->os1.ou2.os23.oopt_hyph
+#define opt_gazumped(x) (x)->os1.ou2.os23.oopt_gazumped
+#define adjust_cat(x) (x)->os1.ou2.os23.oadjust_cat
+#define force_gall(x) (x)->os1.ou2.os23.oforce_gall
+#define cross_type(x) (x)->os1.ou2.os23.ocross_type
+#define foll_or_prec(x) (x)->os1.ou2.os23.ofoll_or_prec
+#define thr_state(x) cross_type(x)
+#define incgraphic_ok(x) cross_type(x)
+
+#define left_pos(x) (x)->os1.ou2.os24.oleft_pos
+#define db_lineslen(x) left_pos(x)
+#define reading(x) (x)->os1.ou2.os24.oreading
+#define in_memory(x) (x)->os1.ou2.os24.oin_memory
+
+#define is_tag(x) (x)->os1.ou2.os26.ois_tag
+#define has_tag(x) (x)->os1.ou2.os26.ohas_tag
+#define has_lpar(x) (x)->os1.ou2.os26.ohas_lpar
+#define has_rpar(x) (x)->os1.ou2.os26.ohas_rpar
+#define right_assoc(x) (x)->os1.ou2.os26.oright_assoc
+#define is_target(x) (x)->os1.ou2.os26.ois_target
+#define has_target(x) (x)->os1.ou2.os26.ohas_target
+#define force_target(x) (x)->os1.ou2.os26.oforce_target
+#define has_body(x) (x)->os1.ou2.os26.ohas_body
+#define indefinite(x) (x)->os1.ou2.os26.oindefinite
+#define recursive(x) (x)->os1.ou2.os26.orecursive
+#define uses_extern_target(x) (x)->os1.ou2.os26.ouses_extern_target
+#define is_extern_target(x) (x)->os1.ou2.os26.ois_extern_target
+#define is_key(x) (x)->os1.ou2.os26.ois_key
+#define has_key(x) (x)->os1.ou2.os26.ohas_key
+#define dirty(x) (x)->os1.ou2.os26.odirty
+#define visible(x) (x)->os1.ou2.os26.ovisible
+#define has_mark(x) (x)->os1.ou2.os26.ohas_mark
+#define has_join(x) (x)->os1.ou2.os26.ohas_join
+#define has_par(x) (x)->os1.ou2.os26.ohas_par
+#define uses_galley(x) (x)->os1.ou2.os26.ouses_galley
+#define horiz_galley(x) (x)->os1.ou2.os26.ohoriz_galley
+#define imports_encl(x) (x)->os1.ou2.os26.oimports_encl
+
+#define fpos(x) (x)->os1.ou1.ofpos
+#define word_save_mark(x) (x)->os1.ou1.os11.oword_save_mark
+
+#define back(x, dim) (x)->os1.ou3.os31.oback[dim]
+#define comp_count(x) back(x, COLM)
+#define fwd(x, dim) (x)->os1.ou3.os31.ofwd[dim]
+#define size(x, dim) (back(x, dim) + fwd(x, dim))
+#define db_filep(x) (x)->os1.ou3.odb_filep
+#define db_lines(x) (x)->os1.ou3.odb_lines
+#define filter_actual(x) (x)->os1.ou3.ofilter_actual
+#define db_checksym(x) filter_actual(x)
+
+#define cs_type(x) (x)->os1.ou3.os33.ocs_type
+#define cs_fnum(x) (x)->os1.ou3.os33.ocs_fnum
+#define cs_pos(x) (x)->os1.ou3.os33.ocs_pos
+#define cs_lnum(x) (x)->os1.ou3.os33.ocs_lnum
+
+#define gall_rec(x) (x)->os1.ou3.os33.ogall_rec
+#define gall_type(x) (x)->os1.ou3.os33.ogall_type
+#define gall_pos(x) (x)->os1.ou3.os33.ogall_pos
+
+#define string(x) (x)->os1.ostring
+
+#define save_style(x) (x)->os2.ou4.osave_style
+#define constraint(x) (x)->os2.ou4.oconstraint
+#define shift_type(x) width(space_gap(save_style(x)))
+#define shift_gap(x) line_gap(save_style(x))
+
+#define actual(x) (x)->os2.oactual
+#define whereto(x) (x)->os2.oux.owhereto
+#define pinpoint(x) (x)->os2.oux.opinpoint
+#define save_mark(x) (x)->os2.oux.osave_mark
+#define ready_galls(x) (x)->os2a.oready_galls
+#define opt_components(x) (x)->os2a.oopt_components
+#define opt_constraints(x) (x)->os2a.oopt_constraints
+#define opt_counts(x) (x)->os2a.oopt_counts
+#define limiter(x) (x)->os2a.olimiter
+#define enclose_obj(x) (x)->os2a.oenclose_obj
+#define opt_comps_permitted(x) (x)->os2a.oopt_comps_permitted
+
+#define number(x) (x)->os4.onumber
+#define db_targ(x) (x)->os4.odb_targ
+
+#define gap(x) (x)->os5.ogap
+#define save_badness(x) (x)->os5.osave_badness
+#define save_space(x) (x)->os5.osave_space
+#define save_actual_gap(x) (x)->os5.osave_actual_gap
+#define save_prev(x) (x)->os5.osave_prev
+#define save_cwid(x) (x)->os5.osave_cwid
+
+#define enclosing(x) (x)->os6.oenclosing
+#define sym_body(x) (x)->os6.osym_body
+#define base_uses(x) (x)->os6.obase_uses
+#define uses(x) (x)->os6.ouses
+#define marker(x) (x)->os6.omarker
+#define cross_sym(x) (x)->os6.ocross_sym
+#define imports(x) (x)->os6.oimports
+#define filter(x) (x)->os6.ofilter
+#define use_invocation(x) (x)->os6.ouse_invocation
+#define predefined(x) (x)->os6.opredefined
+#define has_compulsory(x) (x)->os6.ohas_compulsory
+#define uses_count(x) (x)->os6.ouses_count
+#define npar_code(x) (x)->os6.onpar_code
+#define is_optimize(x) (x)->os6.ois_optimize
+#define has_optimize(x) (x)->os6.ohas_optimize
+#define is_merge(x) (x)->os6.ois_merge
+#define has_merge(x) (x)->os6.ohas_merge
+#define is_enclose(x) (x)->os6.ois_enclose
+#define has_enclose(x) (x)->os6.ohas_enclose
+#define is_compulsory(x) (x)->os6.ois_compulsory
+
+#define target_state(x) (x)->os7.otarget_state
+#define target_file(x) (x)->os7.otarget_file
+/* #define cr_file(x) (x)->os7.ocr_file unused */
+#define target_val(x) (x)->os7.otarget_val
+#define target_seq(x) (x)->os7.otarget_seq
+#define target_pos(x) (x)->os7.otarget_pos
+#define target_lnum(x) (x)->os7.otarget_lnum
+/* #define cr_seq(x) (x)->os7.ocr_seq unused */
+#define gall_seq(x) (x)->os7.ogall_seq
+#define symb(x) (x)->os7.osymb
+#define gall_tag(x) (x)->os7.ogall_tag
+#define gall_tfile(x) (x)->os7.ogall_tfile
+
+#define eg_fnum(x) (x)->os8.oeg_fnum
+#define eg_fpos(x) (x)->os8.oeg_fpos
+#define eg_lnum(x) (x)->os8.oeg_lnum
+#define eg_cont(x) (x)->os8.oeg_cont
+#define eg_symbol(x) (x)->os8.oeg_symbol
+
+#define item(x) (x)->os9.oitem
+#define next(x) (x)->os9.onext
+
+#define font_num(x) (x)->os1.ou2.os25.ofont_num
+#define font_page(x) (x)->os1.ou2.os25.ofont_page
+#define font_size(x) (x)->os1.ou3.os32.ofont_size
+#define font_xheight2(x) (x)->os1.ou3.os32.ofont_xheight2
+#define font_spacewidth(x) (x)->os1.ou3.os32.ofont_spacewidth
+#define font_mapping(x) (x)->os1.ou3.os32.ofont_mapping
+#define font_recoded(x) (x)->os1.ou3.os32.ofont_recoded
+#define font_firstpage(x) (x)->os1.ou3.os32.ofont_firstpage
+
+
+/*@::FONT_INFO@***************************************************************/
+/* */
+/* typedef FONT_INFO - information about font metrics etc. Really private */
+/* but shared between z37.c and z24.c */
+/* */
+/*****************************************************************************/
+
+struct metrics {
+ SHORT_LENGTH up;
+ SHORT_LENGTH down;
+ SHORT_LENGTH left;
+ SHORT_LENGTH right;
+ SHORT_LENGTH last_adjust;
+};
+
+typedef struct font_rec {
+ struct metrics *size_table; /* metrics of sized fonts */
+ FULL_CHAR *lig_table; /* ligatures */
+ OBJECT font_table; /* record of sized fonts */
+ OBJECT original_font; /* font rec before resizing */
+ SHORT_LENGTH underline_pos; /* position of underline */
+ SHORT_LENGTH underline_thick; /* thickness of underline */
+ unsigned short *kern_table; /* first kerning chars */
+ FULL_CHAR *kern_chars; /* second kerning chars */
+ unsigned char *kern_value; /* points into kern_lengths */
+ SHORT_LENGTH *kern_sizes; /* sizes of kernings */
+} FONT_INFO;
+
+
+/*@::MAP_VEC@*****************************************************************/
+/* */
+/* typedef MAP_VEC - information about character mappings. Really private */
+/* to z38.c but (for efficiency) shared with z37.c and z24.c */
+/* */
+/*****************************************************************************/
+
+#define MAX_CHASH 353 /* size of hash table */
+#define MAP_UPPERCASE 0 /* the map to upper case */
+#define MAP_LOWERCASE 1 /* the map to lower case */
+#define MAP_UNACCENTED 2 /* the map to unaccented */
+#define MAP_ACCENT 3 /* the map to the accent character */
+#define MAPS 4 /* the number of maps in each file */
+
+typedef struct mapvec {
+ OBJECT file_name; /* name of file containing the vec */
+ FILE_NUM fnum; /* the file number of this file */
+ BOOLEAN must_print; /* TRUE if this vec must be printed */
+ OBJECT name; /* PostScript name of encoding vec */
+ OBJECT vector[MAX_CHARS]; /* character names */
+ FULL_CHAR hash_table[MAX_CHASH]; /* character hash table for inverse */
+ FULL_CHAR map[MAPS][MAX_CHARS]; /* the mappings */
+} *MAP_VEC;
+
+
+/*@::object types@************************************************************/
+/* */
+/* OBJECT, TOKEN AND OTHER TYPES inhabiting type(x) and predefined(x) */
+/* */
+/* Key letters in the adjacent comment indicate where the tag is legal: */
+/* */
+/* t a token type, pushed on token stack */
+/* o an object type (returned by reduce(), inserted by Manifest) */
+/* i an index type (a child of a galley header other than an object) */
+/* s a predefined symbol (some symbol table entry has this predefined()) */
+/* n an indefinite object i.e. one which is ignored in catenation ops */
+/* */
+/*****************************************************************************/
+
+#define LINK 0 /* a link between objects */
+#define GAP_OBJ 1 /* o a gap object */
+#define CLOSURE 2 /* to n a closure of a symbol */
+#define UNDER_REC 3 /* o n record of underlining */
+#define PAGE_LABEL 4 /* to sn @PageLabel */
+#define NULL_CLOS 5 /* to sn @Null */
+#define CROSS 6 /* to sn && (a cross reference obj) */
+#define FORCE_CROSS 7 /* to sn &&& (a forcing cross ref.) */
+#define HEAD 8 /* o n a galley header */
+#define SPLIT 9 /* o @Split */
+#define PAR 10 /* o a parameter of a closure */
+#define WORD 11 /* o a word */
+#define QWORD 12 /* o a word (was quoted in i/p) */
+#define HSPANNER 13 /* o a horizontal spanner */
+#define VSPANNER 14 /* o a vertical spanner */
+#define ROW_THR 15 /* o a row thread */
+#define COL_THR 16 /* o a column thread */
+#define ACAT 17 /* to s a sequence of &-ed objs */
+#define HCAT 18 /* to s a sequence of |-ed objs */
+#define VCAT 19 /* to s a sequence of /-ed objs */
+#define ONE_COL 20 /* to s @OneCol */
+#define ONE_ROW 21 /* to s @OneRow */
+#define WIDE 22 /* to s @Wide */
+#define HIGH 23 /* to s @High */
+#define HSHIFT 24 /* to s @HShift */
+#define VSHIFT 25 /* to s @VShift */
+#define HSCALE 26 /* to s @HScale */
+#define VSCALE 27 /* to s @VScale */
+#define HCOVER 28 /* to s @HCover */
+#define VCOVER 29 /* to s @VCover */
+#define SCALE 30 /* to s @Scale */
+#define KERN_SHRINK 31 /* to s @KernShrink */
+#define HCONTRACT 32 /* to s @HContract */
+#define VCONTRACT 33 /* to s @VContract */
+#define HLIMITED 34 /* to s @HLimited */
+#define VLIMITED 35 /* to s @VLimited */
+#define HEXPAND 36 /* to s @HExpand */
+#define VEXPAND 37 /* to s @VExpand */
+#define START_HSPAN 38 /* to s @StartHSpan */
+#define START_VSPAN 39 /* to s @StartVSpan */
+#define START_HVSPAN 40 /* to s @StartHVSpan */
+#define HSPAN 41 /* to s @HSpan */
+#define VSPAN 42 /* to s @VSpan */
+#define PADJUST 43 /* to s @PAdjust */
+#define HADJUST 44 /* to s @HAdjust */
+#define VADJUST 45 /* to s @VAdjust */
+#define ROTATE 46 /* to s @Rotate */
+#define BACKGROUND 47 /* to s @Background */
+#define CASE 48 /* to s @Case */
+#define VERBATIM 49 /* to s @Verbatim */
+#define RAW_VERBATIM 50 /* to s @RawVerbatim */
+#define YIELD 51 /* to s @Yield */
+#define BACKEND 52 /* to s @BackEnd */
+#define FILTERED 53 /* to s filtered object (no name) */
+#define XCHAR 54 /* to s @Char */
+#define FONT 55 /* to s @Font */
+#define SPACE 56 /* to s @Space */
+#define YUNIT 57 /* to s @YUnit */
+#define ZUNIT 58 /* to s @ZUnit */
+#define BREAK 59 /* to s @Break */
+#define UNDERLINE 60 /* to s @Underline */
+#define COLOUR 61 /* to s @SetColour and @SetColor */
+#define LANGUAGE 62 /* to s @Language */
+#define CURR_LANG 63 /* to s @CurrLang */
+#define CURR_FAMILY 64 /* to s @CurrFamily */
+#define CURR_FACE 65 /* to s @CurrFace */
+#define COMMON 66 /* to s @Common */
+#define RUMP 67 /* to s @Rump */
+#define MELD 68 /* to s @Meld */
+#define INSERT 69 /* to s @Insert */
+#define ONE_OF 70 /* to s @OneOf */
+#define NEXT 71 /* to s @Next */
+#define PLUS 72 /* to s @Plus */
+#define MINUS 73 /* to s @Minus */
+#define ENV_OBJ 74 /* to s object with envt (no name) */
+#define ENV 75 /* to s @LEnv */
+#define ENVA 76 /* to s @LEnvA */
+#define ENVB 77 /* to s @LEnvB */
+#define ENVC 78 /* to s @LEnvC */
+#define ENVD 79 /* to s @LEnvD */
+#define CENV 80 /* to s @LCEnv */
+#define CLOS 81 /* to s @LClos */
+#define LVIS 82 /* to s @LVis */
+#define LUSE 83 /* to s @LUse */
+#define LEO 84 /* to s @LEO */
+#define OPEN 85 /* to s @Open */
+#define TAGGED 86 /* to s @Tagged */
+#define INCGRAPHIC 87 /* to s @IncludeGraphic */
+#define SINCGRAPHIC 88 /* to s @SysIncludeGraphic */
+#define PLAIN_GRAPHIC 89 /* to s @PlainGraphic */
+#define GRAPHIC 90 /* to s @Graphic */
+#define TSPACE 91 /* t a space token, parser only */
+#define TJUXTA 92 /* t a juxta token, parser only */
+#define LBR 93 /* t s left brace token */
+#define RBR 94 /* t s right brace token */
+#define BEGIN 95 /* t s @Begin token */
+#define END 96 /* t s @End token */
+#define USE 97 /* t s @Use */
+#define NOT_REVEALED 98 /* t s @NotRevealed */
+#define GSTUB_NONE 99 /* t a galley stub, no rpar */
+#define GSTUB_INT 100 /* t galley stub internal rpar */
+#define GSTUB_EXT 101 /* t galley stub external rpar */
+#define UNEXPECTED_EOF 102 /* t unexpected end of file */
+#define INCLUDE 103 /* s @Include */
+#define SYS_INCLUDE 104 /* s @SysInclude */
+#define PREPEND 105 /* s @Prepend */
+#define SYS_PREPEND 106 /* s @SysPrepend */
+#define DATABASE 107 /* s @Database */
+#define SYS_DATABASE 108 /* s @SysDatabase */
+/* #define START 109 */ /* s \Start */
+#define DEAD 110 /* i a dead galley */
+#define UNATTACHED 111 /* i an inner, unsized galley */
+#define RECEPTIVE 112 /* i a receptive object index */
+#define RECEIVING 113 /* i a receiving object index */
+#define RECURSIVE 114 /* i a recursive definite obj. */
+#define PRECEDES 115 /* i an ordering constraint */
+#define FOLLOWS 116 /* i other end of ordering c. */
+#define CROSS_LIT 117 /* i literal word cross-ref */
+#define CROSS_FOLL 118 /* i following type cross-ref */
+#define CROSS_FOLL_OR_PREC 119 /* i follorprec type cross-ref */
+#define GALL_FOLL 120 /* i galley with &&following */
+#define GALL_FOLL_OR_PREC 121 /* i galley with &&following */
+#define CROSS_TARG 122 /* i value of cross-ref */
+#define GALL_TARG 123 /* i target of these galleys */
+#define GALL_PREC 124 /* i galley with &&preceding */
+#define CROSS_PREC 125 /* i preceding type cross-ref */
+#define PAGE_LABEL_IND 126 /* i index of PAGE_LABEL */
+#define SCALE_IND 127 /* i index of auto SCALE */
+#define COVER_IND 128 /* i index of HCOVER or VCOVER */
+#define EXPAND_IND 129 /* i index of HEXPAND or VEXPD */
+#define THREAD 130 /* a sequence of threads */
+#define CROSS_SYM 131 /* cross-ref info */
+#define CR_ROOT 132 /* RootCross */
+#define MACRO 133 /* a macro symbol */
+#define LOCAL 134 /* a local symbol */
+#define LPAR 135 /* a left parameter */
+#define NPAR 136 /* a named parameter */
+#define RPAR 137 /* a right parameter */
+#define EXT_GALL 138 /* an external galley */
+#define CR_LIST 139 /* a list of cross references */
+#define DISPOSED 140 /* a disposed record */
+
+#define is_indefinite(x) ((x) >= CLOSURE && (x) <= HEAD)
+#define is_definite(x) ((x) >= SPLIT && (x) <= GRAPHIC)
+#define is_par(x) ((x) >= LPAR && (x) <= RPAR)
+#define is_index(x) ((x) >= DEAD && (x) <= EXPAND_IND)
+#define is_type(x) ((x) >= LINK && (x) < DISPOSED)
+#define is_word(x) ((x) == WORD || (x) == QWORD)
+#define is_cross(x) ((x) == CROSS || (x) == FORCE_CROSS)
+#define is_cat_op(x) (((x)>=ACAT && (x)<=VCAT) || (x)==TSPACE || (x)<=TJUXTA)
+
+
+/*@::miscellaneous constants@*************************************************/
+/* */
+/* Miscellaneous globally defined constants */
+/* */
+/*****************************************************************************/
+
+/* gap modes occupying mode(x) */
+#define NO_MODE 0 /* for error detection: no mode */
+#define EDGE_MODE 1 /* edge-to-edge spacing */
+#define HYPH_MODE 2 /* edge-to-edge with hyphenation */
+#define MARK_MODE 3 /* mark-to-mark spacing */
+#define OVER_MODE 4 /* overstrike spacing */
+#define KERN_MODE 5 /* kerning spacing */
+#define TAB_MODE 6 /* tabulation spacing */
+#define ADD_HYPH 7 /* temp value used by FillObject */
+
+/* hyph_style(style) options */
+#define HYPH_UNDEF 0 /* hyphenation option undefined */
+#define HYPH_OFF 1 /* hyphenation off */
+#define HYPH_ON 2 /* hyphenation on */
+
+/* fill_style(style) options */
+#define FILL_UNDEF 0 /* fill option undefined */
+#define FILL_OFF 1 /* no filling of lines */
+#define FILL_ON 2 /* fill lines with text */
+
+/* underline(obj) options */
+#define UNDER_UNDEF 0 /* underline undefined */
+#define UNDER_OFF 1 /* no underlining */
+#define UNDER_ON 2 /* underline this */
+
+/* space_style(style) options */
+#define SPACE_LOUT 0 /* interpret white space Lout's way */
+#define SPACE_COMPRESS 1 /* compress multiple white spaces */
+#define SPACE_SEPARATE 2 /* compress an separate */
+#define SPACE_TROFF 3 /* interpret white space troff's way */
+#define SPACE_TEX 4 /* interpret white space TeX's way */
+
+/* display_style(style) options */
+#define DISPLAY_UNDEF 0 /* display option undefined */
+#define DISPLAY_ADJUST 1 /* adjust lines (except last) */
+#define DISPLAY_OUTDENT 2 /* outdent lines (except first) */
+#define DISPLAY_ORAGGED 3 /* outdent but don't adjust */
+#define DISPLAY_LEFT 4 /* left-justify lines, no adjust */
+#define DISPLAY_CENTRE 5 /* centre lines, no adjust */
+#define DISPLAY_RIGHT 6 /* right-justify lines, no adjust */
+#define DO_ADJUST 7 /* placed in ACATs when adjust need */
+
+/* small_caps(style) options */
+#define SMALL_CAPS_OFF 0 /* don't want small capitals */
+#define SMALL_CAPS_ON 1 /* small capitals */
+
+/* sides of a mark */
+#define BACK 141 /* means lies to left of mark */
+#define ON 142 /* means lies on mark */
+#define FWD 143 /* means lies to right of mark */
+
+/* statuses of thread objects */
+#define NOTSIZED 0 /* this thread object is not sized */
+#define SIZED 1 /* thread is sized but not printed */
+#define FINALSIZE 2 /* thread object size is now final */
+
+/* constraint statuses */
+#define PROMOTE 144 /* this component may be promoted */
+#define CLOSE 145 /* must close dest before promoting */
+#define BLOCK 146 /* cannot promote this component */
+#define CLEAR 147 /* this constraint is now satisfied */
+
+/* gap increment types */
+#define GAP_ABS 148 /* absolute, e.g. 3p */
+#define GAP_INC 149 /* increment, e.g. +3p */
+#define GAP_DEC 150 /* decrement, e.g. -3p */
+
+/* file types */
+#define SOURCE_FILE 0 /* input file from command line */
+#define INCLUDE_FILE 1 /* @Include file */
+#define INCGRAPHIC_FILE 2 /* @IncludeGraphic file */
+#define DATABASE_FILE 3 /* database file */
+#define INDEX_FILE 4 /* database index file */
+#define FONT_FILE 5 /* font file */
+#define PREPEND_FILE 6 /* PostScript prologue file */
+#define HYPH_FILE 7 /* hyphenation file */
+#define HYPH_PACKED_FILE 8 /* packed hyphenation file */
+#define MAPPING_FILE 9 /* character mapping file */
+#define FILTER_FILE 10 /* filter output file */
+#define MAX_TYPES 11 /* number of file types */
+
+/* path types (i.e. sequences of directories for file searching) */
+#define SOURCE_PATH 0 /* path to search for source files */
+#define INCLUDE_PATH 1 /* path for @Include files */
+#define SYSINCLUDE_PATH 2 /* path for @SysInclude files */
+#define DATABASE_PATH 3 /* path for @Database files */
+#define SYSDATABASE_PATH 4 /* path for @SysDatabase files */
+#define FONT_PATH 5 /* path for font metrics (AFM) files */
+#define HYPH_PATH 6 /* path for hyphenation files */
+#define MAPPING_PATH 7 /* path for mapping (LCM) files */
+#define MAX_PATHS 8 /* number of mapping paths */
+
+/* units of measurement */
+#define NO_UNIT 0 /* no unit - for error detection */
+#define FIXED_UNIT 1 /* inches, cm, points, ems, y, z */
+#define FRAME_UNIT 2 /* b unit (frame widths) */
+#define AVAIL_UNIT 3 /* r unit (available spaces) */
+#define DEG_UNIT 4 /* d unit (degrees) */
+#define NEXT_UNIT 5 /* w unit (inners) */
+
+/* units of distance as multiples of the basic unit */
+#define CM 567 /* 1 centimetre */
+#define IN 1440 /* 1 inch */
+#define EM 120 /* 1 em (= 1/12 inch) */
+#define PT 20 /* 1 point (= 1/72 inch) */
+#define FR 4096 /* virtual unit for frame units */
+#define DG 128 /* virtual unit for degrees */
+#define SF 128 /* virtual unit for @Scale factors */
+
+/* default size of characters for the PLAINTEXT back end */
+#define PLAIN_WIDTH 144 /* default char width, 10 per inch */
+#define PLAIN_HEIGHT 240 /* default char height, 6 per inch */
+
+/* precedences */
+#define NO_PREC 0 /* lower than any precedence */
+#define BEGIN_PREC 1 /* precedence of @Begin */
+#define END_PREC 2 /* precedence of @End */
+#define LBR_PREC 3 /* precedence of { */
+#define RBR_PREC 4 /* precedence of } */
+#define VCAT_PREC 5 /* precedence of / */
+#define HCAT_PREC 6 /* precedence of | */
+#define ACAT_PREC 7 /* precedence of & and white space */
+#define MIN_PREC 10 /* minimum precedence of user ops */
+#define MAX_PREC 100 /* maximim precedence of user ops */
+#define DEFAULT_PREC 100 /* default precedence of user ops */
+#define CROSSOP_PREC 101 /* precedence of && and &&& ops */
+#define GAP_PREC 102 /* precedence of gap op after cat op */
+#define JUXTA_PREC 103 /* precedence of juxtaposition & */
+#define FILTER_PREC 104 /* precedence of filter symbol ops */
+#define FORCE_PREC 105 /* higher than any precedence */
+
+/* back ends */
+#define POSTSCRIPT 0 /* PostScript back end */
+#define PLAINTEXT 1 /* plain text back end */
+#define PDF 2
+
+/* error types */
+#define INTERN 0 /* internal error (i.e. bug) */
+#define FATAL 1 /* fatal error, abort now */
+#define WARN 2 /* warning, non-fatal */
+
+/* status values returned by AttachGalley() */
+#define ATTACH_KILLED 0
+#define ATTACH_INPUT 1
+#define ATTACH_NOTARGET 2
+#define ATTACH_SUSPEND 3
+#define ATTACH_NULL 4
+#define ATTACH_ACCEPT 5
+
+/* types of memory usage, used to debug memory consumption */
+#define MEM_BINARY 0 /* the executable binary */
+#define MEM_OBJECTS 1 /* objects currently in free list */
+#define MEM_FONTS 2 /* fonts */
+#define MEM_LEX 3 /* lexical analyser file buffers */
+#define MEM_FILES 4 /* table of file names */
+#define MEM_CROSSREF 5 /* table of file names */
+#define MEM_PAGES 6 /* page grids (-p only) */
+#define MEM_DBCHECK 7 /* database checks */
+#define MEM_DB 8 /* in_memory database */
+#define MEM_HYPH_PATS 9 /* hyphenation patterns */
+#define MEM_CMAPS 10 /* character maps */
+#define MEM_COLOUR_TAB 11 /* colour table */
+#define MEM_LANG_TAB 12 /* language table */
+#define MEM_USAGE_MAX 13 /* number of memory usage types */
+
+/*@::Keywords@****************************************************************/
+/* */
+/* Keywords. */
+/* */
+/*****************************************************************************/
+
+#define KW_START AsciiToFull("\\Start")
+#define KW_PRINT AsciiToFull("\\Print")
+#define KW_OPTGALL AsciiToFull("@OptGall")
+#define KW_DEF AsciiToFull("def")
+#define KW_FONTDEF AsciiToFull("fontdef")
+#define KW_LANGDEF AsciiToFull("langdef")
+#define KW_FORCE AsciiToFull("force")
+#define KW_HORIZ AsciiToFull("horizontally")
+#define KW_INTO AsciiToFull("into")
+#define KW_EXTEND AsciiToFull("extend")
+#define KW_IMPORT AsciiToFull("import")
+#define KW_EXPORT AsciiToFull("export")
+#define KW_PRECEDENCE AsciiToFull("precedence")
+#define KW_ASSOC AsciiToFull("associativity")
+#define KW_LEFT AsciiToFull("left")
+#define KW_RIGHT AsciiToFull("right")
+#define KW_BODY AsciiToFull("body")
+#define KW_FILTER AsciiToFull("@Filter")
+#define KW_FILTERIN AsciiToFull("@FilterIn")
+#define KW_FILTEROUT AsciiToFull("@FilterOut")
+#define KW_FILTERERR AsciiToFull("@FilterErr")
+#define KW_MACRO AsciiToFull("macro")
+#define KW_NAMED AsciiToFull("named")
+#define KW_COMPULSORY AsciiToFull("compulsory")
+#define KW_COMMON AsciiToFull("@Common")
+#define KW_RUMP AsciiToFull("@Rump")
+#define KW_MELD AsciiToFull("@Meld")
+#define KW_INSERT AsciiToFull("@Insert")
+#define KW_ONE_OF AsciiToFull("@OneOf")
+#define KW_NEXT AsciiToFull("@Next")
+#define KW_PLUS AsciiToFull("@Plus")
+#define KW_MINUS AsciiToFull("@Minus")
+#define KW_WIDE AsciiToFull("@Wide")
+#define KW_HIGH AsciiToFull("@High")
+#define KW_HSHIFT AsciiToFull("@HShift")
+#define KW_VSHIFT AsciiToFull("@VShift")
+#define KW_ONE_COL AsciiToFull("@OneCol")
+#define KW_ONE_ROW AsciiToFull("@OneRow")
+#define KW_HSCALE AsciiToFull("@HScale")
+#define KW_VSCALE AsciiToFull("@VScale")
+#define KW_HCOVER AsciiToFull("@HCover")
+#define KW_VCOVER AsciiToFull("@VCover")
+#define KW_SCALE AsciiToFull("@Scale")
+#define KW_KERN_SHRINK AsciiToFull("@KernShrink")
+#define KW_HCONTRACT AsciiToFull("@HContract")
+#define KW_VCONTRACT AsciiToFull("@VContract")
+#define KW_HLIMITED AsciiToFull("@HLimited")
+#define KW_VLIMITED AsciiToFull("@VLimited")
+#define KW_HEXPAND AsciiToFull("@HExpand")
+#define KW_VEXPAND AsciiToFull("@VExpand")
+#define KW_STARTHVSPAN AsciiToFull("@StartHVSpan")
+#define KW_STARTHSPAN AsciiToFull("@StartHSpan")
+#define KW_STARTVSPAN AsciiToFull("@StartVSpan")
+#define KW_HSPAN AsciiToFull("@HSpan")
+#define KW_VSPAN AsciiToFull("@VSpan")
+#define KW_PADJUST AsciiToFull("@PAdjust")
+#define KW_HADJUST AsciiToFull("@HAdjust")
+#define KW_VADJUST AsciiToFull("@VAdjust")
+#define KW_ROTATE AsciiToFull("@Rotate")
+#define KW_BACKGROUND AsciiToFull("@Background")
+#define KW_INCGRAPHIC AsciiToFull("@IncludeGraphic")
+#define KW_SINCGRAPHIC AsciiToFull("@SysIncludeGraphic")
+#define KW_GRAPHIC AsciiToFull("@Graphic")
+#define KW_PLAINGRAPHIC AsciiToFull("@PlainGraphic")
+#define KW_VERBATIM AsciiToFull("@Verbatim")
+#define KW_RAWVERBATIM AsciiToFull("@RawVerbatim")
+#define KW_CASE AsciiToFull("@Case")
+#define KW_YIELD AsciiToFull("@Yield")
+#define KW_BACKEND AsciiToFull("@BackEnd")
+#define KW_XCHAR AsciiToFull("@Char")
+#define KW_FONT AsciiToFull("@Font")
+#define KW_SPACE AsciiToFull("@Space")
+#define KW_YUNIT AsciiToFull("@YUnit")
+#define KW_ZUNIT AsciiToFull("@ZUnit")
+#define KW_BREAK AsciiToFull("@Break")
+#define KW_UNDERLINE AsciiToFull("@Underline")
+#define KW_COLOUR AsciiToFull("@SetColour")
+#define KW_COLOR AsciiToFull("@SetColor")
+#define KW_LANGUAGE AsciiToFull("@Language")
+#define KW_CURR_LANG AsciiToFull("@CurrLang")
+#define KW_CURR_FAMILY AsciiToFull("@CurrFamily")
+#define KW_CURR_FACE AsciiToFull("@CurrFace")
+#define KW_ENV AsciiToFull("@LEnv")
+#define KW_ENVA AsciiToFull("@@A")
+#define KW_ENVB AsciiToFull("@@B")
+#define KW_ENVC AsciiToFull("@@C")
+#define KW_ENVD AsciiToFull("@@D")
+#define KW_CENV AsciiToFull("@@E")
+#define KW_CLOS AsciiToFull("@LClos")
+#define KW_LVIS AsciiToFull("@@V")
+#define KW_LUSE AsciiToFull("@LUse")
+#define KW_LEO AsciiToFull("@LEO")
+#define KW_OPEN AsciiToFull("@Open")
+#define KW_USE AsciiToFull("@Use")
+#define KW_NOT_REVEALED AsciiToFull("@NotRevealed")
+#define KW_TAGGED AsciiToFull("@Tagged")
+#define KW_DATABASE AsciiToFull("@Database")
+#define KW_SYSDATABASE AsciiToFull("@SysDatabase")
+#define KW_INCLUDE AsciiToFull("@Include")
+#define KW_SYSINCLUDE AsciiToFull("@SysInclude")
+#define KW_PREPEND AsciiToFull("@PrependGraphic")
+#define KW_SYSPREPEND AsciiToFull("@SysPrependGraphic")
+#define KW_TARGET AsciiToFull("@Target")
+#define KW_FOLLOWING AsciiToFull("following")
+#define KW_PRECEDING AsciiToFull("preceding")
+#define KW_FOLL_OR_PREC AsciiToFull("foll_or_prec")
+#define KW_NOW AsciiToFull("now")
+#define KW_NULL AsciiToFull("@Null")
+#define KW_PAGE_LABEL AsciiToFull("@PageLabel")
+#define KW_GALLEY AsciiToFull("@Galley")
+#define KW_FORCE_GALLEY AsciiToFull("@ForceGalley")
+#define KW_INPUT AsciiToFull("@LInput")
+#define KW_SPLIT AsciiToFull("@Split")
+#define KW_TAG AsciiToFull("@Tag")
+#define KW_KEY AsciiToFull("@Key")
+#define KW_OPTIMIZE AsciiToFull("@Optimize")
+#define KW_MERGE AsciiToFull("@Merge")
+#define KW_ENCLOSE AsciiToFull("@Enclose")
+#define KW_CROSS AsciiToFull("&&")
+#define KW_FORCE_CROSS AsciiToFull("&&&")
+#define KW_LBR AsciiToFull("{")
+#define KW_RBR AsciiToFull("}")
+#define KW_BEGIN AsciiToFull("@Begin")
+#define KW_END AsciiToFull("@End")
+#define KW_VCAT_NN AsciiToFull("//")
+#define KW_VCAT_MN AsciiToFull("^//")
+#define KW_VCAT_NJ AsciiToFull("/")
+#define KW_VCAT_MJ AsciiToFull("^/")
+#define KW_HCAT_NN AsciiToFull("||")
+#define KW_HCAT_MN AsciiToFull("^||")
+#define KW_HCAT_NJ AsciiToFull("|")
+#define KW_HCAT_MJ AsciiToFull("^|")
+#define KW_ACAT_NJ AsciiToFull("&")
+#define KW_ACAT_MJ AsciiToFull("^&")
+#define KW_MOMENT AsciiToFull("@Moment")
+#define KW_SECOND AsciiToFull("@Second")
+#define KW_MINUTE AsciiToFull("@Minute")
+#define KW_HOUR AsciiToFull("@Hour")
+#define KW_DAY AsciiToFull("@Day")
+#define KW_MONTH AsciiToFull("@Month")
+#define KW_YEAR AsciiToFull("@Year")
+#define KW_CENTURY AsciiToFull("@Century")
+#define KW_WEEKDAY AsciiToFull("@WeekDay")
+#define KW_YEARDAY AsciiToFull("@YearDay")
+#define KW_DAYLIGHTSAVING AsciiToFull("@DaylightSaving")
+
+/*@::GetMem(), New(), NewWord()@**********************************************/
+/* */
+/* GetMem(x, siz, pos) */
+/* New(x, typ) */
+/* NewWord(x, typ, len, pos) */
+/* */
+/* Set x to point to a new record, of appropriate length (in ALIGNs). */
+/* The New and NewWord versions initialise LIST, type and rec_size fields. */
+/* NewWord must be used for WORD and QWORD objects. */
+/* */
+/*****************************************************************************/
+
+#if DEBUG_ON
+#define newcount zz_newcount++
+#define freecount zz_listcount--
+
+#define checknew(typ) \
+{ assert1( is_type(typ), "New: type", Image(typ) ); \
+ assert( zz_lengths[typ] > 0, "New: zero length!" ); \
+}
+
+#define checkmem(z, typ) \
+{ if( (MemCheck != 0) && ( (POINTER) z == MemCheck) ) \
+ fprintf(stderr, "%ld = New(%s)\n", (long) z, Image(type(z))); \
+}
+
+#else
+#define newcount
+#define freecount
+#define checknew(typ)
+#define checkmem(z, typ)
+#endif
+
+#define GetMem(x, siz, pos) \
+{ newcount; \
+ if( (zz_size=(siz)) >= MAX_OBJECT_REC ) \
+ Error(1, 1, "word is too long", FATAL, pos); \
+ else if( zz_free[zz_size] == nilobj ) \
+ x = GetMemory(zz_size, pos); \
+ else \
+ { x = zz_hold = zz_free[zz_size]; \
+ freecount; \
+ zz_free[zz_size] = pred(zz_hold, CHILD); \
+ } \
+}
+
+#define New(x, typ) \
+{ checknew(typ); \
+ GetMem(zz_hold, zz_lengths[typ], no_fpos); \
+ type(zz_hold) = typ; \
+ checkmem(zz_hold, typ); \
+ x = pred(zz_hold, CHILD) = succ(zz_hold, CHILD) = \
+ pred(zz_hold, PARENT) = succ(zz_hold, PARENT) = zz_hold; \
+}
+
+#define NewWord(x, typ, len, pos) \
+{ zz_size = sizeof(struct word_type) - 4 + ((len)+1)*sizeof(FULL_CHAR); \
+ /* NB the following line RESETS zz_size */ \
+ GetMem(zz_hold, ceiling(zz_size, sizeof(ALIGN)), pos); \
+ checkmem(zz_hold, typ); \
+ rec_size(zz_hold) = zz_size; \
+ type(zz_hold) = typ; \
+ x = pred(zz_hold, CHILD) = succ(zz_hold, CHILD) = \
+ pred(zz_hold, PARENT) = succ(zz_hold, PARENT) = zz_hold; \
+}
+
+/*@::PutMem(), Dispose()@*****************************************************/
+/* */
+/* PutMem(x, siz) */
+/* Dispose(x) */
+/* */
+/* Dispose x, which is of size siz. Dispose works out the size itself. */
+/* */
+/*****************************************************************************/
+#if DEBUG_ON
+#define disposecount zz_disposecount++; zz_listcount++;
+
+#define disposecheck \
+{ assert( zz_size >= 0 && zz_size < MAX_OBJECT_REC, "Dispose: size" ); \
+}
+
+#define setdisposed \
+{ if( (MemCheck != 0) && ((POINTER) zz_hold == MemCheck) ) \
+ fprintf(stderr, "Dispose(%ld, %s)\n", (long) zz_hold, \
+ Image(type(zz_hold))); \
+ type(zz_hold) = DISPOSED; \
+}
+
+#else
+#define disposecount
+#define disposecheck
+#define setdisposed
+#endif
+
+#define PutMem(x, siz) \
+{ disposecount; \
+ zz_hold = (x); \
+ zz_size = (siz); \
+ disposecheck; \
+ pred(zz_hold, CHILD) = zz_free[zz_size]; \
+ zz_free[zz_size] = zz_hold; \
+}
+
+#define Dispose(x) \
+{ zz_hold = (x); \
+ PutMem(zz_hold, is_word(type(zz_hold)) ? \
+ rec_size(zz_hold) : zz_lengths[type(zz_hold)]); \
+ setdisposed; \
+}
+
+/*@::Append(), Delete()@******************************************************/
+/* */
+/* OBJECT Append(x, y, dir) */
+/* */
+/* Return the append of lists x and y (dir is PARENT or CHILD). */
+/* */
+/*****************************************************************************/
+
+#define Append(x, y, dir) \
+( zz_res = (x), zz_hold = (y), \
+ zz_hold == nilobj ? zz_res : \
+ zz_res == nilobj ? zz_hold : \
+ ( zz_tmp = pred(zz_hold, dir), \
+ pred(zz_hold, dir) = pred(zz_res, dir), \
+ succ(pred(zz_res, dir), dir) = zz_hold, \
+ pred(zz_res, dir) = zz_tmp, \
+ succ(zz_tmp, dir) = zz_res \
+ ) \
+)
+
+
+/*****************************************************************************/
+/* */
+/* OBJECT Delete(x, dir) */
+/* */
+/* Delete x from its dir list, and return succ(x, dir) or nilobj if none. */
+/* */
+/*****************************************************************************/
+
+#define Delete(x, dir) \
+( zz_hold = (x), \
+ succ(zz_hold, dir) == zz_hold ? nilobj : \
+ ( zz_res = succ(zz_hold, dir), \
+ pred(zz_res, dir) = pred(zz_hold, dir), \
+ succ(pred(zz_hold, dir), dir) = zz_res, \
+ pred(zz_hold, dir) = succ(zz_hold, dir) = zz_hold, \
+ zz_res \
+ ) \
+)
+
+#define Down(x) succ(x, CHILD)
+#define NextDown(x) succ(x, CHILD)
+#define LastDown(x) pred(x, CHILD)
+#define PrevDown(x) pred(x, CHILD)
+#define Up(x) succ(x, PARENT)
+#define NextUp(x) succ(x, PARENT)
+#define LastUp(x) pred(x, PARENT)
+#define PrevUp(x) pred(x, PARENT)
+
+#define Child(y, link) \
+for( y = pred(link, PARENT); type(y) == LINK; y = pred(y, PARENT) )
+
+#define CountChild(y, link, i) \
+for( y=pred(link, PARENT), i=1; type(y)==LINK; y = pred(y, PARENT), i++ )
+
+#define Parent(y, link) \
+for( y = pred(link, CHILD); type(y) == LINK; y = pred(y, CHILD) )
+
+
+/*@::UpDim(), DownDim(), Link(), DeleteLink(), etc.@**************************/
+/* */
+/* UpDim(x, dim) */
+/* DownDim(x, dim) */
+/* */
+/* Returns the dim child or parent link of node x (dim == COLM or ROWM). */
+/* */
+/*****************************************************************************/
+
+#define UpDim(x, dim) ( (dim) == COLM ? succ(x, PARENT) : pred(x, PARENT) )
+#define DownDim(x, dim) ( (dim) == COLM ? succ(x, CHILD) : pred(x, CHILD) )
+
+
+/*****************************************************************************/
+/* */
+/* OBJECT Link(x, y) */
+/* */
+/* Make y a child of x in the directed graph, using a new link. */
+/* The link node is returned. */
+/* */
+/*****************************************************************************/
+
+#define Link(x, y) \
+{ New(xx_link, LINK); \
+ Append(xx_link, (x), CHILD); \
+ Append(xx_link, (y), PARENT); \
+}
+
+
+/*****************************************************************************/
+/* */
+/* DeleteLink(link) */
+/* */
+/* Cut the link between nodes x and y of the directed graph. */
+/* Returns the link node of the next child of x, or x if none. */
+/* */
+/*****************************************************************************/
+
+#define DeleteLink(link) \
+{ xx_link = (link); \
+ Delete(xx_link, PARENT); \
+ Delete(xx_link, CHILD); \
+ Dispose(xx_link); \
+}
+
+
+/*****************************************************************************/
+/* */
+/* DisposeChild(link) */
+/* */
+/* Delete link, and if its child is thereby unattached, dispose it. */
+/* */
+/*****************************************************************************/
+
+#define DisposeChild(link) \
+{ xx_link = (link); \
+ xx_tmp = Delete(xx_link, PARENT); \
+ Delete(xx_link, CHILD); \
+ Dispose(xx_link); \
+ if( succ(xx_tmp, PARENT) == xx_tmp ) DisposeObject(xx_tmp); \
+} /* end DisposeChild */
+
+
+/*****************************************************************************/
+/* */
+/* MoveLink(link, x, dir) */
+/* */
+/* Move the dir end of link from wherever it is now to node x. */
+/* */
+/*****************************************************************************/
+
+#define MoveLink(link, x, dir) \
+( xx_link = (link), \
+ Delete(xx_link, 1 - (dir) ), \
+ Append(xx_link, (x), 1 - (dir) ) \
+) /* end MoveLink */
+
+
+/*@::TransferLinks(), DeleteNode(), etc.@*************************************/
+/* */
+/* TransferLinks(start_link, stop_link, dest_link) */
+/* */
+/* Move parent end of links start_link (inclusive) to stop_link (exclusive) */
+/* to just before dest_link. */
+/* */
+/*****************************************************************************/
+
+#define TransferLinks(start_link, stop_link, dest_link) \
+{ OBJECT xxstart = start_link, xxstop = stop_link, xxdest = dest_link; \
+ if( xxstart != xxstop ) \
+ { assert( type(xxstart) == LINK, "TransferLinks: start_link!" ); \
+ Append(xxstart, xxstop, CHILD); /* actually a split */ \
+ Append(xxstart, xxdest, CHILD); \
+ } \
+}
+
+
+/*****************************************************************************/
+/* */
+/* DeleteNode(x) */
+/* */
+/* Delete node x and every edge attaching to x. */
+/* */
+/*****************************************************************************/
+
+#define DeleteNode(x) \
+{ xx_hold = (x); \
+ while( Up(xx_hold) != xx_hold ) DeleteLink( Up(xx_hold) ); \
+ while( Down(xx_hold) != xx_hold ) DeleteLink( Down(xx_hold) ); \
+ Dispose(xx_hold); \
+}
+
+
+/*****************************************************************************/
+/* */
+/* MergeNode(x, y) */
+/* */
+/* Take all the children of y and make them children of x. */
+/* Take all the parents of y and make them parents of x. Dispose y. */
+/* */
+/*****************************************************************************/
+
+#define MergeNode(x, y) \
+{ xx_res = (x); xx_hold = (y); \
+ xx_tmp = Delete(xx_hold, PARENT); \
+ Append(xx_res, xx_tmp, PARENT); \
+ xx_tmp = Delete(xx_hold, CHILD); \
+ Append(xx_res, xx_tmp, CHILD); \
+ Dispose(xx_hold); \
+} /* end MergeNode */
+
+
+/*****************************************************************************/
+/* */
+/* ReplaceNode(x, y) */
+/* */
+/* Move all the parent links of y to x. */
+/* */
+/*****************************************************************************/
+
+#define ReplaceNode(x, y) \
+( xx_tmp = Delete((y), PARENT), \
+ Append((x), xx_tmp, PARENT) \
+) /* end ReplaceNode */
+
+
+/*@::FirstDefinite(), NextDefinite(), etc.@***********************************/
+/* */
+/* FirstDefinite(x, link, y, jn) */
+/* */
+/* On input, x is an object and link and y are undefined. On output there */
+/* are two cases: */
+/* */
+/* link != x. Then y is first definite child of x and link is its link; */
+/* jn is TRUE iff all gaps on the way to link were joined. */
+/* */
+/* link == x. Then x has no definite child and y is undefined. */
+/* */
+/* A SPLIT object is considered to be definite if both its children are */
+/* definite. This condition is returned by SplitIsDefinite. */
+/* */
+/*****************************************************************************/
+
+#define FirstDefinite(x, link, y, jn) \
+{ jn = TRUE; \
+ for( link = Down(x); link != x; link = NextDown(link) ) \
+ { Child(y, link); \
+ if( type(y) == GAP_OBJ ) jn = jn && join(gap(y)); \
+ else if( type(y)==SPLIT ? SplitIsDefinite(y) : is_definite(type(y)))\
+ break; \
+ } \
+} /* end FirstDefinite */
+
+
+/*****************************************************************************/
+/* */
+/* NextDefinite(x, link, y) */
+/* */
+/* On input, x is an object and link is a link to one of its children; y */
+/* is undefined. On output there are two cases: */
+/* */
+/* link != x. Then y is the first definite child of x following link, and */
+/* link is changed to be the link of y. */
+/* */
+/* link == x. Then x has no definite child following link, and y remains */
+/* undefined. */
+/* */
+/*****************************************************************************/
+
+#define NextDefinite(x, link, y) \
+{ for( link = NextDown(link); link != x; link = NextDown(link) ) \
+ { Child(y, link); \
+ if( type(y) == SPLIT ? SplitIsDefinite(y) : is_definite(type(y)) ) \
+ break; \
+ } \
+} /* end NextDefinite */
+
+
+/*****************************************************************************/
+/* */
+/* NextDefiniteWithGap(x, link, y, g, jn) */
+/* */
+/* On input, x is an object and link is a link to one of its children; y */
+/* and g are undefined. On output there are two cases: */
+/* */
+/* link != x. Then y is the first definite child of x following link, and */
+/* link is changed to be the link of y. Also, g is defined */
+/* to be the gap just before y; this must exist and is tested */
+/* by an assert test; and jn is true iff all of the gaps on */
+/* the way from old link to new link are join gaps. */
+/* */
+/* link == x. Then x has no definite child following link, and y and g */
+/* remain undefined. */
+/* */
+/*****************************************************************************/
+
+#define NextDefiniteWithGap(x, link, y, g, jn) \
+{ g = nilobj; jn = TRUE; \
+ for( link = NextDown(link); link != x; link = NextDown(link) ) \
+ { Child(y, link); \
+ if( type(y) == GAP_OBJ ) g = y, jn = jn && join(gap(y)); \
+ else if( type(y)==SPLIT ? SplitIsDefinite(y):is_definite(type(y)) ) \
+ { \
+ debug2(DFS, D, " NextDefiniteWithGap at %s %s", \
+ Image(type(y)), EchoObject(y)); \
+ assert( g != nilobj, "NextDefiniteWithGap: g == nilobj!" ); \
+ break; \
+ } \
+ } \
+} /* end NextDefiniteWithGap */
+
+/*@@**************************************************************************/
+/* */
+/* LastDefinite(x, link, y) */
+/* */
+/* On input, x is an object and link and y are undefined. On output there */
+/* are two cases: */
+/* */
+/* link != x. Then y is the last definite child of x and link is its link. */
+/* */
+/* link == x. Then x has no definite child and y is undefined. */
+/* */
+/* A SPLIT object is considered to be definite if both its children are */
+/* definite. This condition is returned by SplitIsDefinite. */
+/* */
+/*****************************************************************************/
+
+#define LastDefinite(x, link, y) \
+{ for( link = LastDown(x); link != x; link = PrevDown(link) ) \
+ { Child(y, link); \
+ if( type(y) == SPLIT ? SplitIsDefinite(y) : is_definite(type(y)) ) \
+ break; \
+ } \
+} /* end LastDefinite */
+
+
+/*****************************************************************************/
+/* */
+/* PrevDefinite(x, link, y) */
+/* */
+/* On input, x is an object and link is a link to one of its children; y */
+/* is undefined. On output there are two cases: */
+/* */
+/* link != x. Then y is the first definite child of x preceding link, and */
+/* link is changed to be the link of y. */
+/* */
+/* link == x. Then x has no definite child preceding link, and y remains */
+/* undefined. */
+/* */
+/*****************************************************************************/
+
+#define PrevDefinite(x, link, y) \
+{ for( link = PrevDown(link); link != x; link = PrevDown(link) ) \
+ { Child(y, link); \
+ if( type(y) == SPLIT ? SplitIsDefinite(y) : is_definite(type(y)) ) \
+ break; \
+ } \
+} /* end PrevDefinite */
+
+
+/*@::Module Declarations@*****************************************************/
+/* */
+/* MODULE DECLARATIONS */
+/* */
+/*****************************************************************************/
+
+/***** z01.c Supervise **************************************/
+extern int main(int argc, char *argv[]);
+extern POINTER MemCheck;
+extern OBJECT StartSym;
+extern OBJECT GalleySym;
+extern OBJECT ForceGalleySym;
+extern OBJECT InputSym;
+extern OBJECT PrintSym;
+extern OBJECT FilterInSym;
+extern OBJECT FilterOutSym;
+extern OBJECT FilterErrSym;
+extern OBJECT VerbatimSym;
+extern OBJECT RawVerbatimSym;
+extern OBJECT OptGallSym;
+extern OBJECT CommandOptions;
+extern BOOLEAN AllowCrossDb;
+extern BOOLEAN UseCollate;
+extern BOOLEAN InMemoryDbIndexes;
+extern BOOLEAN Encapsulated;
+extern BOOLEAN Kern;
+extern BOOLEAN SafeExecution;
+extern BOOLEAN AltErrorFormat;
+extern int BackEnd;
+extern int TotalWordCount;
+extern FULL_CHAR *BackEndWord;
+extern FULL_LENGTH PlainCharWidth;
+extern FULL_LENGTH PlainCharHeight;
+extern BOOLEAN PlainFormFeed;
+extern BOOLEAN InitializeAll;
+#if LOCALE_ON
+extern nl_catd MsgCat;
+#endif
+
+/***** z02.c Lexical Analyser **************************************/
+extern BOOLEAN LexLegalName(FULL_CHAR *str);
+extern void LexInit(void);
+extern void LexPush(FILE_NUM x, int offs, int ftyp, int lnum, BOOLEAN same);
+extern void LexPop(void);
+extern long LexNextTokenPos(void);
+extern OBJECT LexGetToken(void);
+extern OBJECT LexScanVerbatim(FILE *fp, BOOLEAN end_stop, FILE_POS *err_pos,
+ BOOLEAN lessskip);
+
+/***** z03.c File Service **************************************/
+extern FILE_POS *no_fpos;
+extern void InitFiles(void);
+extern void AddToPath(int fpath, OBJECT dirname);
+extern FILE_NUM DefineFile(FULL_CHAR *str, FULL_CHAR *suffix,
+ FILE_POS *xfpos, int ftype, int fpath);
+extern FILE_NUM FirstFile(int ftype);
+extern FILE_NUM NextFile(FILE_NUM i);
+extern FILE_NUM FileNum(FULL_CHAR *str, FULL_CHAR *suffix);
+extern FILE_NUM DatabaseFileNum(FILE_POS *xfpos);
+extern FULL_CHAR *FileName(FILE_NUM fnum);
+extern FULL_CHAR *FullFileName(FILE_NUM fnum);
+extern FULL_CHAR *EchoFilePos(FILE_POS *pos);
+extern FULL_CHAR *EchoAltFilePos(FILE_POS *pos);
+extern FULL_CHAR *EchoFileSource(FILE_NUM fnum);
+extern FULL_CHAR *EchoFileLine(FILE_POS *pos);
+extern FILE_POS *PosOfFile(FILE_NUM fnum);
+extern FILE *OpenFile(FILE_NUM fnum, BOOLEAN check_ld, BOOLEAN check_lt);
+extern FILE *OpenIncGraphicFile(FULL_CHAR *str, unsigned char typ,
+ OBJECT *full_name, FILE_POS *xfpos, BOOLEAN *compressed);
+extern void FileSetUpdated(FILE_NUM fnum, int newlines);
+extern int FileGetLineCount(FILE_NUM fnum);
+extern BOOLEAN FileTestUpdated(FILE_NUM fnum);
+
+/***** z04.c Token Service **************************************/
+extern OBJECT NewToken(unsigned char xtype, FILE_POS *xfpos,
+ unsigned char xvspace, unsigned char xhspace,
+ unsigned char xprec, OBJECT xactual);
+extern OBJECT CopyTokenList(OBJECT x, FILE_POS *pos);
+extern FULL_CHAR *EchoCatOp(unsigned xtype, BOOLEAN xmark, BOOLEAN xjoin);
+extern FULL_CHAR *EchoToken(OBJECT x);
+
+/***** z05.c Read Definitions **************************************/
+extern void ReadPrependDef(unsigned typ, OBJECT encl);
+extern void ReadDatabaseDef(unsigned typ, OBJECT encl);
+extern void ReadDefinitions(OBJECT *token, OBJECT encl,
+ unsigned char res_type);
+
+/***** z06.c Object Parser **************************************/
+extern void SetScope(OBJECT env, int *count, BOOLEAN vis_only);
+extern void InitParser(FULL_CHAR *cross_db);
+extern OBJECT Parse(OBJECT *token, OBJECT encl, BOOLEAN defs_allowed,
+ BOOLEAN transfer_allowed);
+
+/***** z07.c Object Service **************************************/
+extern BOOLEAN SplitIsDefinite(OBJECT x);
+extern int DisposeObject(OBJECT x);
+extern OBJECT MakeWord(unsigned typ, FULL_CHAR *str, FILE_POS *pos);
+extern OBJECT MakeWordTwo(unsigned typ, FULL_CHAR *str1, FULL_CHAR *str2,
+ FILE_POS *pos);
+extern OBJECT MakeWordThree(FULL_CHAR *s1, FULL_CHAR *s2, FULL_CHAR *s3);
+extern OBJECT CopyObject(OBJECT x, FILE_POS *pos);
+extern OBJECT InsertObject(OBJECT x, OBJECT *ins, STYLE *style);
+extern OBJECT Meld(OBJECT x, OBJECT y);
+
+/***** z08.c Object Manifest **************************************/
+extern OBJECT ReplaceWithTidy(OBJECT x, BOOLEAN one_word);
+extern OBJECT Manifest(OBJECT x, OBJECT env, STYLE *style, OBJECT bthr[2],
+ OBJECT fthr[2], OBJECT *target, OBJECT *crs, BOOLEAN ok,
+ BOOLEAN need_expand, OBJECT *enclose, BOOLEAN fcr);
+
+/***** z09.c Closure Expansion **************************************/
+extern OBJECT SearchEnv(OBJECT env, OBJECT sym);
+extern OBJECT SetEnv(OBJECT x, OBJECT y);
+extern void AttachEnv(OBJECT env, OBJECT x);
+extern OBJECT GetEnv(OBJECT x);
+extern OBJECT DetachEnv(OBJECT x);
+extern OBJECT ClosureExpand(OBJECT x, OBJECT env, BOOLEAN crs_wanted,
+ OBJECT *crs, OBJECT *res_env);
+extern OBJECT ParameterCheck(OBJECT x, OBJECT env);
+
+/***** z10.c Cross References **************************************/
+extern void CrossInit(OBJECT sym);
+extern OBJECT CrossMake(OBJECT sym, OBJECT val, int ctype);
+extern OBJECT GallTargEval(OBJECT sym, FILE_POS *dfpos);
+extern void CrossAddTag(OBJECT x);
+extern OBJECT CrossExpand(OBJECT x, OBJECT env, STYLE *style,
+ OBJECT *crs, OBJECT *res_env);
+extern void CrossSequence(OBJECT x);
+extern void CrossClose(void);
+
+/***** z11.c Style Service **************************************/
+extern FULL_CHAR *EchoStyle(STYLE *style);
+extern void SpaceChange(STYLE *style, OBJECT x);
+extern void BreakChange(STYLE *style, OBJECT x);
+extern void YUnitChange(STYLE *style, OBJECT x);
+extern void ZUnitChange(STYLE *style, OBJECT x);
+
+/***** z12.c Size Finder **************************************/
+extern void SpannerAvailableSpace(OBJECT y, int dim, FULL_LENGTH *resb,
+ FULL_LENGTH *resf);
+extern OBJECT MinSize(OBJECT x, int dim, OBJECT *extras);
+
+/***** z13.c Object Breaking **************************************/
+extern OBJECT BreakObject(OBJECT x, CONSTRAINT *c);
+
+/***** z14.c Object Filling **************************************/
+extern OBJECT FillObject(OBJECT x, CONSTRAINT *c, OBJECT multi,
+ BOOLEAN can_hyphenate, BOOLEAN allow_shrink,
+ BOOLEAN extend_unbreakable, BOOLEAN *hyph_used);
+
+/***** z15.c Size Constraints **************************************/
+extern void MinConstraint(CONSTRAINT *xc, CONSTRAINT *yc);
+extern void SetSizeToMaxForwardConstraint(FULL_LENGTH *b, FULL_LENGTH *f,
+ CONSTRAINT *c);
+extern void EnlargeToConstraint(FULL_LENGTH *b, FULL_LENGTH *f,
+ CONSTRAINT *c);
+extern int ScaleToConstraint(FULL_LENGTH b, FULL_LENGTH f,
+ CONSTRAINT *c);
+extern void InvScaleConstraint(CONSTRAINT *yc, FULL_LENGTH sf,
+ CONSTRAINT*xc);
+extern void RotateConstraint(CONSTRAINT *c, OBJECT y, FULL_LENGTH angle,
+ CONSTRAINT *hc, CONSTRAINT *vc, int dim);
+extern BOOLEAN InsertScale(OBJECT x, CONSTRAINT *c);
+extern void Constrained(OBJECT x, CONSTRAINT *xc, int dim, OBJECT *why);
+extern FULL_CHAR *EchoConstraint(CONSTRAINT *c);
+extern void DebugConstrained(OBJECT x);
+
+/***** z16.c Size Adjustments **************************************/
+extern FULL_LENGTH FindShift(OBJECT x, OBJECT y, int dim);
+extern void SetNeighbours(OBJECT link, BOOLEAN ratm, OBJECT *pg,
+ OBJECT *pdef, OBJECT *sg, OBJECT *sdef, int *side);
+extern void AdjustSize(OBJECT x, FULL_LENGTH b, FULL_LENGTH f, int dim);
+
+/***** z17.c Gap Widths **************************************/
+extern void GetGap(OBJECT x, STYLE *style, GAP *res_gap,
+ unsigned *res_inc);
+extern FULL_LENGTH MinGap(FULL_LENGTH a, FULL_LENGTH b, FULL_LENGTH c, GAP *xgap);
+extern FULL_LENGTH ExtraGap(FULL_LENGTH a, FULL_LENGTH b, GAP *xgap, int dir);
+extern FULL_LENGTH ActualGap(FULL_LENGTH a, FULL_LENGTH b, FULL_LENGTH c,
+ GAP *xgap, FULL_LENGTH f, FULL_LENGTH mk);
+extern FULL_CHAR *EchoGap(GAP *xgap);
+
+/***** z18.c Galley Transfer **************************************/
+extern STYLE InitialStyle;
+extern OBJECT InitialEnvironment;
+extern void TransferInit(OBJECT InitEnv);
+extern OBJECT TransferBegin(OBJECT x);
+extern void TransferComponent(OBJECT x);
+extern void TransferEnd(OBJECT x);
+extern void TransferClose(void);
+
+/***** z19.c Galley Attaching **************************************/
+extern void DetachGalley(OBJECT hd);
+extern OBJECT SearchGalley(OBJECT start, OBJECT sym, BOOLEAN forwards,
+ BOOLEAN subgalleys, BOOLEAN closures, BOOLEAN input);
+extern int AttachGalley(OBJECT hd, OBJECT *inners, OBJECT *suspend_pt);
+
+/***** z20.c Galley Flushing **************************************/
+extern FULL_CHAR *DebugInnersNames(OBJECT inners);
+extern void FlushGalley(OBJECT hd);
+
+/*** z21.c Galley Maker **************************************/
+extern void SizeGalley(OBJECT hd, OBJECT env, BOOLEAN rows,
+ BOOLEAN joined, BOOLEAN nonblock, BOOLEAN trig,
+ STYLE *style, CONSTRAINT *c, OBJECT target,
+ OBJECT *dest_index, OBJECT *recs, OBJECT *inners,
+ OBJECT enclose);
+
+/*** z22.c Galley Service **************************************/
+extern void Interpose(OBJECT z, int typ, OBJECT x, OBJECT y);
+extern void FlushInners(OBJECT inners, OBJECT hd);
+extern void ExpandRecursives(OBJECT recs);
+extern void Promote(OBJECT hd, OBJECT stop_link, OBJECT dest_index,
+ BOOLEAN join_after);
+extern void KillGalley(OBJECT hd, BOOLEAN optimize);
+extern void FreeGalley(OBJECT hd, OBJECT stop_link, OBJECT *inners,
+ OBJECT relocate_link, OBJECT sym);
+extern void SetTarget(OBJECT hd);
+extern int CheckComponentOrder(OBJECT preceder, OBJECT follower);
+
+/***** z23.c Galley Printer **************************************/
+extern void FixAndPrintObject(OBJECT x, FULL_LENGTH xmk, FULL_LENGTH xb,
+ FULL_LENGTH xf, int dim, BOOLEAN suppress, FULL_LENGTH pg,int count);
+
+/***** z24.c Print Service **************************************/
+extern void PrintInit(FILE *file_ptr);
+extern void PrintBeforeFirst(FULL_LENGTH h, FULL_LENGTH v, FULL_CHAR *label);
+extern void PrintBetween(FULL_LENGTH h, FULL_LENGTH v, FULL_CHAR *label);
+extern void PrintWord(OBJECT x, int hpos, int vpos);
+extern void PrintPlainGraphicObject(OBJECT x, FULL_LENGTH xmk,
+ FULL_LENGTH ymk, OBJECT z);
+extern void PrintUnderline(FONT_NUM fnum, FULL_LENGTH xstart,
+ FULL_LENGTH xstop, FULL_LENGTH ymk);
+extern void PrintAfterLast(void);
+extern void CoordTranslate(FULL_LENGTH xdist, FULL_LENGTH ydist);
+extern void CoordRotate(FULL_LENGTH amount);
+extern void CoordScale(float hfactor, float vfactor);
+extern void SaveGraphicState(OBJECT x);
+extern void RestoreGraphicState(void);
+extern void PrintGraphicObject(OBJECT x);
+extern void DefineGraphicNames(OBJECT x);
+extern void SaveTranslateDefineSave(OBJECT x,
+ FULL_LENGTH xdist, FULL_LENGTH ydist);
+extern void PrintGraphicInclude(OBJECT x, FULL_LENGTH colmark,
+ FULL_LENGTH rowmark);
+
+/***** z25.c Object Echo **************************************/
+extern FULL_CHAR *EchoObject(OBJECT x);
+extern void DebugObject(OBJECT x);
+extern FULL_CHAR *EchoIndex(OBJECT index);
+extern void DebugGalley(OBJECT hd, OBJECT pinpt, int indent);
+
+/***** z26.c Echo Service **************************************/
+extern void BeginString(void);
+extern void AppendString(FULL_CHAR *str);
+extern FULL_CHAR *EndString(void);
+extern FULL_CHAR *EchoLength(int len);
+extern FULL_CHAR *Image(unsigned int c);
+extern void SetLengthDim(int dim);
+
+/***** z27.c Debug Service **************************************/
+#if DEBUG_ON
+extern void DebugInit(FULL_CHAR *str);
+extern void Debug(int category, int urgency, char *str, ...);
+extern void ProfileOn(char *str);
+extern void ProfileOff(char *str);
+extern void ProfilePrint(void);
+#endif
+
+/***** z28.c Error Service **************************************/
+extern void ErrorInit(FULL_CHAR *str);
+extern BOOLEAN ErrorSeen(void);
+extern void EnterErrorBlock(BOOLEAN ok_to_print);
+extern void LeaveErrorBlock(BOOLEAN commit);
+extern void CheckErrorBlocks(void);
+extern POINTER Error(int set_num, int msg_num, char *str, int etype,
+ FILE_POS *pos, ...);
+
+/***** z29.c Symbol Table **************************************/
+extern void InitSym(void);
+extern void PushScope(OBJECT x, BOOLEAN npars, BOOLEAN vis);
+extern void PopScope(void);
+extern void SuppressVisible(void);
+extern void UnSuppressVisible(void);
+extern void SuppressScope(void);
+extern void UnSuppressScope(void);
+extern void SwitchScope(OBJECT sym);
+extern void UnSwitchScope(OBJECT sym);
+extern void BodyParAllowed(void);
+extern void BodyParNotAllowed(void);
+extern OBJECT InsertSym(FULL_CHAR *str, unsigned char xtype,
+ FILE_POS *xfpos, unsigned char xprecedence,
+ BOOLEAN xindefinite, BOOLEAN xrecursive,
+ unsigned xpredefined, OBJECT xenclosing, OBJECT xbody);
+extern void InsertAlternativeName(FULL_CHAR *str, OBJECT s,
+ FILE_POS *xfpos);
+extern OBJECT SearchSym(FULL_CHAR *str, int len);
+extern FULL_CHAR *SymName(OBJECT s);
+extern FULL_CHAR *FullSymName(OBJECT x, FULL_CHAR *str);
+extern OBJECT ChildSym(OBJECT s, unsigned typ);
+extern OBJECT ChildSymWithCode(OBJECT s, unsigned char code);
+extern void CheckSymSpread(void);
+extern void DeleteEverySym(void);
+extern void DebugScope(void);
+
+/***** z30.c Symbol Uses **************************************/
+extern void InsertUses(OBJECT x, OBJECT y);
+extern void FlattenUses(void);
+extern BOOLEAN SearchUses(OBJECT x, OBJECT y);
+extern OBJECT FirstExternTarget(OBJECT sym, OBJECT *cont);
+extern OBJECT NextExternTarget(OBJECT sym, OBJECT *cont);
+
+/***** z31.c Memory Allocator **************************************/
+extern void DebugRegisterUsage(int typ, int delta_num, int delta_size);
+extern void DebugMemory(void);
+extern void MemInit(void);
+extern OBJECT GetMemory(int siz, FILE_POS *pos);
+extern OBJECT zz_free[];
+extern unsigned char zz_lengths[];
+extern int zz_newcount;
+extern int zz_disposecount;
+extern int zz_listcount;
+extern OBJECT zz_hold;
+extern OBJECT zz_tmp;
+extern OBJECT zz_res;
+extern int zz_size;
+extern OBJECT xx_link, xx_tmp;
+extern OBJECT xx_hold, xx_res;
+
+/***** z32.c Counter Service **********************************/
+extern OBJECT Next(OBJECT x, int inc, BOOLEAN *done);
+
+/***** z33.c Database Service **************************************/
+extern OBJECT OldCrossDb;
+extern OBJECT NewCrossDb;
+extern OBJECT DbCreate(OBJECT x);
+extern void DbInsert(OBJECT db, BOOLEAN gall, OBJECT sym, FULL_CHAR *tag,
+ FILE_POS *tagfpos, FULL_CHAR *seq, FILE_NUM dfnum,
+ long dfpos, int dlnum, BOOLEAN check);
+extern void DbConvert(OBJECT db, BOOLEAN full_name);
+extern void DbClose(OBJECT db);
+extern OBJECT DbLoad(OBJECT stem, int fpath, BOOLEAN create, OBJECT symbs,
+ BOOLEAN in_memory);
+extern BOOLEAN DbRetrieve(OBJECT db, BOOLEAN gall, OBJECT sym,
+ FULL_CHAR *tag, FULL_CHAR *seq, FILE_NUM *dfnum,
+ long *dfpos, int *dlnum, long *cont);
+extern BOOLEAN DbRetrieveNext(OBJECT db, BOOLEAN *gall, OBJECT *sym,
+ FULL_CHAR *tag, FULL_CHAR *seq, FILE_NUM *dfnum,
+ long *dfpos, int *dlnum, long *cont);
+
+/***** z34.c Rotation Service **************************************/
+extern void RotateSize(FULL_LENGTH *xcb, FULL_LENGTH *xcf,
+ FULL_LENGTH *xrb, FULL_LENGTH *xrf, OBJECT y,
+ FULL_LENGTH theta);
+
+/***** z35.c Time Keeper **************************************/
+extern FULL_CHAR *TimeString(void);
+extern void InitTime(void);
+extern OBJECT MomentSym;
+extern OBJECT StartMoment(void);
+
+/***** z36.c Hyphenation **************************************/
+extern BOOLEAN ReadHyphTable(LANGUAGE_NUM lnum);
+extern OBJECT Hyphenate(OBJECT x);
+
+/***** z37.c Font Service *************************************/
+extern FONT_INFO *finfo;
+extern int font_curr_page;
+extern void FontInit(void);
+extern void FontDefine(OBJECT family, OBJECT face, OBJECT inside);
+extern void FontChange(STYLE *style, OBJECT x);
+extern void FontWordSize(OBJECT x);
+extern FULL_LENGTH FontSize(FONT_NUM fnum, OBJECT x);
+extern FULL_LENGTH FontHalfXHeight(FONT_NUM fnum);
+extern MAPPING FontMapping(FONT_NUM fnum, FILE_POS *xfpos);
+extern FULL_CHAR *FontName(FONT_NUM fnum);
+extern FULL_CHAR *FontFamily(FONT_NUM fnum);
+extern FULL_CHAR *FontFace(FONT_NUM fnum);
+extern FULL_CHAR *FontFamilyAndFace(FONT_NUM fnum);
+extern void FontPrintAll(FILE *fp);
+extern void FontPrintPageSetup(FILE *fp);
+extern void FontPrintPageResources(FILE *fp);
+extern void FontAdvanceCurrentPage(void);
+extern void FontPageUsed(OBJECT face);
+extern BOOLEAN FontNeeded(FILE *fp);
+
+/***** z38.c Character Mappings **************************************/
+extern MAP_VEC MapTable[];
+extern MAPPING MapLoad(OBJECT filename, BOOLEAN must_print);
+extern FULL_CHAR MapCharEncoding(FULL_CHAR *str, MAPPING m);
+extern FULL_CHAR *MapEncodingName(MAPPING m);
+extern void MapPrintEncodings(FILE *fp);
+extern void MapPrintResources(FILE *fp);
+extern OBJECT MapSmallCaps(OBJECT x, STYLE *style);
+extern BOOLEAN MapIsLowerCase(FULL_CHAR ch, MAPPING m);
+
+
+/***** z39.c String Handler **************************************/
+#define AsciiToFull(x) ( (FULL_CHAR *) (x) )
+#define StringEqual(a, b) (strcmp((char *)(a), (char *)(b))==0)
+extern int strcollcmp(char *a, char *b);
+#define StringLessEqual(a, b) \
+ ( UseCollate ? strcollcmp((char *)(a),(char *)(b)) <= 0 \
+ : strcmp((char *)(a),(char *)(b)) <= 0 )
+#define StringCat(a, b) strcat((char *)(a),(char *)(b))
+#define StringCopy(a, b) strcpy((char *)(a),(char *)(b))
+#define StringLength(a) strlen((char *)(a))
+#define StringFOpen(a, b) fopen( (char *) (a), (b) )
+#define StringFPuts(a, b) fputs( (char *) (a), (b) )
+#define StringFGets(a, b, c) fgets( (char *) (a), (b), (c) )
+#define StringRemove(a) remove((char *)(a))
+#define StringRename(a, b) rename((char *)(a),(char *)(b))
+extern BOOLEAN StringBeginsWith(FULL_CHAR *str, FULL_CHAR *pattern);
+extern BOOLEAN StringEndsWith(FULL_CHAR *str, FULL_CHAR *pattern);
+extern BOOLEAN StringContains(FULL_CHAR *str, FULL_CHAR *pattern);
+extern FULL_CHAR *StringInt(int i);
+extern FULL_CHAR *StringFiveInt(int i);
+extern FULL_CHAR *StringQuotedWord(OBJECT x);
+
+/***** z40.c Filter Handler **************************************/
+extern void FilterInit(void);
+extern OBJECT FilterCreate(BOOLEAN use_begin, OBJECT act, FILE_POS *xfpos);
+extern void FilterSetFileNames(OBJECT x);
+extern OBJECT FilterExecute(OBJECT x, FULL_CHAR *command, OBJECT env);
+extern void FilterWrite(OBJECT x, FILE *fp, int *linecount);
+extern void FilterScavenge(BOOLEAN all);
+
+/***** z41.c Object Input-Output **************************************/
+extern OBJECT ReadFromFile(FILE_NUM fnum, long pos, int lnum);
+extern void AppendToFile(OBJECT x, FILE_NUM fnum, int *pos, int *lnum);
+extern void CloseFiles(void);
+
+/***** z42.c Colour Service **************************************/
+extern void ColourInit(void);
+extern void ColourChange(STYLE *style, OBJECT x);
+extern FULL_CHAR *ColourCommand(COLOUR_NUM cnum);
+
+/***** z43.c Language Service **************************************/
+extern void LanguageInit(void);
+extern BOOLEAN LanguageWordEndsSentence(OBJECT wd, BOOLEAN lc_prec);
+extern void LanguageDefine(OBJECT names, OBJECT hyph_file);
+extern void LanguageChange(STYLE *style, OBJECT x);
+extern FULL_CHAR *LanguageString(LANGUAGE_NUM lnum);
+extern OBJECT LanguageHyph(LANGUAGE_NUM lnum);
+extern BOOLEAN LanguageSentenceEnds[];
+
+/***** z44.c Vertical Hyphenation **************************************/
+extern BOOLEAN VerticalHyphenate(OBJECT y);
+extern OBJECT ConvertGalleyList(OBJECT x);
+extern OBJECT BuildEnclose(OBJECT hd);
+
+/***** z45.c External Sort **************************************/
+extern LINE *ReadLines(FILE *fp, FULL_CHAR *fname, FULL_CHAR *first_line, int *len);
+extern void WriteLines(FILE *fp, LINE *lines, int len);
+extern void SortLines(LINE *lines, int lines_len);
+extern void SortFile(FULL_CHAR *infile, FULL_CHAR *outfile);
+
+/***** z46.c Optimal Galleys **************************************/
+extern BOOLEAN FindOptimize(OBJECT x, OBJECT env);
+extern void SetOptimize(OBJECT hd, STYLE *style);
+extern void GazumpOptimize(OBJECT hd, OBJECT dest);
+extern void CalculateOptimize(OBJECT hd);
+extern void DebugOptimize(OBJECT hd);
+
+/***** z47.c Environment Table **************************************/
+extern void EnvInit(void);
+extern BOOLEAN EnvWriteRetrieve(OBJECT env, FILE_NUM fnum, int *offset,
+ int *lnum);
+extern void EnvWriteInsert(OBJECT env, FILE_NUM fnum, int offset,int lnum);
+extern BOOLEAN EnvReadRetrieve(FILE_NUM fnum, int offset, OBJECT *env);
+extern void EnvReadInsert(FILE_NUM fnum, int offset, OBJECT env);
+extern void EnvDebug(void);
+
+/***** z48.c PDF back end **************************************/
+extern void PDFFile_Init(FILE* in_fp, int in_h_bound, int in_v_bound,
+ int in_IN, int in_CM, int in_PT, int in_EM);
+extern void PDFFile_BeginFontEncoding(FILE* in_fp,
+ const char* in_encoding_name);
+extern void PDFFile_EndFontEncoding(FILE* in_fp);
+extern void PDFFile_Cleanup(FILE* in_fp);
+extern void PDFPage_Init(FILE* in_fp, float in_scale_factor,
+ int in_line_width);
+extern void PDFPage_Cleanup(FILE* in_fp);
+extern void PDFPage_Write(FILE* in_fp, char* in_str);
+extern void PDFPage_Push(FILE* in_fp);
+extern void PDFPage_Pop(FILE* in_fp);
+extern void PDFPage_Scale(FILE* in_fp, float in_h_scale_factor,
+ float in_v_scale_factor);
+extern void PDFPage_Translate(FILE* in_fp, float in_delta_h,
+ float in_delta_v);
+extern void PDFPage_Rotate(FILE* in_fp, float in_angle_in_radians);
+extern void PDFPage_SetVars(int xsize, int ysize, int xmark, int ymark,
+ int loutf, int loutv, int louts);
+extern void PDFPage_WriteGraphic(FILE* in_fp, FULL_CHAR* in_str);
+extern void PDFPage_PrintUnderline(FILE* in_fp, int in_x1, int in_x2,
+ int in_y, int in_thickness);
+
+extern void PDFFont_AddFont(
+ FILE* in_fp,
+ const FULL_CHAR* in_short_font_name,
+ const FULL_CHAR* in_real_font_name,
+ const FULL_CHAR* in_font_encoding_name);
+extern void PDFFont_Set(FILE* in_fp, FULL_LENGTH in_font_size,
+ FULL_CHAR * in_short_font_name);
+extern void PDFText_OpenXY(FILE* in_fp, int hpos, int vpos);
+extern void PDFText_OpenX(FILE* in_fp, int hpos);
+extern void PDFText_Open(FILE* in_fp);
+extern void PDFText_Kern(FILE* in_fp, int in_kern);
+extern void PDFText_Close(FILE* in_fp);
+extern BOOLEAN PDFHasValidTextMatrix(void);
+
+
+/*@::assert(), debug(), debug flags@******************************************/
+/* */
+/* ASSERT AND DEBUG CODE */
+/* */
+/*****************************************************************************/
+
+#if ASSERT_ON
+#define assert(c, m) \
+ { if( !(c) ) Error(1, 2, "assert failed in %s", INTERN, no_fpos, m); }
+#define assert1(c, m, p1) \
+ { if( !(c) ) Error(1, 3, "assert failed in %s %s", INTERN,no_fpos,m, p1); }
+#else
+#define assert(c, m)
+#define assert1(c, m, p1)
+#endif
+
+#if DEBUG_ON
+
+struct dbs
+{ char *flag; /* external names for debug flags */
+ BOOLEAN on[3]; /* the debug flags */
+};
+extern struct dbs dbg[];
+
+/* debug routines */
+#define debug0(cat, urg, str) \
+ { if( dbg[cat].on[urg] ) Debug(cat, urg, str); }
+#define debug1(cat, urg, str, p1) \
+ { if( dbg[cat].on[urg] ) Debug(cat, urg, str, p1); }
+#define debug2(cat, urg, str, p1, p2) \
+ { if( dbg[cat].on[urg] ) Debug(cat, urg, str, p1, p2); }
+#define debug3(cat, urg, str, p1, p2, p3) \
+ { if( dbg[cat].on[urg] ) Debug(cat, urg, str, p1, p2, p3); }
+#define debug4(cat, urg, str, p1, p2, p3, p4) \
+ { if( dbg[cat].on[urg] ) Debug(cat, urg, str, p1, p2, p3, p4); }
+#define debug5(cat, urg, str, p1, p2, p3, p4, p5) \
+ { if( dbg[cat].on[urg] ) Debug(cat, urg, str, p1, p2, p3, p4, p5); }
+#define debug6(cat, urg, str, p1, p2, p3, p4, p5, p6) \
+ { if( dbg[cat].on[urg] ) Debug(cat, urg, str, p1, p2, p3, p4, p5, p6); }
+#define debug7(cat, urg, str, p1, p2, p3, p4, p5, p6, p7) \
+ { if( dbg[cat].on[urg] ) Debug(cat, urg, str, p1, p2, p3, p4, p5,p6,p7); }
+#define debug8(cat, urg, str, p1, p2, p3, p4, p5, p6, p7, p8) \
+ { if( dbg[cat].on[urg] ) Debug(cat, urg, str, p1, p2,p3,p4,p5,p6,p7,p8); }
+#define ifdebug(cat, urg, x) \
+ { if( dbg[cat].on[urg] ) { x; } }
+
+#define debugcond0(cat, urg, cond, str) \
+ { if( dbg[cat].on[urg] && cond ) Debug(cat, urg, str); }
+#define debugcond1(cat, urg, cond, str, p1) \
+ { if( dbg[cat].on[urg] && cond ) Debug(cat, urg, str, p1); }
+#define debugcond2(cat, urg, cond, str, p1, p2) \
+ { if( dbg[cat].on[urg] && cond ) Debug(cat, urg, str, p1, p2); }
+#define debugcond3(cat, urg, cond, str, p1, p2, p3) \
+ { if( dbg[cat].on[urg] && cond ) Debug(cat, urg, str, p1, p2, p3); }
+#define debugcond4(cat, urg, cond, str, p1, p2, p3, p4) \
+ { if( dbg[cat].on[urg] && cond ) Debug(cat, urg, str, p1, p2, p3, p4); }
+#define debugcond5(cat, urg, cond, str, p1, p2, p3, p4, p5) \
+ { if( dbg[cat].on[urg] && cond ) Debug(cat, urg, str, p1, p2, p3, p4, p5);}
+#define debugcond6(cat, urg, cond, str, p1, p2, p3, p4, p5, p6) \
+ { if( dbg[cat].on[urg] && cond ) Debug(cat, urg, str, p1, p2,p3,p4,p5,p6);}
+#define ifdebugcond(cat, urg, cond, x) \
+ { if( dbg[cat].on[urg] && cond ) { x; } }
+#define debug_init(str) \
+ DebugInit(str)
+
+/* debug styles */
+#define D 0
+#define DD 1
+#define DDD 2
+
+/* debug flags */
+#define DSP 1 /* z01.c -dsp Supervise */
+#define DLA 2 /* z02.c -dla Lexical Analyser */
+#define DFS 3 /* z03.c -dfs File Service */
+#define DTS 4 /* z04.c -dts Token Service */
+#define DRD 5 /* z05.c -drd Read Definitions */
+#define DOP 6 /* z06.c -dop Object Parser */
+#define DOS 7 /* z07.c -dos Object Service */
+#define DOM 8 /* z08.c -dom Object Manifest */
+#define DCE 9 /* z09.c -dce Closure Expansion */
+#define DCR 10 /* z10.c -dcr Cross References */
+#define DSS 11 /* z11.c -dss Style Service */
+#define DSF 12 /* z12.c -dsf Size Finder */
+#define DOB 13 /* z13.c -dob Object Breaking */
+#define DOF 14 /* z14.c -dof Object Filling */
+#define DSC 15 /* z15.c -dsc Size Constraints */
+#define DSA 16 /* z16.c -dsa Size Adjustments */
+#define DGW 17 /* z17.c -dgw Gap Widths */
+#define DGT 18 /* z18.c -dgt Galley Transfer */
+#define DGA 19 /* z19.c -dgf Galley Attaching */
+#define DGF 20 /* z20.c -dgf Galley Flushing */
+#define DGM 21 /* z21.c -dgm Galley Maker */
+#define DGS 22 /* z22.c -dgs Galley Service */
+#define DGP 23 /* z23.c -dgp Galley Printer */
+#define DPS 24 /* z24.c -dps Print Service */
+#define DOE 25 /* z25.c -doe Object Echo */
+#define DES 26 /* z26.c -des Echo Service */
+#define DZZ 27 /* z27.c -dzz Debug Service */
+#define DYY 28 /* z28.c -dyy Error Service */
+#define DST 29 /* z29.c -dst Symbol Table */
+#define DSU 30 /* z30.c -dsu Symbol Uses */
+#define DMA 31 /* z31.c -dma Memory Allocator */
+#define DCS 32 /* z32.c -dcs Counter Service */
+#define DBS 33 /* z33.c -dbs Database Service */
+#define DRS 34 /* z34.c -drs Rotation Service */
+#define DTK 35 /* z35.c -dtk Time Keeper */
+#define DHY 36 /* z36.c -dhy Hyphenation */
+#define DFT 37 /* z37.c -dft Font Service */
+#define DCM 38 /* z38.c -dcm Character Mapping */
+#define DSH 39 /* z39.c -dsh String Handler */
+#define DFH 40 /* z40.c -dsh Filter Handler */
+#define DIO 41 /* z41.c -dio Object Input-Output */
+#define DCO 42 /* z42.c -dco Colour Service */
+#define DLS 43 /* z43.c -dls Language Service */
+#define DVH 44 /* z44.c -dvh Vertical Hyphenation */
+#define DEX 45 /* z45.c -dex External Sort */
+#define DOG 46 /* z46.c -dex Optimal Galleys */
+#define DET 47 /* z47.c -det Environment Table */
+#define DPD 48 /* z48.c -dpd PDF Back End */
+#define DPP 49 /* -dpp Profiling */
+#define ANY 50 /* -d any */
+
+#else
+#define ifdebug(cat, urg, x)
+#define debug0(cat, urg, str)
+#define debug1(cat, urg, str, p1)
+#define debug2(cat, urg, str, p1, p2)
+#define debug3(cat, urg, str, p1, p2, p3)
+#define debug4(cat, urg, str, p1, p2, p3, p4)
+#define debug5(cat, urg, str, p1, p2, p3, p4, p5)
+#define debug6(cat, urg, str, p1, p2, p3, p4, p5, p6)
+#define debug7(cat, urg, str, p1, p2, p3, p4, p5, p6, p7)
+#define debug8(cat, urg, str, p1, p2, p3, p4, p5, p6, p7, p8)
+
+#define debugcond0(cat, urg, cond, str)
+#define debugcond1(cat, urg, cond, str, p1)
+#define debugcond2(cat, urg, cond, str, p1, p2)
+#define debugcond3(cat, urg, cond, str, p1, p2, p3)
+#define debugcond4(cat, urg, cond, str, p1, p2, p3, p4)
+#define debugcond5(cat, urg, cond, str, p1, p2, p3, p4, p5)
+#define debugcond6(cat, urg, cond, str, p1, p2, p3, p4, p5, p6)
+#define ifdebugcond(cat, urg, cond, x)
+#define debug_init(str) Error(1, 4, "%s - debug flags not implemented", \
+ FATAL, no_fpos, str)
+#endif