home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / misc / volume38 / lout / part04 < prev    next >
Encoding:
Text File  |  1993-08-11  |  74.0 KB  |  1,833 lines

  1. Newsgroups: comp.sources.misc
  2. From: jeff@joyce.cs.su.oz.au (Jeff Kingston)
  3. Subject: v38i072:  lout - Lout document formatting system, v2.05, Part04/35
  4. Message-ID: <1993Aug8.180620.11259@sparky.sterling.com>
  5. X-Md4-Signature: 6b428214ab8eeff15164e4029a34c6bb
  6. Sender: kent@sparky.sterling.com (Kent Landfield)
  7. Organization: Sterling Software
  8. Date: Sun, 8 Aug 1993 18:06:20 GMT
  9. Approved: kent@sparky.sterling.com
  10.  
  11. Submitted-by: jeff@joyce.cs.su.oz.au (Jeff Kingston)
  12. Posting-number: Volume 38, Issue 72
  13. Archive-name: lout/part04
  14. Environment: UNIX
  15. Supersedes: lout: Volume 37, Issue 99-128
  16.  
  17. #! /bin/sh
  18. # This is a shell archive.  Remove anything before this line, then feed it
  19. # into a shell via "sh file" or similar.  To overwrite existing files,
  20. # type "sh file -c".
  21. # Contents:  externs.A include/tab
  22. # Wrapped by kent@sparky on Sun Aug  8 12:29:21 1993
  23. PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
  24. echo If this archive is complete, you will see the following message:
  25. echo '          "shar: End of archive 4 (of 35)."'
  26. if test -f 'externs.A' -a "${1}" != "-c" ; then 
  27.   echo shar: Will not clobber existing file \"'externs.A'\"
  28. else
  29.   echo shar: Extracting \"'externs.A'\" \(46198 characters\)
  30.   sed "s/^X//" >'externs.A' <<'END_OF_FILE'
  31. X/*@externs:External Declarations:Directories and file conventions@************/
  32. X/*                                                                           */
  33. X/*  LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.05)       */
  34. X/*  COPYRIGHT (C) 1993 Jeffrey H. Kingston                                   */
  35. X/*                                                                           */
  36. X/*  Jeffrey H. Kingston (jeff@cs.su.oz.au)                                   */
  37. X/*  Basser Department of Computer Science                                    */
  38. X/*  The University of Sydney 2006                                            */
  39. X/*  AUSTRALIA                                                                */
  40. X/*                                                                           */
  41. X/*  This program is free software; you can redistribute it and/or modify     */
  42. X/*  it under the terms of the GNU General Public License as published by     */
  43. X/*  the Free Software Foundation; either version 1, or (at your option)      */
  44. X/*  any later version.                                                       */
  45. X/*                                                                           */
  46. X/*  This program is distributed in the hope that it will be useful,          */
  47. X/*  but WITHOUT ANY WARRANTY; without even the implied warranty of           */
  48. X/*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            */
  49. X/*  GNU General Public License for more details.                             */
  50. X/*                                                                           */
  51. X/*  You should have received a copy of the GNU General Public License        */
  52. X/*  along with this program; if not, write to the Free Software              */
  53. X/*  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.                */
  54. X/*                                                                           */
  55. X/*  FILE:         externs                                                    */
  56. X/*  MODULE:       External Declarations                                      */
  57. X/*                                                                           */
  58. X/*****************************************************************************/
  59. X#include <stdio.h>
  60. X#include <string.h>
  61. X
  62. X/*****************************************************************************/
  63. X/*                                                                           */
  64. X/*  Include, font and database directories, and the DEBUG_ON and ASSERT_ON   */
  65. X/*  flags (defined by -D options on the cc command line in the makefile).    */
  66. X/*                                                                           */
  67. X/*  LATIN               Non-zero means compile for ISO-LATIN-1 char set.     */
  68. X/*  INCL_DIR            The system directory where @Include files are kept   */
  69. X/*  FONT_DIR            The system directory where .AFM font files are kept  */
  70. X/*  EVEC_DIR            The system directory where .CEV files are kept       */
  71. X/*  DATA_DIR            The system directory where database files are kept   */
  72. X/*  CHAR_IN             Determines assignment of input chars to lex classes  */
  73. X/*  CHAR_OUT            Determines appearance of literal chars in output     */
  74. X/*  DEBUG_ON            Non-zero means compile debug code (lout -d)          */
  75. X/*  ASSERT_ON           Non-zero means test assertions                       */
  76. X/*                                                                           */
  77. X/*  #define  INCL_DIR   "/usr/local/lib/lout/include"                        */
  78. X/*  #define  FONT_DIR   "/usr/local/lib/lout/font"                           */
  79. X/*  #define  EVEC_DIR   "/usr/local/lib/lout/evec"                           */
  80. X/*  #define  DATA_DIR   "/usr/local/lib/lout/data"                           */
  81. X/*  #define  CHAR_IN    0                                                    */
  82. X/*  #define  CHAR_OUT   0                                                    */
  83. X/*  #define  DEBUG_ON   0                                                    */
  84. X/*  #define  ASSERT_ON  1                                                    */
  85. X/*                                                                           */
  86. X/*  File naming conventions and version                                      */
  87. X/*                                                                           */
  88. X/*  LOUT_VERSION        Version information                                  */
  89. X/*  CROSS_DB            The default name of the cross reference database     */
  90. X/*  SOURCE_SUFFIX       Optional suffix of source files and include files    */
  91. X/*  INDEX_SUFFIX        The suffix of database index files                   */
  92. X/*  NEW_INDEX_SUFFIX    The suffix of new database index files               */
  93. X/*  DATA_SUFFIX         The suffix of database data files                    */
  94. X/*  NEW_DATA_SUFFIX     The additional suffix of new database data files     */
  95. X/*  HYPH_FILENAME       The default name of the unpacked hyphenation file    */
  96. X/*  HYPH_SUFFIX         The suffix of the packed hyphenation file            */
  97. X/*                                                                           */
  98. X/*****************************************************************************/
  99. X
  100. X#define    LOUT_VERSION      AsciiToFull("Basser Lout Version 2.05 (July 1993)")
  101. X#define    CROSS_DB      AsciiToFull("lout")
  102. X#define    SOURCE_SUFFIX      AsciiToFull(".lout")
  103. X#define    INDEX_SUFFIX      AsciiToFull(".li")
  104. X#define    NEW_INDEX_SUFFIX  AsciiToFull(".lix")
  105. X#define    DATA_SUFFIX      AsciiToFull(".ld")
  106. X#define    NEW_DATA_SUFFIX      AsciiToFull("x")
  107. X#define    HYPH_FILENAME      AsciiToFull("lout.hyph")
  108. X#define    HYPH_SUFFIX      AsciiToFull(".pk")
  109. X
  110. X/*@::Significant limits@******************************************************/
  111. X/*                                                                           */
  112. X/*  Significant Limits (other insignificant ones appear in other files)      */
  113. X/*                                                                           */
  114. X/*  MAX_LEN             The maximum value storable in type LENGTH            */
  115. X/*                                                                           */
  116. X/*  MAX_FILES           1 + the maximum number of files.  This cannot        */
  117. X/*                      exceed 256 without changing type FILE_NUM; and       */
  118. X/*                      it cannot exceed 255 without increasing MAX_WORD     */
  119. X/*                      (a WORD is used to hold an array indexed by          */
  120. X/*                      filenum in file z10.c).                              */
  121. X/*                                                                           */
  122. X/*  MAX_LINE            1 + the maximum length of an input line, in files    */
  123. X/*                      of all types.  This cannot exceed 256, at least in   */
  124. X/*                      source files, unless the col_num field of FILE_POS   */
  125. X/*                      is enlarged beyond its present 1 byte unsigned       */
  126. X/*                                                                           */
  127. X/*  MAX_WORD            1 + the maximum length of a word storable in an      */
  128. X/*                      object record, which includes all file path names    */
  129. X/*                      too.  It is reasonable to make this MAX_LINE, since  */
  130. X/*                      a word longer than MAX_LINE cannot be read in        */
  131. X/*                                                                           */
  132. X/*  MAX_OBJECT_REC      1 + the maximum size of an object record, measured   */
  133. X/*                      in ALIGNs.  The value chosen should exceed           */
  134. X/*                      ceiling( (wr + MAX_WORD - 4) / sizeof(ALIGN) )       */
  135. X/*                      where wr = sizeof(struct word_rec), so that words of */
  136. X/*                      length MAX_WORD-1 can be stored in an object record  */
  137. X/*                                                                           */
  138. X/*  MAX_FONT            1 + the maximum number of sized fonts.  This can be  */
  139. X/*                      increased easily since font metric memory is         */
  140. X/*                      obtained as required from malloc().                  */
  141. X/*                                                                           */
  142. X/*  MAX_LEX_STACK       The maximum depth of @Includes and @Databases.       */
  143. X/*                      This can be increased easily if desired.             */
  144. X/*                                                                           */
  145. X/*****************************************************************************/
  146. X
  147. X#define    MAX_LEN            32767
  148. X#define    MAX_FILES        255
  149. X#define MAX_LINE            256
  150. X#define MAX_WORD            256
  151. X#define    MAX_OBJECT_REC        73
  152. X#define MAX_FONT        100
  153. X#define    MAX_LEX_STACK         5
  154. X
  155. X/*****************************************************************************/
  156. X/*                                                                           */
  157. X/*  Miscellaneous Macros                                                     */
  158. X/*                                                                           */
  159. X/*****************************************************************************/
  160. X
  161. X#define    BOOLEAN        unsigned
  162. X#define    FALSE        0
  163. X#define    TRUE        1
  164. X#define    bool(x)        (x ? AsciiToFull("TRUE") : AsciiToFull("FALSE") )
  165. X#define    CHILD        0
  166. X#define    PARENT        1
  167. X#define    COL        0
  168. X#define    ROW        1
  169. X#define    dimen(x)    (x == COL ? AsciiToFull("COL") : AsciiToFull("ROW") )
  170. X#define    nil        ( (OBJECT) NULL )
  171. X#define    null        ( (FILE *) NULL )
  172. X
  173. X#define max(a, b)    ((a) < (b) ? (b) : (a))
  174. X#define min(a, b)    ((a) < (b) ? (a) : (b))
  175. X#define    ceiling(a, b)    ( ((a) - 1)/(b) + 1 )    /* ceiling(a/b)              */
  176. X#define is_odd(x)    ( (x) & 1 )        /* TRUE if x is odd number   */
  177. X
  178. X
  179. X/*@::ALIGN, LENGTH, FONT_NUM, ENCODING, FULL_CHAR@****************************/
  180. X/*                                                                           */
  181. X/*  typedef ALIGN - the most restrictive memory alignment type.              */
  182. X/*                                                                           */
  183. X/*****************************************************************************/
  184. X
  185. Xtypedef char *ALIGN;
  186. X
  187. X
  188. X/*****************************************************************************/
  189. X/*                                                                           */
  190. X/*  typedef LENGTH - an integer physical distance.                           */
  191. X/*                                                                           */
  192. X/*****************************************************************************/
  193. X
  194. Xtypedef short int LENGTH;
  195. X
  196. X
  197. X/*****************************************************************************/
  198. X/*                                                                           */
  199. X/*  FONT_NUM - internal name for a font.                                     */
  200. X/*                                                                           */
  201. X/*****************************************************************************/
  202. X
  203. Xtypedef unsigned char FONT_NUM;
  204. X
  205. X
  206. X/*****************************************************************************/
  207. X/*                                                                           */
  208. X/*  ENCODING - internal name for a character encoding vector.                */
  209. X/*                                                                           */
  210. X/*****************************************************************************/
  211. X
  212. Xtypedef unsigned char ENCODING;
  213. X
  214. X
  215. X/*****************************************************************************/
  216. X/*                                                                           */
  217. X/*  typedef FULL_CHAR - one of the characters manipulated by Lout.           */
  218. X/*                                                                           */
  219. X/*  This program does not deal with 7-bit ASCII characters.  Instead, its    */
  220. X/*  characters are defined by the FULL_CHAR typedef, and could be anything   */
  221. X/*  from 7-bit ASCII to 8-bit ISO-LATIN-1 to 16-bit UNICODE and beyond.      */
  222. X/*                                                                           */
  223. X/*  Unfortunately C favours signed 8-bit characters: literal strings are     */
  224. X/*  pointers to them, argv[] and the standard libraries assume them.  We get */
  225. X/*  around these problems by using our own library, including AsciiToFull()  */
  226. X/*  to convert an ASCII string (such as a C string) into a FULL_CHAR string. */
  227. X/*                                                                           */
  228. X/*  Formally this library appears in module z39.c; however since this        */
  229. X/*  implementation uses 8-bit unsigned characters, most of the routines      */
  230. X/*  can be implemented by macros containing type-cast calls to C standard    */
  231. X/*  library routines.  These appear in the z39.c externs list below.         */
  232. X/*                                                                           */
  233. X/*****************************************************************************/
  234. X
  235. Xtypedef unsigned char FULL_CHAR;
  236. X
  237. X
  238. X/*@::Character literals@******************************************************/
  239. X/*                                                                           */
  240. X/*  Character Literals                                                       */
  241. X/*                                                                           */
  242. X/*  The following macros ensure that no Lout source is ever compared to a    */
  243. X/*  literal character other than '\0':                                       */
  244. X/*                                                                           */
  245. X/*****************************************************************************/
  246. X
  247. X#define    CH_FLAG_OUTFILE        'o'    /* the -o command line flag          */
  248. X#define    CH_FLAG_SUPPRESS    's'    /* the -s command line flag          */
  249. X#define    CH_FLAG_CROSS        'c'    /* the -c command line flag          */
  250. X#define    CH_FLAG_ERRFILE        'e'    /* the -e command line flag          */
  251. X#define    CH_FLAG_EPSFIRST    'E'    /* first letter of the -EPS flag     */
  252. X#define    CH_FLAG_DIRPATH        'D'    /* the -D command line flag          */
  253. X#define    CH_FLAG_ENCPATH        'C'    /* the -C command line flag          */
  254. X#define    CH_FLAG_FNTPATH        'F'    /* the -F command line flag          */
  255. X#define    CH_FLAG_INCPATH        'I'    /* the -I command line flag          */
  256. X#define    CH_FLAG_INCLUDE        'i'    /* the -i command line flag          */
  257. X#define    CH_FLAG_HYPHEN        'h'    /* the -h command line flag          */
  258. X#define    CH_FLAG_VERSION        'V'    /* the -V command line flag          */
  259. X#define    CH_FLAG_USAGE        'u'    /* the -u command line flag          */
  260. X#define    CH_FLAG_DEBUG        'd'    /* the -d command line flag          */
  261. X
  262. X#define    CH_SPACE        ' '    /* space character                   */
  263. X#define    CH_NEWLINE        '\n'    /* the newline character             */
  264. X#define    CH_SYMSTART        '@'    /* extra letter symbols may have     */
  265. X#define    CH_QUOTE        '"'    /* the quote character             */
  266. X#define    CH_ZERO            '0'    /* the first digit character, zero   */
  267. X#define    CH_INCGAP        '+'    /* begins an incrementing gap         */
  268. X#define    CH_DECGAP        '-'    /* begins a decrementing gap         */
  269. X#define    CH_MINUS        '-'    /* minus sign                        */
  270. X#define    CH_HYPHEN        '-'    /* the hyphen character             */
  271. X
  272. X#define    CH_UNIT_CM        'c'    /* unit of measurement: centimetres  */
  273. X#define    CH_UNIT_IN        'i'    /* unit of measurement: inches       */
  274. X#define    CH_UNIT_PT        'p'    /* unit of measurement: points       */
  275. X#define    CH_UNIT_EM        'm'    /* unit of measurement: ems          */
  276. X#define    CH_UNIT_FT        'f'    /* unit of measurement: fontsizes    */
  277. X#define    CH_UNIT_SP        's'    /* unit of measurement: spacewidths  */
  278. X#define    CH_UNIT_VS        'v'    /* unit of measurement: vspaces      */
  279. X#define    CH_UNIT_WD        'w'    /* unit of measurement: follwidths   */
  280. X#define    CH_UNIT_BD        'b'    /* unit of measurement: boundwidths  */
  281. X#define    CH_UNIT_RL        'r'    /* unit of measurement: relwidths    */
  282. X#define    CH_UNIT_DG        'd'    /* unit of measurement: degrees      */
  283. X
  284. X#define    CH_MODE_EDGE        'e'    /* spacing mode: edge-to-edge        */
  285. X#define    CH_MODE_HYPH        'h'    /* spacing mode: hyphenation         */
  286. X#define    CH_MODE_MARK        'x'    /* spacing mode: mark-to-mark        */
  287. X#define    CH_MODE_OVER        'o'    /* spacing mode: overstrike          */
  288. X#define    CH_MODE_KERN        'k'    /* spacing mode: kerning             */
  289. X#define    CH_MODE_TABL        't'    /* spacing mode: tabulation          */
  290. X
  291. X#define octaldigit(ch)        ( (ch) >= '0' && (ch) <= '7' )
  292. X#define decimaldigit(ch)    ( (ch) >= '0' && (ch) <= '9' )
  293. X#define    digitchartonum(ch)    ( (ch) - '0' )
  294. X#define    numtodigitchar(ch)    ( (ch) + '0' )
  295. X#define    beginsbreakstyle(ch)    ( (ch) >= 'a' && (ch) <= 'z' )
  296. X#define    numericchar(ch)        ( decimaldigit(ch) || (ch) == '.' )
  297. X
  298. X
  299. X/*@::String literals, FULL_CHAR type@*****************************************/
  300. X/*                                                                           */
  301. X/*  String Literals.                                                         */
  302. X/*                                                                           */
  303. X/*  All significant string literals are defined here.  The program has many  */
  304. X/*  others, however: format strings, debug output, etc.                      */
  305. X/*                                                                           */
  306. X/*****************************************************************************/
  307. X
  308. X#define    STR_EMPTY        AsciiToFull("")
  309. X#define    STR_QUOTE        AsciiToFull("\"")
  310. X#define    STR_ESCAPE        AsciiToFull("\\")
  311. X#define    STR_COMMENT        AsciiToFull("#")
  312. X#define    STR_SPACE        AsciiToFull(" ")
  313. X#define    STR_TAB            AsciiToFull("\t")
  314. X#define    STR_NEWLINE        AsciiToFull("\n")
  315. X#define    STR_LETTERS_LOWER    AsciiToFull("abcdefghijklmnopqrstuvwxyz")
  316. X#define    STR_LETTERS_UPPER    AsciiToFull("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
  317. X#define    STR_LETTERS_SYMSTART    AsciiToFull("@")
  318. X
  319. X#if CHAR_IN==0
  320. X#define    STR_LETTERS_EXTRA0    AsciiToFull("")
  321. X#define    STR_LETTERS_EXTRA1    AsciiToFull("")
  322. X#define    STR_LETTERS_EXTRA2    AsciiToFull("")
  323. X#define    STR_LETTERS_EXTRA3    AsciiToFull("")
  324. X#define    STR_LETTERS_EXTRA4    AsciiToFull("")
  325. X#define    STR_LETTERS_EXTRA5    AsciiToFull("")
  326. X#define    STR_LETTERS_EXTRA6    AsciiToFull("")
  327. X#define    STR_LETTERS_EXTRA7    AsciiToFull("")
  328. X#else
  329. X#define    STR_LETTERS_EXTRA0    AsciiToFull("\300\301\302\303\304\305\306\307")
  330. X#define    STR_LETTERS_EXTRA1    AsciiToFull("\310\311\312\313\314\315\316\317")
  331. X#define    STR_LETTERS_EXTRA2    AsciiToFull("\320\321\322\323\324\325\326")
  332. X#define    STR_LETTERS_EXTRA3    AsciiToFull("\330\331\332\333\334\335\336\337")
  333. X#define    STR_LETTERS_EXTRA4    AsciiToFull("\340\341\342\343\344\345\346\347")
  334. X#define    STR_LETTERS_EXTRA5    AsciiToFull("\350\351\352\353\354\355\356\357")
  335. X#define    STR_LETTERS_EXTRA6    AsciiToFull("\360\361\362\363\364\365\366")
  336. X#define    STR_LETTERS_EXTRA7    AsciiToFull("\370\371\372\373\374\375\376\377")
  337. X#endif
  338. X
  339. X#define    STR_STDIN        AsciiToFull("-")
  340. X#define    STR_STDOUT        AsciiToFull("-")
  341. X#define    STR_HYPHEN        AsciiToFull("-")
  342. X#define    STR_EPS            AsciiToFull("EPS")
  343. X#define    STR_ELSE        AsciiToFull("else")
  344. X#define    STR_NOCROSS        AsciiToFull("??")
  345. X#define    STR_BADKEY        AsciiToFull("badkey")
  346. X#define    STR_NONE        AsciiToFull("none")
  347. X#define    STR_ZERO        AsciiToFull("0")
  348. X#define    STR_PS_SPACENAME    AsciiToFull("space")
  349. X#define    STR_FONT_RECODE        AsciiToFull("Recode")
  350. X#define    STR_FONT_NORECODE    AsciiToFull("NoRecode")
  351. X
  352. X#define    STR_BREAK_HYPHEN    AsciiToFull("hyphen")
  353. X#define    STR_BREAK_NOHYPHEN    AsciiToFull("nohyphen")
  354. X#define    STR_BREAK_ADJUST    AsciiToFull("adjust")
  355. X#define    STR_BREAK_OUTDENT    AsciiToFull("outdent")
  356. X#define    STR_BREAK_RAGGED    AsciiToFull("ragged")
  357. X#define    STR_BREAK_CRAGGED    AsciiToFull("cragged")
  358. X#define    STR_BREAK_RRAGGED    AsciiToFull("rragged")
  359. X#define    STR_BREAK_LINES        AsciiToFull("lines")
  360. X#define    STR_BREAK_CLINES    AsciiToFull("clines")
  361. X#define    STR_BREAK_RLINES    AsciiToFull("rlines")
  362. X
  363. X#define    STR_GAP_RJUSTIFY    AsciiToFull("1rt")
  364. X#define    STR_GAP_ZERO_HYPH    AsciiToFull("0ch")
  365. X
  366. X
  367. X/*@::GAP, STYLE@**************************************************************/
  368. X/*                                                                           */
  369. X/*  typedef GAP - what separates one object from another.                    */
  370. X/*                                                                           */
  371. X/*****************************************************************************/
  372. X
  373. Xtypedef struct
  374. X{ unsigned char    ospare;            /* left for other things in STYLE    */
  375. X  BOOLEAN    omark    : 1;        /* TRUE if this gap is marked        */
  376. X  BOOLEAN    ojoin    : 1;        /* TRUE if joins exist across gap    */
  377. X  unsigned    ounits    : 3;        /* units of measurement: fixed, etc  */
  378. X  unsigned    omode    : 3;        /* spacing mode: edge-to-edge, etc   */
  379. X  LENGTH    owidth;            /* width of the gap                  */
  380. X} GAP;
  381. X
  382. X#define    mark(x)        (x).omark
  383. X#define    join(x)        (x).ojoin
  384. X#define    units(x)    (x).ounits
  385. X#define    mode(x)        (x).omode
  386. X#define    width(x)    (x).owidth
  387. X
  388. X#define SetGap(x, xmark, xjoin, xunits, xmode, xwidth)            \
  389. X( mark(x) = xmark, join(x) = xjoin, units(x) = xunits,            \
  390. X  mode(x) = xmode, width(x) = xwidth                    \
  391. X)
  392. X
  393. X#define GapCopy(x, y)                            \
  394. X( mark(x) = mark(y), join(x) = join(y), units(x) = units(y),        \
  395. X  mode(x) = mode(y), width(x) = width(y)                \
  396. X)
  397. X
  398. X#define ClearGap(x)    SetGap(x, FALSE, TRUE, FIXED_UNIT, NO_MODE, 0)
  399. X
  400. X
  401. X/*****************************************************************************/
  402. X/*                                                                           */
  403. X/*  typedef STYLE - information about how to break text, etc.                */
  404. X/*                                                                           */
  405. X/*****************************************************************************/
  406. X
  407. Xtypedef struct
  408. X{ GAP        oline_gap;        /* separation between lines          */
  409. X  union {
  410. X    GAP        ospace_gap;        /* separation indiced by white space */
  411. X    struct {
  412. X      unsigned    ohyph_style    : 2;    /* hyphenation off or on             */
  413. X      unsigned    ofill_style    : 2;    /* fill lines with text off/on       */
  414. X      unsigned    odisplay_style : 3;    /* display lines adjusted, ragged... */
  415. X    } oss;
  416. X  } osu;
  417. X} STYLE;
  418. X
  419. X#define    line_gap(x)    (x).oline_gap
  420. X#define    space_gap(x)    (x).osu.ospace_gap
  421. X#define    font(x)        (x).oline_gap.ospare
  422. X#define    hyph_style(x)    (x).osu.oss.ohyph_style
  423. X#define    fill_style(x)    (x).osu.oss.ofill_style
  424. X#define    display_style(x)(x).osu.oss.odisplay_style
  425. X
  426. X#define StyleCopy(x, y)                            \
  427. X( GapCopy( line_gap(x), line_gap(y) ),                    \
  428. X  font(x) = font(y),                            \
  429. X  hyph_style(x) = hyph_style(y),                    \
  430. X  fill_style(x) = fill_style(y),                    \
  431. X  display_style(x) = display_style(y),                    \
  432. X  GapCopy( space_gap(x), space_gap(y) )                    \
  433. X)
  434. X
  435. X
  436. X/*@::CONSTRAINT, FILE_NUM, FILE_POS, LIST@************************************/
  437. X/*                                                                           */
  438. X/*  typedef CONSTRAINT - a size constraint.                                  */
  439. X/*                                                                           */
  440. X/*****************************************************************************/
  441. X
  442. Xtypedef struct
  443. X{ LENGTH  obc;
  444. X  LENGTH  obfc;
  445. X  LENGTH  ofc;
  446. X  LENGTH  osparec;
  447. X} CONSTRAINT;
  448. X
  449. X#define    bc(x)        (x).obc
  450. X#define    bfc(x)        (x).obfc
  451. X#define    fc(x)        (x).ofc
  452. X#define    sparec(x)    (x).osparec
  453. X#define    constrained(x)    (bc(x)!=MAX_LEN || bfc(x)!=MAX_LEN || fc(x)!=MAX_LEN)
  454. X
  455. X#define    SetConstraint(c,x,y,z)    (bc(c) = (x),   bfc(c) = (y),    fc(c) = (z))
  456. X#define    CopyConstraint(x, y)    (bc(x) = bc(y), bfc(x) = bfc(y), fc(x) = fc(y))
  457. X#define FitsConstraint(b, f, c)    (b <= bc(c)  && b + f <= bfc(c) && f <= fc(c))
  458. X
  459. X#define    ig_fnum(x)    bc(constraint(x))
  460. X#define    ig_xtrans(x)    bfc(constraint(x))
  461. X#define    ig_ytrans(x)    fc(constraint(x))
  462. X
  463. X
  464. X/*****************************************************************************/
  465. X/*                                                                           */
  466. X/*  typedef FILE_NUM - the internal representation of a file.                */
  467. X/*                                                                           */
  468. X/*****************************************************************************/
  469. X
  470. Xtypedef unsigned char    FILE_NUM;
  471. X#define    NO_FILE        0
  472. X
  473. X
  474. X/*****************************************************************************/
  475. X/*                                                                           */
  476. X/*  typedef FILE_POS - a position in the set of input files.                 */
  477. X/*                                                                           */
  478. X/*****************************************************************************/
  479. X
  480. Xtypedef    struct
  481. X{ FILE_NUM    ofile_num;        /* no. of file this record is from   */
  482. X  unsigned char    ocol_num;        /* column number this is related to  */
  483. X  LENGTH    oline_num;        /* the line number of this record    */
  484. X} FILE_POS;
  485. X
  486. X#define    file_num(x)    (x).ofile_num
  487. X#define    col_num(x)    (x).ocol_num
  488. X#define    line_num(x)    (x).oline_num
  489. X
  490. X#define FposCopy(x, y)                            \
  491. X( file_num(x) = file_num(y),                        \
  492. X  line_num(x) = line_num(y),                        \
  493. X  col_num(x)  = col_num(y)                        \
  494. X)
  495. X
  496. X
  497. X/*****************************************************************************/
  498. X/*                                                                           */
  499. X/*  typedef LIST - two pointers used to make one doubly linked list          */
  500. X/*                                                                           */
  501. X/*****************************************************************************/
  502. X
  503. Xtypedef struct { union rec *opred, *osucc; } LIST;
  504. X
  505. X
  506. X/*@::FIRST_UNION@*************************************************************/
  507. X/*                                                                           */
  508. X/*  typedef FIRST_UNION - first four bytes of object record (after 2 LISTs). */
  509. X/*                                                                           */
  510. X/*****************************************************************************/
  511. X
  512. Xtypedef union
  513. X{
  514. X  struct /* used by WORD and QWORD when they are tokens */
  515. X  {    unsigned char    otype, orec_size;
  516. X    unsigned char    ohspace, ovspace;
  517. X  } os11;
  518. X
  519. X  struct /* used by all non-WORD tokens, including CLOSURE and GAP_OBJ */
  520. X  {    unsigned char    otype, oprecedence;
  521. X    unsigned char    ohspace, ovspace;
  522. X  } os12;
  523. X
  524. X  struct /* used by WORD and QWORD when they are objects */
  525. X  {    unsigned char    otype, orec_size;
  526. X    BOOLEAN        ogall_rec    : 1;
  527. X    BOOLEAN        obroken      : 1;
  528. X    BOOLEAN        othreaded    : 1;
  529. X    BOOLEAN        oexternal    : 1;
  530. X    BOOLEAN        oblocked     : 1;
  531. X    BOOLEAN        obackward    : 1;
  532. X    BOOLEAN        otrigger_ext : 1;
  533. X    BOOLEAN            omust_expand : 1;
  534. X    FONT_NUM    oword_font;
  535. X  } os13;
  536. X
  537. X  struct /* used by all non-WORD objects, including CLOSURE */
  538. X  {    unsigned char    otype, ospare;
  539. X    BOOLEAN        ogall_rec    : 1;
  540. X    BOOLEAN        obroken      : 1;
  541. X    BOOLEAN        othreaded    : 1;
  542. X    BOOLEAN        oexternal    : 1;
  543. X    BOOLEAN        oblocked     : 1;
  544. X    BOOLEAN        obackward    : 1;
  545. X    BOOLEAN        otrigger_ext : 1;
  546. X    BOOLEAN            omust_expand : 1;
  547. X    unsigned char    ocross_type;         /* CROSS objects only */
  548. X  } os14;
  549. X
  550. X  struct /* used by WORD and QWORD when they are database nodes */
  551. X  {    unsigned char    otype, orec_size;
  552. X    unsigned    oreading     :    1;
  553. X    unsigned     oleft_pos    : 15;
  554. X  } os15;
  555. X
  556. X  struct /* used by WORD and QWORD when they are font records */
  557. X  {    unsigned char    otype, orec_size;
  558. X    FONT_NUM    ofont_num;
  559. X    BOOLEAN        ofont_recoded:  1;
  560. X  } os16;
  561. X
  562. X  struct /* used by symbol table entries */
  563. X  {    unsigned char    otype, oprecedence;
  564. X    BOOLEAN        ois_tag             : 1;
  565. X    BOOLEAN        ohas_tag             : 1;
  566. X    BOOLEAN        ohas_lpar            : 1;
  567. X    BOOLEAN        ohas_rpar            : 1;
  568. X    BOOLEAN        oright_assoc         : 1;
  569. X    BOOLEAN        ois_target           : 1;
  570. X    BOOLEAN        ohas_target          : 1;
  571. X    BOOLEAN        oforce_target         : 1;
  572. X    BOOLEAN        ohas_body            : 1;
  573. X    BOOLEAN        oindefinite          : 1;
  574. X    BOOLEAN        orecursive           : 1;
  575. X    BOOLEAN        ouses_extern_target  : 1;
  576. X    BOOLEAN        ois_extern_target    : 1;
  577. X    BOOLEAN        ois_key             : 1;
  578. X    BOOLEAN        ohas_key         : 1;
  579. X    BOOLEAN        odirty               : 1;
  580. X  } os17;
  581. X
  582. X} FIRST_UNION;
  583. X
  584. X/*@::SECOND_UNION, THIRD_UNION, FOURTH_UNION@*********************************/
  585. X/*                                                                           */
  586. X/*  typedef SECOND_UNION - four bytes usually holding a file position.       */
  587. X/*                                                                           */
  588. X/*  The fpos is overwritten in WORDs and QWORDs during FixAndPrintObject by  */
  589. X/*  the horizontal coordinate of the word, which has to be remembered.       */
  590. X/*                                                                           */
  591. X/*****************************************************************************/
  592. X
  593. Xtypedef union
  594. X{
  595. X  FILE_POS    ofpos;
  596. X  int        oword_save_mark;
  597. X
  598. X} SECOND_UNION;
  599. X
  600. X
  601. X/*****************************************************************************/
  602. X/*                                                                           */
  603. X/*  typedef THIRD_UNION - eight bytes usually holding an object size.        */
  604. X/*                                                                           */
  605. X/*  In database records this space is used for a file pointer; in certain    */
  606. X/*  WORD objects used privately in z10.c it is used for a galley-position.   */
  607. X/*  In font records it holds the font size, space width, etc.                */
  608. X/*                                                                           */
  609. X/*****************************************************************************/
  610. X
  611. Xtypedef union
  612. X{
  613. X  struct
  614. X  {    LENGTH    oback[2];
  615. X    LENGTH    ofwd[2];
  616. X  } os31;
  617. X
  618. X  FILE *ofilep;
  619. X  int    ogall_pos;
  620. X
  621. X  struct
  622. X  {    LENGTH    ofont_size;
  623. X    LENGTH    ofont_xheight2;
  624. X    LENGTH    ofont_spacewidth;
  625. X    ENCODING ofont_encoding;
  626. X  } os32;
  627. X
  628. X} THIRD_UNION;
  629. X
  630. X
  631. X/*****************************************************************************/
  632. X/*                                                                           */
  633. X/*  typedef FOURTH_UNION - eight bytes holding a STYLE or CONSTRAINT.        */
  634. X/*                                                                           */
  635. X/*****************************************************************************/
  636. X
  637. Xtypedef union
  638. X{
  639. X  STYLE        osave_style;
  640. X  CONSTRAINT    oconstraint;
  641. X
  642. X} FOURTH_UNION;
  643. X
  644. X
  645. X/*@::OBJECT@******************************************************************/
  646. X/*                                                                           */
  647. X/*  typedef OBJECT - the general-purpose record used throughout Lout.        */
  648. X/*                                                                           */
  649. X/*****************************************************************************/
  650. X
  651. Xtypedef union rec
  652. X{
  653. X  struct word_type    /* all fields of WORD and QWORD, token and object */
  654. X  {  LIST        olist[2];
  655. X     FIRST_UNION    ou1;
  656. X     SECOND_UNION    ou2;
  657. X     THIRD_UNION    ou3;
  658. X     FULL_CHAR        ostring[4];
  659. X  } os1;
  660. X
  661. X  struct closure_type    /* all fields of CLOSURE, both as token and object */
  662. X  {  LIST        olist[2];
  663. X     FIRST_UNION    ou1;
  664. X     SECOND_UNION    ou2;
  665. X     THIRD_UNION    ou3;
  666. X     FOURTH_UNION    ou4;
  667. X     union rec        *oactual;
  668. X     union
  669. X     { union rec *owhereto;
  670. X       LENGTH    osave_mark;
  671. X     } oux;
  672. X     union rec *oready_galls;
  673. X  } os2;
  674. X  
  675. X  struct object_type    /* the general OBJECT */
  676. X  {  LIST        olist[2];
  677. X     FIRST_UNION    ou1;
  678. X     SECOND_UNION    ou2;
  679. X     THIRD_UNION    ou3;
  680. X     FOURTH_UNION    ou4;
  681. X  } os3;
  682. X
  683. X  struct link_type    /* LINK */
  684. X  {  LIST        olist[2];
  685. X     unsigned char    otype;
  686. X     unsigned char    onumber;
  687. X     unsigned char    odb_targ;
  688. X  } os4;
  689. X  
  690. X  struct gapobj_type    /* GAP_OBJ */
  691. X  {  LIST        olist[2];
  692. X     FIRST_UNION    ou1;
  693. X     SECOND_UNION    ou2;
  694. X     GAP        ogap;
  695. X     int        osave_badness;        /* optimum paragraph breaker */
  696. X     LENGTH        osave_space;        /* optimum paragraph breaker */
  697. X     LENGTH        osave_actual_gap;    /* optimum paragraph breaker */
  698. X     union rec      *osave_prev;        /* optimum paragraph breaker */
  699. X  } os5;
  700. X
  701. X  struct symbol_type
  702. X  {  LIST        olist[2];
  703. X     FIRST_UNION    ou1;
  704. X     SECOND_UNION    ou2;
  705. X     union rec        *oenclosing;
  706. X     union rec        *osym_body;
  707. X     union rec        *obase_uses;
  708. X     union rec        *ouses;
  709. X     union rec        *omarker;
  710. X     union rec        *ocross_sym;
  711. X     union rec        *oimports;
  712. X     short unsigned     opredefined;
  713. X     unsigned char    ouses_count;
  714. X     BOOLEAN        ovisible         : 1;
  715. X     BOOLEAN        ohas_mark         : 1;
  716. X     BOOLEAN        ohas_join         : 1;
  717. X     BOOLEAN        ohas_par             : 1;
  718. X     BOOLEAN        ouses_galley         : 1;
  719. X  } os6;
  720. X
  721. X  struct cr_type
  722. X  {  LIST        olist[2];
  723. X     unsigned char    otype;
  724. X     unsigned char    otarget_state;
  725. X     FILE_NUM        otarget_file;
  726. X     FILE_NUM        ocr_file;
  727. X     union rec        *otarget_val;
  728. X     int        otarget_seq;
  729. X     int        otarget_pos;
  730. X     int        ocr_seq;
  731. X     int        ogall_seq;
  732. X     union rec        *osymb;
  733. X     union rec        *ogall_tag;
  734. X     FILE_NUM        ogall_tfile;
  735. X     FILE_NUM        ogentag_file;
  736. X     int        ogentag_seq;
  737. X     union rec        *ogentag_fseq;
  738. X  } os7;
  739. X
  740. X  struct ext_gall_type
  741. X  {  LIST        olist[2];
  742. X     unsigned char    otype;
  743. X     FILE_NUM        oeg_fnum;
  744. X     long        oeg_fpos;
  745. X     long        oeg_cont;
  746. X     union rec        *oeg_symbol;
  747. X  } os8;
  748. X
  749. X  struct uses_type
  750. X  {  union rec    *oitem;
  751. X     union rec    *onext;
  752. X  } os9;
  753. X
  754. X  struct hash_entry_type
  755. X  {  LIST    olist[1];
  756. X  } os10;
  757. X
  758. X} *OBJECT;
  759. X
  760. X
  761. X/*@::macros for fields of OBJECT@*********************************************/
  762. X/*                                                                           */
  763. X/*  Macros for fields of OBJECT.                                             */
  764. X/*                                                                           */
  765. X/*****************************************************************************/
  766. X
  767. X#define    succ(x, dim)        (x)->os1.olist[dim].osucc
  768. X#define    pred(x, dim)        (x)->os1.olist[dim].opred
  769. X
  770. X#define type(x)            (x)->os1.ou1.os11.otype
  771. X#define    rec_size(x)        (x)->os1.ou1.os11.orec_size
  772. X#define    hspace(x)        (x)->os1.ou1.os11.ohspace
  773. X#define    vspace(x)        (x)->os1.ou1.os11.ovspace
  774. X#define    precedence(x)        (x)->os2.ou1.os12.oprecedence
  775. X
  776. X#define    gall_rec(x)        (x)->os1.ou1.os13.ogall_rec
  777. X#define    non_blocking(x)        gall_rec(x)
  778. X#define    broken(x)        (x)->os1.ou1.os13.obroken
  779. X#define    sized(x)        broken(x)
  780. X#define    threaded(x)        (x)->os1.ou1.os13.othreaded
  781. X#define    external(x)        (x)->os1.ou1.os13.oexternal
  782. X#define    blocked(x)        (x)->os1.ou1.os13.oblocked
  783. X#define    seen_nojoin(x)        blocked(x)
  784. X#define    backward(x)        (x)->os1.ou1.os13.obackward
  785. X#define    trigger_externs(x)    (x)->os1.ou1.os13.otrigger_ext
  786. X#define    must_expand(x)        (x)->os1.ou1.os13.omust_expand
  787. X#define    word_font(x)        (x)->os1.ou1.os13.oword_font
  788. X#define    cross_type(x)        (x)->os1.ou1.os14.ocross_type
  789. X#define    thr_state(x)        cross_type(x)
  790. X
  791. X#define    reading(x)        (x)->os1.ou1.os15.oreading
  792. X#define    left_pos(x)        (x)->os1.ou1.os15.oleft_pos
  793. X
  794. X#define    has_lpar(x)        (x)->os1.ou1.os17.ohas_lpar
  795. X#define    has_rpar(x)        (x)->os1.ou1.os17.ohas_rpar
  796. X#define    right_assoc(x)        (x)->os1.ou1.os17.oright_assoc
  797. X#define    is_target(x)        (x)->os1.ou1.os17.ois_target
  798. X#define    has_target(x)        (x)->os1.ou1.os17.ohas_target
  799. X#define    force_target(x)        (x)->os1.ou1.os17.oforce_target
  800. X#define    is_tag(x)        (x)->os1.ou1.os17.ois_tag
  801. X#define    has_tag(x)        (x)->os1.ou1.os17.ohas_tag
  802. X#define    has_body(x)        (x)->os1.ou1.os17.ohas_body
  803. X#define    indefinite(x)        (x)->os1.ou1.os17.oindefinite
  804. X#define    recursive(x)        (x)->os1.ou1.os17.orecursive
  805. X#define    uses_extern_target(x)    (x)->os1.ou1.os17.ouses_extern_target
  806. X#define    is_extern_target(x)    (x)->os1.ou1.os17.ois_extern_target
  807. X#define    is_key(x)        (x)->os1.ou1.os17.ois_key
  808. X#define    has_key(x)        (x)->os1.ou1.os17.ohas_key
  809. X#define    dirty(x)        (x)->os1.ou1.os17.odirty
  810. X
  811. X#define    fpos(x)            (x)->os1.ou2.ofpos
  812. X#define word_save_mark(x)    (x)->os1.ou2.oword_save_mark
  813. X
  814. X#define    back(x, dim)        (x)->os1.ou3.os31.oback[dim]
  815. X#define    fwd(x, dim)        (x)->os1.ou3.os31.ofwd[dim]
  816. X#define    size(x, dim)        (back(x, dim) + fwd(x, dim))
  817. X#define    filep(x)        (x)->os1.ou3.ofilep
  818. X#define    gall_pos(x)        (x)->os1.ou3.ogall_pos
  819. X
  820. X#define string(x)        (x)->os1.ostring
  821. X
  822. X#define    save_style(x)        (x)->os2.ou4.osave_style
  823. X#define    constraint(x)        (x)->os2.ou4.oconstraint
  824. X
  825. X#define actual(x)        (x)->os2.oactual
  826. X#define whereto(x)        (x)->os2.oux.owhereto
  827. X#define save_mark(x)        (x)->os2.oux.osave_mark
  828. X#define ready_galls(x)        (x)->os2.oready_galls
  829. X
  830. X#define    number(x)        (x)->os4.onumber
  831. X#define    db_targ(x)        (x)->os4.odb_targ
  832. X
  833. X#define    gap(x)            (x)->os5.ogap
  834. X#define    save_badness(x)        (x)->os5.osave_badness
  835. X#define    save_space(x)        (x)->os5.osave_space
  836. X#define    save_actual_gap(x)    (x)->os5.osave_actual_gap
  837. X#define    save_prev(x)        (x)->os5.osave_prev
  838. X
  839. X#define    enclosing(x)        (x)->os6.oenclosing
  840. X#define    sym_body(x)        (x)->os6.osym_body
  841. X#define    base_uses(x)        (x)->os6.obase_uses
  842. X#define    uses(x)            (x)->os6.ouses
  843. X#define    marker(x)        (x)->os6.omarker
  844. X#define    cross_sym(x)        (x)->os6.ocross_sym
  845. X#define    imports(x)        (x)->os6.oimports
  846. X#define    predefined(x)        (x)->os6.opredefined
  847. X#define    uses_count(x)        (x)->os6.ouses_count
  848. X#define    visible(x)        (x)->os6.ovisible
  849. X#define    has_mark(x)        (x)->os6.ohas_mark
  850. X#define    has_join(x)        (x)->os6.ohas_join
  851. X#define    has_par(x)        (x)->os6.ohas_par
  852. X#define    uses_galley(x)        (x)->os6.ouses_galley
  853. X
  854. X#define    target_state(x)        (x)->os7.otarget_state
  855. X#define    target_file(x)        (x)->os7.otarget_file
  856. X#define    cr_file(x)        (x)->os7.ocr_file
  857. X#define    target_val(x)        (x)->os7.otarget_val
  858. X#define    target_seq(x)        (x)->os7.otarget_seq
  859. X#define    target_pos(x)        (x)->os7.otarget_pos
  860. X#define    cr_seq(x)        (x)->os7.ocr_seq
  861. X#define    gall_seq(x)        (x)->os7.ogall_seq
  862. X#define    symb(x)            (x)->os7.osymb
  863. X#define    gall_tag(x)        (x)->os7.ogall_tag
  864. X#define    gall_tfile(x)        (x)->os7.ogall_tfile
  865. X#define    gentag_file(x)        (x)->os7.ogentag_file
  866. X#define    gentag_seq(x)        (x)->os7.ogentag_seq
  867. X#define    gentag_fseq(x)        (x)->os7.ogentag_fseq
  868. X
  869. X#define    eg_fnum(x)        (x)->os8.oeg_fnum
  870. X#define    eg_fpos(x)        (x)->os8.oeg_fpos
  871. X#define    eg_cont(x)        (x)->os8.oeg_cont
  872. X#define    eg_symbol(x)        (x)->os8.oeg_symbol
  873. X
  874. X#define    item(x)            (x)->os9.oitem
  875. X#define    next(x)            (x)->os9.onext
  876. X
  877. X#define    font_num(x)        (x)->os1.ou1.os16.ofont_num
  878. X#define    font_recoded(x)        (x)->os1.ou1.os16.ofont_recoded
  879. X#define    font_size(x)        (x)->os1.ou3.os32.ofont_size
  880. X#define    font_xheight2(x)    (x)->os1.ou3.os32.ofont_xheight2
  881. X#define    font_spacewidth(x)    (x)->os1.ou3.os32.ofont_spacewidth
  882. X#define    font_encoding(x)    (x)->os1.ou3.os32.ofont_encoding
  883. X
  884. X
  885. X/*@::object types@************************************************************/
  886. X/*                                                                           */
  887. X/*  OBJECT, TOKEN AND OTHER TYPES inhabiting type(x) and predefined(x)       */
  888. X/*                                                                           */
  889. X/*  Key letters in the adjacent comment indicate where the tag is legal:     */
  890. X/*                                                                           */
  891. X/*    t  a token type, pushed on token stack                                 */
  892. X/*    o  an object type (returned by reduce(), inserted by Manifest)         */
  893. X/*    i  an index type (a child of a galley header other than an object)     */
  894. X/*    s  a predefined symbol (some symbol table entry has this predefined()) */
  895. X/*    n  an indefinite object i.e. one which is ignored in catenation ops    */
  896. X/*                                                                           */
  897. X/*****************************************************************************/
  898. X
  899. X#define    LINK         0        /*        a link between objects     */
  900. X#define    GAP_OBJ         1        /*  o     a gap object               */
  901. X#define    CLOSURE         2        /* to  n  a closure of a symbol      */
  902. X#define    NULL_CLOS     3        /* to sn  @Null                      */
  903. X#define    CROSS         4        /* to sn  && (a cross reference obj) */
  904. X#define    HEAD         5        /*  o  n  a galley header            */
  905. X#define    SPLIT         6        /*  o     @Split                     */
  906. X#define    PAR         7        /*  o     a parameter of a closure   */
  907. X#define    WORD         8        /*  o     a word                     */
  908. X#define    QWORD         9        /*  o     a word (was quoted in i/p) */
  909. X#define    ROW_THR        10        /*  o     a row thread               */
  910. X#define    COL_THR        11        /*  o     a column thread            */
  911. X#define    ACAT        12        /* to s   a sequence of &-ed objs    */
  912. X#define    HCAT        13        /* to s   a sequence of |-ed objs    */
  913. X#define    VCAT        14        /* to s   a sequence of /-ed objs    */
  914. X#define    ONE_COL        15        /* to s   @OneCol                    */
  915. X#define    ONE_ROW        16        /* to s   @OneRow                    */
  916. X#define    WIDE        17        /* to s   @Wide                      */
  917. X#define    HIGH        18        /* to s   @High                      */
  918. X#define    HSCALE        19        /* to s   @HScale                    */
  919. X#define    VSCALE        20        /* to s   @HScale                    */
  920. X#define    SCALE        21        /* to s   @Scale                     */
  921. X#define    HCONTRACT    22        /* to s   @HContract                 */
  922. X#define    VCONTRACT    23        /* to s   @VContract                 */
  923. X#define    HEXPAND        24        /* to s   @HExpand                   */
  924. X#define    VEXPAND        25        /* to s   @VExpand                   */
  925. X#define    PADJUST        26        /* to s   @PAdjust                   */
  926. X#define    HADJUST        27        /* to s   @HAdjust                   */
  927. X#define    VADJUST        28        /* to s   @VAdjust                   */
  928. X#define    ROTATE        29        /* to s   @Rotate                    */
  929. X#define    CASE        30        /* to s   @Case                      */
  930. X#define    YIELD        31        /* to s   @Yield                     */
  931. X#define    XCHAR        32        /* to s   @Char                      */
  932. X#define    FONT        33        /* to s   @Font                      */
  933. X#define    SPACE        34        /* to s   @Space                     */
  934. X#define    BREAK        35        /* to s   @Break                     */
  935. X#define    NEXT        36        /* to s   @Next                      */
  936. X#define    ENV        37        /* to s   @LEnv                      */
  937. X#define    CLOS        38        /* to s   @LClos                     */
  938. X#define    LVIS        39        /* to s   @LVis                      */
  939. X#define    OPEN        40        /* to s   @Open                      */
  940. X#define    TAGGED        41        /* to s   @Tagged                    */
  941. X#define    INCGRAPHIC    42        /* to s   @IncludeGraphic            */
  942. X#define    SINCGRAPHIC    43        /* to s   @SysIncludeGraphic         */
  943. X#define    GRAPHIC        44        /* to s   @Graphic                   */
  944. X
  945. X#define    TSPACE        45        /* t      a space token, parser only */
  946. X#define    TJUXTA        46        /* t      a juxta token, parser only */
  947. X#define    LBR        47        /* t  s   left brace token           */
  948. X#define    RBR        48        /* t  s   right brace token          */
  949. X#define    BEGIN        49        /* t  s   @Begin token               */
  950. X#define    END        50        /* t  s   @End token                 */
  951. X#define    USE        51        /* t  s   @Use                       */
  952. X#define    GSTUB_NONE    52        /* t      a galley stub, no rpar     */
  953. X#define    GSTUB_INT    53        /* t      galley stub internal rpar  */
  954. X#define    GSTUB_EXT    54        /* t      galley stub external rpar  */
  955. X#define    INCLUDE        55        /*    s   @Include                   */
  956. X#define    SYS_INCLUDE    56        /*    s   @SysInclude                */
  957. X#define    PREPEND        57        /*    s   @Prepend                   */
  958. X#define    SYS_PREPEND    58        /*    s   @SysPrepend                */
  959. X#define    DATABASE    59        /*    s   @Database                  */
  960. X#define    SYS_DATABASE    60        /*    s   @SysDatabase               */
  961. X#define    START        61        /*    s   \Start                     */
  962. X
  963. X#define    DEAD        63        /*   i    a dead galley              */
  964. X#define    UNATTACHED    64        /*   i    an inner, unsized galley   */
  965. X#define    RECEPTIVE    65        /*   i    a receptive object index   */
  966. X#define    RECEIVING    66        /*   i    a receiving object index   */
  967. X#define    RECURSIVE    67        /*   i    a recursive definite obj.  */
  968. X#define    PRECEDES    68        /*   i    an ordering constraint     */
  969. X#define    FOLLOWS        69        /*   i    other end of ordering c.   */
  970. X#define    CROSS_FOLL    70        /*   i    following type cross-ref   */
  971. X#define    GALL_FOLL    71        /*   i    galley with &&following    */
  972. X#define    CROSS_TARG    72        /*   i    value of cross-ref         */
  973. X#define    GALL_TARG    73        /*   i    target of these galleys    */
  974. X#define    GALL_PREC    74        /*   i    galley with &&preceding    */
  975. X#define    CROSS_PREC    75        /*   i    preceding type cross-ref   */
  976. X#define    EXPAND_IND    76        /*   i    index of HEXPAND or VEXPD  */
  977. X#define    THREAD        77        /*        a sequence of threads      */
  978. X#define    CROSS_SYM    78        /*        cross-ref info             */
  979. X#define    CR_ROOT        79        /*        RootCross                  */
  980. X#define    MACRO        80        /*        a macro symbol             */
  981. X#define    LOCAL        81        /*        a local symbol             */
  982. X#define    LPAR        82        /*        a left parameter           */
  983. X#define    NPAR        83        /*        a named parameter          */
  984. X#define    RPAR        84        /*        a right parameter          */
  985. X#define    EXT_GALL    85        /*        an external galley         */
  986. X#define    CR_LIST        86        /*        a list of cross references */
  987. X#define    DISPOSED    87        /*        a disposed record          */
  988. X
  989. X#define is_indefinite(x)  ((x) >= CLOSURE && (x) <= HEAD)
  990. X#define is_definite(x)      ((x) >= SPLIT && (x) <= GRAPHIC)
  991. X#define    is_par(x)    ((x) >= LPAR   && (x) <= RPAR)
  992. X#define    is_index(x)    ((x) >= DEAD && (x) <= EXPAND_IND)
  993. X#define    is_type(x)    ((x) >= LINK && (x) < DISPOSED)
  994. X#define    is_word(x)    ((x) == WORD || (x) == QWORD)
  995. X#define is_cat_op(x)    (((x)>=ACAT && (x)<=VCAT) || (x)==TSPACE || (x)<=TJUXTA)
  996. X
  997. X
  998. X/*@::miscellaneous constants@*************************************************/
  999. X/*                                                                           */
  1000. X/*  Miscellaneous globally defined constants                                 */
  1001. X/*                                                                           */
  1002. X/*****************************************************************************/
  1003. X
  1004. X/* gap modes occupying mode(x) */
  1005. X#define    NO_MODE        0        /* for error detection: no mode      */
  1006. X#define    EDGE_MODE    1        /* edge-to-edge spacing              */
  1007. X#define    HYPH_MODE    2        /* edge-to-edge with hyphenation     */
  1008. X#define    MARK_MODE    3        /* mark-to-mark spacing              */
  1009. X#define    OVER_MODE    4        /* overstrike spacing                */
  1010. X#define    KERN_MODE    5        /* kerning spacing                   */
  1011. X#define    TAB_MODE    6        /* tabulation spacing                */
  1012. X#define    ADD_HYPH    7        /* temp value used by FillObject     */
  1013. X
  1014. X/* hyph_style(style) options                                                 */
  1015. X#define    HYPH_UNDEF    0        /* hyphenation option undefined      */
  1016. X#define    HYPH_OFF    1        /* hyphenation off                   */
  1017. X#define    HYPH_ON        2        /* hyphenation on                    */
  1018. X
  1019. X/* fill_style(style) options                                                 */
  1020. X#define    FILL_UNDEF    0        /* fill option undefined             */
  1021. X#define    FILL_OFF    1        /* no filling of lines               */
  1022. X#define    FILL_ON        2        /* fill lines with text              */
  1023. X
  1024. X/* display_style(style) options                                              */
  1025. X#define    DISPLAY_UNDEF    0        /* display option undefined          */
  1026. X#define    DISPLAY_ADJUST    1        /* adjust lines (except last)        */
  1027. X#define    DISPLAY_OUTDENT    2        /* outdent lines (except first)      */
  1028. X#define    DISPLAY_LEFT    3        /* left-justify lines, no adjust     */
  1029. X#define    DISPLAY_CENTRE    4        /* centre lines, no adjust           */
  1030. X#define    DISPLAY_RIGHT    5        /* right-justify lines, no adjust    */
  1031. END_OF_FILE
  1032.   if test 46198 -ne `wc -c <'externs.A'`; then
  1033.     echo shar: \"'externs.A'\" unpacked with wrong size!
  1034.   elif test -f 'externs.B' ; then
  1035.     echo shar: Combining  \"'externs'\" \(96127 characters\)
  1036.     cat 'externs.A' 'externs.B' > 'externs'
  1037.     if test 96127 -ne `wc -c <'externs'`; then
  1038.       echo shar: \"'externs'\" combined with wrong size!
  1039.     else
  1040.       rm externs.A externs.B
  1041.     fi
  1042.   fi
  1043.   # end of 'externs.A'
  1044. fi
  1045. if test -f 'include/tab' -a "${1}" != "-c" ; then 
  1046.   echo shar: Will not clobber existing file \"'include/tab'\"
  1047. else
  1048.   echo shar: Extracting \"'include/tab'\" \(25206 characters\)
  1049.   sed "s/^X//" >'include/tab' <<'END_OF_FILE'
  1050. X
  1051. X###############################################################################
  1052. X#                                                                             #
  1053. X#  Lout @Tab package for formatting tables (Version 2.0)                      #
  1054. X#                                                                             #
  1055. X#  Version 1.0 by Jeffrey H. Kingston, September 1991.                        #
  1056. X#  Version 2.0 by Jeffrey H. Kingston, 22 December 1992.                      #
  1057. X#                                                                             #
  1058. X#  See "Tab - A Lout package for formatting tables" for user information.     #
  1059. X#                                                                             #
  1060. X###############################################################################
  1061. X
  1062. X@SysPrependGraphic { tab_prepend }
  1063. X
  1064. Xexport    @CC @RR @Rule @DoubleRule @Line @DoubleLine @NP
  1065. X    @Rowa @Rowb @Rowc @Rowd @Rowe @Rowf @Rowg @Rowh @Rowi @Rowj
  1066. X    @MarkRowa @MarkRowb @MarkRowc @MarkRowd @MarkRowe @MarkRowf 
  1067. X    @MarkRowg @MarkRowh @MarkRowi @MarkRowj 
  1068. X
  1069. Xdef @Tab                 
  1070. X
  1071. X    named above     { no      }
  1072. X    named below     { no      }
  1073. X    named between   { no      }
  1074. X    named side      { no      }
  1075. X    named hmargin   { 0.3c    }
  1076. X    named vmargin   { 0.2v    }
  1077. X    named linewidth { 0.5 pt  }
  1078. X
  1079. X    named @Fmta
  1080. X    named A {} named B {} named C {} named D {} named E {}
  1081. X    named F {} named G {} named H {} named I {} named J {}
  1082. X    named K {} named L {} named M {} named N {} named O {}
  1083. X    named P {} named Q {} named R {} named S {} named T {}
  1084. X    named U {} named V {} named W {} named X {} named Y {}
  1085. X    named Z {}
  1086. X    named "!"     precedence 10 left x named between { dft } right y {}
  1087. X    named "!!"    precedence 10 left x right y {}
  1088. X    named "!!!"   precedence 10 left x right y {}
  1089. X    named "@Over" precedence 11 left x right y { x // y }
  1090. X    named ","     precedence 12 left x right y {}
  1091. X    named @Col    precedence 12        right x {}
  1092. X    named @CC     right x { clines @Break { & x } }
  1093. X    named @RR     right x { rlines @Break { & x } }
  1094. X    {}
  1095. X
  1096. X    named @Fmtb
  1097. X    named A {} named B {} named C {} named D {} named E {}
  1098. X    named F {} named G {} named H {} named I {} named J {}
  1099. X    named K {} named L {} named M {} named N {} named O {}
  1100. X    named P {} named Q {} named R {} named S {} named T {}
  1101. X    named U {} named V {} named W {} named X {} named Y {}
  1102. X    named Z {}
  1103. X    named "!"     precedence 10 left x named between { dft } right y {}
  1104. X    named "!!"    precedence 10 left x right y {}
  1105. X    named "!!!"   precedence 10 left x right y {}
  1106. X    named "@Over" precedence 11 left x right y { x // y }
  1107. X    named ","     precedence 12 left x right y {}
  1108. X    named @Col    precedence 12        right x {}
  1109. X    named @CC     right x { clines @Break { & x } }
  1110. X    named @RR     right x { rlines @Break { & x } }
  1111. X    {}
  1112. X
  1113. X    named @Fmtc
  1114. X    named A {} named B {} named C {} named D {} named E {}
  1115. X    named F {} named G {} named H {} named I {} named J {}
  1116. X    named K {} named L {} named M {} named N {} named O {}
  1117. X    named P {} named Q {} named R {} named S {} named T {}
  1118. X    named U {} named V {} named W {} named X {} named Y {}
  1119. X    named Z {}
  1120. X    named "!"     precedence 10 left x named between { dft } right y {}
  1121. X    named "!!"    precedence 10 left x right y {}
  1122. X    named "!!!"   precedence 10 left x right y {}
  1123. X    named "@Over" precedence 11 left x right y { x // y }
  1124. X    named ","     precedence 12 left x right y {}
  1125. X    named @Col    precedence 12        right x {}
  1126. X    named @CC     right x { clines @Break { & x } }
  1127. X    named @RR     right x { rlines @Break { & x } }
  1128. X    {}
  1129. X
  1130. X    named @Fmtd
  1131. X    named A {} named B {} named C {} named D {} named E {}
  1132. X    named F {} named G {} named H {} named I {} named J {}
  1133. X    named K {} named L {} named M {} named N {} named O {}
  1134. X    named P {} named Q {} named R {} named S {} named T {}
  1135. X    named U {} named V {} named W {} named X {} named Y {}
  1136. X    named Z {}
  1137. X    named "!"     precedence 10 left x named between { dft } right y {}
  1138. X    named "!!"    precedence 10 left x right y {}
  1139. X    named "!!!"   precedence 10 left x right y {}
  1140. X    named "@Over" precedence 11 left x right y { x // y }
  1141. X    named ","     precedence 12 left x right y {}
  1142. X    named @Col    precedence 12        right x {}
  1143. X    named @CC     right x { clines @Break { & x } }
  1144. X    named @RR     right x { rlines @Break { & x } }
  1145. X    {}
  1146. X
  1147. X    named @Fmte
  1148. X    named A {} named B {} named C {} named D {} named E {}
  1149. X    named F {} named G {} named H {} named I {} named J {}
  1150. X    named K {} named L {} named M {} named N {} named O {}
  1151. X    named P {} named Q {} named R {} named S {} named T {}
  1152. X    named U {} named V {} named W {} named X {} named Y {}
  1153. X    named Z {}
  1154. X    named "!"     precedence 10 left x named between { dft } right y {}
  1155. X    named "!!"    precedence 10 left x right y {}
  1156. X    named "!!!"   precedence 10 left x right y {}
  1157. X    named "@Over" precedence 11 left x right y { x // y }
  1158. X    named ","     precedence 12 left x right y {}
  1159. X    named @Col    precedence 12        right x {}
  1160. X    named @CC     right x { clines @Break { & x } }
  1161. X    named @RR     right x { rlines @Break { & x } }
  1162. X    {}
  1163. X
  1164. X    named @Fmtf
  1165. X    named A {} named B {} named C {} named D {} named E {}
  1166. X    named F {} named G {} named H {} named I {} named J {}
  1167. X    named K {} named L {} named M {} named N {} named O {}
  1168. X    named P {} named Q {} named R {} named S {} named T {}
  1169. X    named U {} named V {} named W {} named X {} named Y {}
  1170. X    named Z {}
  1171. X    named "!"     precedence 10 left x named between { dft } right y {}
  1172. X    named "!!"    precedence 10 left x right y {}
  1173. X    named "!!!"   precedence 10 left x right y {}
  1174. X    named "@Over" precedence 11 left x right y { x // y }
  1175. X    named ","     precedence 12 left x right y {}
  1176. X    named @Col    precedence 12        right x {}
  1177. X    named @CC     right x { clines @Break { & x } }
  1178. X    named @RR     right x { rlines @Break { & x } }
  1179. X    {}
  1180. X
  1181. X    named @Fmtg
  1182. X    named A {} named B {} named C {} named D {} named E {}
  1183. X    named F {} named G {} named H {} named I {} named J {}
  1184. X    named K {} named L {} named M {} named N {} named O {}
  1185. X    named P {} named Q {} named R {} named S {} named T {}
  1186. X    named U {} named V {} named W {} named X {} named Y {}
  1187. X    named Z {}
  1188. X    named "!"     precedence 10 left x named between { dft } right y {}
  1189. X    named "!!"    precedence 10 left x right y {}
  1190. X    named "!!!"   precedence 10 left x right y {}
  1191. X    named "@Over" precedence 11 left x right y { x // y }
  1192. X    named ","     precedence 12 left x right y {}
  1193. X    named @Col    precedence 12        right x {}
  1194. X    named @CC     right x { clines @Break { & x } }
  1195. X    named @RR     right x { rlines @Break { & x } }
  1196. X    {}
  1197. X
  1198. X    named @Fmth
  1199. X    named A {} named B {} named C {} named D {} named E {}
  1200. X    named F {} named G {} named H {} named I {} named J {}
  1201. X    named K {} named L {} named M {} named N {} named O {}
  1202. X    named P {} named Q {} named R {} named S {} named T {}
  1203. X    named U {} named V {} named W {} named X {} named Y {}
  1204. X    named Z {}
  1205. X    named "!"     precedence 10 left x named between { dft } right y {}
  1206. X    named "!!"    precedence 10 left x right y {}
  1207. X    named "!!!"   precedence 10 left x right y {}
  1208. X    named "@Over" precedence 11 left x right y { x // y }
  1209. X    named ","     precedence 12 left x right y {}
  1210. X    named @Col    precedence 12        right x {}
  1211. X    named @CC     right x { clines @Break { & x } }
  1212. X    named @RR     right x { rlines @Break { & x } }
  1213. X    {}
  1214. X
  1215. X    named @Fmti
  1216. X    named A {} named B {} named C {} named D {} named E {}
  1217. X    named F {} named G {} named H {} named I {} named J {}
  1218. X    named K {} named L {} named M {} named N {} named O {}
  1219. X    named P {} named Q {} named R {} named S {} named T {}
  1220. X    named U {} named V {} named W {} named X {} named Y {}
  1221. X    named Z {}
  1222. X    named "!"     precedence 10 left x named between { dft } right y {}
  1223. X    named "!!"    precedence 10 left x right y {}
  1224. X    named "!!!"   precedence 10 left x right y {}
  1225. X    named "@Over" precedence 11 left x right y { x // y }
  1226. X    named ","     precedence 12 left x right y {}
  1227. X    named @Col    precedence 12        right x {}
  1228. X    named @CC     right x { clines @Break { & x } }
  1229. X    named @RR     right x { rlines @Break { & x } }
  1230. X    {}
  1231. X
  1232. X    named @Fmtj
  1233. X    named A {} named B {} named C {} named D {} named E {}
  1234. X    named F {} named G {} named H {} named I {} named J {}
  1235. X    named K {} named L {} named M {} named N {} named O {}
  1236. X    named P {} named Q {} named R {} named S {} named T {}
  1237. X    named U {} named V {} named W {} named X {} named Y {}
  1238. X    named Z {}
  1239. X    named "!"     precedence 10 left x named between { dft } right y {}
  1240. X    named "!!"    precedence 10 left x right y {}
  1241. X    named "!!!"   precedence 10 left x right y {}
  1242. X    named "@Over" precedence 11 left x right y { x // y }
  1243. X    named ","     precedence 12 left x right y {}
  1244. X    named @Col    precedence 12        right x {}
  1245. X    named @CC     right x { clines @Break { & x } }
  1246. X    named @RR     right x { rlines @Break { & x } }
  1247. X    {}
  1248. X
  1249. X    body @Body
  1250. X
  1251. X@Begin
  1252. X
  1253. X    macro @NP { /1.1b }
  1254. X
  1255. X    def @CC right x { clines @Break { & x } }
  1256. X    def @RR right x { rlines @Break { & x } }
  1257. X
  1258. X    def @HSingle    { linewidth ltabhs   }
  1259. X    def @HSingleProject    { linewidth ltabhsp  }
  1260. X    def @HDouble    { linewidth ltabhd   }
  1261. X    def @HDoubleBelow    { linewidth ltabhdb  }
  1262. X    def @HDoubleNW    { linewidth ltabhdnw }
  1263. X    def @HDoubleNE    { linewidth ltabhdne }
  1264. X    def @HDoubleSW    { linewidth ltabhdsw }
  1265. X    def @HDoubleSE    { linewidth ltabhdse }
  1266. X    def @VSingle    { linewidth ltabvs   }
  1267. X    def @VDouble    { linewidth ltabvd   }
  1268. X    def @VDoubleRight    { linewidth ltabvdr  }
  1269. X
  1270. X    def @MidHRule
  1271. X    left rule
  1272. X    right x
  1273. X    {
  1274. X    rule @Case
  1275. X    {
  1276. X        no                @Yield { @OneCol x }
  1277. X        { yes single }        @Yield { @HSingle @Graphic x }
  1278. X        { double doubleboxabove }    @Yield { @HDouble @Graphic x }
  1279. X        doubleboxbelow        @Yield { @HDoubleBelow @Graphic x }
  1280. X    }
  1281. X    }
  1282. X
  1283. X    def @LeftHRule
  1284. X    left rule
  1285. X    right x
  1286. X    {
  1287. X    rule @Case
  1288. X    {
  1289. X        no            @Yield { @OneCol x }
  1290. X        { yes single }    @Yield { @HSingleProject @Graphic x }
  1291. X        double        @Yield { @HDouble @Graphic x }
  1292. X        doubleboxabove    @Yield { @HDoubleNW @Graphic x }
  1293. X        doubleboxbelow    @Yield { @HDoubleSW @Graphic x }
  1294. X    }
  1295. X    }
  1296. X
  1297. X    def @RightHRule
  1298. X    left rule
  1299. X    right x
  1300. X    {
  1301. X    rule @Case
  1302. X    {
  1303. X        no            @Yield { @OneCol x }
  1304. X        { yes single }    @Yield { @HSingleProject @Graphic x }
  1305. X        double        @Yield { @HDouble @Graphic x }
  1306. X        doubleboxabove    @Yield { @HDoubleNE @Graphic x }
  1307. X        doubleboxbelow    @Yield { @HDoubleSE @Graphic x }
  1308. X    }
  1309. X    }
  1310. X
  1311. X    def @HSRule
  1312. X    left rule
  1313. X    {
  1314. X    rule @Case
  1315. X    {
  1316. X        no           @Yield {}
  1317. X        { yes single } @Yield { @HSingle @Graphic {} }
  1318. X        double       @Yield { @HDouble @Graphic {} }
  1319. X        doubleboxabove @Yield { @HDouble @Graphic {} }
  1320. X        doubleboxbelow @Yield { @HDoubleBelow @Graphic {} }
  1321. X    }
  1322. X    }
  1323. X
  1324. X    def @ZeroWidth
  1325. X    right x
  1326. X    { @OneCol { |0io x |0io }
  1327. X    }
  1328. X
  1329. X    def @Line
  1330. X    { single @HSRule
  1331. X    }
  1332. X
  1333. X    def @DoubleLine
  1334. X    { double @HSRule
  1335. X    }
  1336. X
  1337. X    def @Rule
  1338. X    {
  1339. X    @OneRow
  1340. X    {
  1341. X        @ZeroWidth @HSingle @Graphic { ^|hmargin }
  1342. X        / @Line /
  1343. X        &1rt @ZeroWidth @HSingle @Graphic { |hmargin }
  1344. X    }
  1345. X    }
  1346. X
  1347. X    def @DoubleRule
  1348. X    {
  1349. X    @OneRow
  1350. X    {
  1351. X        @ZeroWidth @HDouble @Graphic { ^|hmargin }
  1352. X        / @DoubleLine /
  1353. X        &1rt @ZeroWidth @HDouble @Graphic { |hmargin }
  1354. X    }
  1355. X    }
  1356. X
  1357. X    def @VRule
  1358. X    left rule
  1359. X    right x
  1360. X    {
  1361. X    rule @Case
  1362. X    {
  1363. X        no           @Yield {}
  1364. X        { yes single } @Yield @OneRow { /0io @VSingle @Graphic x /0io }
  1365. X        double       @Yield @OneRow { /0io @VDouble @Graphic x /0io }
  1366. X    }
  1367. X    }
  1368. X
  1369. X    def @VRuleRight
  1370. X    left rule
  1371. X    right x
  1372. X    {
  1373. X    rule @Case
  1374. X    {
  1375. X        no         @Yield {}
  1376. X        {yes single} @Yield @OneRow { /0io @VSingle @Graphic x /0io }
  1377. X        double     @Yield @OneRow { /0io @VDoubleRight @Graphic x /0io }
  1378. X    }
  1379. X    }
  1380. X
  1381. X    def @VSRule
  1382. X    left rule
  1383. X    {
  1384. X    rule @Case
  1385. X    {
  1386. X        no           @Yield {}
  1387. X        { yes single } @Yield { @VSingle @Graphic {} }
  1388. X        double       @Yield { @VDouble @Graphic {} }
  1389. X    }
  1390. X    }
  1391. X
  1392. X    def @VSRuleRight
  1393. X    left rule
  1394. X    {
  1395. X    rule @Case
  1396. X    {
  1397. X        no         @Yield {}
  1398. X        {yes single} @Yield { @VSingle @Graphic {} }
  1399. X        double     @Yield { @VDoubleRight @Graphic {} }
  1400. X    }
  1401. X    }
  1402. X
  1403. X    def @Wrap
  1404. X    named ur { no }            # Rule up above entry
  1405. X    named dr { no }            # Rule down below entry
  1406. X    named vm { vmargin }        # Vertical margin
  1407. X    right x                # The object to be wrapped
  1408. X    {
  1409. X          ur @HSRule
  1410. X    ^/vm  @OneCol @OneRow x
  1411. X     /vm  dr @HSRule
  1412. X    }
  1413. X
  1414. X    def @Sep
  1415. X    left x
  1416. X    named ur { no }            # Rule up above entry
  1417. X    named dr { no }            # Rule down below entry
  1418. X    named sr { no }            # Rule separating x from y
  1419. X    named hm { hmargin }        # Horizontal margin
  1420. X    named vm { vmargin }        # Vertical margin
  1421. X    right y
  1422. X    {
  1423. X    def vr
  1424. X    {
  1425. X        sr @Case
  1426. X        {    dft    @Yield between 
  1427. X        else    @Yield sr
  1428. X        }
  1429. X    }
  1430. X
  1431. X    x | @OneCol
  1432. X    {      ur @MidHRule {|hm}
  1433. X      /vm
  1434. X      /vm  dr @MidHRule {|hm}
  1435. X    }
  1436. X    | @OneCol
  1437. X    {      vr @VRule { /vm }  |  ur @MidHRule {|hm}
  1438. X      /vm  vr @VSRule         |
  1439. X      /vm  vr @VRule {^/vm }  |  dr @MidHRule {|hm}
  1440. X    }
  1441. X    | y
  1442. X    }
  1443. X
  1444. X    def @NSep
  1445. X    left x
  1446. X    named hm { hmargin }
  1447. X    right y
  1448. X    {
  1449. X    x | @OneCol { |hm } | @OneCol { |hm } | y
  1450. X    }
  1451. X
  1452. X    def @LeftEdge
  1453. X    named ur { no }            # Rule up above entry
  1454. X    named dr { no }            # Rule down below entry
  1455. X    named sr { no }            # Rule separating x from y
  1456. X    named hm { hmargin }        # Horizontal margin
  1457. X    named vm { vmargin }        # Vertical margin
  1458. X    right x
  1459. X    {
  1460. X    sr @Case
  1461. X    {
  1462. X        no @Yield { x }
  1463. X        else @Yield
  1464. X        { @OneCol
  1465. X          {
  1466. X              sr @VRule { /vm }     |  ur @LeftHRule { |hm }
  1467. X             ^/vm sr @VSRule     |
  1468. X          /vm sr @VRule { ^/vm } |  dr @LeftHRule { |hm }
  1469. X          }
  1470. X          | x
  1471. X        }
  1472. X    }
  1473. X    }
  1474. X
  1475. X    def @RightEdge
  1476. X    left x
  1477. X    named ur { no }            # Rule up above entry
  1478. X    named dr { no }            # Rule down below entry
  1479. X    named sr { no }            # Rule separating x from y
  1480. X    named hm { hmargin }        # Horizontal margin
  1481. X    named vm { vmargin }        # Vertical margin
  1482. X    {
  1483. X    sr @Case
  1484. X    {
  1485. X        no @Yield { x }
  1486. X        else @Yield
  1487. X        {
  1488. X          x | @OneCol
  1489. X          {
  1490. X            ur @RightHRule { |hm }
  1491. X        /vm
  1492. X        /vm dr @RightHRule { |hm }
  1493. X          }
  1494. X          | @OneCol
  1495. X          {
  1496. X             sr @VRuleRight { /vm }
  1497. X        /vm  sr @VSRuleRight
  1498. X        /vm  sr @VRuleRight { ^/vm }
  1499. X          }
  1500. X        }
  1501. X    }
  1502. X    }
  1503. X
  1504. X    def @DoRowa
  1505. X    named A {} named B {} named C {} named D {} named E {}
  1506. X    named F {} named G {} named H {} named I {} named J {}
  1507. X    named K {} named L {} named M {} named N {} named O {}
  1508. X    named P {} named Q {} named R {} named S {} named T {}
  1509. X    named U {} named V {} named W {} named X {} named Y {}
  1510. X    named Z {}
  1511. X    named above    { above   }
  1512. X    named below    { below   }
  1513. X    named side     { side    }
  1514. X    named vmargin   { vmargin }
  1515. X    {
  1516. X    @LeftEdge ur { above } dr { below } sr { side } vm { vmargin }
  1517. X    @Fmta
  1518. X      A { A }  B { B }  C { C }  D { D }  E { E }
  1519. X      F { F }  G { G }  H { H }  I { I }  J { J }
  1520. X      K { K }  L { L }  M { M }  N { N }  O { O }
  1521. X      P { P }  Q { Q }  R { R }  S { S }  T { T }
  1522. X      U { U }  V { V }  W { W }  X { X }  Y { Y }
  1523. X      Z { Z }
  1524. X      @Col { @Wrap ur {above} dr {below} vm {vmargin} x}
  1525. X      !    { x @Sep ur {above} dr {below} sr { between } vm {vmargin} y}
  1526. X      !!   { x @Sep ur {above} dr {below} sr { single  } vm {vmargin} y}
  1527. X      !!!  { x @Sep ur {above} dr {below} sr { double  } vm {vmargin} y}
  1528. X      ,    { x @NSep y }
  1529. X    @RightEdge ur { above } dr { below } sr { side } vm { vmargin }
  1530. X    }
  1531. X
  1532. X    def @DoRowb
  1533. X    named A {} named B {} named C {} named D {} named E {}
  1534. X    named F {} named G {} named H {} named I {} named J {}
  1535. X    named K {} named L {} named M {} named N {} named O {}
  1536. X    named P {} named Q {} named R {} named S {} named T {}
  1537. X    named U {} named V {} named W {} named X {} named Y {}
  1538. X    named Z {}
  1539. X    named above    { above   }
  1540. X    named below    { below   }
  1541. X    named side     { side    }
  1542. X    named vmargin   { vmargin }
  1543. X    {
  1544. X    @LeftEdge ur { above } dr { below } sr { side } vm { vmargin }
  1545. X    @Fmtb
  1546. X      A { A }  B { B }  C { C }  D { D }  E { E }
  1547. X      F { F }  G { G }  H { H }  I { I }  J { J }
  1548. X      K { K }  L { L }  M { M }  N { N }  O { O }
  1549. X      P { P }  Q { Q }  R { R }  S { S }  T { T }
  1550. X      U { U }  V { V }  W { W }  X { X }  Y { Y }
  1551. X      Z { Z }
  1552. X      @Col { @Wrap ur {above} dr {below} vm {vmargin} x}
  1553. X      !    { x @Sep ur {above} dr {below} sr { between } vm {vmargin} y}
  1554. X      !!   { x @Sep ur {above} dr {below} sr { single  } vm {vmargin} y}
  1555. X      !!!  { x @Sep ur {above} dr {below} sr { double  } vm {vmargin} y}
  1556. X      ,    { x @NSep y }
  1557. X    @RightEdge ur { above } dr { below } sr { side } vm { vmargin }
  1558. X    }
  1559. X
  1560. X    def @DoRowc
  1561. X    named A {} named B {} named C {} named D {} named E {}
  1562. X    named F {} named G {} named H {} named I {} named J {}
  1563. X    named K {} named L {} named M {} named N {} named O {}
  1564. X    named P {} named Q {} named R {} named S {} named T {}
  1565. X    named U {} named V {} named W {} named X {} named Y {}
  1566. X    named Z {}
  1567. X    named above    { above   }
  1568. X    named below    { below   }
  1569. X    named side     { side    }
  1570. X    named vmargin   { vmargin }
  1571. X    {
  1572. X    @LeftEdge ur { above } dr { below } sr { side } vm { vmargin }
  1573. X    @Fmtc
  1574. X      A { A }  B { B }  C { C }  D { D }  E { E }
  1575. X      F { F }  G { G }  H { H }  I { I }  J { J }
  1576. X      K { K }  L { L }  M { M }  N { N }  O { O }
  1577. X      P { P }  Q { Q }  R { R }  S { S }  T { T }
  1578. X      U { U }  V { V }  W { W }  X { X }  Y { Y }
  1579. X      Z { Z }
  1580. X      @Col { @Wrap ur {above} dr {below} vm {vmargin} x}
  1581. X      !    { x @Sep ur {above} dr {below} sr { between } vm {vmargin} y}
  1582. X      !!   { x @Sep ur {above} dr {below} sr { single  } vm {vmargin} y}
  1583. X      !!!  { x @Sep ur {above} dr {below} sr { double  } vm {vmargin} y}
  1584. X      ,    { x @NSep y }
  1585. X    @RightEdge ur { above } dr { below } sr { side } vm { vmargin }
  1586. X    }
  1587. X
  1588. X    def @DoRowd
  1589. X    named A {} named B {} named C {} named D {} named E {}
  1590. X    named F {} named G {} named H {} named I {} named J {}
  1591. X    named K {} named L {} named M {} named N {} named O {}
  1592. X    named P {} named Q {} named R {} named S {} named T {}
  1593. X    named U {} named V {} named W {} named X {} named Y {}
  1594. X    named Z {}
  1595. X    named above    { above   }
  1596. X    named below    { below   }
  1597. X    named side     { side    }
  1598. X    named vmargin   { vmargin }
  1599. X    {
  1600. X    @LeftEdge ur { above } dr { below } sr { side } vm { vmargin }
  1601. X    @Fmtd
  1602. X      A { A }  B { B }  C { C }  D { D }  E { E }
  1603. X      F { F }  G { G }  H { H }  I { I }  J { J }
  1604. X      K { K }  L { L }  M { M }  N { N }  O { O }
  1605. X      P { P }  Q { Q }  R { R }  S { S }  T { T }
  1606. X      U { U }  V { V }  W { W }  X { X }  Y { Y }
  1607. X      Z { Z }
  1608. X      @Col { @Wrap ur {above} dr {below} vm {vmargin} x}
  1609. X      !    { x @Sep ur {above} dr {below} sr { between } vm {vmargin} y}
  1610. X      !!   { x @Sep ur {above} dr {below} sr { single  } vm {vmargin} y}
  1611. X      !!!  { x @Sep ur {above} dr {below} sr { double  } vm {vmargin} y}
  1612. X      ,    { x @NSep y }
  1613. X    @RightEdge ur { above } dr { below } sr { side } vm { vmargin }
  1614. X    }
  1615. X
  1616. X    def @DoRowe
  1617. X    named A {} named B {} named C {} named D {} named E {}
  1618. X    named F {} named G {} named H {} named I {} named J {}
  1619. X    named K {} named L {} named M {} named N {} named O {}
  1620. X    named P {} named Q {} named R {} named S {} named T {}
  1621. X    named U {} named V {} named W {} named X {} named Y {}
  1622. X    named Z {}
  1623. X    named above    { above   }
  1624. X    named below    { below   }
  1625. X    named side     { side    }
  1626. X    named vmargin   { vmargin }
  1627. X    {
  1628. X    @LeftEdge ur { above } dr { below } sr { side } vm { vmargin }
  1629. X    @Fmte
  1630. X      A { A }  B { B }  C { C }  D { D }  E { E }
  1631. X      F { F }  G { G }  H { H }  I { I }  J { J }
  1632. X      K { K }  L { L }  M { M }  N { N }  O { O }
  1633. X      P { P }  Q { Q }  R { R }  S { S }  T { T }
  1634. X      U { U }  V { V }  W { W }  X { X }  Y { Y }
  1635. X      Z { Z }
  1636. X      @Col { @Wrap ur {above} dr {below} vm {vmargin} x}
  1637. X      !    { x @Sep ur {above} dr {below} sr { between } vm {vmargin} y}
  1638. X      !!   { x @Sep ur {above} dr {below} sr { single  } vm {vmargin} y}
  1639. X      !!!  { x @Sep ur {above} dr {below} sr { double  } vm {vmargin} y}
  1640. X      ,    { x @NSep y }
  1641. X    @RightEdge ur { above } dr { below } sr { side } vm { vmargin }
  1642. X    }
  1643. X
  1644. X    def @DoRowf
  1645. X    named A {} named B {} named C {} named D {} named E {}
  1646. X    named F {} named G {} named H {} named I {} named J {}
  1647. X    named K {} named L {} named M {} named N {} named O {}
  1648. X    named P {} named Q {} named R {} named S {} named T {}
  1649. X    named U {} named V {} named W {} named X {} named Y {}
  1650. X    named Z {}
  1651. X    named above    { above   }
  1652. X    named below    { below   }
  1653. X    named side     { side    }
  1654. X    named vmargin   { vmargin }
  1655. X    {
  1656. X    @LeftEdge ur { above } dr { below } sr { side } vm { vmargin }
  1657. X    @Fmtf
  1658. X      A { A }  B { B }  C { C }  D { D }  E { E }
  1659. X      F { F }  G { G }  H { H }  I { I }  J { J }
  1660. X      K { K }  L { L }  M { M }  N { N }  O { O }
  1661. X      P { P }  Q { Q }  R { R }  S { S }  T { T }
  1662. X      U { U }  V { V }  W { W }  X { X }  Y { Y }
  1663. X      Z { Z }
  1664. X      @Col { @Wrap ur {above} dr {below} vm {vmargin} x}
  1665. X      !    { x @Sep ur {above} dr {below} sr { between } vm {vmargin} y}
  1666. X      !!   { x @Sep ur {above} dr {below} sr { single  } vm {vmargin} y}
  1667. X      !!!  { x @Sep ur {above} dr {below} sr { double  } vm {vmargin} y}
  1668. X      ,    { x @NSep y }
  1669. X    @RightEdge ur { above } dr { below } sr { side } vm { vmargin }
  1670. X    }
  1671. X
  1672. X    def @DoRowg
  1673. X    named A {} named B {} named C {} named D {} named E {}
  1674. X    named F {} named G {} named H {} named I {} named J {}
  1675. X    named K {} named L {} named M {} named N {} named O {}
  1676. X    named P {} named Q {} named R {} named S {} named T {}
  1677. X    named U {} named V {} named W {} named X {} named Y {}
  1678. X    named Z {}
  1679. X    named above    { above   }
  1680. X    named below    { below   }
  1681. X    named side     { side    }
  1682. X    named vmargin   { vmargin }
  1683. X    {
  1684. X    @LeftEdge ur { above } dr { below } sr { side } vm { vmargin }
  1685. X    @Fmtg
  1686. X      A { A }  B { B }  C { C }  D { D }  E { E }
  1687. X      F { F }  G { G }  H { H }  I { I }  J { J }
  1688. X      K { K }  L { L }  M { M }  N { N }  O { O }
  1689. X      P { P }  Q { Q }  R { R }  S { S }  T { T }
  1690. X      U { U }  V { V }  W { W }  X { X }  Y { Y }
  1691. X      Z { Z }
  1692. X      @Col { @Wrap ur {above} dr {below} vm {vmargin} x}
  1693. X      !    { x @Sep ur {above} dr {below} sr { between } vm {vmargin} y}
  1694. X      !!   { x @Sep ur {above} dr {below} sr { single  } vm {vmargin} y}
  1695. X      !!!  { x @Sep ur {above} dr {below} sr { double  } vm {vmargin} y}
  1696. X      ,    { x @NSep y }
  1697. X    @RightEdge ur { above } dr { below } sr { side } vm { vmargin }
  1698. X    }
  1699. X
  1700. X    def @DoRowh
  1701. X    named A {} named B {} named C {} named D {} named E {}
  1702. X    named F {} named G {} named H {} named I {} named J {}
  1703. X    named K {} named L {} named M {} named N {} named O {}
  1704. X    named P {} named Q {} named R {} named S {} named T {}
  1705. X    named U {} named V {} named W {} named X {} named Y {}
  1706. X    named Z {}
  1707. X    named above    { above   }
  1708. X    named below    { below   }
  1709. X    named side     { side    }
  1710. X    named vmargin   { vmargin }
  1711. X    {
  1712. X    @LeftEdge ur { above } dr { below } sr { side } vm { vmargin }
  1713. X    @Fmth
  1714. X      A { A }  B { B }  C { C }  D { D }  E { E }
  1715. X      F { F }  G { G }  H { H }  I { I }  J { J }
  1716. X      K { K }  L { L }  M { M }  N { N }  O { O }
  1717. X      P { P }  Q { Q }  R { R }  S { S }  T { T }
  1718. X      U { U }  V { V }  W { W }  X { X }  Y { Y }
  1719. X      Z { Z }
  1720. X      @Col { @Wrap ur {above} dr {below} vm {vmargin} x}
  1721. X      !    { x @Sep ur {above} dr {below} sr { between } vm {vmargin} y}
  1722. X      !!   { x @Sep ur {above} dr {below} sr { single  } vm {vmargin} y}
  1723. X      !!!  { x @Sep ur {above} dr {below} sr { double  } vm {vmargin} y}
  1724. X      ,    { x @NSep y }
  1725. X    @RightEdge ur { above } dr { below } sr { side } vm { vmargin }
  1726. X    }
  1727. X
  1728. X    def @DoRowi
  1729. X    named A {} named B {} named C {} named D {} named E {}
  1730. X    named F {} named G {} named H {} named I {} named J {}
  1731. X    named K {} named L {} named M {} named N {} named O {}
  1732. X    named P {} named Q {} named R {} named S {} named T {}
  1733. X    named U {} named V {} named W {} named X {} named Y {}
  1734. X    named Z {}
  1735. X    named above    { above   }
  1736. X    named below    { below   }
  1737. X    named side     { side    }
  1738. X    named vmargin   { vmargin }
  1739. X    {
  1740. X    @LeftEdge ur { above } dr { below } sr { side } vm { vmargin }
  1741. X    @Fmti
  1742. X      A { A }  B { B }  C { C }  D { D }  E { E }
  1743. X      F { F }  G { G }  H { H }  I { I }  J { J }
  1744. X      K { K }  L { L }  M { M }  N { N }  O { O }
  1745. X      P { P }  Q { Q }  R { R }  S { S }  T { T }
  1746. X      U { U }  V { V }  W { W }  X { X }  Y { Y }
  1747. X      Z { Z }
  1748. X      @Col { @Wrap ur {above} dr {below} vm {vmargin} x}
  1749. X      !    { x @Sep ur {above} dr {below} sr { between } vm {vmargin} y}
  1750. X      !!   { x @Sep ur {above} dr {below} sr { single  } vm {vmargin} y}
  1751. X      !!!  { x @Sep ur {above} dr {below} sr { double  } vm {vmargin} y}
  1752. X      ,    { x @NSep y }
  1753. X    @RightEdge ur { above } dr { below } sr { side } vm { vmargin }
  1754. X    }
  1755. X
  1756. X    def @DoRowj
  1757. X    named A {} named B {} named C {} named D {} named E {}
  1758. X    named F {} named G {} named H {} named I {} named J {}
  1759. X    named K {} named L {} named M {} named N {} named O {}
  1760. X    named P {} named Q {} named R {} named S {} named T {}
  1761. X    named U {} named V {} named W {} named X {} named Y {}
  1762. X    named Z {}
  1763. X    named above    { above   }
  1764. X    named below    { below   }
  1765. X    named side     { side    }
  1766. X    named vmargin   { vmargin }
  1767. X    {
  1768. X    @LeftEdge ur { above } dr { below } sr { side } vm { vmargin }
  1769. X    @Fmtj
  1770. X      A { A }  B { B }  C { C }  D { D }  E { E }
  1771. X      F { F }  G { G }  H { H }  I { I }  J { J }
  1772. X      K { K }  L { L }  M { M }  N { N }  O { O }
  1773. X      P { P }  Q { Q }  R { R }  S { S }  T { T }
  1774. X      U { U }  V { V }  W { W }  X { X }  Y { Y }
  1775. X      Z { Z }
  1776. X      @Col { @Wrap ur {above} dr {below} vm {vmargin} x}
  1777. X      !    { x @Sep ur {above} dr {below} sr { between } vm {vmargin} y}
  1778. X      !!   { x @Sep ur {above} dr {below} sr { single  } vm {vmargin} y}
  1779. X      !!!  { x @Sep ur {above} dr {below} sr { double  } vm {vmargin} y}
  1780. X      ,    { x @NSep y }
  1781. X    @RightEdge ur { above } dr { below } sr { side } vm { vmargin }
  1782. X    }
  1783. X
  1784. X    macro @Rowa { / @DoRowa }
  1785. X    macro @Rowb { / @DoRowb }
  1786. X    macro @Rowc { / @DoRowc }
  1787. X    macro @Rowd { / @DoRowd }
  1788. X    macro @Rowe { / @DoRowe }
  1789. X    macro @Rowf { / @DoRowf }
  1790. X    macro @Rowg { / @DoRowg }
  1791. X    macro @Rowh { / @DoRowh }
  1792. X    macro @Rowi { / @DoRowi }
  1793. X    macro @Rowj { / @DoRowj }
  1794. X
  1795. X    macro @MarkRowa { ^/ @DoRowa }
  1796. X    macro @MarkRowb { ^/ @DoRowb }
  1797. X    macro @MarkRowc { ^/ @DoRowc }
  1798. X    macro @MarkRowd { ^/ @DoRowd }
  1799. X    macro @MarkRowe { ^/ @DoRowe }
  1800. X    macro @MarkRowf { ^/ @DoRowf }
  1801. X    macro @MarkRowg { ^/ @DoRowg }
  1802. X    macro @MarkRowh { ^/ @DoRowh }
  1803. X    macro @MarkRowi { ^/ @DoRowi }
  1804. X    macro @MarkRowj { ^/ @DoRowj }
  1805. X
  1806. X
  1807. X    @Body
  1808. X
  1809. X@End @Tab
  1810. END_OF_FILE
  1811.   if test 25206 -ne `wc -c <'include/tab'`; then
  1812.     echo shar: \"'include/tab'\" unpacked with wrong size!
  1813.   fi
  1814.   # end of 'include/tab'
  1815. fi
  1816. echo shar: End of archive 4 \(of 35\).
  1817. cp /dev/null ark4isdone
  1818. MISSING=""
  1819. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 ; do
  1820.     if test ! -f ark${I}isdone ; then
  1821.     MISSING="${MISSING} ${I}"
  1822.     fi
  1823. done
  1824. if test "${MISSING}" = "" ; then
  1825.     echo You have unpacked all 35 archives.
  1826.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1827. else
  1828.     echo You still must unpack the following archives:
  1829.     echo "        " ${MISSING}
  1830. fi
  1831. exit 0
  1832. exit 0 # Just in case...
  1833.