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