perm filename PUBDFS.SAI[2,TES]5 blob sn#073670 filedate 1973-11-20 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00018 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00003 00002	REQUIRE "VERSION.SAI" SOURCE_FILE
C00007 00003	COMMENT  To  avoid  calling  POINT  to  generate  byte  pointers, we use
C00012 00004	COMMENT The  symbol  table  method  is  hashed  strings  using quadratic
C00017 00005	COMMENT  Symbol Type → IX array conversion 
C00021 00006	COMMENT Fields of Entries in ISTK 
C00026 00007		MACROWDS = "4", RESPWDS  = "7", SIGWDS = "9",
C00031 00008		COMMENT
C00034 00009	COMMENT A record of each active frame and area is  kept  in  a  dynamically
C00038 00010	COMMENT An Area Record is an integer array symbolized THISAREA[0:AREC] -- 
C00041 00011	COMMENT These "mode words" are BLT'ed to ISTK upon block entry 
C00045 00012	COMMENT These are for scanners
C00050 00013	COMMENT Run-of-mill defines
C00052 00014	TERNAL SAFE INTEGER ARRAY
C00055 00015	DEFINE DSCR="COMMENT "
C00057 00016	TERNAL INTEGER
C00063 00017		UPCAS3, UPCAS5, UPCAS6, comment, byte pointers for CAPITALIZE,STRLSS
C00068 00018	TERNAL INTEGER XMAXIM, COMMENT LDX LINE WIDTH
C00071 ENDMK
C⊗;
REQUIRE "VERSION.SAI" SOURCE_FILE;
DEFINE		NB = "COMMENT", TES = "COMMENT", RKJ = "COMMENT", CMU = "COMMENT",
		PLK = "COMMENT",

	INITSIZES = "ISIZE←1000; SSIZE←200; ITSIZE←200; STSIZE←300; SIZE←100",
	REGULAR_SIZE = "1021", COMMENT Must be a prime ;
	BIG_SIZE = "2999",
	HUGE_SIZE = "8191", COMMENT can't exceed 2↑13-1 ;

COMMENT All the output lines tentatively placed in the current frame are
        stored in .PUI files and referenced by  sequential  number  from
        the integer array OWLS (OWtput LineS).  Its length is sufficient
        to hold every line of every column of every area in  it.     The
        general   form   of   a   string   referenced   from   OWLS  is:
        {<chars><cr>}...<lf> .   One of the <chars> (the last) may be  a
        line  that needs to be justified in Pass Two. Each word break in
        such a substring is represented by a  '13  (vert-tab)  --  these
        mark  the  places that extra spaces may be added.  Pass Two also
        needs to know about FONT changes -- in the present version, this
        is limited to underlining, superscripts, and subscripts.  A FONT
        change is signalled by the character pair '177 <code>.  Finally,
        Pass Two will fill in forward references marked ALTMODE.

        Other information must be known about each string in OWLS. There
        must  be  an  indication  of  how  many  spaces  to  add  to   a
        justify-line  during  Pass  Two,  and  there  must  be  mobility
        restrictions to  assure  that  groups  stay  together  and  that
        section  titles stay at tops of pages.  This information is kept
        in an integer array MOLES (MObility of LinES) of the  same  size
        as  OWLS.   MOLES[J]  is  the descriptor for OWLS[J].  To access
        these entries,  the  value  J  is  stored  in  an  "area  array"
        associated  with  the  area  the  line was placed in, at element
        [C,L] for the C'th column and L'th line.

	A Moles descriptor looks like this:

	 --------------------------------------------------
	|       |        |L|H|L|R|A|B|              |      |
	|       |        |O|O|E|I|B|E|              |      |
	| SHORT |  FOOT  |C|R|F|G|O|L|    LABEL     | LEAD |
	|       |        |K|I|T|H|V|O|              |      |
	|       |        | |Z| |T|E|W|              |      |
	 --------------------------------------------------
	 0.....6 7.....11-2-3-4-5-6-7-18..........31 32..35 ;
COMMENT  To  avoid  calling  POINT  to  generate  byte  pointers, we use
        Swinehart's BBPP and our own BP.  BBPP(N,GLOBAL,N) is like POINT
        but usually   it  will  compile  constants  instead of procedure
        calls.  BP is a macro which creates a byte pointer as the sum of
        a  constant  and  two  variables  or  expressions.   Instead  of
        POINT(6,ARR[J+4],35), say:  BP(6,ARRIDA,J,+4,35).    The  first,
        fourth,  and  fifth  arguments  will  be  ROTed and LORed into a
        constant at compile time, and the second and third will be added
        to  it  at execution time.  Be sure that ARRIDA points to ARR[0]
        at all times, and that the fourth argument either is  absent  or
	is a signed integer. ;

	BP(S,A0,J,SIGNED_CONSTANT,P) = "(((35-(P)) ROT 6 LOR S) ROT 24 SIGNED_CONSTANT) +
	(A0) + (J)",

	    H1(WD) = "POINT(18,WD,17)", COMMENT, POINT can make constant byte pointers;
	    H2(WD) = "POINT(18,WD,35)",
	    Q1(WD) = "POINT(9,WD,8)",
	    Q2(WD) = "POINT(9,WD,17)",
	    Q3(WD) = "POINT(9,WD,26)",
	    Q4(WD) = "POINT(9,WD,35)",

COMMENT  Fields of MOLES ;

	SHORTM(J) = "BP(7,MOLESIDA,""J"",,6)", COMMENT, How far short of the right
            margin ADJUST line is;
	FOOTM(J) = "BP(5, MOLESIDA,""J"",, 11)", COMMENT,
            If  this  line has footnotes, then this field is nonzero and
            matches the value in the corresponding  field  of  the  last
            line of its last footnote (a value of 31 means that footnote
            ends in a subsequent column);
	LOCKM(J) = "BP(1,MOLESIDA,""J"",,12)", COMMENT, This line can not be moved;
	HORIZM(J) = "BP(1,MOLESIDA,""J"",,13)", COMMENT, Only move to same line no. in another column;
	LEFTM(J) = "BP(1,MOLESIDA,""J"",,14)", COMMENT, If moved, also move line on my left;
	RIGHTM(J) = "BP(1,MOLESIDA,""J"",,15)", COMMENT, ... also line on my right;
	ABOVEM(J) = "BP(1,MOLESIDA,""J"",,16)", COMMENT, ... also line above me;
	BELOWM(J) = "BP(1,MOLESIDA,""J"",,17)", COMMENT, ... also line below me;
		ABV = "'2000000", BLW="'1000000", ABV_BLW="'3000000",
	LABELM(J) = "BP(14,MOLESIDA,""J"",,31)", COMMENT,
	    Position in ITBL of head of L.L. of page labels of this line;
        LEADM(J) = "BP(4,MOLESIDA,""J"",,35)", COMMENT, Number of lead lines to  assure  if
            moved  --  this is necessary because blank lines that happen
            to show up at the top of a column are deleted,  but  if  the
            paragraph they lead is moved down, they must be restored;

