/*@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 #include #include #include #include #if LOCALE_ON #include 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