perm filename PAGES.SAI[PUB,TES] blob
sn#129302 filedate 1974-11-07 generic text, type T, neo UTF8
00100 BEGOF("PAGES")
00200
00300 COMMENT
00400
00500 All the output lines tentatively placed in the current frame are
00600 stored in intermediate files and referenced by sequential number from
00700 the integer array OWLS (OWtput LineS). Its length is sufficient to
00800 hold every line of every column of every area in it. The general
00900 form of a string referenced from OWLS is:
01000
01100 <chars><cr><chars><cr>...<lf>
01200
01300 One of the <chars> (the last) may be a line that needs to be
01400 justified in Pass Two. Each word break in such a substring is
01500 represented by a ALTMODE -- these mark the places that extra spaces
01600 may be added. Pass Two also needs to know about FONT changes -- in
01700 the present version, this is limited to underlining, superscripts,
01800 and subscripts. A FONT change is signalled by the character pair
01900 '177 <code>. Finally, Pass Two will fill in forward references
02000 marked '13 (vertical tab).
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 justify-line
02400 during Pass Two, and there must be mobility restrictions to assure
02500 that groups stay together and that section titles stay at tops of
02600 pages. This information is kept in integer arrays SHORT and MOLES
02700 (MObility of LinES) of the same size as OWLS. MOLES[J] is the
02800 descriptor for OWLS[J]. To access these entries, the value J is
02900 stored in an "area array" associated with the area the line was
03000 placed in, at element [C,L] for the C'th column and L'th line.
03100
03200 A Moles descriptor looks like this:
03300
03400 --------------------------------------------------
03500 | | |L|H|L|R|A|B| | |
03600 | | |O|O|E|I|B|E| | |
03700 |UN-USED| FOOT |C|R|F|G|O|L| LABEL | LEAD |
03800 | | |K|I|T|H|V|O| | |
03900 | | | |Z| |T|E|W| | |
04000 --------------------------------------------------
04100 0.....6 7.....11-2-3-4-5-6-7-18..........31 32..35
04200
04300 Another array parallel to SHORT and MOLES is MLEAD. When an entry is
04400 zero, it means that the mill leading above the line is the normal
04500 value MILLVERTI (initiallized in OWLPLACE inside PASTE). A nonzero
04600 value is added to MILLVERTI in pass 2 to compute the unusual mill
04700 leading of the line.
04800
04900 ;
05000
05100 PROCEDURES
00100 PUBLIC SIMPLE PROCEDURE PAGES! ;$"#
00200 BEGIN "PAGES!"
00300 OLX ← -1 ; OLMAX ← 5 ;
00400 OWLSEQ ← MESGS ← 0 ;
00500 END "PAGES!" ;
00100 PUBLIC SIMPLE PROCEDURE FINIPAGES ;$"#
00200 BEGIN "FINIPAGES"
00300 COMMENT Finish Last Page File ;
00400 IF INTER GEQ 0 THEN
00500 BEGIN
00600 FOR DUMMY←1 THRU 5 DO WORDOUT(INTER,-20) ;
00700 RELEASE(INTER) ;
00800 RELEASE(SINTER) ;
00900 END ;
01000 END "FINIPAGES" ;
00100 PUBLIC RECURSIVE PROCEDURE DBLANKPAGE ;$"#
00200 BEGIN COMMENT LEAVE N BLANK PAGES WITHOUT AFFECTING THE PAGE NUMBER ;
00300 INTEGER I, J, N ;
00400 PASS ; N ← CVD(E("1", NULL)) ;
00500 IF NOT ON THEN RETURN ;
00600 DBREAK ;
00700 IF OLDPGIDA THEN NEXTPAGE ;
00800 IF INTER LEQ 0 THEN NOPORTION ;
00900 FOR I ← 1 THRU N DO
00950 FOR J ← PHIGH, PWIDE, EVENLEFTBORDER, ODDLEFTBORDER, -10 DO
00975 WORDOUT(INTER, J) ;
01000 END ;
00100 PUBLIC RECURSIVE PROCEDURE DFRAME(BOOLEAN BOXFRM) ;$"#
00200 BEGIN
00300 INTEGER L, I ;
00400 PRELOAD!WITH "HIGH", "WIDE" ; OWN STRING ARRAY POST[1:2];
00500 STRING ARRAY PAR[1:2] ;
00600 DAPART ; PASS ; PARAMS(2,NULLS,PAR,POST);
00700 IF ON THEN
00800 IF BOXFRM THEN BEGIN END
00900 ELSE
01000 BEGIN
01100 PHIGH←FHIGH←IF NULSTR(PAR[1]) THEN 1 ELSE CVD(PAR[1]) ;
01200 PWIDE←FWIDE←IF NULSTR(PAR[2]) THEN 1 ELSE CVD(PAR[2]) ;
01300 IF OLDPGIDA THEN NEXTPAGE ;
01400 L ← NULLAREAS ;
01500 WHILE L DO BEGIN
01600 I ← AREAIDA ; IDASSIGN(AREAIDA←L,THISAREA) ; L ← RH(INA) ;
01700 OPEN!ACTIVE(DEFA) ← 0 ; GOAWAY(AREAIDA) ; IF (AREAIDA←I) THEN IDASSIGN(AREAIDA,THISAREA) ;
01800 END ;
01900 NULLAREAS ← 0 ;
02000 END ;
02100 END "DFRAME" ;
00100 PUBLIC PROCEDURE FINPAGE ;$"#
00200 BEGIN "FINPAGE" COMMENT ***T EMPO RA RY V ERS I ON -- No Boxes **** ;
00300 INTEGER A, CS, LS, C, L, X, LB, LBPAGE, LINK, LINENO, FOOTLINE1, F, OWLINE, ARIX ;
00400 INTEGER NULINE, NUPINE, NUINE, NLFOOT, NPFOOT, NFOOT, NAREA ;
00500 IF EXNEXTPAGE THEN BEGIN WARN("=","Response to PAGE change called NEXT PAGE again.") ; RETURN END ;
00600 EXNEXTPAGE ← TRUE ;
00700 BEGIN "PAGEOUT"
00800 COMMENT PASS 1 OUTPUT FORMAT FOR EACH PAGE :
00900 Height Width MillLeftMargin MillRightMargin
01000 For each area:
01100 UpperLine NumCols NumLines
01200 For each column:
01300 LeftChar
01400 For each non-null line:
01500 LineNo
01600 How far short of being justified
01700 Excess mill leading
01800 Index of Intermediate Ascii File line
01900 0
02000 -10
02100 ;
02200 IF OLDPGIDA NEQ FRAMEIDA THEN BEGIN WARN("=","FRAME NEQ PAGE at end of page"); FIXFRAME(OLDPGIDA) END ;
02300 IF AREAIDA AND AREAIXM AND STATUS=1 THEN CLOSEAREA(AREAIXM, FALSE) ;
02400 IF (A ← ARF) THEN
02500 BEGIN "NONEMPTY"
02600 INTEGER ARRAY XTRALINES[1:HIGHF]; RKJ TO FIXUP "TOPLINES" OF AREAS;
02700 IF INTER LEQ 0 THEN NOPORTION ;
02800 LS←0;
02900 WHILE A DO BEGIN "COLLECTXGENS"
03000 IDASSIGN(AREAIDA←A, THISAREA) ; A ← ARA ; IDASSIGN(AAA, AA) ;
03100 IF STATA THEN LS ← LS + (XTRALINES[ULLA MAX 1] ← XGENA);
03200 END "COLLECTXGENS";
03300 A←ARF;
03400 WORDOUT(INTER, HIGHF+LS) ; WORDOUT(INTER, WIDEF) ;
03500 L ← ODDLEFTBORDER ; F ← EVENLEFTBORDER ;
03600 IF NULSTR(S←CTR!VAL(PATPAGE)) OR CVD(S) MOD 2 THEN F SWAP L ;
03700 WORDOUT(INTER, F) ; WORDOUT(INTER, L) ; TES 8/29/74;
03800 WHILE A DO BEGIN "AFTER AREA RESPONSES"
03900 IDASSIGN(AREAIDA←A, THISAREA) ; A ← ARA ; IDASSIGN(AAA, AA) ;
04000 IF (X ← DEFA) AND STATA=1 AND FINDTRAN(LDB(BIXNUM(X)), 3) THEN RESPOND(LLTHIS) ;
04100 END "AFTER AREA RESPONSES" ;
04200 A ← ARF ;
04300 WHILE A DO BEGIN "CLOSE ALL AREAS"
04400 IDASSIGN(AREAIDA←A, THISAREA) ; A ← ARA ; IDASSIGN(AAA, AA) ;
04500 IF STATA = 1 THEN CLOSEAREA(-DEFA, FALSE) ;
04600 END "CLOSE ALL AREAS" ;
04700 A ← ARF ;
04800 WHILE A DO
04900 BEGIN "AREAOUT"
05000 IDASSIGN(AREAIDA←A, THISAREA) ; NAREA ← 0 ; IDASSIGN(AAA, AA) ;
05100 IF STATA > 1 THEN
05200 BEGIN "AREAUSED" TES CHANGED X TO ARIX 12/5/73 ;
05300 IF GRPOLX AND (STATUS←STATA)=2 AND (ARIX ← DEFA) THEN
05400 BEGIN COMMENT SET UP GROUP OVERFLOW INFO ;
05500 FIXFRAME(NEWPGIDA) ; OPENAREA(ARIX) ; NAREA ← AREAIDA ;
05600 IDASSIGN(AAA, NAA) ; NLFOOT←NPFOOT←NULINE←NUPINE←0 ;
05700 FIXFRAME(OLDPGIDA) ; IDASSIGN(AREAIDA←A, THISAREA) ;
05800 IDASSIGN(AAA, AA) ;
05900 END ;
06000 CS ← COLCA ;
06100 LS ← ARRINFO(AA, 4) ; TES 11/6/74;
06200 F←0; RKJ;
06300 FOR C←1 THRU ULLA-1 DO F←F+XTRALINES[C];
06350 RKJ SEE IF ANY AREAS ABOVE THIS ONE HAVE "XTRALINES";
06400 WORDOUT(INTER, ULLA+F) ; RKJ ADDED F;
06475 WORDOUT(INTER, CS) ; WORDOUT(INTER, LS) ;
06500 FOR C ← 1 THRU CS DO
06600 BEGIN "AREACOL"
06650 WORDOUT(INTER, AA[C,0]) ;
06675 FOOTLINE1 ← LINECA+XGENA - RH(AA[CS+C,0]) ; TES 11/6/74 ;
06700 FOR F ← 0, CS DO FOR L ← 1 THRU LS DO IF (X ← AA[F+C, L]) THEN
06800 IF GRPOLX = 0 OR X < GRPOLX OR X > GRPTOP THEN
06900 BEGIN "AREALINE" LINENO ← IF F=0 THEN L ELSE FOOTLINE1 + L ;
07000 IF (LB ← LDB(LABELM(X))) THEN
07100 BEGIN "A PAGE LABEL"
07200 LBPAGE ← 2 ROT -2 LOR PUTS(PAGEVAL&
07300 (IF XCRIBL THEN ALTMODE&CVS(XLENGTH(PAGEVAL)) ELSE NULL)) ;
07400 WHILE LB NEQ -TWO(13) DO
07500 IF (LINK ← LB) < 0 THEN
07600 BEGIN
07700 LB←NUMBER[-LINK] ;
07800 NUMBER[-LINK] ← LBPAGE ;
07900 END
08000 ELSE BEGIN LB←ITBL[LINK] ; ITBL[LINK]←LBPAGE END ;
08100 END "A PAGE LABEL" ;
08200 IF OWLINE ← OWLS[X] THEN
08300 BEGIN
08400 WORDOUT(INTER, LINENO) ;
08500 WORDOUT(INTER, SHORT[X]) ;
08600 WORDOUT(INTER, MLEAD[X]) ;
08700 WORDOUT(INTER, OWLINE) ;
08800 END ;
08900 END "AREALINE"
09000 ELSE BEGIN "GRP OVERFLOW"
09100 IF F AND NUPINE=0 AND GRPOLX>AA[F+C,1] THEN TES 11/5,12/11/73 ;
09200 BEGIN "FOOTSP"
09300 FOR NUPINE←1 THRU FTGP DO
09400 NAA[F+1,NUPINE] ←
09500 TES 1/16/74 NEWNEW: ;
09600 NEWNEWBLANK(IF NUPINE=1 THEN BLW ELSE ABV!BLW) ;
09700 NAA[F+1,NUPINE]←NOLX←NOLX+1 ;
09800 NOWLS[NOLX] ← OWLSEQ ← OWLSEQ+1 ;
09900 IF XCRIBL THEN
10000 OUT(SINTER,CVSR(OWLSEQ)&ALTMODE&
10100 PICKFONT(FSFONT)&ENOUGH(FOOTSEP,COLWID(AREAIXM),FSFONT)&CRLF)
10200 ELSE
10300 OUT(SINTER, CVSR(OWLSEQ) & ALTMODE &
10400 FOOTSEP[1 TO COLWID(ARIX)] & CRLF) ;
10500 NMOLES[NOLX] ← IF FTGP=0 THEN BLW ELSE ABV!BLW ;
10600 FOR LB←NUPINE+1 THRU NUPINE+FTGP2 DO
10700 NAA[F+1,LB] ← NEWNEWBLANK(ABV!BLW) ;
10800 NUPINE ← NUPINE + FTGP2 ;
10900 END "FOOTSP" ;
11000 NUINE ← IF F THEN NUPINE ← NUPINE + 1 ELSE NULINE ← NULINE + 1 ;
11100 NFOOT ← IF LDB(FOOTM(X)) = 0 THEN 0
11200 ELSE IF F THEN NPFOOT←NPFOOT+1 ELSE NLFOOT←NLFOOT+1 ;
11300 NAA[F+1, NUINE] ← NOLX ← NOLX + 1 ; NOWLS[NOLX] ← OWLS[X] ;
11400 IF NFOOT THEN DPB(NFOOT, FOOTM(X)) ;
11500 NMOLES[NOLX] ← MOLES[X] ;
11600 NSHORT[NOLX] ← SHORT[X] ;
11700 NMLEAD[NOLX] ← MLEAD[X] ;
11800 END "GRP OVERFLOW" ;
11900 WORDOUT(INTER, 0) ;
12000 END "AREACOL" ;
12100 END "AREAUSED" ;
12200 A ← ARA ;
12300 GOAWAY(WHATIS(AA)) ; GOAWAY(AREAIDA) ;
12400 IF NAREA THEN
12500 BEGIN
12600 NAA[1, 0] ← NULINE ; NAA[CS+1, 0] ← NUPINE ;
12700 IDASSIGN(AREAIDA←NAREA, THISAREA) ; COLA ← 1 ; AREAIDA ← 0 ;
12800 END ;
12900 END "AREAOUT" ;
13000 WORDOUT(INTER, -10) ;
13100 END "NONEMPTY" ;
13200 GOAWAY(MOLESIDA) ; GOAWAY(SHORTIDA) ; GOAWAY(MLEADIDA) ;
13300 GOAWAY(-1 LSH 18 + OWLSIDA) ;
13400 MOLESIDA ← MLEADIDA ← SHORTIDA ← OWLSIDA ← GROUPM ← GLINEM ← 0 ;
13500 GOAWAY(FRAMEIDA) ; FRAMEIDA ← OLDPGIDA ← AREAIDA ← 0 ; STATUS ← -1 ;
13600 END "PAGEOUT" ;
13700 IF GRPOLX THEN GRPOLX ← 0 ;
13800 EXNEXTPAGE ← FALSE ;
13900 OVEREST ← 0; comment short font kludge ;
14000 END "FINPAGE" ;
00100 PUBLIC SIMPLE PROCEDURE FIXFRAME(INTEGER FRIDA) ;$"#
00200 BEGIN "FIXFRAME"
00300 IF AREAIDA AND STATUS=1 THEN PLACE(AREAIXM) ; COMMENT BE SURE LINE,PINE STORED IN AA ;
00400 IF MOLESIDA THEN MOLES[0] ← OLX ; TES 1/15/74 ADDED IF.. ;
00500 IDASSIGN(FRAMEIDA ← FRIDA, THISFRAME) ;
00600 IDASSIGN(OWLSIDA ← OWLSF, OWLS) ;
00700 IDASSIGN(MOLESIDA ← MOLESF, MOLES) ;
00800 IDASSIGN(SHORTIDA ← SHORTF, SHORT) ;
00900 IDASSIGN(MLEADIDA ← MLEADF, MLEAD) ;
01000 OLX ← MOLES[0] ; AREAIDA ← 0 ;
01100 END "FIXFRAME" ;
00100 PUBLIC SIMPLE PROCEDURE GROWOWLS(INTEGER EXTRA) ;$"#
00200 BEGIN "GROWOWLS"
00300 GROW(MOLES, MOLESIDA, OLXX, EXTRA, NULL) ; MAKEBE(MOLESIDA, MOLES) ;
00400 GROW(SHORT, SHORTIDA, DUMMY←0, EXTRA, NULL) ; MAKEBE(SHORTIDA, SHORT) ;
00500 GROW(MLEAD, MLEADIDA, DUMMY←0, EXTRA, NULL) ; MAKEBE(MLEADIDA, MLEAD) ;
00600 DUMMY ← 0 ; COMMENT OTHERWISE SPURIOUS MESSAGE FROM GROW 2/28/73 TES ;
00700 GROW(OWLS, OWLSIDA, DUMMY, EXTRA, NULL) ;
00800 MAKEBE(OWLSIDA, OWLS) ;
00900 OWLSF ← OWLSIDA ; MOLESF ← MOLESIDA ; SHORTF ← SHORTIDA ; MLEADF ← MLEADIDA ;
01000 END "GROWOWLS" ;
00100 PUBLIC SIMPLE PROCEDURE MAKEPAGE(INTEGER HIGH, WIDE) ;$"#
00200 BEGIN "MAKEPAGE"
00300 IDASSIGN(FRAMEIDA←CREATE(0,PFREC), THISFRAME) ;
00400 HIGHF ← HIGH; WIDEF ← WIDE;
00500 END "MAKEPAGE" ;
00100 PUBLIC SIMPLE PROCEDURE NEXTPAGE ;$"#
00200 BEGIN
00300 INTEGER SAVEAREA ;
00400 SAVEAREA ← IF AREAIXM THEN LDB(BIXNUM(AREAIXM)) ELSE SYMTEXT ;
00500 NEXTCOUNTER(SYMPAGE, IXPAGE) ;
00600 PLACE(LDB(IXN(SAVEAREA))) ;
00700 END ;
00100 PUBLIC SIMPLE PROCEDURE OPENFRAME ;$"#
00200 BEGIN "OPENFRAME"
00300 MAKEPAGE(FHIGH,FWIDE);
00400 OLXX ← OLMAX ; comment Total of all areas now declared ; OLX ← 0 ;
00500 IDASSIGN(OWLSF←OWLSIDA←CREATE(0,OLXX), OWLS);
00600 IDASSIGN(MOLESF←MOLESIDA←CREATE(0,OLXX), MOLES);
00700 IDASSIGN(SHORTF←SHORTIDA←CREATE(0,OLXX), SHORT);
00800 IDASSIGN(MLEADF←MLEADIDA←CREATE(0,OLXX), MLEAD);
00900 END "OPENFRAME" ;
00100 PUBLIC SIMPLE PROCEDURE OPENPAGE ;$"#
00200 DO BEGIN OPENFRAME ; IDASSIGN(OLDPGIDA ← FRAMEIDA, OLDPAGE) ;
00300 PAGEVAL ← PATT!VAL(PATPAGE) ;
00400 IF FINDTRAN(SYMPAGE, 4) THEN RESPOND(LLTHIS) ;
00500 END UNTIL FRAMEIDA ;
00100 FINISHED
00200
00300 ENDOF("PAGES")