COMMENT The last subscript used in MOLES and OWLS is stored in MOLES[0];
COMMENT The  symbol  table  method  is  hashed  strings  using quadratic
        search. Swinehart's "SYMSER.SAI[1,DCS]"  has  been  used.   That
        package  declares two arrays [-1:SYMNO], where SYMNO+1 is prime.
        One array, SYM, holds the strings, and the other, NUMBER,  holds
        their   descriptors.    The  procedure  SETSYM  initializes  the
        package.  FLAG←LOOKSYM(STRING A) tells whether the string is  in
        the table and sets SYMBOL to its index (or the index of where to
        enter it if not there).  ENTERSYM(STRING A, INTEGER NUM)  enters
        it  in  the table at SYMBOL and makes its descriptor be NUM (and
        sets ERRFLAG to TRUE and prints a message if the table is full).

        The compiler requires that all symbols be unique  at  any  block
        level,  however,  labels  are  totally  global and although each
        label must have a different name from every other label, it  may
        have  the  same  name  as  another whatsit.  Therefore, before a
        label is looked up or entered in the symbol table,  a  colon  is
        appended to its name to guarantee its distinction.  Furthermore,
        all lower case letters of every identifier are changed to  upper
        case for symbol table purposes.

	The fields of a descriptor D = NUMBER[SYMBOL] are:
	 --------------------------------------------
	| DEPTH |    SYMBOL    | TYPE |      IX      |
	 --------------------------------------------
	 0.....4 5...........17 18..21 22..........35 ;

	DEPTHWD(DESC) = "POINT(5,DESC,4)", COMMENT, the block depth;
	DEPTHN(S) = "BP(5,NUMBIDA,""S"",+1,4)",
	SYMBOLWD(DESC) = "POINT(13,DESC,17)",
	SYMBOLN(S) = "BP(13,NUMBIDA,""S"",+1,17)", COMMENT,  This field always equals
            s, its subscript in NUMBER.   When a local  declaration  in  an
            inner  block  forces  an  outer  definition to be stacked, this
            field of the descriptor tells where to restore it;
	TYPEWD(DESC) = "POINT(4,DESC,21)",
	TYPEN(S) = "BP(4,NUMBIDA,""S"",+1,21)", COMMENT, The symbol type (listed below);
	IXWD(DESC) = "POINT(14,DESC,35)", COMMENT, depending on TYPE, this may be a
            case index or a 14-bit pointer to the definition in some array;
	IXN(S) = "BP(14,NUMBIDA,""S"",+1,35)",

COMMENT The descriptor of a label, however, is:
	 ---------------------------------------
	| PLIGHT | zeroes or ones |     IX      |
	 ---------------------------------------
	   0..1    2 ......... 21   22 ..... 35 ;

	PLIGHTWD(DESC) = "POINT(2, DESC, 1)", COMMENT,
		1: Referenced but not yet defined. IX is the NUMBER posn of the mentioned Unit (or 0).
		2: Defined as the string in STBL[IX].
		0|3: Defined as a page label, but the exact page is still uncertain--
			DESC is a link to another label in the same plight:
			>0--ITBL[DESC], <0--NUMBER[-DESC], =-(2↑13)--end L.L. ;
COMMENT  Symbol Type → IX array conversion ;

		COMMENT			Type		IX points to
					----		------------	;
	GLOBALTYPE="1",  COMMENT,   Global Variable	    STBL	;
	LOCALTYPE="2",   COMMENT,   Local Variable          SSTK	;
	INTERNTYPE="3",  COMMENT,   Internal Variable       none     (this is a case index);
	MANTYPE="6",     COMMENT,   MANUS Command Word	    none     (this is a case index);
	PORTYPE="10",    COMMENT,   Portion		    ITBL	;
	PUNITTYPE="11",  COMMENT,   Print Value of Unit     ISTK (same IX as Counter Value) ;
	AREATYPE="12",   COMMENT,   Area		    ISTK	;
	UNITTYPE="13",   COMMENT,   Unit		    ISTK	;
	MACROTYPE="14",  COMMENT,   Macro		    ISTK	;

COMMENT  Now the STKs, TBLs, and NESTs will be introduced.

ISTK....

	In ISTK are stored:
		(a) Modes and Variable Values to be restored upon block exit.
		(b) AREA, UNIT, MACRO, and Response Declarations local to this block.
		(c) Former margin positions in a NARROW/WIDEN nest.
	To push an m-word entry of type T onto ISTK, increment IHED by (m+1),
		check for stack  overflow, and put the following descriptor
		at ISTK(IHED):

		 ---------------------------------------
		| T | SYM subscript | old value of IHED |
		 ---------------------------------------
		0..8 9............21 22...............35

	Now store the entries at IHED-1 to IHED-m.  The header word at IHED is the
	one that IX points to. Note that it is in a linked list which is scanned at
	block exit to restore former conditions.

	The types T are as follows:	;
	COMMENT AREATYPE = "12", COMMENT, Local Area Declaration;
	COMMENT UNITTYPE = "13", COMMENT, Local Unit Declaration;
	COMMENT MACROTYPE = "14", COMMENT, Local Macro Declaration;
		RESPTYPE = "15", COMMENT, Local Response Declaration;
		MARGTYPE = "16", COMMENT, Former margin positions in a NARROW//WIDEN Nest;
		TURNTYPE = "17", COMMENT, Former <chars><function> pair;
		MODETYPE = "18", COMMENT, Mode Words before block entry;
		NUMTYPE = "19", COMMENT, Former NUMBER descriptor;
		TABTYPE = "20", COMMENT, tab stops ;
		MIDTYPE = "21", COMMENT, saved paragraph params for BEFORE|AFTER|footnotes in mid-pgph ;
		FONTYPE = "22", COMMENT, Former font settings TES 11/15/73;

	IXTYPE(ANYIX) = "(ISTK[ANYIX] ROT 9 LAND '777)",
	BIXNUM(NAMED) = "BP(13, ISTKIDA, ""NAMED"", , 21)",
	IXOLD(ANYIX) = "(ISTK[ANYIX] LAND '37777)",
