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")