perm filename PUBDFS.SAI[2,TES]1 blob
sn#009888 filedate 1972-07-19 generic text, type T, neo UTF8
00100 DEFINE NB = "COMMENT",
00200
00300 INITSIZES = "ISIZE←1000; SSIZE←200; ITSIZE←200; STSIZE←300; SIZE←100",
00400 REGULAR_SIZE = "1021", COMMENT Must be a prime ;
00500 BIG_SIZE = "2999",
00600 HUGE_SIZE = "8191", COMMENT can't exceed 2↑13-1 ;
00700
00800 COMMENT All the output lines tentatively placed in the current frame are
00900 stored in .PUI files and referenced by sequential number from
01000 the integer array OWLS (OWtput LineS). Its length is sufficient
01100 to hold every line of every column of every area in it. The
01200 general form of a string referenced from OWLS is:
01300 {<chars><cr>}...<lf> . One of the <chars> (the last) may be a
01400 line that needs to be justified in Pass Two. Each word break in
01500 such a substring is represented by a '13 (vert-tab) -- these
01600 mark the places that extra spaces may be added. Pass Two also
01700 needs to know about FONT changes -- in the present version, this
01800 is limited to underlining, superscripts, and subscripts. A FONT
01900 change is signalled by the character pair '177 <code>. Finally,
02000 Pass Two will fill in forward references marked '175 (altmode).
02100
02200 Other information must be known about each string in OWLS. There
02300 must be an indication of how many spaces to add to a
02400 justify-line during Pass Two, and there must be mobility
02500 restrictions to assure that groups stay together and that
02600 section titles stay at tops of pages. This information is kept
02700 in an integer array MOLES (MObility of LinES) of the same size
02800 as OWLS. MOLES[J] is the descriptor for OWLS[J]. To access
02900 these entries, the value J is stored in an "area array"
03000 associated with the area the line was placed in, at element
03100 [C,L] for the C'th column and L'th line.
03200
03300 A Moles descriptor looks like this:
03400
03500 --------------------------------------------------
03600 | | |L|H|L|R|A|B| | |
03700 | | |O|O|E|I|B|E| | |
03800 | SHORT | FOOT |C|R|F|G|O|L| LABEL | LEAD |
03900 | | |K|I|T|H|V|O| | |
04000 | | | |Z| |T|E|W| | |
04100 --------------------------------------------------
04200 0.....6 7.....11-2-3-4-5-6-7-18..........31 32..35 ;
00100 COMMENT To avoid calling POINT to generate byte pointers, we use
00200 Swinehart's BBPP and our own BP. BBPP is called like POINT, but
00300 if possible it will compile constants instead of procedure
00400 calls. BP is a macro which creates a byte pointer as the sum of
00500 a constant and two variables or expressions. Instead of
00600 POINT(6,ARR[J+4],35), say: BP(6,ARRIDA,J,+4,35). The first,
00700 fourth, and fifth arguments will be ROTed and LORed into a
00800 constant at compile time, and the second and third will be added
00900 to it at execution time. Be sure that ARRIDA points to ARR[0]
01000 at all times, and that the fourth argument either is absent or
01100 is a signed integer. ;
01200
01300 BP(S,A0,J,SIGNED_CONSTANT,P) = "(((35-(P)) ROT 6 LOR S) ROT 24 SIGNED_CONSTANT) +
01400 (A0) + (J)",
01500
01600 H1(WD) = "BBPP(18,WD,17)", COMMENT, BBPP can make constant byte pointers;
01700 H2(WD) = "BBPP(18,WD,35)",
01800 Q1(WD) = "BBPP(9,WD,8)",
01900 Q2(WD) = "BBPP(9,WD,17)",
02000 Q3(WD) = "BBPP(9,WD,26)",
02100 Q4(WD) = "BBPP(9,WD,35)",
02200
02300 COMMENT Fields of MOLES ;
02400
02500 SHORTM(J) = "BP(7,MOLESIDA,""J"",,6)", COMMENT, How far short of the right
02600 margin ADJUST line is;
02700 FOOTM(J) = "BP(5, MOLESIDA,""J"",, 11)", COMMENT,
02800 If this line has footnotes, then this field is nonzero and
02900 matches the value in the corresponding field of the last
03000 line of its last footnote (a value of 31 means that footnote
03100 ends in a subsequent column);
03200 LOCKM(J) = "BP(1,MOLESIDA,""J"",,12)", COMMENT, This line can not be moved;
03300 HORIZM(J) = "BP(1,MOLESIDA,""J"",,13)", COMMENT, Only move to same line no. in another column;
03400 LEFTM(J) = "BP(1,MOLESIDA,""J"",,14)", COMMENT, If moved, also move line on my left;
03500 RIGHTM(J) = "BP(1,MOLESIDA,""J"",,15)", COMMENT, ... also line on my right;
03600 ABOVEM(J) = "BP(1,MOLESIDA,""J"",,16)", COMMENT, ... also line above me;
03700 BELOWM(J) = "BP(1,MOLESIDA,""J"",,17)", COMMENT, ... also line below me;
03800 ABV = "'2000000", BLW="'1000000", ABV_BLW="'3000000",
03900 LABELM(J) = "BP(14,MOLESIDA,""J"",,31)", COMMENT,
04000 Position in ITBL of head of L.L. of page labels of this line;
04100 LEADM(J) = "BP(4,MOLESIDA,""J"",,35)", COMMENT, Number of lead lines to assure if
04200 moved -- this is necessary because blank lines that happen
04300 to show up at the top of a column are deleted, but if the
04400 paragraph they lead is moved down, they must be restored;
04500
04600 COMMENT The last subscript used in MOLES and OWLS is stored in MOLES[0];
00100 COMMENT The symbol table method is hashed strings using quadratic
00200 search. Swinehart's "SYMSER.SAI[1,DCS]" has been used. That
00300 package declares two arrays [-1:SYMNO], where SYMNO+1 is prime.
00400 One array, SYM, holds the strings, and the other, NUMBER, holds
00500 their descriptors. The procedure SETSYM initializes the
00600 package. FLAG←LOOKSYM(STRING A) tells whether the string is in
00700 the table and sets SYMBOL to its index (or the index of where to
00800 enter it if not there). ENTERSYM(STRING A, INTEGER NUM) enters
00900 it in the table at SYMBOL and makes its descriptor be NUM (and
01000 sets ERRFLAG to TRUE and prints a message if the table is full).
01100
01200 The compiler requires that all symbols be unique at any block
01300 level, however, labels are totally global and although each
01400 label must have a different name from every other label, it may
01500 have the same name as another whatsit. Therefore, before a
01600 label is looked up or entered in the symbol table, a colon is
01700 appended to its name to guarantee its distinction. Furthermore,
01800 all lower case letters of every identifier are changed to upper
01900 case for symbol table purposes.
02000
02100 The fields of a descriptor D = NUMBER[SYMBOL] are:
02200 --------------------------------------------
02300 | DEPTH | SYMBOL | TYPE | IX |
02400 --------------------------------------------
02500 0.....4 5...........17 18..21 22..........35 ;
02600
02700 DEPTHWD(DESC) = "BBPP(5,DESC,4)", COMMENT, the block depth;
02800 DEPTHN(S) = "BP(5,NUMBIDA,""S"",+1,4)",
02900 SYMBOLWD(DESC) = "BBPP(13,DESC,17)",
03000 SYMBOLN(S) = "BP(13,NUMBIDA,""S"",+1,17)", COMMENT, This field always equals
03100 s, its subscript in NUMBER. When a local declaration in an
03200 inner block forces an outer definition to be stacked, this
03300 field of the descriptor tells where to restore it;
03400 TYPEWD(DESC) = "BBPP(4,DESC,21)",
03500 TYPEN(S) = "BP(4,NUMBIDA,""S"",+1,21)", COMMENT, The symbol type (listed below);
03600 IXWD(DESC) = "BBPP(14,DESC,35)", COMMENT, depending on TYPE, this may be a
03700 case index or a 14-bit pointer to the definition in some array;
03800 IXN(S) = "BP(14,NUMBIDA,""S"",+1,35)",
03900
04000 COMMENT The descriptor of a label, however, is:
04100 ---------------------------------------
04200 | PLIGHT | zeroes or ones | IX |
04300 ---------------------------------------
04400 0..1 2 ......... 21 22 ..... 35 ;
04500
04600 PLIGHTWD(DESC) = "BBPP(2, DESC, 1)", COMMENT,
04700 1: Referenced but not yet defined. IX is the NUMBER posn of the mentioned Unit (or 0).
04800 2: Defined as the string in STBL[IX].
04900 0|3: Defined as a page label, but the exact page is still uncertain--
05000 DESC is a link to another label in the same plight:
05100 >0--ITBL[DESC], <0--NUMBER[-DESC], =-(2↑13)--end L.L. ;
00100 COMMENT Symbol Type → IX array conversion ;
00200
00300 COMMENT Type IX points to
00400 ---- ------------ ;
00500 GLOBALTYPE="1", COMMENT, Global Variable STBL ;
00600 LOCALTYPE="2", COMMENT, Local Variable SSTK ;
00700 INTERNTYPE="3", COMMENT, Internal Variable none (this is a case index);
00800 MANTYPE="6", COMMENT, MANUS Command Word none (this is a case index);
00900 PORTYPE="10", COMMENT, Portion ITBL ;
01000 PUNITTYPE="11", COMMENT, Print Value of Unit ISTK (same IX as Counter Value) ;
01100 AREATYPE="12", COMMENT, Area ISTK ;
01200 UNITTYPE="13", COMMENT, Unit ISTK ;
01300 MACROTYPE="14", COMMENT, Macro ISTK ;
01400
01500 COMMENT Now the STKs, TBLs, and NESTs will be introduced.
01600
01700 ISTK....
01800
01900 In ISTK are stored:
02000 (a) Modes and Variable Values to be restored upon block exit.
02100 (b) AREA, UNIT, MACRO, and Response Declarations local to this block.
02200 (c) Former margin positions in a NARROW/WIDEN nest.
02300 To push an m-word entry of type T onto ISTK, increment IHED by (m+1),
02400 check for stack overflow, and put the following descriptor
02500 at ISTK(IHED):
02600
02700 ---------------------------------------
02800 | T | SYM subscript | old value of IHED |
02900 ---------------------------------------
03000 0..8 9............21 22...............35
03100
03200 Now store the entries at IHED-1 to IHED-m. The header word at IHED is the
03300 one that IX points to. Note that it is in a linked list which is scanned at
03400 block exit to restore former conditions.
03500
03600 The types T are as follows: ;
03700 COMMENT AREATYPE = "12", COMMENT, Local Area Declaration;
03800 COMMENT UNITTYPE = "13", COMMENT, Local Unit Declaration;
03900 COMMENT MACROTYPE = "14", COMMENT, Local Macro Declaration;
04000 RESPTYPE = "15", COMMENT, Local Response Declaration;
04100 MARGTYPE = "16", COMMENT, Former margin positions in a NARROW//WIDEN Nest;
04200 TURNTYPE = "17", COMMENT, Former <chars><function> pair;
04300 MODETYPE = "18", COMMENT, Mode Words before block entry;
04400 NUMTYPE = "19", COMMENT, Former NUMBER descriptor;
04500 TABTYPE = "20", COMMENT, tab stops ;
04600 MIDTYPE = "21", COMMENT, saved paragraph params for BEFORE|AFTER|footnotes in mid-pgph ;
04700
04800 IXTYPE(ANYIX) = "(ISTK[ANYIX] ROT 9 LAND '777)",
04900 BIXNUM(NAMED) = "BP(13, ISTKIDA, ""NAMED"", , 21)",
05000 IXOLD(ANYIX) = "(ISTK[ANYIX] LAND '37777)",
00100 COMMENT Fields of Entries in ISTK ;
00200
00300 MARGWDS = "4",
00400 LMARGX(MARG) = "ISTK[(MARG)-1]",
00500 RMARGX(MARG) = "ISTK[(MARG)-2]",
00600 OLD_MARGX(MARG) = "ISTK[(MARG)-3]",
00700 AREAX(MARG) = "ISTK[(MARG)-4]", COMMENT, ISTK IX of AREA with these margins ;
00800
00900 TURNWDS = "1", COMMENT, CHR, FUN 7 bits each, to TURN back ON previous meaning;
01000
01100 NUMWDS = "1",
01200 OLD_NUMBER(SYM) = "ISTK[(SYM)-1]",
01300
01400 AREAWDS = "14",
01500 DISD(AREA_UNIT) = "ISTK[(AREA_UNIT)-1]", COMMENT, TRUE if disdeclared ;
01600 FULHIGH(AREA) = "ISTK[(AREA)-2]", COMMENT, 1 iff no LINES clause ;
01700 LINE1(AREA) = "ISTK[(AREA)-3]", COMMENT, Top line number used;
01800 LINECT(AREA) = "ISTK[(AREA)-4]", COMMENT, Number of lines used;
01900 FULWIDE(AREA) = "ISTK[(AREA)-5]", COMMENT, 1 iff no CHARS clause ;
02000 CHAR1(AREA) = "ISTK[(AREA)-6]", COMMENT, Leftmost character position;
02100 CHARCT(AREA) = "ISTK[(AREA)-7]", COMMENT, Width of whole area;
02200 TEXTAR(AREA) = "ISTK[(AREA)-8]", COMMENT, 1=TEXT AREA, 0=TITLE AREA;
02300 COLCT(AREA) = "ISTK[(AREA)-9]", COMMENT, Number of columns;
02400 COLWID(AREA) = "ISTK[(AREA)-10]", COMMENT, Width of each column;
02500 OLD_ACTIVE(AREA) = "ISTK[(AREA)-11]", COMMENT, If Open, array descriptor of active area in OLDPAGE;
02600 NEW_ACTIVE(AREA) = "ISTK[(AREA)-12]", COMMENT, If Open, array descriptor of active area in NEWPAGE;
02700 OPEN_ACTIVE(AREA) = "ISTK[(AREA)-(IF FRAMEIDA=NEWPGIDA THEN 12 ELSE 11)]",
02800 FOOTSTR(AREA) = "ISTK[(AREA)-13]", COMMENT, SSTK subscript of SEND FOOT string ;
02900 MARGINS(AREA) = "ISTK[(AREA)-14]", COMMENT, ISTK IX of MARGTYPE entry ;
03000
03100 UNITWDS = "12",
03200 COMMENT DISD(AREA_UNIT) = "ISTK[(AREA_UNIT)-1]", COMMENT, see area def above;
03300 CTR_INIT(UNIT) = "ISTK[(UNIT)-2]", COMMENT, FROM initial value + 2↑14 ;
03400 CTR_STEP(UNIT) = "ISTK[(UNIT)-3]", COMMENT, BY step-value + 2↑6 ;
03500 PATT_CHRS(UNIT) = "ISTK[(UNIT)-4]", COMMENT, estimate based on chars in patterned TO value;
03600 CTR_CHRS(UNIT) = "ISTK[(UNIT)-5]", COMMENT, estimate based on unpatterned TO value;
03700 PARENT(UNIT) = "ISTK[(UNIT)-6]", COMMENT, IX of parent unit;
03800 PATT_PARENT(UNIT) = "ISTK[(UNIT)-7]", COMMENT, whether ! occurs in pattern;
03900 PATT_ALF(UNIT) = "ISTK[(UNIT)-8]", COMMENT, alphabet to convert CTR_VAL to:
04000 PATT_ALF... 0 1 2 3 4 5
04100 alphabet... template 1 i I a A ;
04200
04300 PATT_STRS(UNIT) = "ISTK[(UNIT)-9]", COMMENT, pointer to strings in SSTK;
04400 SON(UNIT) = "ISTK[(UNIT)-10]", COMMENT, IX of youngest son unit ;
04500 BROTHER(UNIT) = "ISTK[(UNIT)-11]", COMMENT, IX of brother unit ;
04600 IN_LINE(UNIT) = "ISTK[(UNIT)-12]", COMMENT, TRUE if INLINE option present ;
00100 MACROWDS = "4", RESPWDS = "7", SIGWDS = "9",
00200 BODY(DEF) = "ISTK[(DEF)-1]", COMMENT, points to body string in SSTK;
00300 NAMEPAR(MACRO) = "ISTK[(MACRO)-3]", COMMENT, LAND 2↑(ARGS-n) says n'th arg is by name;
00400 NUMARGS(DEF) = "ISTK[(DEF)-2]", COMMENT, no. of formal parameters;
00500 ODDMAC(MACRO) = "ISTK[(MACRO)-4]", COMMENT, 1 for ODD MACRO, 0 for [EVEN] MACRO;
00600 OLD_RESP(RESP) = "ISTK[(RESP)-3]", COMMENT, former response+200 or (<200) breaktable value;
00700 DEPTH_RESP(RESP) = "ISTK[(RESP)-4]", COMMENT, block level (unimplemented) ;
00800 NEXT_RESP(RESP) = "ISTK[(RESP)-5]", COMMENT, another resp. with similar recognizer;
00900 CLUE(RESP) = "ISTK[(RESP)-6]", COMMENT, encoding of the recognizer;
01000 VARIETY(RESP) = "ISTK[(RESP)-7]", COMMENT, see Table below ;
01100 SIGNAL(RESP) = "ISTK[(RESP)-8]", COMMENT, ASCII of Signal;
01200 RESP_SEP(RESP) = "ISTK[(RESP)-9]", COMMENT, ASCII of seps (up to 5), right byte=last sep;
01300
01400 COMMENT NEXT_RESP and CLUE for each VARIETY of response declaration:
01500
01600 Declaration VARIETY CLUE NEXT_RESP with
01700 ----------- ------- ---------------------- --------------
01800 AT <e> 0 Pointer to <e> in SSTK Same 1st letter & 2d letter|non-letter-ness
01900 AT <n> 1 n Next larger n
02000 AT <signal> 2 Number of characters Same first char
02100 AFTER <area|unit> 3 Symb. no. of area|unit (WAITRESP link only)
02200 BEFORE ... 4 " "
02300
02400 ITBL....
02500
02600 Has (1) Labels generated by {PAGE}. The entry looks like a
02700 NUMBER entry for a label, except PLIGHT is never 1.
02800 (2) Portion declarations--NOTE: no word may have left half = '400000;
02900 PORCH(PORT) = "ITBL[PORT]", COMMENT, 0-15: channel SENDing to,
03000 -1: FOOT, -2: declared but never SENT to, -3: sent to & declared but not RECEIVEd,
03100 -4: already RECEIVEd, -5: only mentioned in INSERT, -6: RECEIVEd AND Alphabetized ;
03200 PORSEQ(PORT) = "ITBL[(PORT)-1]", COMMENT, pointer to next PORTION in collating sequence ;
03300 PORFIL(PORT) = "ITBL[(PORT)-2]", COMMENT, ASCII of generated file's first name ;
03400 PORINT(PORT) = "ITBL[(PORT)-3]", COMMENT, ASCII of intermed. file's first name (if 1st in that file);
03500 COMMENT
03600 SSTK....
03700 Has (1) Values of Local Variables
03800 (2) Macro, Response, and Prepare Bodies
03900 (3) Unit PATT_STRS; PATT_VAL(PS) = "SSTK[PS]", COMMENT, current printing value;
04000 CTR_VAL(PS) = "SSTK[(PS)-1]", COMMENT, current counter value ;
04100 PREFIX(PS) = "SSTK[(PS)-2]", COMMENT, before ! OR template;
04200 INFIX(PS) = "SSTK[(PS)-3]", COMMENT, between ! and alphabet;
04300 SUFFIX(PS) = "SSTK[(PS)-4]", COMMENT, after alphabet .
04400 (4) SEND FOOT Strings for each declared AREA.
04500
04600 STBL....
04700 Has (1) Values of Global Variables
04800 (2) Values of Labels (set to '0&<last unit specified--SYMBOL no.>
04900 if undefined, so MANUS can check consistency of use)
05000 (3) Current file-block for every generated file getting sent to;
00100 COMMENT
00200
00300 SNEST...
00400 Has (1) Input strings to scan. They nest due to macro calls,
00500 responses, argument substitutions, RECEIVEs, and
00600 REQUIREs. This nesting is not synchronized with that
00700 of blocks, because a macro or argument body or a source
00800 file may have unmatched BEGINs, etc., so a separate
00900 stack is required.
01000 (2) Saved line number for previous source:
01100 The first six characters are the file name ;
01200 STRSCAN(S) = "SNEST[(S)-1]", COMMENT, a string to scan (STRSCAN(LAST)
01300 is the current one);
01400 LINESCAN(S) = "SNEST[S]", COMMENT, MACLINE or SRCLINE ;
01500
01600 COMMENT
01700
01800 INEST...
01900 Has (1) Input channels to scan. When reading from a file,
02000 just its channel number is kept instead of the whole
02100 string of course. However, a whole line at a time is
02200 stripped and scanned as if it were an input string.
02300 (2) Saved SOS page number for previous input file;
02400 CHANSCAN(S) = "INEST[(S)-1]", COMMENT, the channel number of a file to
02500 scan (CHANSCAN(LAST) is the current one or -1 if none)
02600 TECO files: channel no. stored here excess 100 ;
02700 PAGESCAN(S) = "INEST[S]", COMMENT, LH=PAGEMARKS RH=PAGEWAS Negated by RECEIVE if GEN-file;
02800
02900 COMMENT These are our DEVICE numbers;
03000 LPT = "1",
03100 TTY = "2",
03200 MIC = "3",
03300
03400 COMMENT These are definctions to compare strings;
03500 NULSTR(S) = "(LENGTH(S) = 0)",
03600 FULSTR(S) = "(LENGTH(S) ≠ 0)",
03700 FALSTR(S) = "EQU(S, ""0"")",
03800 TRUESTR(S) = "¬EQU(S, ""0"")",
00100 COMMENT A record of each active frame and area is kept in a dynamically
00200 created array. Swinehart's ARRSER.SAI package creates such
00300 arrays. The array may be represented by an integer descriptor
00400 (we'll call it the array's IDA) which can be assigned to any array
00500 of variable upper bound (the array's ALIAS). Frame and area
00600 records contain IDAs of other records and of dynamic MOLES, OWLS,
00700 and area-arrays. All these arrays must be dynamically created
00800 because their existence is independent of block nests and even of
00900 their declarations -- for example, a BOX and its areas may be held
01000 over for several pages before insertion. THE FIRST ELEMENT OF EACH
01100 SUCH STRING ARRAY IS NOT A STRING BUT A GARBAGE-COLLECT LINK!!!
01200
01300 Two pages may be open at once, due to group overflow or to closing
01400 of one text area while others are still open. ;
01500
01600 COMMENT Here are the Aliases of the dynamic arrays:
01700
01800 IDA ALIAS Represents
01900 --- ----- --------------------------------------
02000 OLDPGIDA OLDPAGE Partly completed open page.
02100 NEWPGIDA NEWPAGE Overflow from OLDPAGE.
02200 FRAMEIDA THISFRAME Record of Frame we're PLACing in (PAGE or BOX).
02300 MOLESIDA MOLES Its MOLES array.
02400 OWLSIDA OWLS Its OWLS array.
02500 AREAIDA THISAREA Record of Area we're placing in.
02600 AA Its Area-Array.
02700 WBOXIDA WAITBOX Head of L.L. of Boxes held over.
02800
02900 A Frame Record is an integer array symbolized THISFRAME[0:PFREC|BFREC]: ;
03000 PFREC = "4", BFREC = "20",
03100 ARF = "THISFRAME[0]", COMMENT, head of LL of its area records;
03200 OWLSF = "THISFRAME[1]", COMMENT, IDA of its OWLS array;
03300 MOLESF = "THISFRAME[2]", COMMENT, IDA of its MOLES array;
03400 HIGHF = "THISFRAME[3]", COMMENT, n HIGH;
03500 WIDEF = "THISFRAME[4]", COMMENT, v WIDE;
03600 COMMENT The rest apply only to a BOX FRAME;
03700 ULLB = "THISFRAME[5]", COMMENT, Upper Left Line covered in containing area INB;
03800 ULCB = "THISFRAME[6]", COMMENT, Upper Left Char covered;
03900 INB = "THISFRAME[7]", COMMENT, symbol no. of containing area;
04000 NEXTB = "THISFRAME[8]", COMMENT, link to next BOX -- two cases:
04100 If this box is held over → next such box in WAITBOX L.L.
04200 Otherwise → next box in this area (BOXA L.L.) ;
04300 comment, NEAR <where> encoded: about 12 words ;
00100 COMMENT An Area Record is an integer array symbolized THISAREA[0:AREC] -- ;
00200 AREC = "11",
00300 AAA = "THISAREA[0]", COMMENT, IDA of Area-Array (a 2-D array);
00400 ARA = "THISAREA[1]", COMMENT, IDA of next area record in this frame (ARF L.L.);
00500 OLD_ACTA = "THISAREA[2]", COMMENT, IDA of area record in up-level frame ;
00600 BOXA = "THISAREA[3]", COMMENT, IDA of first BOX in this area;
00700 INA = "THISAREA[4]", COMMENT, IDA of containing frame;
00800 STATA = "THISAREA[5]", COMMENT, Status:
00900 Unopened=0 Open=1 Closed=2 Dis-Declared=4 ;
01000 DEFA = "THISAREA[6]", COMMENT, ptr to definition in ISTK (or 0 if none);
01100 COMMENT If the area is open-- ;
01200 NBOXA = "THISAREA[7]", COMMENT, number of BOXes in the BOXA L.L.;
01300 COLA = "THISAREA[8]", COMMENT, column we're PLACing in;
01400 COMMENT If the area is closed or dis-declared-- ;
01500 LINECA = "THISAREA[9]", COMMENT, LINECT copied from ISTK ;
01600 COLCA = "THISAREA[10]", COMMENT, COLCT copied from ISTK ;
01700 ULLA = "THISAREA[11]", COMMENT, LINE1(AREA) copied from ISTK;
01800 COMMENT and AA[i,0] tells upper left character posn of column i ;
01900
02000 COMMENT The Area-Array of a D-column M-line area is an integer array AA[1:2*D,0:M].
02100
02200 Column 1 Column 2 Column 3 ...
02300 "Leg" Foot Leg Foot Leg Foot ...
02400 lines already used * AA[1,0] AA[D+1,0] AA[2,0] AA[D+2,0] AA[3,0] AA[D+3,0] ...
02500 J'th line AA[1,J] AA[D+1,J] AA[2,J] AA[D+2,J] AA[3,J] AA[D+3,J] ...
02600 (*): H2=last placed line, H1=lines beneath covered by BOXes;
00100 COMMENT These "mode words" are BLT'ed to ISTK upon block entry ;
00200
00300 MODEWDS = "18" ;
00400
00500 TERNAL INTEGER BREAKM ; comment Break Mode ; DEFINE
00600 FILL="(BREAKM=0)", NOFILL = "(BREAKM≠0)", JUSTJUST="(BREAKM=1)", FLUSHL="(BREAKM=2)",
00700 FLUSHR="(BREAKM=3)", CENTER="(BREAKM=4)", IMPOSE="(BREAKM=5)", VERBATIM="(BREAKM=6)",
00800 REGNOFILL = "(BREAKM=7)" ;
00900 TERNAL INTEGER JUSTM ; DEFINE ADJUST="(JUSTM=1)", NOJUST="(JUSTM=0)" ;
01000 TERNAL INTEGER SPACEM ; DEFINE COMPACT="(SPACEM=2 ∨ FILL∧SPACEM=1)", RETAIN="(¬COMPACT)" ;
01100 TERNAL INTEGER CRBM ; DEFINE CRBREAK="(CRBM=1)", CRSPACE="(CRBM=0)" ;
01200 TERNAL INTEGER TWEENLFM, comment, N-1 from SUPERIMPOSE N;
01300 SINCELFM, comment, count no-LF lines;
01400 FIRSTIM, comment, f from INDENT f,r ;
01500 RESTIM, comment, r from INDENT f,r ;
01600 RIGHTIM, comment, g from INDENT f, r, g ;
01700
01800 GROUPM, comment, GROUP=1 APART=0;
01900 GLINEM, comment, MOLES Posn of 1st output line in the group;
02000 AREAIXM, comment, ISTK posn of Place Area;
02100
02200 LEADFM, comment, PREFACE in FILL mode ;
02300 LEADNM, comment, PREFACE in NOFILL mode ;
02400 SPREADM, comment, SPREAD, e.g., SINGLE SPACE → 1;
02500 ENDCASE, comment, how this block began: BEGIN=1 ONCE=2 BEFORE|AFTER|FOOTNOTES=3 ;
02600 STARTS, comment, clump depth in this block ;
02700 SHED ; comment, Top of SSTK ;
02800
02900 COMMENT Several linked list scans use these macros to generate code.
03000 LLHEAD symbolizes a variable pointing to the first element.
03100 LLNEXT(x) would determine the successor to x. The global variables
03200 LLPREV, LLTHIS, and LLPOST display the result of the scan. ;
03300
03400 DEFINE LLSCAN(LLHEAD, LLNEXT, LLSTOP) = "
03500 BEGIN LLTHIS ← LLHEAD MAX 0 ; LLPREV ← -1 ;
03600 WHILE LLTHIS ∧ ¬(LLSTOP) DO
03700 BEGIN
03800 LLPREV ← LLTHIS ; LLTHIS ← LLNEXT(LLTHIS) ;
03900 END ;
04000 LLPOST ← IF LLTHIS THEN LLNEXT(LLTHIS) ELSE 0 ;
04100 END",
04200 LLSKIP(LLHEAD, LLNEXT) = "
04300 IF LLPREV<0 THEN LLHEAD ← LLPOST
04400 ELSE LLNEXT(LLPREV) ← LLPOST ",
04500 LLINS(LLHEAD, LLNEXT, LLNEW) = "
04600 BEGIN
04700 IF LLPREV < 0 THEN LLHEAD ← LLNEW ELSE LLNEXT(LLPREV) ← LLNEW ;
04800 LLNEXT(LLNEW) ← LLTHIS ;
04900 END",
00100 COMMENT These are for scanners;
00200 LETTS = """!_QWERTYUIOPLKJHGFDSAZXCVBNMzxcvbnmlkjhgfdsaqwertyuiop""",
00300 DIGS = """0123456789""",
00400 CR = "'15", LF = "'12", SP = "'40", TB = "'11", FF = "'14", CRLF = "(CR&LF)",
00500 RUBOUT = "'177", ALTMODE = "'175", VT = "'13",
00600
00700 COMMENT For the parser;
00800 SPASS(X) = "((X&NULL)&PASS)",
00900 IPASS(X) = "((X+0)+PASS)",
01000 DPASS = "BEGIN DCLR_ID←TRUE ; PASS; DCLR_ID←FALSE END",
01100 EMPTYTHIS = "BEGIN THISTYPE ← -EMPTYQ ; THISWD ← NULL END",
01200 EMPTYTHAT = "BEGIN THATTYPE ← -EMPTYQ ; THATWD ← NULL END",
01300 THISISFULL = "(THISTYPE ≠ -EMPTYQ)", THATISFULL = "(THATTYPE ≠ -EMPTYQ)",
01400 THISISID = "(THISTYPE ≥ 0)", THATISID = "(THATTYPE ≥ 0)",
01500 THISISCON = "(THISTYPE = -1)", THATISCON = "(THATTYPE = -1)",
01600 ITS(LIT) = "EQU(THISWD,""LIT"")", ITSV(EX) = "EQU(THISWD,EX)",
01700 NEXTS(LIT) = "EQU(THATWD,""LIT"")", NEXTSV(EX) = "EQU(THATWD,EX)",
01800 ITSCH(CHR) = "THISWD = ""CHR""", NEXTSCH(CHR) = "THATWD = ""CHR""",
01900
02000 COMMENT The character Table CHARTBL categorizes each of the 128 ASCII
02100 characters for both the Parser and the Filler. SPCODE is a
02200 variable field set by TURN ON (and reset by TURN OFF) to a value
02300 fetched from the constant field SPCHAR.;
02400
02500 UPCASE(CH) = "BBPP(7, CHARTBL[0], 6) + (CH)",
02600 FAMILY(CH) = "BBPP(5, CHARTBL[0], 11) + (CH)",
02700 SPECIES(CH) = "BBPP(5, CHARTBL[0], 17) + (CH)",
02800 SPCODE(CH) = "BBPP(6, CHARTBL[0], 35) + (CH)",
02900 SPCHAR(CH) = "BBPP(6, CHARTBL[0], 26) + (CH)",
03000 COMMENT and Bit 29 is set for Invisibles ;
03100
03200 COMMENT Table of Character Families and Species
03300
03400 S P E C I E S
03500 F A M I L Y 0 1 2 3 4 5 6 ..... 26
03600 ---------------- ----- ------- ------- -------- ----- ----- ----- ---- ;
03700 LETTQ = " 0", COMMENT, Aa Bb Cc Dd Ee Ff Gg .... !_ ;
03800 DIGQ = " 1", COMMENT, 0 1 2 3 4 5 6 ... ;
03900 EMPTYQ = " 2" ,
04000 TERQ = " 3", COMMENT, } ; COMMENT ) , ] ⊂ ;
04100 QUOTEQ = " 4", COMMENT, " ' ;
04200 CURLYQ = " 5", COMMENT, { ;
04300 BROKQ = " 6", COMMENT, [ ;
04400 MULQ = " 7", COMMENT, * / DIV % MOD & ;
04500 ADDQ = " 8", COMMENT, + - EQV≡ABS ↑ XOR⊗LENGTH ;
04600 BOUNDQ = " 9", COMMENT, MAX MIN ;
04700 ODDQ = "10" , COMMENT, EVEN ODD ;
04800 RELQ = "11", COMMENT, < > = ≤ LEQ ≥ GEQ ≠ NEQ ;
04900 NOTQ = "12", COMMENT, ¬ NOT ;
05000 ANDQ = "13", COMMENT, ∧ AND ;
05100 ORQ = "14", COMMENT, ∨ OR ;
05200 MISCQ = "15", COMMENT, rest : ← ( ∞ @ | ε ;
05300 MISCMAX = "7", COMMENT, Highest numbered species in MISCQ ;
00100 COMMENT Run-of-mill defines;
00200 THRU = "STEP 1 UNTIL",
00300 DOWN = "STEP -1 UNTIL",
00400 FALSE = "0", TRUE = "-1",
00500 LOPP(STR) = "DUMMY ← LOP(STR)",
00600 COPY(STR) = "BEGIN STR ← 0&STR ; LOPP(STR) END",
00700 LH(X) = "((X) LSH -18 LAND '777777)",
00800 RH(X) = "((X) LAND '777777)",
00900 LHRH(X,Y) = "((X) LSH 18 LOR (Y))",
01000 WDBRK = "'175", FONTCHAR = "'177",
01100 CVSR(N) = "CVS(N) & ALTMODE",
01200
01300 COMMENT Break Tables;
01400 TO_VT_SKIP = "15",
01500 TO_COMMA_RPAR = "14",
01600 TO_TERQ_CR = "13",
01700 TO_SEMI_SKIP = "12", COMMENT, for COMMENT comments;
01800 NO_CHARS = "11",
01900 ONE_CHAR = "10", COMMENT, break on aything and append;
02000 LOCAL_TABLE = "9", COMMENT, Do a SETBREAK before using this one;
02100 TO_TB_FF_SKIP = "8", COMMENT, to scan a line number (ignores line feed);
02200 TO_LF_TB_VT_SKIP = "7", COMMENT, to swallow a whole line;
02300 TO_VISIBLE = "6",
02400 ALPHA = "5",
02500 DIGITA = "4",
02600 TO_QUOTE_APPD = "3",
02700 TO_NON_SP = "2",
02800 TEXT_TBL = "1",
02900 TO_CR_SKIP = "16", COMMENT for VERBATIM text lines ;
03000 TO_VBAR_SKIP = "17",
03100 DEFN_TABLE = "18",
03200
03300 COMMENT Buggy Printout ;
03400 DARN = "WARN",
03500 λ = "& "","" &",
03600 VS(SVAR) = " "" SVAR="" & SVAR ",
03700 VI(IVAR) = " "" IVAR="" & CVS(IVAR) ",
03800 MESSMAX = "3",
03900
04000 VIRGIN = "NULL" ; NB End DEFINE ;
00100 TERNAL SAFE INTEGER ARRAY
00200 PHRASED[0:26,0:27], COMMENT, trigger phrase response search on first two letters;
00300 SIGNALD[0:127], COMMENT, detect last character of signal to trigger response search;
00400 CHARTBL[0:150], COMMENT, current classification and mapping of characters;
00500 INPG[0:10], COMMENT, 1 to 10 mTnP options;
00600 TABSORT[1:28], COMMENT, tab stops in increasing order;
00700 CHANLS[0:15], COMMENT, IDA of SEND portion assigned to each channel, if positive ;
00800 ETCIARRAYS[0:0];
00900
01000 PRELOAD "MONTH TABLE", "January ", "February ", "March ", "April ",
01100 "May ", "June ", "July ", "August ", "September ", "October ",
01200 "November ", "December " ;
01300 TERNAL STRING ARRAY
01400 MONTH[0:12], COMMENT, To compute DATE for macros to print ;
01500 MESSAGE[1:MESSMAX], COMMENT, Short error messages to print on document in D mode. ;
01600 NULLS[0:10], COMMENT, always NULLs;
01700 BLKNAMES[0:40], COMMENT, clump and block names ;
01800 ETCSARRAYS[0:0] ;
01900
02000 PRELOAD
02100 "ADJUST", "AFTER", "APART", "AREA", "AT",
02200 "BEFORE", "BEGIN", "BELOW", "BOXFRAME", "BREAK",
02300 "CC", "CENTER", "CLOSE", "COMMANDCHARACTER", "COMMENT",
02400 "COMPACT", "CONTINUE", "COUNT", "CRBREAK", "CRSPACE",
02500 "DEVICE",
02600 "END",
02700 "FILL", "FLUSHLEFT", "FLUSHRIGHT",
02800 "GROUP", "GROUPSKIP",
02900 "IF", "INDENT", "INSERT",
03000 "JUSTJUST",
03100 "LET", "LOCK",
03200 "MACRO",
03300 "NARROW", "NEXT", "NOFILL", "NOJUST",
03400 "ONCE",
03500 "PACK", "PAGEFRAME", "PLACE", "PORTION", "PREFACE",
03600 "RECEIVE", "RECURSIVEMACRO", "REQUIRE", "RETAIN",
03700 "SEND", "SHOW", "SKIP", "START", "SUPERIMPOSE",
03800 "TABS", "TEXTAREA", "TITLEAREA", "TURNOFF", "TURNON",
03900 "VARIABLE", "VERBATIM",
04000 "WIDEN",
04100 NULL ;
04200 TERNAL STRING ARRAY MANWD[0:61] ; comment, Only first words of commands are reserved ;
04300
04400 PRELOAD NULL, " ", " ", " ", " ", " ", " ",
04500 " ", " ", " ", " " ;
04600 TERNAL SAFE STRING ARRAY SPSARR[0:10] ;
00100 DEFINE DSCR="COMMENT ";
00200 DSCR **** DYNAMIC ARRAY MANIPULATION PACKAGE ****
00300
00400
00500
00600 ;
00700
00800
00900 DEFINE TEMPO="'14", LPSA="'13";
01000 EXTERNAL INTEGER SIMPLE PROCEDURE LRMAK(INTEGER L,H,D);
01100 EXTERNAL INTEGER SIMPLE PROCEDURE LRCOP(INTEGER A);
01200 EXTERNAL SIMPLE PROCEDURE ARYEL(INTEGER I);
01300
01400 DSCR PTR ← CREATE(LOWBND,HIBND)
01500 CAL MACRO -- EXPRESSION
01600 PAR LOWBND IS LOWER BOUND FOR INTEGER ARRAY
01700 HIBND IS UPPER BOUND
01800 RES PTR IS AN ARRAY DESCRIPTOR
01900 DES CALLS LRMAK TO GET AN UNMARKED ARRAY
02000 ;
02100
02200 DEFINE CREATE(L,H)= "LRMAK(L,H,1)";
02300
02400 DSCR MAKEBE(PTR,ARRAY)
02500 CAL MACRO -- STATEMENT
02600 PAR PTR IS INTEGER HOLDING ARRAY DESCRIPTOR
02700 ARRAY IS DUMMY TO RECEIVE DESCRIPTOR (DON'T LEAVE THAT BLOCK!)
02800 DES EFFECT IS "ARRAY←PTR", BUT SAIL WON'T DO THAT DIRECTLY
02900 ;
03000
03100 DEFINE MAKEBE(I,A)="
03200 START_CODE
03300 MOVE TEMPO,I;
03400 MOVEM TEMPO,A;
03500 END ";
03600
03700 DEFINE IDASSIGN(EX,ALIAS)="BEGIN DUMMY←EX;
03800 IF DUMMY ≤ 0 THEN WARN(NULL,""NEGATIVE ALIAS FOR INTEGER ARRAY"") ELSE comment ************* ;
03900 MAKEBE(DUMMY, ALIAS) END" ;
04000
04100 DEFINE SMAKEBE(I, A) = "START_CODE HRRO TEMPO,I ; MOVEM TEMPO, A ; END",
04200 SAT(A, STRS) = "START_CODE MOVE 1,A ; MOVE 2,STRS ; MOVEM 2,-1(1) ; END",
04300 SIDASSIGN(EX, ALIAS) = "BEGIN DUMMY←EX ; SMAKEBE(DUMMY, ALIAS) END" ;
00100 TERNAL INTEGER
00200 SYMNO, comment, size of hashed SYMBOL Table;
00300 XSYMNO, comment, size of SYM and NUMBER--first SYMNO elemts hash-searched, rest linear- searched;
00400 ISIZE, SSIZE, ITSIZE, STSIZE, SIZE, comment of ISTK,SSTK,ITBL,STBL,NESTs;
00500 IHED, IHIGH, SHIGH, LAST, comment last used (highest unavailable) subscript;
00600 OLX,NOLX,GRPOLX,GRPTOP, OLXX, OLMAX, comment,
00700 used words of OWLS, LENGTH(OWLS), total of all declared areas;
00800 EOF, BRC, FLAG, comment, I/O control variables;
00900 CONTENTS, DEBUG, DEVICE, comment, RPG-derived switches;
01000 LMARG, RMARG, comment, margin settings in this area;
01100 OAKS,POSN, BRKPT,BRKPOSN,BRKFAKE, BRKABX, BRKBLX,
01200 BRKSPCS, JUSTIFY, LASTWDBRK, BRKPLBL, TABI,RBOUND,
01300 MAXIM,FMAXIM,NMAXIM, comment, Line-Filler (OWL) variables;
01400 STANDARD, comment, ptr to def in ISTK of MACRO !STANDARD;
01500 INSETS, comment, ptr to AT <n> of smallest n (ISTK ptr);
01600 INPUTCHAN, TECOFILE, comment, current input channel ;
01700 INPGS, INPGX,comment, last and current subscript in array INPG of mTnP options;
01800 ONE, comment, 1 for variable upper bound of ALIAS arrays;
01900 TAG, comment, STBL address of variable TAG;
02000 MANUS_SKIP_, comment, _SKIP_ value after execution of MANUS substring operation;
02100 INF, comment, ∞ value for current MANUS substring spec;
02200 I, J, K, L, M, N, DUMMY, comment, short-term loan currency ;
02300 DEPTH, comment, block depth -- MANWDS are at 0, main program at 1;
02400 ON, comment, FALSE if parsing false part of conditional or if defining a response body;
02500 FHIGH, FWIDE, PHIGH, PWIDE, comment, Dimensions of the current Frame and Page Frame;
02600 EPSCHAR, comment, char serving { function ;
02700 PAGEMARKS, PAGEWAS, comment, no. of PM's on this page: passed, responded to ;
02800 RESP_BODY, comment, TRUE if defining a response body;
02900 DCLR_LET, comment, TRUE if scanning after = of `LET X=..';
03000 DCLR_ID, comment, TRUE if in a declaration scanning an identifier that is to be declared;
03100 DEFINING, comment TRUE if reading ⊂definition⊃ ;
03200 WAITRESP, comment, head of LL of Responses to undeclared areas and units;
03300 LEADRESPS, comment, head of LL of "AT n" responses, in ascending order by n ;
03400 COMMAND_CHARACTER, TAB_CHARACTER,
03500 PORTS, THISPORT, SEQPORT, PORTLL, comment, Portions: # of, last declared, last in seq, seq LL;
03600 INTER, SINTER, INTERS, comment Intermediate output channel, no. of intermediate output files ;
03700 STATUS, comment, Current place area UNOPENED (0), OPEN (1), CLOSED (2), GONE (3) ;
03800 OLDPGIDA, NEWPGIDA, FRAMEIDA, MOLESIDA, OWLSIDA, AREAIDA, WBOXIDA,
03900 SYMIDA, NUMBIDA, ISTKIDA, SSTKIDA, ITBLIDA, STBLIDA, INESTIDA, SNESTIDA,
04000 BYTEWD, comment, lots of byte pointers point here ;
04100 COLS, COL, PAL, LINES, LINE, PINE, COVERED, UNDEAD, comment, Current position in place area ;
04200 NULLAREAS, comment, LL of Made but Unopened areas (Status=0) ;
04300 PREFMODE, comment, n from nS option ;
04400 BLNMS, comment, top of BLKNAMES stack ;
04500 MYEND, comment flag for END routines (see TOEND in MAN.SAI) ;
04600 FOOTTOP, comment TRUE iff expecting 1st line of 1st footnote belonging to a body line;
04700 OWLSEQ, comment, counts total output lines red'd by OWLS arrays ;
04800 WISTK, WITBL, WINEST, WSSTK, WSTBL, WSNEST, WSYM, WNUMBER,
04900 WOLDPAGE, WNEWPAGE, WTHISFRAME, WMOLES, WNMOLES,
05000 WOWLS, WNOWLS, WTHISAREA, WWAITBOX, WAVAILREC,
05100 WAA, WNAA, comment, WHATIS(dummy arrays) ;
00100 UPCAS3, UPCAS5, UPCAS6, comment, byte pointers for CAPITALIZE,STRLSS;
00200 SYMTYPE, SYMIX, comment, fields of a descr. looked up by SIMLOOK or SIMNUM;
00300 LONG, comment TRUE in a LONG etc. command;
00400 SYMPAGE, IXPAGE, PATPAGE, comment, SYM subscript, IX field, counter subscript for PAGE;
00500 IXCOMMENT, IXEND, IXFOOT, IXTAG, comment, IX fields for reserved words;
00600 SYMTEXT, IXTEXT,
00700 LLPREV, LLTHIS, LLPOST, comment, results of LLSCAN (a macro) ;
00800 AMSAND, LBRACK, UARROW, DARROW, UNDERBAR, comment SPCHAR codes of & [ ↑ ↓ _ ;
00900 EXNEXTPAGE, comment TRUE while executing NEXT PAGE (prevents recursion) ;
01000 MESGS, comment, how many messages in MESSAGE[] ;
01100 GENSYM ;
01200
01300 TERNAL STRING
01400 C!, !, comment C and P-values of incremented counter after NEXT statement;
01500 INPUTSTR, comment, current input string;
01600 LIT_ENTITY, LIT_TRAIL, comment,
01700 for the entity in THATWD: its literal input form & trailing spaces;
01800 TEXT_BRC, comment, break characters (always including CR LF SP ALTMODE RUBOUT -.?! );
01900 DEFN_BRC, comment, break characters (char serving as {, also }, LF, ⊂, ⊃, ∃, letters) ;
02000 SIG_BRC, comment, break characters for Signals (first char of each signal) ;
02100 PAGEVAL, comment, the P-value of this PAGE when it was opened ;
02200 SRCPAGE, SRCLINE, MACLINE, LSTOP, comment, input file line nos.;
02300 INFILE, OUTFILE, TMPFILE, comment, RPG-determined file names;
02400 MAINFILE, comment first name of INFILE, filled out with colons to 6 chars ;
02500 THISFILE, comment, the first name of the file being read now, colon-filled ;
02600 LIBPPN, comment usually [1,TES], but [2,TES] if logged in as [2,TES] ;
02700 OWL, LBF, OLBF, comment, Line-Filler variables ;
02800 DUMMYSTR, S, comment, just strings to throw around;
02900 THISWD,THATWD, comment, this (ITS) and sometimes next entity from scanner;
03000 CHARSP, comment, SPCHAR to character convert table ;
03100 FOOTSEP, comment, line to draw above footnotes ;
03200 STR1, STR2, STR3, comment temporaries ;
03300 DELINT, comment, Delete Intermediate Files Option Y/N/A ;
03400 ETCS;
03500
03600 EXTERNAL INTEGER RPGSW, _SKIP_ ;
03700
03800 TERNAL INTEGER
03900 comment, BEGINBLOCK BLT's these to ISTK (keep them together): ;
04000 THISTYPE,THATTYPE, comment, THATTYPE is parser type of THATWD:
04100 -2=EMPTYQ ≥0=IDENTIFIER(exact value is no. of trailing spaces)
04200 THISTYPE is parser type of THISWD:
04300 1..15=TYPEN(ID symbol) 0=Undeclared ID
04400 -1=CONSTANT -2=EMPTYQ ≤-3=SP.CHAR.(-FAMILY no.);
04500 SYMB, comment, the SYM subscript of THISWD, if THISISID;
04600 IX, comment, the IX field of NUMBER for THISWD, if THISISID;
04700 STARPOSN, RIPTPOSNS, AMPPOSN,
04800 PLBL,FIRST,NOPGPH,SPCS,ABOVEX,BELOWX,HEIGHT,SUPERSUB,
04900 UNDERLINING,FAKE,MIDWORD,PUNC,INDENT,LBP,LBO,LBK,ILBF ;
05000 DEFINE SOMEWDS="4",MIDWDS="24" ; comment, how many variables in above list ;