COMMENT Fields of Entries in ISTK ;

	MARGWDS = "4",
	LMARGX(MARG) = "ISTK[(MARG)-1]",
	RMARGX(MARG) = "ISTK[(MARG)-2]",
	OLD_MARGX(MARG) = "ISTK[(MARG)-3]",
	AREAX(MARG) = "ISTK[(MARG)-4]", COMMENT, ISTK IX of AREA with these margins ;

	FONTWDS = "4", COMMENT TES 11/15/73 ;
	THISFONTX(FONT) = "ISTK[(FONT)-1]", COMMENT OF OUTER BLOCK ;
	OLDFONTX(FONT) = "ISTK[(FONT)-2]",
	OUTERX(FONT) = "ISTK[(FONT)-3]",
	COMMENT TES same as for MARG:  AREAX(FONT) = "ISTK[(FONT)-4]";

	TURNWDS = "1", COMMENT, CHR, FUN 7 bits each, to TURN back ON previous meaning;

	NUMWDS = "1",
	OLD_NUMBER(SYM) = "ISTK[(SYM)-1]",

	AREAWDS = "17",
	DISD(AREA_UNIT) = "ISTK[(AREA_UNIT)-1]", COMMENT, TRUE if disdeclared ;
	FULHIGH(AREA) = "ISTK[(AREA)-2]", COMMENT, 1 iff no LINES clause ;
	LINE1(AREA) = "ISTK[(AREA)-3]", COMMENT, Top line number used;
	LINECT(AREA) = "ISTK[(AREA)-4]", COMMENT, Number of lines used;
	FULWIDE(AREA) = "ISTK[(AREA)-5]", COMMENT, 1 iff no CHARS clause ;
	CHAR1(AREA) = "ISTK[(AREA)-6]", COMMENT, Leftmost character position;
	CHARCT(AREA) = "ISTK[(AREA)-7]", COMMENT, Width of whole area;
	TEXTAR(AREA) = "ISTK[(AREA)-8]", COMMENT, 1=TEXT AREA, 0=TITLE AREA;
	COLCT(AREA) = "ISTK[(AREA)-9]", COMMENT, Number of columns;
	COLWID(AREA) = "ISTK[(AREA)-10]", COMMENT, Width of each column;
	OLD_ACTIVE(AREA) = "ISTK[(AREA)-11]", COMMENT, If Open, array descriptor of active area in OLDPAGE;
	NEW_ACTIVE(AREA) = "ISTK[(AREA)-12]", COMMENT, If Open, array descriptor of active area in NEWPAGE;
		OPEN_ACTIVE(AREA) = "ISTK[(AREA)-
			(IF FRAMEIDA=NEWPGIDA≠0 THEN 12 ELSE 11)]",
			COMMENT "≠0" ABOVE ADDED APRIL 22, 1973 BY TES ;
	FOOTSTR(AREA) = "ISTK[(AREA)-13]", COMMENT, SSTK subscript of SEND FOOT string ;
	MARGINS(AREA) = "ISTK[(AREA)-14]", COMMENT, ISTK IX of MARGTYPE entry ;
	FONTS(AREA) = "ISTK[(AREA)-15]", COMMENT TES 11/15/73 ISTK IX of FONTTYPE entry ;
	TFONT(AREA) = "ISTK[(AREA)-16]", COMMENT TES 11/15/73 THISFONT;
	OFONT(AREA) = "ISTK[(AREA)-17]", COMMENT TES 11/15/73 OLDFONT ;

	UNITWDS = "12",
COMMENT DISD(AREA_UNIT) = "ISTK[(AREA_UNIT)-1]", COMMENT, see area def above;
	CTR_INIT(UNIT) = "ISTK[(UNIT)-2]", COMMENT, FROM initial value + 2↑14 ;
	CTR_STEP(UNIT) = "ISTK[(UNIT)-3]", COMMENT, BY step-value + 2↑6 ;
	PATT_CHRS(UNIT) = "ISTK[(UNIT)-4]", COMMENT, estimate based on chars in patterned TO value;
	CTR_CHRS(UNIT) = "ISTK[(UNIT)-5]", COMMENT, estimate based on unpatterned TO value;
	PARENT(UNIT) = "ISTK[(UNIT)-6]", COMMENT, IX of parent unit;
	PATT_PARENT(UNIT) = "ISTK[(UNIT)-7]", COMMENT, whether ! occurs in pattern;
	PATT_ALF(UNIT) = "ISTK[(UNIT)-8]", COMMENT, alphabet to convert CTR_VAL to:
		PATT_ALF...	0	1	2	3	4	5
		alphabet... template	1	i	I	a	A	;

	PATT_STRS(UNIT) = "ISTK[(UNIT)-9]", COMMENT, pointer to strings in SSTK;
	SON(UNIT) = "ISTK[(UNIT)-10]", COMMENT, IX of youngest son unit ;
	BROTHER(UNIT) = "ISTK[(UNIT)-11]", COMMENT, IX of brother unit ;
	IN_LINE(UNIT) = "ISTK[(UNIT)-12]", COMMENT, TRUE if INLINE option present ;
	MACROWDS = "4", RESPWDS  = "7", SIGWDS = "9",
	BODY(DEF) = "ISTK[(DEF)-1]", COMMENT, points to body string in SSTK;
	NAMEPAR(MACRO) = "ISTK[(MACRO)-3]", COMMENT, LAND 2↑(ARGS-n) says n'th arg is by name;
	NUMARGS(DEF) = "ISTK[(DEF)-2]", COMMENT, no. of formal parameters;
	ODDMAC(MACRO) = "ISTK[(MACRO)-4]", COMMENT, 1 for ODD MACRO, 0 for [EVEN] MACRO;
	OLD_RESP(RESP) = "ISTK[(RESP)-3]", COMMENT, former response+200 or (<200) breaktable value;
	DEPTH_RESP(RESP) = "ISTK[(RESP)-4]", COMMENT, block level (unimplemented) ;
	NEXT_RESP(RESP) = "ISTK[(RESP)-5]", COMMENT, another resp. with similar recognizer;
	CLUE(RESP) = "ISTK[(RESP)-6]", COMMENT, encoding of the recognizer;
	VARIETY(RESP) = "ISTK[(RESP)-7]", COMMENT, see Table below ;
	SIGNAL(RESP) = "ISTK[(RESP)-8]", COMMENT, ASCII of Signal;
	RESP_SEP(RESP) = "ISTK[(RESP)-9]", COMMENT, ASCII of seps (up to 5), right byte=last sep;

COMMENT NEXT_RESP and CLUE for each VARIETY of response declaration:

	Declaration	VARIETY		CLUE		NEXT_RESP with
	-----------	-------	----------------------	--------------
	AT <e>		   0	Pointer to <e> in SSTK	Same 1st letter & 2d letter|non-letter-ness
	AT <n>		   1		  n		Next larger n
	AT <signal>	   2     Number of characters	Same first char
	AFTER <area|unit>  3    Symb. no. of area|unit  (WAITRESP link only)
	BEFORE ...	   4            "                      "

ITBL....

	Has (1) Labels generated by {PAGE}. The entry looks like a
		NUMBER entry for a label, except PLIGHT is never 1.
	    (2) Portion declarations--NOTE: no word may have left half = '400000;
		PORCH(PORT) = "ITBL[PORT]", COMMENT, 0-15: channel SENDing to,
			-1: FOOT, -2: declared but never SENT to, -3: sent to & declared but not RECEIVEd,
			-4: already RECEIVEd, -5: only mentioned in INSERT, -6: RECEIVEd AND Alphabetized ;
		PORSEQ(PORT) = "ITBL[(PORT)-1]", COMMENT, pointer to next PORTION in collating sequence ;
		PORFIL(PORT) = "ITBL[(PORT)-2]", COMMENT, ASCII of generated file's first name ;
		PORINT(PORT) = "ITBL[(PORT)-3]", COMMENT, ASCII of intermed. file's first name (if 1st in that file);
	COMMENT
SSTK....
	Has (1) Values of Local Variables
	    (2) Macro, Response, and Prepare Bodies
	    (3) Unit PATT_STRS;	PATT_VAL(PS) = "SSTK[PS]", COMMENT, current printing value;
				CTR_VAL(PS) = "SSTK[(PS)-1]", COMMENT, current counter value ;
				PREFIX(PS) = "SSTK[(PS)-2]", COMMENT, before ! OR template;
				INFIX(PS) = "SSTK[(PS)-3]", COMMENT, between ! and alphabet;
				SUFFIX(PS) = "SSTK[(PS)-4]", COMMENT, after alphabet .
	    (4) SEND FOOT Strings for each declared AREA.

STBL....
	Has (1) Values of Global Variables
	    (2) Values of Labels (set to '0&<last unit specified--SYMBOL no.>
		if undefined, so MANUS can check consistency of use)
	    (3) Current file-block for every generated file getting sent to;
	COMMENT

SNEST...
	Has (1) Input strings to scan.  They nest due to macro calls,
		responses, argument substitutions, RECEIVEs, and
		REQUIREs.  This nesting is not synchronized with that
		of blocks, because a macro or argument body or a source
		file may have unmatched BEGINs, etc., so a separate
		stack is required.
	    (2) Saved line number for previous source:
		The first six characters are the file name ;
	STRSCAN(S) = "SNEST[(S)-1]", COMMENT, a string to scan (STRSCAN(LAST)
		is the current one);
	LINESCAN(S) = "SNEST[S]", COMMENT, MACLINE or SRCLINE ;

	COMMENT

INEST...
	Has (1) Input channels to scan.  When reading from a file,
		just  its channel number is kept instead of the whole
		string of course.  However, a whole line at a time is
		stripped and scanned as if it were an input string.
	    (2) Saved SOS page number for previous input file;
	CHANSCAN(S) = "INEST[(S)-1]", COMMENT, the channel number of a file to
		scan (CHANSCAN(LAST) is the current one or -1 if none)
		TECO files: channel no. stored here excess 100 ;
	PAGESCAN(S) = "INEST[S]", COMMENT, LH=PAGEMARKS  RH=PAGEWAS   Negated by RECEIVE if GEN-file;

COMMENT These are our DEVICE numbers;
	LPT = "1",
	TTY = "2",
	MIC = "3",
	XGP = "4",

COMMENT These are definctions to compare strings;
	NULSTR(S) = "(LENGTH(S) = 0)",
	FULSTR(S) = "(LENGTH(S) ≠ 0)",
	FALSTR(S) = "EQU(S, ""0"")",
	TRUESTR(S) = "¬EQU(S, ""0"")",
COMMENT A record of each active frame and area is  kept  in  a  dynamically
        created   array.    Swinehart's  ARRSER.SAI  package  creates  such
        arrays.  The array may be  represented  by  an  integer  descriptor
        (we'll  call it the array's IDA) which can be assigned to any array
        of variable upper bound  (the  array's  ALIAS).    Frame  and  area
        records  contain  IDAs of other records and of dynamic MOLES, OWLS,
        and area-arrays.  All these  arrays  must  be  dynamically  created
        because  their  existence is independent of block nests and even of
        their declarations -- for example, a BOX and its areas may be  held
        over for several pages before insertion.  THE FIRST ELEMENT OF EACH
        SUCH STRING ARRAY IS NOT A STRING BUT A GARBAGE-COLLECT LINK!!!

        Two pages may be open at once, due to group overflow or to  closing
        of one text area while others are still open. ;

COMMENT	Here are the Aliases of the dynamic arrays:

	IDA		ALIAS		Represents
	---		-----		--------------------------------------
	OLDPGIDA	OLDPAGE		Partly completed open page.
	NEWPGIDA	NEWPAGE		Overflow from OLDPAGE.
	FRAMEIDA	THISFRAME	Record of Frame we're PLACing in (PAGE or BOX).
	MOLESIDA	MOLES			Its MOLES array.
	OWLSIDA		OWLS			Its OWLS array.
	AREAIDA		THISAREA	Record of Area we're placing in.
			AA			Its Area-Array.
	WBOXIDA		WAITBOX		Head of L.L. of Boxes held over.

	A Frame Record is an integer array symbolized THISFRAME[0:PFREC|BFREC]: ;
	PFREC = "5", BFREC = "21",
		ARF = "THISFRAME[0]", COMMENT, head of LL of its area records;
		OWLSF = "THISFRAME[1]", COMMENT, IDA of its OWLS array;
		MOLESF = "THISFRAME[2]", COMMENT, IDA of its MOLES array;
		HIGHF = "THISFRAME[3]", COMMENT, n HIGH;
		WIDEF = "THISFRAME[4]", COMMENT, v WIDE;
		SHORTF = "THISFRAME[5]", COMMENT, new SHORTM array for XGP;
COMMENT The rest apply only to a BOX FRAME;
		ULLB = "THISFRAME[6]", COMMENT, Upper Left Line covered in containing area INB;
		ULCB = "THISFRAME[7]", COMMENT, Upper Left Char covered;
		INB = "THISFRAME[8]", COMMENT, symbol no. of containing area;
		NEXTB = "THISFRAME[9]", COMMENT, link to next BOX -- two cases:
			If this box is held over → next such box in WAITBOX L.L.
			Otherwise → next box in this area (BOXA L.L.)	;
		comment, NEAR <where> encoded:  about 12 words ;
COMMENT An Area Record is an integer array symbolized THISAREA[0:AREC] -- ;
	AREC = "13",
	AAA = "THISAREA[0]", COMMENT, IDA of Area-Array (a 2-D array);
	ARA = "THISAREA[1]", COMMENT, IDA of next area record in this frame (ARF L.L.);
	OLD_ACTA = "THISAREA[2]", COMMENT, IDA of area record in up-level frame ;
	BOXA = "THISAREA[3]", COMMENT, IDA of first BOX in this area;
	INA = "THISAREA[4]", COMMENT, IDA of containing frame;
	STATA = "THISAREA[5]", COMMENT, Status:
		Unopened=0  Open=1  Closed=2  Dis-Declared=4	;
	DEFA = "THISAREA[6]", COMMENT, ptr to definition in ISTK (or 0 if none);
	COMMENT If the area is open-- ;
		NBOXA = "THISAREA[7]", COMMENT, number of BOXes in the BOXA L.L.;
		COLA = "THISAREA[8]", COMMENT, column we're PLACing in;
	COMMENT If the area is closed or dis-declared-- ;
		LINECA = "THISAREA[9]", COMMENT, LINECT copied from ISTK ;
		COLCA = "THISAREA[10]", COMMENT, COLCT copied from ISTK ;
		ULLA = "THISAREA[11]", COMMENT, LINE1(AREA) copied from ISTK;
		COMMENT and AA[i,0] tells upper left character posn of column i ;
	XGENA="THISAREA[12]" , COMMENT, XGENLINES FOR AREA;COMMENT  RKJ;
	OVERA="THISAREA[13]", COMMENT TES 11/14/73 OVEREST for col-1 of area;

COMMENT The Area-Array of a D-column M-line area is an integer array AA[1:2*D,0:M].

	                  	   Column  1	     Column  2	       Column 3	   ...
				 "Leg"     Foot	    Leg      Foot     Leg      Foot	  ...
	lines already used *	AA[1,0] AA[D+1,0] AA[2,0] AA[D+2,0] AA[3,0] AA[D+3,0]	...
	J'th line       	AA[1,J] AA[D+1,J] AA[2,J] AA[D+2,J] AA[3,J] AA[D+3,J]	...
			(*): H2=last placed line, H1=lines beneath covered by BOXes;
COMMENT These "mode words" are BLT'ed to ISTK upon block entry ;

	MODEWDS = "20" ;

TERNAL INTEGER	BREAKM ; comment Break Mode ; DEFINE
	FILL="(BREAKM=0)", NOFILL = "(BREAKM≠0)", JUSTJUST="(BREAKM=1)", FLUSHL="(BREAKM=2)",
	FLUSHR="(BREAKM=3)", CENTER="(BREAKM=4)", IMPOSE="(BREAKM=5)", VERBATIM="(BREAKM=6)",
	REGNOFILL = "(BREAKM=7)" ;
TERNAL INTEGER	JUSTM ; DEFINE ADJUST="(JUSTM=1)", NOJUST="(JUSTM=0)" ;
TERNAL INTEGER	SPACEM ; DEFINE COMPACT="(SPACEM=2 ∨ FILL∧SPACEM=1)", RETAIN="(¬COMPACT)" ;
TERNAL INTEGER CRBM ; DEFINE CRBREAK="(CRBM=1)", CRSPACE="(CRBM=0)" ;
TERNAL INTEGER	TWEENLFM, comment, N-1 from SUPERIMPOSE N;
		SINCELFM, comment, count no-LF lines;
		FIRSTIM, comment, f from INDENT f,r ;
		RESTIM, comment, r from INDENT f,r ;
		RIGHTIM, comment, g from INDENT f, r, g ;

		GROUPM, comment, GROUP=1  APART=0;
		GLINEM, comment, MOLES Posn of 1st output line in the group;
		AREAIXM, comment, ISTK posn of Place Area;

		TABTAB, comment either 0 or what TAB is TURNed ON as ;

		LEADFM, comment, PREFACE in FILL mode ;
		LEADNM, comment, PREFACE in NOFILL mode ;
		SPREADM, comment, SPREAD, e.g., SINGLE SPACE → 1;
		ENDCASE, comment, how this block began: BEGIN=1 ONCE=2 BEFORE|AFTER|FOOTNOTES=3 ;
		STARTS, comment, clump depth in this block ;
		SHED , comment, Top of SSTK ;
		OLDIHED; COMMENT TES 11/15/73 OLD ISTK TOP ;

	COMMENT TES 11/15/73 OLDFONT + THISFONT moved to last page ;

COMMENT Several linked list  scans  use  these  macros  to  generate  code.
	LLHEAD symbolizes a variable pointing to the first element.
	LLNEXT(x) would determine the successor to x. The global variables
        LLPREV, LLTHIS, and LLPOST display the result of the scan. ;

DEFINE	LLSCAN(LLHEAD, LLNEXT, LLSTOP) = "
		BEGIN LLTHIS ← LLHEAD MAX 0 ; LLPREV ← -1 ;
		WHILE LLTHIS ∧ ¬(LLSTOP) DO
			BEGIN
			LLPREV ← LLTHIS ; LLTHIS ← LLNEXT(LLTHIS) ;
			END ;
		LLPOST ← IF LLTHIS THEN LLNEXT(LLTHIS) ELSE 0 ;
		END",
	LLSKIP(LLHEAD, LLNEXT) = "
		IF LLPREV<0 THEN LLHEAD ← LLPOST
		ELSE LLNEXT(LLPREV) ← LLPOST ",
	LLINS(LLHEAD, LLNEXT, LLNEW) = "
		BEGIN
		IF LLPREV < 0 THEN LLHEAD ← LLNEW ELSE LLNEXT(LLPREV) ← LLNEW ;
		LLNEXT(LLNEW) ← LLTHIS ;
		END",
COMMENT These are for scanners;
	LETTS = """!_QWERTYUIOPLKJHGFDSAZXCVBNMzxcvbnmlkjhgfdsaqwertyuiop""",
	DIGS = """0123456789""",
	CR = "'15", LF = "'12", SP = "'40", TB = "'11", FF = "'14", CRLF = "(CR&LF)",
	RUBOUT = "'177", VT = "'13", BAR = "'30",
	ALTMODE=IFC VERSION=SAILVER THENC "'175" ELSEC "'176" ENDC,
	RCBRAK=IFC VERSION=SAILVER THENC "'176" ELSEC "'175" ENDC,

COMMENT For the parser;
	SPASS(X) = "((X&NULL)&PASS)",
	IPASS(X) = "((X+0)+PASS)",
	DPASS = "BEGIN DCLR_ID←TRUE ; PASS; DCLR_ID←FALSE END",
	EMPTYTHIS = "BEGIN THISTYPE ← -EMPTYQ ; THISWD ← NULL END",
	EMPTYTHAT = "BEGIN THATTYPE ← -EMPTYQ ; THATWD ← NULL END",
	THISISFULL = "(THISTYPE ≠ -EMPTYQ)", THATISFULL = "(THATTYPE ≠ -EMPTYQ)",
	THISISID = "(THISTYPE ≥ 0)", THATISID = "(THATTYPE ≥ 0)",
	THISISCON = "(THISTYPE = -1)", THATISCON = "(THATTYPE = -1)",
	ITS(LIT) = "EQU(THISWD,""LIT"")", ITSV(EX) = "EQU(THISWD,EX)",
	NEXTS(LIT) = "EQU(THATWD,""LIT"")", NEXTSV(EX) = "EQU(THATWD,EX)",
	ITSCH(CHR) = "THISWD = ""CHR""", NEXTSCH(CHR) = "THATWD = ""CHR""",

COMMENT  The  character  Table  CHARTBL  categorizes  each of the 128 ASCII
        characters for both the  Parser  and  the  Filler.    SPCODE  is  a
        variable  field  set  by TURN ON (and reset by TURN OFF) to a value
        fetched from the constant field SPCHAR.;

	UPCASE(CH) = "BBPP(7, CHARTBL[0], 6) + (CH)",
	FAMILY(CH) = "BBPP(5, CHARTBL[0], 11) + (CH)",
	SPECIES(CH) = "BBPP(5, CHARTBL[0], 17) + (CH)",
	SPCODE(CH) = "BBPP(6, CHARTBL[0], 35) + (CH)",
	SPCHAR(CH) = "BBPP(6, CHARTBL[0], 26) + (CH)",
	COMMENT and Bit 29 is set for Invisibles ;

		COMMENT   Table of Character Families and Species

				    S       P       E       C       I       E       S
       F  A  M  I  L  Y		0	1	2	3	4	5	6 .....	26
       ----------------	      -----  ------- ------- -------- -----   -----   -----    ----	;
	LETTQ	= " 0",COMMENT 	Aa	Bb	Cc	Dd	Ee	Ff	Gg ....	!_	;
	DIGQ	= " 1",COMMENT 	0	1	2	3	4	5	6 ...  		;
	EMPTYQ	= " 2"	  ,
	TERQ	= " 3",COMMENT 	}      ; COMMENT )	,	]	⊂			;
	QUOTEQ	= " 4",COMMENT 	"	'							;
	DOLLARQ	= " 5",COMMENT 	$								;
	BROKQ	= " 6",COMMENT 	[								;
	MULQ	= " 7",COMMENT 	*    / DIV %   MOD	&					;
	ADDQ	= " 8",COMMENT 	+	-    EQV≡ABS	↑    XOR⊗LENGTH				;
	BOUNDQ	= " 9",COMMENT  MAX     MIN							;
	ODDQ	= "10",COMMENT  EVEN    ODD							;
	RELQ	= "11",COMMENT 	<	>	=     ≤ LEQ   ≥ GEQ   ≠ NEQ			;
	NOTQ	= "12",COMMENT¬ NOT								;
	ANDQ	= "13",COMMENT∧ AND								;
	ORQ	= "14",COMMENT∨ OR								;
	MISCQ	= "15",COMMENT rest	:	←	(	∞	@	|	ε	;
			MISCMAX = "7", COMMENT, Highest numbered species in MISCQ ;
COMMENT Run-of-mill defines;
	TWO(X) = "(1 LSH (X))",
	THRU = "STEP 1 UNTIL",
	DOWN = "STEP -1 UNTIL",
	FALSE = "0", TRUE = "-1",
	LOPP(STR) = "DUMMY ← LOP(STR)",
	COPY(STR) = "BEGIN STR ← 0&STR ; LOPP(STR) END",
	LH(X) = "((X) LSH -18 LAND '777777)",
	RH(X) = "((X) LAND '777777)",
	LHRH(X,Y) = "((X) LSH 18 LOR (Y))",
	WDBRK = "ALTMODE", FONTCHAR = "'177",
	CVSR(N) = "CVS(N) & ALTMODE",

COMMENT Break Tables;
	TO_VT_SKIP = "15",
	TO_COMMA_RPAR = "14",
	TO_TERQ_CR = "13",
	TO_SEMI_SKIP = "12", COMMENT, for COMMENT comments;
	NO_CHARS = "11",
	ONE_CHAR = "10", COMMENT, break on aything and append;
	LOCAL_TABLE = "9", COMMENT, Do a SETBREAK before using this one;
	TO_TB_FF_SKIP = "8", COMMENT, to scan a line number (ignores line feed);
	TO_LF_TB_VT_SKIP = "7", COMMENT, to swallow a whole line;
	TO_VISIBLE = "6",
	ALPHA = "5",
	DIGITA = "4",
	TO_QUOTE_APPD = "3",
	TO_NON_SP = "2",
	TEXT_TBL = "1",
	TO_CR_SKIP = "16", COMMENT for VERBATIM text lines ;
	TO_VBAR_SKIP = "17",
	DEFN_TABLE = "18",

COMMENT Buggy Printout ;
	DARN = "WARN",
	λ = "& "","" &",
	VS(SVAR) = " "" SVAR="" & SVAR ",
	VI(IVAR) = " "" IVAR="" & CVS(IVAR) ",
	MESSMAX = "3",

	VIRGIN = "NULL" ; NB End DEFINE ;
TERNAL SAFE INTEGER ARRAY
	COMMENT PHRASED ARRAY REMOVED TES 11/15/73;
	SIGNALD[0:127], COMMENT, detect last character of signal to trigger response search;
	CHARTBL[0:150], COMMENT, current classification and mapping of characters;
	INPG[0:10], COMMENT, 1 to 10 mTnP options;
	TABSORT[1:28], COMMENT, tab stops in increasing order;
	CHANLS[0:15], COMMENT, IDA of SEND portion assigned to each channel, if positive ;
	ETCIARRAYS[0:0];

DEFINE MAXBLNMS = "40" ; TES 11/20/73 ;

PRELOAD "MONTH TABLE", "January ", "February ", "March ", "April ",
		"May ", "June ", "July ", "August ", "September ", "October ",
		"November ", "December " ;
TERNAL STRING ARRAY
	BLKNAMES[0:MAXBLNMS], COMMENT, clump and block names ;
	MONTH[0:12], COMMENT, To compute DATE for macros to print ;
	MESSAGE[1:MESSMAX], COMMENT, Short error messages to print on document in D mode. ;
	NULLS[0:10], COMMENT, always NULLs;
	ETCSARRAYS[0:0] ;

PRELOAD
	"ADJUST",	"AFTER",	"APART",	"AREA",		"AT",
	"BEFORE",	"BEGIN",	"BELOW",	"BLANKPAGE",	"BOXFRAME",
	"BREAK",
	"CC",		"CENTER",	"CLOSE",   "COMMANDCHARACTER",	"COMMENT",
	"COMPACT",	"CONTINUE",	"COUNT",	"CRBREAK",	"CRSPACE",
	"DEVICE",
	"END",
	"FILL",		"FLUSHLEFT",	"FLUSHRIGHT",	"FONT",
	"GROUP",	"GROUPSKIP",
	"IF",		"INDENT",	"INSERT",
	"JUSTJUST",
	"LET",		"LOCK",
	"MACRO",
	"NARROW",	"NEXT",		"NOFILL",	"NOJUST",
	"ONCE",
	"PACK",		"PAGEFRAME",	"PLACE",	"PORTION",	"PREFACE",
	"RECEIVE",	"RECURSIVEMACRO",		"REQUIRE",	"RETAIN",
	"SELECT",	"SEND",		"SHOW",		"SKIP",		"START",
	"SUPERIMPOSE",
	"TABS",		"TEXTAREA",	"TITLEAREA",	"TURNOFF",	"TURNON",
	"VARIABLE",	"VERBATIM",
	"WIDEN",
	NULL ;
TERNAL STRING ARRAY MANWD[0:64] ; comment, Only first words of commands are reserved ;

PRELOAD NULL, " ", "  ", "   ", "    ", "     ", "      ",
	"       ", "        ", "         ", "          " ;
TERNAL SAFE STRING ARRAY SPSARR[0:10] ;
DEFINE DSCR="COMMENT ";
DSCR **** DYNAMIC ARRAY MANIPULATION PACKAGE ****



;
	

DEFINE TEMPO="'14", LPSA="'13";
EXTERNAL INTEGER SIMPLE PROCEDURE LRMAK(INTEGER L,H,D);
EXTERNAL INTEGER SIMPLE PROCEDURE LRCOP(INTEGER A);
EXTERNAL SIMPLE PROCEDURE ARYEL(INTEGER I);

DSCR PTR ← CREATE(LOWBND,HIBND)
CAL MACRO -- EXPRESSION
PAR LOWBND IS LOWER BOUND FOR INTEGER ARRAY
 HIBND IS UPPER BOUND
RES PTR IS AN ARRAY DESCRIPTOR
DES CALLS LRMAK TO GET AN UNMARKED ARRAY
;

DEFINE CREATE(L,H)= "LRMAK(L,H,1)";

DSCR MAKEBE(PTR,ARRAY)
CAL MACRO -- STATEMENT
PAR PTR IS INTEGER HOLDING ARRAY DESCRIPTOR
 ARRAY IS DUMMY TO RECEIVE DESCRIPTOR (DON'T LEAVE THAT BLOCK!)
DES EFFECT IS "ARRAY←PTR", BUT SAIL WON'T DO THAT DIRECTLY
;

DEFINE MAKEBE(I,A)="
 START_CODE
  MOVE TEMPO,I;
  MOVEM  TEMPO,A;
 END ";

DEFINE IDASSIGN(EX,ALIAS)="BEGIN DUMMY←EX; 
	IF DUMMY ≤ 0 THEN WARN(NULL,""NEGATIVE ALIAS FOR INTEGER ARRAY"") ELSE comment ************* ;
	MAKEBE(DUMMY, ALIAS) END" ;

DEFINE SMAKEBE(I, A) = "START_CODE HRRO TEMPO,I ; MOVEM TEMPO, A ; END",
	SIDASSIGN(EX, ALIAS) = "BEGIN DUMMY←EX ; SMAKEBE(DUMMY, ALIAS) END" ;
TERNAL INTEGER
	SYMNO, comment, size of hashed SYMBOL Table;
	XSYMNO, comment, size of SYM and NUMBER--first SYMNO elemts hash-searched, rest linear- searched;
	ISIZE, SSIZE, ITSIZE, STSIZE, SIZE, comment of ISTK,SSTK,ITBL,STBL,NESTs;
	IHED,         IHIGH,  SHIGH,  LAST, comment last used (highest unavailable) subscript;
	OLX,NOLX,GRPOLX,GRPTOP, OLXX, OLMAX, comment,
		used words of OWLS, LENGTH(OWLS), total of all declared areas;
	EOF, BRC, FLAG, comment, I/O control variables;
	CONTENTS, DEBUG, DEVICE, comment, RPG-derived switches;
	LMARG, RMARG, comment, margin settings in this area;
	OAKS,POSN, BRKPT,BRKPOSN,BRKXPOSN,BRKFAKE,  BRKABX, BRKBLX,
	BRKSPCS, JUSTIFY, LASTWDBRK,  BRKPLBL, TABI,RBOUND,
	MAXIM,FMAXIM,NMAXIM, comment, Line-Filler (OWL) variables;
	STANDARD, comment, ptr to def in ISTK of MACRO !STANDARD;
	INSETS, comment, ptr to AT <n> of smallest n (ISTK ptr);
	INPUTCHAN, TECOFILE, comment, current input channel ;
	INPGS, INPGX,comment, last and current subscript in array INPG of mTnP options;
	SWDBACK, comment, -1=just SWICHBACKed from a file, +1=just WARNed ;
	PUBSTD, comment, whether compiling PUBSTD.DFS (suppress pgno display) ;
	ONE, comment, 1 for variable upper bound of ALIAS arrays;
	TAG, comment, STBL address of variable TAG;
	MANUS_SKIP_, comment, _SKIP_ value after execution of MANUS substring operation;
	INF, comment, ∞ value for current MANUS substring spec;
	I, J, K, L, M, N, DUMMY, comment, short-term loan currency ;
	DEPTH, comment, block depth -- MANWDS are at 0, main program at 1;
	ON, comment, FALSE if parsing false part of conditional or if defining a response body;
	FHIGH, FWIDE, PHIGH, PWIDE, comment, Dimensions of the current Frame and Page Frame;
	EPSCHAR, comment, char serving { function ;
	PAGEMARKS, PAGEWAS, comment, no. of PM's on this page: passed, responded to ;
	RESP_BODY, comment, TRUE if defining a response body;
	DCLR_LET, comment, TRUE if scanning after = of `LET X=..';
	DCLR_ID, comment, TRUE if in a declaration scanning an identifier that is to be declared;
	DEFINING, comment TRUE if reading ⊂definition⊃ ;
	WAITRESP, comment, head of LL of Responses to undeclared areas and units;
	LEADRESPS, comment, head of LL of "AT n" responses, in ascending order by n ;
	COMMAND_CHARACTER, TAB_CHARACTER,
	PORTS, THISPORT, SEQPORT, PORTLL, comment, Portions: # of, last declared, last in seq, seq LL;
	INTER, SINTER, INTERS, comment Intermediate output channel, no. of intermediate output files ;
	STATUS, comment, Current place area UNOPENED (0), OPEN (1), CLOSED (2), GONE (3) ;
	OLDPGIDA, NEWPGIDA, FRAMEIDA, MOLESIDA, SHORTIDA, OWLSIDA, AREAIDA, WBOXIDA,
	SYMIDA, NUMBIDA, ISTKIDA, SSTKIDA, ITBLIDA, STBLIDA, INESTIDA, SNESTIDA,
	BYTEWD, comment, lots of byte pointers point here ;
	COLS, COL, PAL, LINES, LINE, PINE, COVERED, UNDEAD, comment, Current position in place area ;
	NULLAREAS, comment, LL of Made but Unopened areas (Status=0) ;
	PREFMODE, comment, n from nS option ;
	BLNMS, comment, top of BLKNAMES stack ;
	MYEND, comment flag for END routines (see TOEND in MAN.SAI) ;
	FOOTTOP, comment TRUE iff expecting 1st line of 1st footnote belonging to a body line;
	OWLSEQ, comment, counts total output lines red'd by OWLS arrays ;
	WISTK, WITBL, WINEST, WSSTK, WSTBL, WSNEST, WSYM, WNUMBER,
		WOLDPAGE, WNEWPAGE, WTHISFRAME, WMOLES, WNMOLES,
		WOWLS, WNOWLS, WTHISAREA, WWAITBOX, WAVAILREC,
		WAA, WNAA, WSHORT, WNSHORT, comment, WHATIS(dummy arrays) ;
	UPCAS3, UPCAS5, UPCAS6, comment, byte pointers for CAPITALIZE,STRLSS;
	SYMTYPE, SYMIX, comment, fields of a descr. looked up by SIMLOOK or SIMNUM;
	LONG, comment TRUE in a LONG etc. command;
	SYMPAGE, IXPAGE, PATPAGE, comment, SYM subscript, IX field, counter subscript for PAGE;
	IXCOMMENT, IXEND, IXFOOT, IXTAG, comment, IX fields for reserved words;
	SYMTEXT, IXTEXT,
	LLPREV, LLTHIS, LLPOST, comment, results of LLSCAN (a macro) ;
	AMSAND, LBRACK, UARROW, DARROW, UNDERBAR, LCURLY, DOLLAR,
		comment SPCHAR codes of & [ ↑ ↓ _ { $ ;
	EXNEXTPAGE, comment TRUE while executing NEXT PAGE (prevents recursion) ;
	MESGS, comment, how many messages in MESSAGE[] ;
	LDEFN_BRC, comment, initial LENGTH(DEFN_BRC) ;
	GENSYM ;

TERNAL STRING
	C!, !, comment C and P-values of incremented counter after NEXT statement;
	INPUTSTR, comment, current input string;
	LIT_ENTITY, LIT_TRAIL, comment,
		for the entity in THATWD: its literal input form & trailing spaces;
	TEXT_BRC, comment, break characters (always including CR LF SP ALTMODE RUBOUT -.?! );
	DEFN_BRC, comment, break characters (char serving as {, also }, LF, ⊂, ⊃, ∃, letters) ;
	SIG_BRC, comment, break characters for Signals (first char of each signal) ;
	PAGEVAL, comment, the P-value of this PAGE when it was opened ;
	SRCPAGE, SRCLINE, MACLINE, LSTOP, comment, input file line nos.;
	INFILE, OUTFILE, TMPFILE, comment, RPG-determined file names;
	MAINFILE, comment first name of INFILE, filled out with colons to 6 chars ;
	THISFILE, comment, the first name of the file being read now, colon-filled ;
	LIBPPN, comment usually [1,TES], but [2,TES] if logged in as [2,TES] ;
	OWL, LBF, OLBF, comment, Line-Filler variables ;
	DUMMYSTR, S, comment, just strings to throw around;
	THISWD,THATWD, comment, this (ITS) and sometimes next entity from scanner;
	CHARSP, comment, SPCHAR to character convert table ;
	FOOTSEP, comment, line to draw above footnotes ;
	STR1, STR2, STR3, comment temporaries ;
	DELINT, comment, Delete Intermediate Files Option Y/N/A ;
	JOBNO, CONDIR, comment, job number & connected dir (TENEX only--else NULL) TES 10/25/73;
	VUNDERLINE, COMMENT TES 10/22/73 The UNDERLINE character ;
	ETCS;

EXTERNAL INTEGER RPGSW, _SKIP_ ;

TERNAL INTEGER
	comment, BEGINBLOCK BLT's these to ISTK (keep them together):  ;
	THISTYPE,THATTYPE, comment, THATTYPE is parser type of THATWD:
		-2=EMPTYQ  ≥0=IDENTIFIER(exact value is no. of trailing spaces)
		    THISTYPE is parser type of THISWD:
		1..15=TYPEN(ID symbol)  0=Undeclared ID
		-1=CONSTANT  -2=EMPTYQ  ≤-3=SP.CHAR.(-FAMILY no.);
	SYMB, comment, the SYM subscript of THISWD, if THISISID;
	IX, comment, the IX field of NUMBER for THISWD, if THISISID;
	STARPOSN, RIPTPOSNS, AMPPOSN,
	PLBL,FIRST,NOPGPH,SPCS,ABOVEX,BELOWX,HEIGHT,SUPERSUB,
	UNDERLINING,FAKE,MIDWORD,PUNC,INDENT,LBP,XLBP,LBO,LBK,ILBF,
	BRKFONT ; TES 11/20/73 ;
DEFINE SOMEWDS="4",MIDWDS="26" ; comment, how many variables in above list ;
TERNAL INTEGER XMAXIM, COMMENT LDX LINE WIDTH;
		OLDFONT , comment last XGP font ;
		THISFONT , comment current XGP font ;
		KSETCON, COMMENT KSET OFFSET IN CW;
		XGENLINES, COMMENT NUMBER OF LINES GENERATED BY LDX MACROS;
		XPOSN, COMMENT LDX EQUIV OF POSN;
		XCRIBL, COMMENT TRUE IF IN XCRIBL MODE;
		XCMDCHR, COMMENT SPCHAR CODE FOR ⊗;
		XNJB, COMMENT SPCHAR CODE FOR #;
		KSETSWAP, COMMENT SPCHAR CODE FOR %;
		FSHORT; COMMENT FAKE SHORT FOR XCRIBL MODE SPACES;

TERNAL INTEGER CHARW; COMMENT AVERAGE CHAR WIDTH (WIDTH OF '177);

TERNAL INTEGER WCW ; COMMENT WHATIS CW;
TERNAL INTEGER ARRAY FONTFIL[1:35] ; COMMENT HOLDS CW POINTERS ;
TERNAL SAFE INTEGER ARRAY FNTINF[1:35] ; comment font info ;
	DEFINE CHARH="FNTINF[THISFONT]", STDCHARH="FNTINF[DEFAULTFONT]";
TERNAL INTEGER BASELINE;
TERNAL INTEGER OVEREST; COMMENT SHORT FONT KLUDGE! ;

TERNAL STRING XGPCMD , comment XGP commands to go on next line ;
	CMDFILE; COMMENT TEXT OF XGP COMMAND FILE ;

DEFINE CHARTORAST(VAL)="IF XCRIBL THEN CHARW*(VAL) ELSE VAL";

COMMENT  INSTALLATION DEPENDENT DEFAULTS ;

IFC VERSION=SAILVER THENC
	DEFINE	FONTPPN = "'704760637163", COMMENT [XGP,SYS];
		DEFAULTFONT = "1",
		FONTEXT = "'465664000000"; COMMENT FNT ;
ENDC
IFC VERSION=CMUVER THENC
	DEFINE	FONTPPN = "'001343303360", COMMENT [A730KS00] ;
		DEFAULTFONT = "10",
		FONTEXT = "'536364000000"; COMMENT KST ;
	DEFINE	LIBDEV = """DSK""";
ENDC
IFC VERSION=PARCVER THENC
    IFC TENEX THENC
	DEFINE	DEFAULTFONT="1",
		FONTPPN="""<FONTS>""",
		FONTEXT=""".XH""";
    ELSEC
	DEFINE	DEFAULTFONT="1",
		FONTPPN="1",
		FONTEXT="CVSIX(""XH"")";
    ENDC
ENDC