perm filename PASS2.MAX[PUB,TES] blob
sn#146876 filedate 1975-02-19 generic text, type T, neo UTF8
00100 BEGIN "PUB2"
00200 COMMENT NOTE THAT THE PARCVER USES MEMORY PAGES 700-712 AS A BUFFER ;
00300 REQUIRE "[]<>" DELIMITERS ;
00400 REQUIRE "SITE" SOURCE!FILE;
00500 REQUIRE 6500 STRING!SPACE ;
00600 DEFINE
00700 PASSONE = [FALSE],
00800 PASSTWO = [TRUE],
00900 BEGOF(NAME) = [ ],
01000 ENDOF(NAME) = [ ],
01100 PROCEDURES = [ ],
01200 FINISHED = [ ],
01300 PUBLIC = [ ],
01400 PRIVATE = [ ],
01500 $ = ["],
01600 # = [],
01700 IFK = [IFC],
01800 THENK = [THENC],
01900 IFSITE = [IFK],
02000 SITE(DUMMY) = [ ],
02100 TERNAL = [] ;
02200 REQUIRE "COMMON" SOURCE!FILE ;
02300 COMMENT The Document Compiler -- Pass Two ;
02400 COMMENT Pass One and Two share certain declarations, but in
02500 one case, the meaning of a variable is different:
02600 In Pass 1, XCRIBL is true for either
02700 an XGP -or- PARC's MIC.
02800 In Pass 2, XCRIBL is only true for an
02900 XGP. MICRO is true for PARC's MIC
03000 and RASTER is true for both. ;
03100 COMMENT PASS 1 OUTPUT FORMAT FOR EACH PAGE :
03200 Height Width MillLeftMargin MillRightMargin
03300 For each area:
03400 UpperLine NumCols NumLines
03500 For each column:
03600 LeftChar
03700 For each non-null line:
03705 Line Number
03710 How far short of justification
03715 Excess mill leading
03720 Index of Intermediate Ascii File line
03800 0
03900 -10
04000
04100 PASS 2 reads the output file name and the intermediate page file names from
04200 PUPSEQ.PUI, and the label table from PULABL.PUI. Then it reads
04300 each page from each page file, processes each line in each of
04400 its areas, and writes out a line printer image on the output file.
04500
04600 Each line is subject to three operations, in this order:
04700 (1) Substitute label values at each vertical tab.
04800 (2) Justify the line, if required, by inserting spaces at word breaks marked by altmodes.
04900 (3) Generate underlining and super/sub-scripting as indicated by rubouts.
05000
05100 ;
05200
05300 IFC CMUVER THENC REQUIRE "PUBTMP.SAI" SOURCE!FILE;
05400 ENDC COMMENT RKJ: 26-SEP-74;
05500
05600 DEFINE THRU = [STEP 1 UNTIL], DOWN = [STEP -1 UNTIL],
05700 LH(X) = [(X LSH -18)], RH(X) = [(X LAND '777777)],
05800 AWHILE = [WHILE TRUE],
05900 INNUM = [WORDIN(ICHAN)],
06000 SCN(BRKTBL)= [(IF FROMFILE THEN INPUT(SCHAN,BRKTBL) ELSE SCAN(OWL,BRKTBL,PAGEBRC))],
06100 SCNUM = [CVD(SCN(TO!ALTMODE!SKIP))],
06200 LPT = [1], TTY = [2], MIC = [3], XGP = [4],
06300 HORIZ= ['40], VERTI= ['41], CSIZE= ['42], ULINE= ['43], RSPCS= ['44],
06400 LSPCS= ['45], UDOTS= ['46], RDOTS= ['47], comment FR80 escape codes ;
06500 FULSTR(X) = [LENGTH(X)], NULSTR(X) = [(LENGTH(X)=0)],
06600 CR = ['15], LF = ['12], VT = ['13], FF = ['14], SP = ['40],
06700 RUBOUT = ['177], TB = ['11],
06800 ALTMODE = IFC TENEX THENC ['33] ELSEC
06900 IFC SAILVER THENC ['175] ELSEC ['176] ENDC
07000 ENDC,
07100 TO!ALTMODE!SKIP = [1], TO!LF!APPD = [2],
07200 ONE!CHAR = [3], BREAKER = [4], TO!RUB!ALT!SKIP = [5],
07300 LOCAL!TABLE = [6],
07400 FIML = [256],
07500 ANS(A) = [(S = "A" OR S = "A" + '40)];
07600 DEFINE COMMENT FOR XGP;
07700 USEA= [('177&'14)], USEB= [('177&'15)], VSB= [('177&'20)],
07800 XTAB= [('177&'30)],
07900 XGPNUM(N)= [((N LSH -7) & N)];
08000 DEFINE ESCAPE1= [('177&'1)], ESCAPE2= [('177&'2)];
08100 DEFINE CTLK = [11], CTLF= [6], CTLE= [5], CTLT= ['24], CTLQ= ['21];
08200
08300 IFC SAILVER THENC DEFINE RPGEXT = [".RPG"] ; ENDC
08400
08500 PJ 5/28/74 ; DEFINE
08600 PUIEXT = IFC ITSVER THENC [" PUI"] ELSEC [".PUI"] ENDC,
08700 OCTEXT = IFC ITSVER THENC [" OCT"] ELSEC [".OCT"] ENDC,
08800 TXTEXT = IFC ITSVER THENC [" ASC"] ELSEC [".ASC"] ENDC;
08900
09000 TES 1/7/74 ; DEFINE CTLC= [3], CTLH= ['10], CTLR= ['22], CTLU= ['25], CTLS= ['23] ;
09100 EXTERNAL INTEGER !SKIP! ;
09200 INTEGER BRC, EOF ; COMMENT FOR FONTS TES 10/22/74 ;
09300 INTEGER IML, IMC, comment, no. of lines and chars per page image ;
09400 DEBUG, DEVICE, SEQCHAN, SEQBRC, SEQEOF, comment PUPSEQ.PUI info ;
09500 LFTMAR, comment RASTER left margin (for tabs) ;
09600 RGTMAR, comment RASTER right margin ;
09700 INTRA, comment TES 6/11/74 PARC XGP Intra-line spacing (normally 3) ;
09710 MILLVERTI, RASTVERTI, COMMENT TES 11/2/74 "NORMAL" INTERLINE FOR THIS DOC ;
09800 LISTCHAN, comment output file ;
09900 BAR, TES underlining character (or 0 if OFF) 10/22/73;
10000 PAGEHIGH, PAGEWIDE, comment IML and IMC for latest page ;
10100 I, J, K, L, M, N, DUMMY, comment general-purpose ;
10200 LABCHAN, LABBRC, LABEOF, comment PULABL.PUI info ;
10300 NL, comment LABTAB upper bound ; PAGECT, comment counts pages ;
10400 TABLE, comment LABTAB first subscript -- selects Pass 1 NUMBER vs ITBL ;
10500 ICHAN, SCHAN, FROMFILE, PAGEBRC, PAGEEOF, comment PUIn[S].PUI info ;
10600 TOPLINE, NCOLS, NLINES, comment Area info ;
10700 COL, LEFTCH, comment Column info ;
10800 SLIDETOP, comment top of ∞ stacks such as SLIDESG ;
10900 NCSIZE,CCSIZE, NHORIZ,CHORIZ, NVERTI,CVERTI, comment microfilm normal/current settings ;
11000 NEEDCR, comment, assures CR before every LF for Stanford LPT ;
11100 LINENO, MLEAD, SHORTM, SH, BRKS, FSTBRK, CHRS, FSTCHRS, SG, NOTFST, comment, Line info ;
11200 ONE, comment, 1 ;
11300 BOTMAR, TOPMAR, RASTPHIGH, RASTPWIDE, RASTLHIGH, comment raster units ;
11400 LINEY, CURRENTX, CURRENTY, DLBP, DLBP1, FSTFONT,
11500 TERM, TERMX, LINE, UNDERLINE, CHAR, F, G, LAST, LASL, AVAIL ; comment, Justify info ;
11600
11700 INTEGER SCRIPT, comment baseline adjustment ;
11800 THISFONT, comment PARC font number for scripts;
11900 SCRLVL; comment baseline level ;
12000
12100 INTEGER TLFTMAR ; TVR temporary left margin in XGP pts;
12200 BOOLEAN MICRO, RASTER ; TES 8/23/74 RASTER = XCRIBL OR MICRO ;
12300 IFC CMUVER THENC BOOLEAN FIRST!OUTPUT ; ENDC RKJ: 10-SEP-74 ;
12400 BOOLEAN NEEDFONTS ; TES 10/17/74 FOR PARC MIC ;
12450 BOOLEAN NEEDVERTI ; TES 11/4/74 ;
12500
12600 INTEGER FLUSHING, FSIZE; comment kludges for XGP ;
12700 EXTERNAL INTEGER RPGSW ;
12800 STRING TMPFILE, LISTFILE, PAGEFILE, IFILE, SFILE, S, SR,
12900 OWL, SS, T, ENDLINE, RESTARTLINE, ENDPAGE, DELINT, CRLF, JOBNO ;
13000 STRING SPSSTR ; COMMENT A STRING OF 200 SPACES (TES 8/28/74) ;
13100 TES 1/7/74 ; STRING CMDFILE ;
13200 TES 3/20/74 ; STRING IFILENAME ; INTEGER IFICHAN ;
13300
13400 REAL RATIO ;
13500
13600 INTEGER ARRAY CHARTBL[0:127], XFILL,XINF,SLIDESG,RB,LBD[1:5] ;
13700 INTEGER ARRAY FNTSIZE,FNTCHAN[0:35] ;
13800
13900 STRING ARRAY LBF[1:5] ;
14000
14100 PRELOAD!WITH "", " ", " ", " ", " ", " ", " ",
14200 " ", " ", " ", " " ;
14300 THAFE STRING ARRAY SPSARR[0:10] ;
14400
14500 TES ADDED ALL PARC MIC STUFF ABOUT 8/28/74 : ;
14600
14700 IFCR PARCVER THENC
14800 PARCODES
14900 PARCARRAYS
15000 ENDC
00100 SIMPLE PROCEDURE WARN(STRING MESSG) ;
00110 USERERR(0,1,MESSG) ;
00200
00300 INTEGER SIMPLE PROCEDURE READIN(STRING FILENAME; BOOLEAN BINARY ; REFERENCE INTEGER BRC, EOF) ;
00400 BEGIN "READIN"
00500 INTEGER CH, FLAG ;
00600 CH ← GETCHAN ; EOF ← 0 ; OPEN(CH, "DSK", IF BINARY THEN 8 ELSE 0,2,0,150, BRC, EOF) ;
00700 LOOKUP(CH, FILENAME, FLAG) ;
00800 IF FLAG THEN WARN("Pass one said to read this file: " &
00900 FILENAME & " but it does not exist") ;
01000 RETURN(CH) ;
01100 END "READIN" ;
01200
01300 INTEGER SIMPLE PROCEDURE WRITEON(STRING FILENAME) ;
01400 IFC TENEX THENC
01500 OPENFILE(FILENAME, "WC") ;
01600 ELSEC
01700 BEGIN "WRITEON"
01800 INTEGER CH ;
01900 CH ← GETCHAN ; OPEN(CH, "DSK", 0,0,2,0, 0, 0) ;
02000 AWHILE DO RKJ: 23-JUL-74 - CHECK FOR ENTER FAILURE ;
02100 BEGIN
02200 ENTER(CH, FILENAME, DUMMY←0);
02300 IF NOT DUMMY THEN DONE;
02400 OUTSTR("Cannot ENTER """ & FILENAME & """ Write file: ");
02500 FILENAME←INCHWL;
02600 END;
02700 RETURN(CH);
02800 END "WRITEON" ;
02900 ENDC
03000
03100 IFC TENEX THENC
03200 INTEGER SIMPLE PROCEDURE WRITE16(STRING FILENAME) ;
03300 BEGIN "WRITE16"
03400 INTEGER CH ;
03500 CH ← GTJFN(FILENAME, 1) ;
03600 IF CH<0 THEN WARN("Error in GTJFN of Document file " & FILENAME) ;
03700 OPENF(CH, '200000100000) ;
03800 IF !SKIP! THEN
03810 BEGIN
03820 ERSTR(!SKIP!,0) ;
03830 WARN("Error opening Document file " & FILENAME) ;
03840 END ;
03900 RETURN(CH) ;
04000 END "WRITE16" ;
04100 ENDC
04200
04400 STRING SIMPLE PROCEDURE MICROFILM(INTEGER OP, ARG) ;
04500 RETURN('177 & OP & (IF OP LEQ '42 THEN (ARG DIV 128)&(ARG MOD 128) ELSE ARG)) ;
04600 STRING SIMPLE PROCEDURE SETSIZE(INTEGER N) ; RETURN(MICROFILM(CSIZE, CCSIZE ← N)) ;
04700 STRING SIMPLE PROCEDURE SETHORIZ(INTEGER N) ; RETURN(MICROFILM(HORIZ, CHORIZ ← N)) ;
04800 STRING SIMPLE PROCEDURE SETVERTI(INTEGER N) ; RETURN(MICROFILM(VERTI, CVERTI ← N)) ;
04900 STRING SIMPLE PROCEDURE DOULINE(INTEGER N) ; RETURN(MICROFILM(ULINE, N)) ;
05000 STRING SIMPLE PROCEDURE DORSPCS(INTEGER N) ; RETURN(MICROFILM(RSPCS, N)) ;
05100 STRING SIMPLE PROCEDURE DOLSPCS(INTEGER N) ; RETURN(MICROFILM(LSPCS, N)) ;
05200 STRING SIMPLE PROCEDURE DOUDOTS(INTEGER N) ; RETURN(MICROFILM(UDOTS, N)) ;
05300 STRING SIMPLE PROCEDURE DORDOTS(INTEGER N) ; RETURN(MICROFILM(RDOTS, N)) ;
05400
05500 RECURSIVE STRING PROCEDURE VARBLANK(INTEGER N);
05600 BEGIN "VARBLANK"
05700 IFC CMUXGP THENC
05800 IF N LEQ 0 THEN RETURN(NULL) ELSE
05900 IF N GEQ 128 THEN RETURN(VSB & 127 & VARBLANK(N-127)) ELSE
06000 RETURN(VSB&N)
06100 ELSEC IFC SAILXGP THENC
06200 IF N LEQ 0 THEN RETURN(NULL) ELSE
06300 IF N GEQ 64 THEN RETURN(ESCAPE2 & 63 & VARBLANK(N-63)) ELSE
06400 RETURN(ESCAPE2&N)
06500 ELSEC IFC PARCVER THENC
06600 RETURN(CTLE&CVS(N)&".")
06700 ENDC ENDC ENDC;
06800 END "VARBLANK";
06900
07000 INTERNAL STRING SIMPLE PROCEDURE SPS(INTEGER N) ;
07100 IF N LEQ 10 THEN RETURN(SPSARR[N MAX 0])
07200 ELSE IF DEVICE=MIC THEN RETURN(DORSPCS(N))
07300 ELSE RETURN(SPSSTR[1 TO N]) ;
07400
07500 IFC TENEX THENC
07600 STRING PROCEDURE SCANTO(STRING BRKS; REFERENCE STRING SCANNEE; BOOLEAN INCLUDE) ;
07700 BEGIN
07800 INTEGER DUMMY ;
07900 SETBREAK(LOCAL!TABLE, BRKS, NULL, IF INCLUDE THEN "IA" ELSE "IR") ;
08000 RETURN(SCAN(SCANNEE, LOCAL!TABLE, DUMMY)) ;
08100 END ;
08200 ENDC
08300
08400 IFC PARCVER THENC PARCOUT ENDC
08500
08600 STRING SIMPLE PROCEDURE SPARAM ;
08700 BEGIN "SPARAM"
08800 STRING S ;
08900 S ← NULL ;
09000 DO S ← S & INPUT(SEQCHAN, TO!ALTMODE!SKIP) UNTIL SEQBRC = ALTMODE OR SEQEOF ;
09100 RETURN(S) ;
09200 END "SPARAM" ;
09300
09400 INTEGER SIMPLE PROCEDURE IPARAM ; RETURN(CVD(SPARAM)) ;
09500
09600 IFC CMUXGP THENC RKJ: 29-AUG-74;
09700
09800 INTEGER SIMPLE PROCEDURE INDEX2(STRING A,B);
09900 comment returns the location of the first occurance of
10000 the string B in A, 0 if none;
10100 BEGIN "INDEX2"
10200 INTEGER LA, LB;
10300 IF (LB←LENGTH(B))=0 THEN RETURN(1);
10400 IF (LA←LENGTH(A)-LB+1) LEQ 0 THEN RETURN(0);
10500 START!CODE
10600 LABEL L1, L2, OUTT, NEXT;
10700 MOVE 2,A; MOVN 1,LA; ILDB 0,B; SOS 0,LB;
10800 L1: ILDB 3,2; CAME 3,0; NEXT: AOJL 1,L1;
10900 JUMPE 1,OUTT;
11000 MOVE 4,2; MOVE 5,B; MOVE 6,LB;
11100 L2: ILDB 7,4; ILDB '10,5; CAME 7,'10; JRST NEXT; SOJG 6,L2;
11200 ADD 1,LA; AOJ 1,0;
11300 OUTT:
11400 END;
11500 END "INDEX2";
11600
11700 SIMPLE STRING PROCEDURE FIXUP(STRING S);
11800 BEGIN "FIXUP"
11900 INTEGER ALOC,BLOC;
12000 IF NOT XCRIBL THEN RETURN(S) ; RKJ: 28-SEP-74 ;
12100 IF (ALOC←INDEX2(S,USEA))=1 THEN RETURN(S);
12200 IF (BLOC←INDEX2(S,USEB))=1 THEN RETURN(S);
12300 IF ALOC=0 THEN ALOC←BLOC;
12400 IF BLOC=0 THEN BLOC←ALOC;
12500 ALOC←ALOC MIN BLOC;
12600 RETURN(S[ALOC FOR 2]&S[1 TO ALOC-1]&S[ALOC+2 TO ∞]);
12700 END "FIXUP";
12800 ELSEC
12900 DEFINE FIXUP(X)="X";
13000 ENDC
13100
13200 IFC TENEX THENC
13300 SIMPLE PROCEDURE SFBSZ(INTEGER CHAN, SIZE) ;
13400 BEGIN "SFBSZ"
13500 INTEGER K ;
13600 DEFINE JSYS=['104000000000], SFBSZ=[JSYS '46];
13700 K ← CVJFN(CHAN) ;
13800 START!CODE "BYTE16"
13900 MOVE 1,K; MOVE 2,SIZE; SFBSZ ;
14000 END "BYTE16" ;
14100 END "SFBSZ" ;
14200 ENDC
00100 ONE ← 1 ; COMMENT TO FORCE ARRAY TO BE DYNAMIC ;
00200 BEGIN "VARIABLE BOUND ARRAY BLOCK"
00300 THAFE INTEGER ARRAY CW[0:ONE] ;
00400 REQUIRE "DATUM" SOURCE!FILE ;
00500 REQUIRE "FONTS" SOURCE!FILE ;
00600
00700 BOOLEAN SIMPLE PROCEDURE READFONT(INTEGER WHICH) ;
00800 BEGIN
00900 INTEGER CHAN ;
01000 FNTCHAN[WHICH] ← CHAN ←
01100 IFC PARCVER THENC OPENFILE(FNTNAME[WHICH], "RO")
01200 ELSEC READIN(FNTNAME[WHICH], TRUE, BRC, EOF) ENDC ;
01300 IF CHAN<0 THEN WARN("Can not open font file " &
01400 FNTNAME[WHICH] & " in pass two. This is a bug") ; TES 10/18/74 ;
01500 BRC ← FNTFIL[WHICH] ← CREATE(0,127) ; MAKEBE(BRC, CW) ;
01600 FNTSIZE[WHICH] ← PERUSEFONT(WHICH, CHAN) ;
01700 IFC PARCVER THENC RETURN(FNTNUMBER[WHICH]<0) TES 10/17/74 ;
01800 ELSEC RELEASE(CHAN) ENDC ;
01900 END "READFONT" ;
02000
02100 COMMENT I N I T I A L I Z E ;
02200
02300 WCW ← WHATIS(CW) ;
02400
02500 IFC PARCVER THENC
02600 SR ← NULL ;
02700 DUMMY←CVSIX("PUB2 ");
02800 START!CODE
02900 MOVE 1,DUMMY;
03000 '104000000210;
03100 END;
03200
03300 ARRCLR(NILS, 1) ;
03400 ENDC
03500
03600 SPSSTR ← SP ;
03700 FOR I ← 1 THRU 200 DO SPSSTR ← SPSSTR & SP ; TES 8/28/74 ;
03800
03900 SCRIPT ← 10;
04000 IFC TENEX THENC JOBNO ← CVS(GJINF(DUMMY, DUMMY, DUMMY)) ; ENDC TES 10/25/73 ;
04100
04200 IFC PARCVER THENC IML←65; IMC←72; ENDC
04300 IFC SAILVER THENC IML←53; IMC←69; ENDC
04400 IFC ITSVER THENC IML←55; IMC←69; ENDC PJ 5/28/74 ;
04500 IFC CMUVER THENC IML←55; IMC←69; ENDC
04600 IFC ISIVER THENC IML←55; IMC←69; ENDC
04700 PAGEHIGH ← PAGEWIDE ← PAGECT ← 0 ; CRLF ← CR & LF ;
04800 SETBREAK(ONE!CHAR, NULL, NULL, "XA") ;
04900 SETBREAK(TO!ALTMODE!SKIP, ALTMODE, NULL, "IS") ;
05000 SETBREAK(TO!LF!APPD, LF, NULL, "IA") ;
05100 SETBREAK(BREAKER, RUBOUT&VT&ALTMODE&CR&LF, NULL, "IS") ;
05200 SETBREAK(TO!RUB!ALT!SKIP, RUBOUT&ALTMODE, NULL, "IS") ;
05300 IFC TENEX THENC
05400 IF RPGSW THEN
05500 BEGIN
05600 IFICHAN ← READIN(JOBNO & ".PASS2", FALSE, DUMMY, DUMMY) ;
05700 IFILENAME ← INPUT(IFICHAN, TO!ALTMODE!SKIP) ;
05800 RELEASE(IFICHAN) ; TES 6/11/74 ;
05900 END
06000 ELSE BEGIN TES 6/11/74 REVISED ;
06100 OUTSTR("MANUSCRIPT: ") ;
06200 WHILE -1 = (J ←
06300 GTJFNL(NULL, '162000000000, '100000101,
06400 NULL, NULL, NULL, "PUB", NULL, NULL, NULL)) DO
06500 OUTSTR(" ?" & CRLF & "MANUSCRIPT: ") ;
06600 IFILENAME ← JFNS(J, '1000000000) ;
06700 RLJFN(J) ;
06800 END ;
06900 ENDC
07000
07100 OUTSTR("PASS TWO ") ;
07200
07300 SEQCHAN ← READIN(
07400 IFC TENEX THENC IFILENAME&".FILES" ELSEC "PUPSEQ"&PUIEXT ENDC,
07500 FALSE, SEQBRC, SEQEOF) ;
07600
07700 TMPFILE ← SPARAM ;
07800 LISTFILE ← SPARAM ;
07900
08000 DEBUG ← IPARAM ;
08100
08200 DEVICE ← IPARAM ;
08300 XCRIBL ← DEVICE=XGP ;
08400 IFC PARCVER THENC
08500 MICRO ← DEVICE=MIC ;
08600 PDIX ← OUTCOUNT ← 0 ;
08700 IF MICRO THEN
08800 BEGIN
08900 DLBP1 ← '041000677777 ; COMMENT BYTE POINTER ;
09000 END ;
09100 ELSEC MICRO ← FALSE ; ENDC ;
09200 RASTER ← MICRO OR XCRIBL ;
09300
09400 DELINT ← SPARAM ;
09500
09600 LOFONT ← IPARAM ; HIFONT ← IPARAM ;
09700 NEEDFONTS ← FALSE ; TES 10/17/74 ;
09800 FOR J ← LOFONT THRU HIFONT DO
09900 IF FULSTR(FNTNAME[J] ← SPARAM) THEN
10000 IF READFONT(J) THEN NEEDFONTS ← TRUE ;
10100 IFC PARCVER THENC
10200 IF MICRO AND NEEDFONTS THEN
10300 BEGIN TES 10/17/74 ;
10400 K ← -1 ;
10500 FOR J ← LOFONT THRU HIFONT DO IF FULSTR(FNTNAME[J]) THEN
10600 FNTNUMBER[J] ← K ← K + 1 ;
10700 END ;
10800 ENDC
10900
11000 CMDFILE ← SPARAM ;
11100
11200 BAR ← SPARAM[1 FOR 1] ;
11300 IF BAR = SP THEN BAR ← 0 ; TES 10/22/73 ;
11400
11500 CHARW ← IPARAM;
11550 NEEDVERTI ← FALSE ;
11600 IF (MILLVERTI←IPARAM) LEQ 0 THEN
11610 BEGIN
11620 INTRA ← IFC NOT SAILXGP THENC 0 ; ENDC
11630 MILLVERTI ← ABS(MILLVERTI) ;
11635 NEEDVERTI ← RASTER ;
11640 END
11650 ELSE INTRA ← MILLVERTI ;
11700 BASELINE ← IPARAM; BASELINE←BASELINE+(BASELINE DIV 4);
11800 DOPASS3 ← IPARAM; RKJ: 1-4-74;
11900 IFC CMUVER THENC FIRST!OUTPUT ← NOT DOPASS3 ; ENDC RKJ: 28-SEP-74 ;
12000 VBPI ← IPARAM ;
12100 HBPI ← IPARAM ;
12200 MINLFTMAR ← IPARAM ;
12205 TOPMAR ← (IPARAM*VBPI + 500)/1000 ; TES 1/26/74 ;
12207 BOTMAR ← (IPARAM*VBPI + 500)/1000 ; TES 1/26/74 ;
12210
12220 INTRA ← (INTRA*VBPI + 500)/1000 ; TES 11/2/74 ;
12230 RASTVERTI ← (MILLVERTI*VBPI + 500)/1000 ; TES 11/2/74 ;
12240
12300
12400 IF NOT RPGSW AND NOT RASTER THEN COMMENT STARTED BY ".R PUB2" ;
12500 DO BEGIN
12600 OUTSTR("OUTPUT DEVICE (LPT or TTY): ") ;
12700 S ← INCHWL ;
12800 DEVICE ← IF ANS(L) THEN LPT ELSE IF ANS(T) THEN TTY ELSE 0 ;
13000 END
13100 UNTIL DEVICE ;
13200 IF NOT RPGSW AND DEBUG THEN
13300 IF DEVICE = MIC THEN DEBUG ← 0
13400 ELSE DO BEGIN
13500 OUTSTR("Debug info in right margin? (Y or N) = ") ;
13600 S ← INCHWL ;
13700 DEBUG ← IF ANS(Y) THEN -1 ELSE IF ANS(N) THEN 0 ELSE 100 ;
13800 END
13900 UNTIL DEBUG < 100 ;
14000
14100 ENDLINE ← LF ; ENDPAGE ← FF ;
14200 IFC PARCVER THENC IF MICRO THEN ENDLINE ← MEOL ; ENDC
14300 RESTARTLINE ←
14400 IFC PARCVER THENC IF XCRIBL THEN CTLT&"0." ELSE CR
14500 ELSEC CR ENDC ; TES 11/1/73 ;
14600
14700 IFC SAILVER THENC
14800 CASE DEVICE-1 OF
14900 BEGIN "DEV"
15000 comment 1...LPT ; LISTCHAN ← WRITEON(LISTFILE) ;
15100 comment 2...TTY ; LISTCHAN ← WRITEON(LISTFILE) ;
15200 comment 3...MIC ; BEGIN IML ← IMC ← 1 ; LISTCHAN ← WRITEON(TMPFILE) ;
15300 IF DEBUG THEN BEGIN OUTSTR(CRLF&"Won't put Debug info on Microfilm"&CRLF) ;
15400 DEBUG ← FALSE ; END END ;
15500 COMMENT 4...XGP ; LISTCHAN ← WRITEON(LISTFILE)
15600 END "DEV" ;
15700 ELSEC
15800 IFC PARCVER THENC
15900 IF MICRO THEN LISTCHAN ← WRITE16(LISTFILE) ELSE
16000 ENDC
16100 LISTCHAN ← WRITEON(LISTFILE) ;
16200 ENDC
16300 IFC TENEX THENC LISTFILE ← JFNS(LISTCHAN, 0) ; ENDC
16400 OUTSTR(LISTFILE) ;
16500
16600 J ← 0 ; FOR K ← RUBOUT, ALTMODE, VT, CR, LF DO CHARTBL[K] ← J ← J + 1 ;
16700
16800 LABCHAN ← READIN(
16900 IFC TENEX THENC IFILENAME&".LABELS" ELSEC "PULABL"&PUIEXT ENDC,
17000 FALSE, LABBRC, LABEOF) ;
17100 NL ← CVD(INPUT(LABCHAN, TO!ALTMODE!SKIP)) ;
17200
17300 LASL ← 1000 ; comment, last physical line occupied on the page ;
17400
17500 S←INPUT(SEQCHAN,TO!LF!APPD); comment get to right place ;
17600
17700 TES 1/7/74 ADDED : TES 6/11/74 WITH INTRA:;
17800 IFC PARCVER THENC
17900 IF XCRIBL THEN OUT(LISTCHAN,
18000 (RUBOUT&CTLC) & CMDFILE &
18100 ("K EFHJKLMQRSTU" & CR & "I " & CVS(INTRA) &
18200 CR & "M 0" & CR & "W 1600" & CR & "E" & CR)) ;
18300 COMMENT
18400 CTLC Initiallize switches (used as RUBOUT CTLC)
18500 CTLE Variable blank
18600 CTLF Font change
18700 CTLH Overstrike
18800 CTLJ=LF Line Feed
18850 CTLK Vertical Spacing
18900 CTLL=FF Form Feed
19000 CTLM=CR Carriage Return
19100 CTLQ Quote control character
19200 CTLR Return to baseline from ript
19300 CTLS Subscript
19400 CTLT Tab
19500 CTLU Superscript
19600 RUBOUT Treat as control character (inverse CTLQ)
19700 ;
19800 ENDC
19900
20000 IFC SAILVER THENC
20100 IF XCRIBL THEN OUT(LISTCHAN, "/LMAR="&CVS(LFTMAR)&CMDFILE&CRLF&FF) ;
20200 ENDC
20300 IFC ITSVER THENC PJ 8/24/74 ;
20400 IF XCRIBL THEN OUT(LISTCHAN,";LFTMAR "&CVS(LFTMAR)&CRLF&
20500 ";VSP "&CVS(INTRA)&CRLF&
20600 ";SKIP 1"&CRLF&
20700 CMDFILE&CRLF&FF);
20800 ENDC
00100 BEGIN "INNER BLOCK"
00200
00300 STRING ARRAY LABTAB[0:1, 0:NL], OWLS[0:FIML-1] ;
00400
00500 AWHILE DO
00600 BEGIN "LABEL"
00700 TABLE ← CVD(INPUT(LABCHAN, TO!ALTMODE!SKIP)) ; IF LABEOF THEN DONE ;
00800 LABTAB[TABLE, CVD(INPUT(LABCHAN, TO!ALTMODE!SKIP))] ←
00900 INPUT(LABCHAN, TO!ALTMODE!SKIP) &
01000 (IF RASTER THEN
01100 (ALTMODE & INPUT(LABCHAN, TO!ALTMODE!SKIP))
01200 ELSE NULL);
01300 END "LABEL" ;
01400
01500 RELEASE(LABCHAN);
01600
01700 COMMENT G O ! ;
01800
01900 IF MICRO THEN IML ← 1 ; COMMENT SAVE STORAGE ;
02000 DO comment, This loop is re-entered only if page image grows ;
02100
02200 BEGIN "SIZE"
02300 THAFE STRING ARRAY IMG[1:IML+IML], SEG[0:8*IMC], SRCREF[1:IML] ;
02400 THAFE INTEGER ARRAY LINK,FAKE,LASC[1:IML+IML], LEADING[1:IML+1] ;
02500 LABEL CONTINUE ;
02600
02700 COMMENT * * * * A P P D * * * * ;
02800
02900 INTEGER SIMPLE PROCEDURE APPD(STRING S) ;
03000 IFC PARCVER THENC PARCAPPD ENDC
03100 BEGIN "APPD"
03200 INTEGER HAD, EXTRA, SPACES, F ; STRING T, SS ;
03300 L ← LINE ; EXTRA ← LENGTH(S) ;
03400 IF XCRIBL THEN
03500 BEGIN TES 11/13/73 FOR MULTI-COLUMNS ;
03600 IF CHAR < (HAD ← LASC[L]) THEN
03700 BEGIN
03800 FAKE[L] ← FAKE[L] + HAD - CHAR ;
03900 HAD ← LASC[L] ← CHAR ;
04000 END
04100 END
04200 ELSE
04300 WHILE CHAR < (HAD ← LASC[L]) DO IF (F←LINK[L]) THEN L ← F ELSE
04400 IF (LINK[L] ← AVAIL←AVAIL+1) > IML+IML THEN
04410 WARN("Too much for one page: " & S)
04500 ELSE L ← AVAIL ;
04600 SPACES ← CHAR - HAD ; HAD ← HAD + FAKE[L] ;
04700 T ← IMG[L] ;
04800 IF LENGTH(T) < HAD+SPACES+EXTRA THEN
04900 BEGIN comment no room -- must use concatenate ;
05000 SS ← SPS(SPACES) ;
05100 IF DEVICE=MIC THEN FAKE[L] ← FAKE[L] + LENGTH(SS) - SPACES ;
05200 IMG[L] ← IF HAD THEN T[1 TO HAD]&SS&S ELSE (0&SS&S)[2 TO ∞]
05300 END
05400 ELSE BEGIN comment there's room in old string -- IDPB into it.;
05500 SS ← T[HAD + 1 FOR 1] ; comment byte pointer to IDPB place ;
05600 START!CODE "APPEND" LABEL LOOP1, LOOP2 ;
05700 MOVE 1, SS ; MOVE 2, S ; MOVE 3, EXTRA ;
05800 MOVE 4, SPACES ; JUMPE 4, LOOP2 ; MOVEI 5, '40 ; LOOP1: IDPB 5,1 ; SOJG 4,LOOP1 ;
05900 LOOP2: ILDB 5, 2 ; IDPB 5, 1 ; SOJG 3, LOOP2 ;
06000 END "APPEND" ;
06100 END ;
06200 RETURN(LASC[L] ← CHAR + EXTRA) ;
06300 END "APPD" ;
06400
06500 COMMENT * * * * C T R L * * * * ;
06600
06700 SIMPLE PROCEDURE CTRL(STRING S) ;
06800 BEGIN "CTRL"
06900 CHAR ← 0 MAX APPD(S) - LENGTH(S) ;
07000 LASC[L] ← CHAR ;
07100 FAKE[L] ← FAKE[L] + LENGTH(S) ;
07200 END "CTRL" ;
07300
07400 SIMPLE PROCEDURE MCTRL(INTEGER C) ;
07500 BEGIN "MCTRL"
07600 QUICK!CODE "MCTRLAPPEND"
07700 LABEL RBYTE ;
07800 DEFINE WD=['13] ;
07900 MOVE WD, C ;
08000 CAIG WD,'377 ;
08100 JRST RBYTE ;
08200 ROT WD, -8 ;
08300 IDPB WD, DLBP ;
08400 ROT WD, 8 ;
08500 RBYTE:
08600 IDPB WD, DLBP ;
08700 END "MCTRLAPPEND" ;
08800 END "MCTRL" ;
00100 SIMPLE PROCEDURE UNDERSCORE(INTEGER RIGHTCHAR) ;
00200 BEGIN "UNDERSCORE"
00300 INTEGER NUMCHARS, DESCEND, SAVEHORIZ ;
00400 NUMCHARS ← RIGHTCHAR - UNDERLINE ;
00500 IF NUMCHARS > 0 THEN
00600 BEGIN
00700 SAVEHORIZ ← CHORIZ ;
00800 DESCEND ← CCSIZE DIV 4 ;
00900 CTRL( DOLSPCS(CHAR-UNDERLINE) & DOUDOTS(-DESCEND) & DOULINE(NUMCHARS-1) &
01000 SETHORIZ(CCSIZE) & DOULINE(1) & DOLSPCS(1) & SETHORIZ(SAVEHORIZ) &
01100 DOUDOTS(DESCEND) & DORSPCS(CHAR - RIGHTCHAR + 1) ) ;
01200 UNDERLINE ← RIGHTCHAR ;
01300 END ;
01400 END "UNDERSCORE" ;
01500
01600 SIMPLE PROCEDURE CHANGESPACING ;
01700 IF (N←CHRS-CHAR-1)>0 AND (K←(J←N*CHORIZ+SHORTM)/N MIN 511) NEQ CHORIZ THEN
01800 BEGIN "CHANGESPACING"
01900 IF UNDERLINE GEQ 0 THEN UNDERSCORE(CHAR) ;
02000 SHORTM ← J - K*N ;
02100 IF NOTFST AND (UNDERLINE<0 OR SHORTM<0) THEN
02200 BEGIN CTRL(DORDOTS(SHORTM)) ; SHORTM ← 0 END ; TES CTRL 8/28/74;
02300 CTRL(SETHORIZ(K)) ; NOTFST ← TRUE ;
02400 END "CHANGESPACING" ;
02500
02600 SIMPLE PROCEDURE FONTSELECT(INTEGER WHICH);
02700 BEGIN "FONTSELECT"
02800 IF (WHICH←WHICH-"0")>9 THEN WHICH←WHICH-("A"-"0"-10);
02900 THISFONT ← WHICH ; TES 10/17/74 ;
03000 IFC CMUXGP THENC
03100 WHICH←WHICH MOD 9; COMMENT MAKE 1,A 2,B EQUIVALENT;
03200 IF WHICH=1 THEN CTRL(USEA) ELSE
03300 IF WHICH=2 THEN CTRL(USEB) ELSE
03400 WARN("Font " & CVS(WHICH) & " ignored")
03500 ELSEC IFC SAILXGP THENC
03600 IF WHICH>16 THEN WARN("Font " & CVS(WHICH) & " ignored") ELSE
03700 BEGIN
03800 CTRL(ESCAPE1&(WHICH-1));
03900 IF SCRLVL THEN CTRL(ESCAPE1&'43&SCRLVL);
04000 END;
04100 ELSEC IFC PARCVER THENC
04200 PARCFONT
04300 ENDC ENDC ENDC;
04400 END "FONTSELECT";
04500
04600 STRING SIMPLE PROCEDURE XTABSTR(INTEGER N); RKJ: NEW 1-4-74;
04700 BEGIN "XTABSTR"
04800 IFC CMUXGP THENC RETURN(XTAB&XGPNUM(N)) ENDC
04900 IFC SAILXGP THENC
05000 RETURN(ESCAPE1&'40&XGPNUM(N))
05100 ENDC
05200 IFC PARCVER THENC
05300 RETURN(CTLT&CVS(N)&".")
05400 ENDC;
05500 END "XTABSTR";
05600
05700 SIMPLE PROCEDURE XGPTAB(INTEGER N); RKJ: NEW 1-4-74;
05800 CTRL(XTABSTR(N+TLFTMAR));
05900
06000 STRING PROCEDURE SCNBYCOUNT(INTEGER COUNT) ;
06100 BEGIN
06200 INTEGER I ; STRING S ;
06300 S ← NULL ;
06400 FOR I ← 1 THRU COUNT DO S ← S & SCN(ONE!CHAR) ;
06500 RETURN(S) ;
06600 END ;
06700
06800 SIMPLE STRING PROCEDURE UNMASH(STRING Q) ;
06900 BEGIN TES 8/14/74 PACK EXCESS-64 4-BIT BYTES INTO 7-BIT BYTES ;
07000 STRING S ; S ← NULL ;
07100 WHILE FULSTR(Q) DO S ← S & (((LOP(Q)-64)LSH 4) + (LOP(Q)-64)) ;
07200 RETURN(S) ;
07300 END ;
07400
07500 SIMPLE INTEGER PROCEDURE BYTECOUNT(INTEGER BPNOW, BPTHEN) ;
07600 RETURN(
07700 ((RH(BPNOW)-RH(BPTHEN)) LSH 2) + ((28-((BPNOW ROT 6) LAND '77)) LSH -3) - 3
07800 ) ;
07900
08000 IFC PARCVER THENC PARCLINE ENDC
08050
08100 SIMPLE PROCEDURE IMPOSSIBLE(STRING HOW) ;
08200 BEGIN "IMPOSSIBLE"
08300 IF SG > -1 THEN
08400 BEGIN
08500 OUTSTR(CRLF & HOW & " Error."&CRLF&
08600 "This is an encoding of text line " & CVS(LINE) & ":" & CRLF) ;
08700 FOR I ← 1 THRU SG DO OUTSTR(SEG[I]) ;
08800 END ;
08900 WARN("A supposedly impossible condition has been encountered."&CRLF&
09000 "This is most likely a PUB bug. However, you may have an error"&CRLF&
09100 "which produced unanticipated line lengths or other strange effects."&
09150 (IF DEBUG THEN CRLF&"Line/Page: "&SRCREF[LINE] ELSE NULL)) ;
09200 END "IMPOSSIBLE" ;
00010 SIMPLE PROCEDURE SLIDERROR ;
00020 BEGIN
00030 IMPOSSIBLE(CVS(SLIDETOP)&" Horizontal Positioning") ;
00040 SLIDETOP ← 1 ;
00050 END ;
00060
00100 SIMPLE PROCEDURE RIGHTBOUND ;
00200 BEGIN "RIGHTBOUND" COMMENT RIGHT BOUND OF ∞ ;
00300 INTEGER DEST, FILLIN, I ; STRING FILLER, OLBF ;
00400 INTEGER XF; STRING XTO ; TES 3/30/74;
00500 IF SLIDETOP < 1 THEN SLIDERROR ;
00600 IF LBD[SLIDETOP] < -900 THEN COMMENT FLUSH RIGHT ;
00700 BEGIN
00800 IF RASTER THEN
00900 BEGIN
01000 XF←RB[SLIDETOP]-(XFILL[SLIDETOP]+FSIZE);
01100 XTO ← "=" ;
01200 END ;
01300 FILLIN←RB[SLIDETOP]-CHRS;
01400 END
01500 ELSE COMMENT CENTER ;
01600 BEGIN
01700 IF RASTER THEN
01800 BEGIN
01900 XF ← (RB[SLIDETOP]-LBD[SLIDETOP]-(XFILL[SLIDETOP]+FSIZE)) DIV 2;
02000 XTO ← "+" ;
02100 END ;
02200 FILLIN ← ((RB[SLIDETOP]-CHRS) DIV 2) MAX 0;
02300 END;
02400 DEST ← CHRS + FILLIN ; OLBF ← LBF[SLIDETOP] ;
02500 IF FULSTR(OLBF) THEN
02600 IF RASTER THEN
02700 BEGIN "XGPINFINITY"
02800 FILLER ← NULL ;
02900 FOR I ← 1 THRU XINF[SLIDETOP] DO FILLER ← FILLER & OLBF ;
03000 SEG[I ← SLIDESG[SLIDETOP]] ← FILLER ;
03100 SEG[I + 1] ← RUBOUT & XTO & CVS(XF) ;
03200 END "XGPINFINITY"
03300 ELSE
03400 BEGIN "NON-BLANKS"
03500 FILLER ← NULL ;
03600 WHILE CHRS < DEST DO
03700 BEGIN
03800 FILLER ← FILLER & OLBF ;
03900 CHRS ← CHRS + LENGTH(OLBF) ;
04000 END ;
04100 IF CHRS > DEST THEN FILLER ← FILLER[1 TO ∞-(CHRS-DEST)] ;
04200 SEG[SLIDESG[SLIDETOP]] ← FILLER ;
04300 END "NON-BLANKS"
04400 ELSE SEG[SLIDESG[SLIDETOP]] ← RUBOUT &
04500 (IF RASTER THEN (XTO&CVS(XF))
04600 ELSE ("+"&CVS(FILLIN)) );
04700 CHRS ← DEST ; SLIDETOP ← SLIDETOP - 1 ;
04800 BRKS ← 0 ; FSTCHRS ← CHRS ; FSTBRK ← SG ; COMMENT NOJUST TO LEFT ;
04900 FLUSHING ← FALSE ; FSIZE ← 0 ;
05000 END "RIGHTBOUND";
05100
05200 SIMPLE INTEGER PROCEDURE STEP!SG ;
05300 IF SG<8*IMC THEN RETURN(SG←SG+1)
05400 ELSE BEGIN
05450 IMPOSSIBLE("Line complexity") ;
05800 RETURN(SG←0) ;
05900 END ;
00100 IF PAGEHIGH THEN GO TO CONTINUE ; comment, re-entered ;
00200 AWHILE DO
00300 BEGIN "FILE"
00400 PAGEFILE ← SPARAM ; IF SEQEOF THEN DONE ;
00500 IFC TENEX THENC
00600 IFILE ← IFILENAME & OCTEXT & PAGEFILE ;
00700 SFILE ← IFILENAME & TXTEXT & PAGEFILE ;
00800 ELSEC
00900 IFILE ← PAGEFILE & PUIEXT ; SFILE ← PAGEFILE & "S"&PUIEXT ;
01000 ENDC
01100 ICHAN ← READIN(IFILE, TRUE, PAGEBRC, PAGEEOF) ; SCHAN ← READIN(SFILE, FALSE, PAGEBRC, PAGEEOF) ;
01200
01300 AWHILE DO
01400 BEGIN "PAGE"
01500 PAGEHIGH ← INNUM ; IF PAGEEOF OR PAGEHIGH LEQ 0 THEN DONE ; PAGEWIDE ← INNUM ;
01600 LFTMAR ← 0 MAX (INNUM*HBPI + 500)/1000 - MINLFTMAR ; TES 6/11/74 ADDED ;
01700 RGTMAR ← 0 MAX ((8500-INNUM)*HBPI + 500)/1000 - MINLFTMAR ; TES 8/29/74 ADDED ;
01800 COMMENT HBPI HORIZ BITS PER INCH, MINLFTMAR BIT MIN MARGIN;
01900 IF NOT MICRO AND (PAGEHIGH > IML OR PAGEWIDE > IMC) THEN
02000 BEGIN "EXPAND"
02100 IFC SAILVER THENC
02200 IF DEVICE=MIC THEN
02300 BEGIN "FRAME SIZE"
02400 IF LASL NEQ 1000 THEN OUT(LISTCHAN, ENDPAGE) ;
02500 NVERTI ← 11000 DIV PAGEHIGH MIN 16384 DIV PAGEWIDE MIN 375 ;
02600 NHORIZ ← 10*NVERTI DIV 11 ; NCSIZE ← (9*NHORIZ DIV 80)*8 ;
02700 OUT(LISTCHAN, SETSIZE(NCSIZE)&SETHORIZ(NHORIZ)&SETVERTI(NVERTI)) ;
02800 END "FRAME SIZE"
02900 ELSE IF DEVICE = LPT THEN
03000 BEGIN
03100 IF (LASL-1) MOD 66 + 1 LEQ 6 AND (PAGEHIGH-1) MOD 66 < 60 THEN
03200 OUT(LISTCHAN, ENDPAGE) ;
03300 ENDLINE ← IF PAGEHIGH GEQ 54 THEN RUBOUT & '21 ELSE LF ;
03400 END ;
03500 ENDC;
03600 IML ← PAGEHIGH ; IMC ← PAGEWIDE ;
03700 DONE ; comment, Exit "SIZE" block and immediately reenter with bigger IMG array ;
03800 END "EXPAND" ;
03900
04000 CONTINUE: OUTSTR(SP & CVS(PAGECT ← PAGECT + 1)) ; AVAIL ← IML ;
04200 RASTPHIGH ← 11*VBPI - (TOPMAR+BOTMAR) ; COMMENT *** TEMP *** ;
04300 RASTPWIDE ← (17*HBPI)/2 - (LFTMAR+RGTMAR) ; COMMENT *** TEMP *** ;
04400 RASTLHIGH ← RASTPHIGH/PAGEHIGH ;
04500 IFC SAILVER THENC
04600 IF PAGECT > 1 THEN
04700 IF DEVICE = LPT THEN COMMENT AVOID SPURIOUS BLANK PAGE ;
04800 IF (IML-1) MOD 66 < 60 THEN OUT(LISTCHAN, ENDPAGE)
04900 ELSE FOR L ← (LASL-1) MOD 66 + 2 THRU 66 DO
05000 BEGIN OUT(LISTCHAN, CR) ; OUT(LISTCHAN, ENDLINE) END
05100 ELSE OUT(LISTCHAN, ENDPAGE) ;
05200 ENDC
05300 IFC CMUXGP THENC
05400 IF PAGECT>1 THEN OUT(LISTCHAN,ENDPAGE);
05500 ENDC
05600
05700 IFC PARCVER THENC
05800 IF MICRO THEN
05900 BEGIN
06000 FSTFONT ← -1 ;
06100 DLBP ← DLBP1 ;
06200 TLIX ← 0 ;
06300 END ;
06400 ENDC
00100 WHILE (TOPLINE ← INNUM) > -10 DO
00200 BEGIN "AREA"
00300 NCOLS ← INNUM ; NLINES ← INNUM ;
00400 FOR COL ← 1 THRU NCOLS DO
00500 BEGIN "COLUMN"
00600 LEFTCH ← INNUM ;
00700 TLFTMAR ← LFTMAR + CHARW*(LEFTCH-1) ; TVR: Initiallize left margin for this column ;
00800 WHILE (LINENO ← INNUM) DO
00900 BEGIN "LINE"
01000 SH ← SHORTM ← INNUM ;
01005 MLEAD ← INNUM ; TES 11/2/74 ;
01010 SG ← FSTBRK ← -1 ;
01015 BRKS ← CHRS ← FSTCHRS ← SLIDETOP ← 0 ;
01100 LINE ← TOPLINE - 1 + LINENO ;
01200 IF LINE<1 OR LINE>PAGEHIGH THEN
01210 BEGIN
01220 WARN("Area outside page. If Pass one didn't tell you too, then there is a bug in PUB");
01230 LINE←LINE MAX 1 MIN PAGEHIGH ;
01240 END ;
01300 L ← INNUM ; F ← L MOD FIML ; OWL ← OWLS[F] ;
01400 IF FULSTR(OWL) THEN BEGIN FROMFILE ← FALSE ; OWLS[F] ← NULL END
01500 ELSE BEGIN FROMFILE ← TRUE ;
01600 WHILE L NEQ (M←CVD(INPUT(SCHAN, TO!ALTMODE!SKIP))) DO
01700 BEGIN S ← NULL ;
01800 RKJ: 4-26-74, added EOF stuff on next two lines ;
01900 DO S ← S & INPUT(SCHAN, TO!LF!APPD) UNTIL PAGEBRC = LF OR PAGEEOF ;
02000 IF PAGEEOF THEN USERERR(0,0,"Bad input from Pass One (a PUB bug), I give up.");
02100 OWLS[M MOD FIML] ← S ;
02200 END ;
02300 END ;
02400 IF NOT DEBUG THEN S ← SCN(TO!ALTMODE!SKIP)
02500 ELSE BEGIN
02600 SR ← IF MICRO THEN NULL ELSE SRCREF[LINE] ;
02700 SR ← SR & " " & SCN(TO!RUB!ALT!SKIP) ;
02800 WHILE PAGEBRC NEQ ALTMODE DO
02900 BEGIN "ERROR MESSG"
03000 S ← SCN(TO!RUB!ALT!SKIP) ; M ← LENGTH(S)+3 ; L ← LINE ;
03100 IF DEVICE=TTY OR (IMC MAX 75)+13*(NCOLS-COL)+LENGTH(SR)+M LEQ 119 THEN
03200 SR ← SR & "..." & S ;
03300 END "ERROR MESSG" ;
03400 IF NOT MICRO THEN SRCREF[LINE] ← SR ;
03500 END ;
03600 DO BEGIN "PIECE"
03700 S ← SCN(BREAKER) ; TES 11/6/74 ;
03800 WHILE NOT PAGEEOF AND NOT PAGEBRC DO
03850 S ← S & SCN(BREAKER) ; TES 11/6/74 ;
03900 CHRS ← CHRS + LENGTH(SEG[STEP!SG] ← S) ;
00100 CASE CHARTBL[PAGEBRC] OF
00200 BEGIN comment by BRC ;
00300
00400 comment 0 ... ; IMPOSSIBLE("0"&CVOS(PAGEBRC)&" Break Character") ;
00500
00600 comment 1 ... RUBOUT -- Font change ; BEGIN
00700 SEG[STEP!SG] ← RUBOUT & (F←SCN(ONE!CHAR)) &
00800 (S ← IF F="-" OR F="+" OR F="=" THEN SCN(TO!ALTMODE!SKIP)
00900 ELSE IF F = "F" THEN SCN(ONE!CHAR)
01000 ELSE IF F="π" THEN SCNBYCOUNT(SCNUM) TES 1/11/75 SCNUM ;
01100 ELSE NULL) ;
01200 IF F = "π" THEN CHRS ← CHRS + 1
01300 ELSE IF F = "+" THEN CHRS ← CHRS + CVD(S)
01400 ELSE IF F = "-" THEN CHRS ← CHRS - CVD(S)
01500 ELSE IF F = "→" THEN
01600 BEGIN COMMENT ∞ ;
01700 IF (SLIDETOP ← SLIDETOP + 1) > 5 THEN SLIDERROR ;
01800 SLIDESG[SLIDETOP] ← SG ; RB[SLIDETOP] ← SCNUM ;
01900 LBD[SLIDETOP] ← SCNUM ;
02000 IF RASTER THEN
02100 BEGIN
02200 RKJ; XFILL[SLIDETOP] ← SCNUM ;
02300 TES ; XINF[SLIDETOP] ← SCNUM ;
02400 END ;
02500 LBF[SLIDETOP] ← SCN(TO!ALTMODE!SKIP) ;
02600 IF RASTER AND FULSTR(LBF[SLIDETOP]) THEN STEP!SG ; RKJ: 1-9-74;
02700 FLUSHING ← TRUE;
02800 END
02900 ELSE IF F = "←" THEN
03000 RIGHTBOUND
03100 ELSE IF F = "=" THEN BEGIN
03200 comment 8/9/73 RKJ IF RASTER THEN SHORTM←(SHORTM-BRKS*CHARW) MAX 0;
03300 BRKS←0 ; FSTCHRS←CHRS←CVD(S) ; FSTBRK←SG END ;
03400 END ; COMMENT NOJUST LEFT OF TAB ;
03500
03600 comment 2 ... ALTMODE -- Word Break ; BEGIN BRKS ← BRKS + 1 ; SEG[STEP!SG] ← ALTMODE END ;
03700
03800 comment 3 ... VT -- label reference ;
03900 BEGIN "LABEL REF"
04000 STRING S;
04100 S ← LABTAB[(F←SCNUM) LSH -14, F LAND '37777] ;
04200 L ← LENGTH(SEG[STEP!SG] ← SCAN(S, TO!ALTMODE!SKIP, DUMMY)) ;
04300 J ← CVD(S) ;
04400 SHORTM ← SHORTM - (IF RASTER THEN J ELSE L) ; CHRS ← CHRS + L ;
04500 IF FLUSHING AND RASTER THEN FSIZE←FSIZE+J ;
04600 END "LABEL REF" ;
00100 comment 4 ... CR -- Justify it ;
00200 BEGIN "JUSTIFY"
00300 WHILE SLIDETOP DO BEGIN SLIDERROR ; RIGHTBOUND END ;
00400 IF SHORTM < 0 THEN SHORTM ← 0 ;
00500 IFC SAILVER THENC IF DEVICE = MIC THEN SHORTM ← SHORTM*NHORIZ ELSE ENDC
00600 BEGIN "DISTRIBUTE SPACES"
00700 COMMENT beta(α,K) = [α(K+1)] - [αK], PJ 5/27/74 ITS doesn't like <control-C>'s
00800 WHERE α = SHORTM/BRKS, is h.m. spaces to insert at the K'th break ;
00900 RATIO ← IF BRKS=0 THEN 0.0 ELSE SHORTM/BRKS ; TERM ← RATIO + .0001 ; BRKS ← 1 ;
01000 END "DISTRIBUTE SPACES" ;
01100 UNDERLINE←-1 ; LINE←TOPLINE-1+LINENO MAX 1 MIN PAGEHIGH ; CHAR ← 0 MAX LEFTCH-1 MAX 0 ;
01150 IFC CMUVER THENC IF XCRIBL THEN CHAR←LASC[LINE]; ENDC RKJ: 7-Nov-74, needed for multi column;
01200 NOTFST ← FALSE ; CHRS ← CHRS + CHAR ;
01300
01400 TVR: Initial column select for XGP ;
01500 IF XCRIBL AND (LEFTCH NEQ 1 OR LFTMAR > 0) THEN XGPTAB(0) ;
01600 IFC PARCVER THENC IF MICRO THEN OPENLINE(0, -1) ; ENDC
01610
01620 IF XCRIBL THEN LEADING[LINE] ← TES 11/4/74; RKJ: 7-Nov-74;
01630 IF MLEAD = 0 THEN 0
01640 ELSE IF MLEAD > 0 THEN (MLEAD*VBPI + 500)/1000
01650 ELSE -((-MLEAD*VBPI + 500)/1000) ;
01700
01800 IFC SAILVER THENC
01900 IF DEVICE = MIC AND FSTBRK = -1 THEN CHANGESPACING ;
02000 ENDC
02100 FOR G ← 0 THRU SG DO IF FULSTR(S ← SEG[G]) THEN CASE CHARTBL[S] OF
02200 BEGIN comment three cases ;
02300
02400 comment 0 ... text ;
02500 BEGIN "TEXT SEG"
02600 IF UNDERLINE<0 OR BAR=0 TES 10/22/73 ; THEN CHAR ← 0 MAX APPD(S) ELSE
02700 COMMENT *** UNDERLINING *** ;
02800 IF DEVICE = MIC THEN
02900 IFC SAILVER THENC
03000 BEGIN K ← LENGTH(S) ;
03100 WHILE K DO
03200 BEGIN COMMENT DON'T UNDERLINE BLANKS ;
03300 N ← LOP(S) ;
03400 IF N=SP THEN BEGIN UNDERSCORE(CHAR-K) ; UNDERLINE←UNDERLINE+1 END ;
03500 K ← K - 1 ;
03600 END ;
03700 END
03800 ENDC
03900 IFC PARCVER THENC PARCBAR ENDC
04000 ELSE IF XCRIBL THEN
04100 BEGIN
04200 IFC CMUXGP THENC
04300 K←LENGTH(S); SS←0&SPS(K*4); N←LOP(SS);
04400 START!CODE "XGPUNDER"
04500 DEFINE LEN= [2],SRC= [3],DEST= [4],RUB= [5],ESC= [6],R= [7],CNT= ['10],UBAR= ['11];
04600 LABEL LOOP,ELOOP,SPACE,OUTT;
04700 SETZ CNT,0; MOVE LEN,K; MOVE SRC,S; MOVE DEST,SS; MOVEI RUB,'177; MOVEI ESC,'35; MOVE UBAR,BAR;
04800 LOOP: ILDB R,SRC;
04900 CAIE R,BAR; CAIN R,SP; JRST SPACE;
05000 IDPB RUB,DEST; IDPB ESC,DEST; IDPB R,DEST; IDPB UBAR,DEST;
05100 ELOOP: SOJG LEN,LOOP;
05200 MOVEM CNT,N; JRST OUTT;
05300 SPACE: IDPB R,DEST;
05400 AOJA CNT,ELOOP;
05500 OUTT:
05600 END "XGPUNDER";
05700 CHAR ← 0 MAX APPD(SS[1 TO (K*4-N*3)])-(K-N)*3;
05800 LASC[L]←CHAR; FAKE[L]←FAKE[L]+(K-N)*3;
05900 ENDC
06000 IFC SAILXGP THENC CHAR ← 0 MAX APPD(S); ENDC
06100 IFC PARCVER THENC
06200 K←LENGTH(S); SS←0&SPS(K*3); N←LOP(SS);
06300 START!CODE "XGPUNDER"
06400 DEFINE LEN= [2],SRC= [3],DEST= [4],BS= [5],UBAR= [6],CNT= [7],R= ['10];
06500 LABEL LOOP, OUTT, NOBAR; TES 8/19/74 TES CHAR BS BAR -> BAR BS CHAR, FOR BOBROW ;
06600 SETZ CNT,0;
06700 MOVE LEN,K; MOVE SRC,S; MOVE DEST,SS; MOVEI BS,'10; MOVE UBAR,BAR;
06800 LOOP: SOJL LEN,OUTT;
06900 ILDB R,SRC;
07000 CAIE R,BAR; CAIN R,SP; AOJA CNT,NOBAR;
07100 IDPB UBAR,DEST; IDPB BS,DEST;
07200 NOBAR: IDPB R,DEST;
07300 JUMPA LOOP;
07400 OUTT: MOVEM CNT,N;
07500 END "XGPUNDER";
07600 CHAR ← 0 MAX APPD(SS[1 TO (K*3-N*2)])-(K-N)*2;
07700 LASC[L]←CHAR; FAKE[L]←FAKE[L]+(K-N)*2;
07800 ENDC
07900 END
00100 ELSE BEGIN CHAR ← 0 MAX APPD(S);
00200 K ← LENGTH(S) ; SS ← 0&S ; N ← LOP(SS) ; CHAR ← 0 MAX CHAR-K ;
00300 IFC NOT CMUXGP THENC RKJ: 1-7-74;
00400 START!CODE "UNDER" LABEL LOOP ;
00500 MOVE 2, K ; MOVE 3, SS ;
00600 LOOP: ILDB 4,3 ; CAIE 4,SP ; CAIN 4,BAR ; CAIA 0,0 ; MOVE 4,BAR ; DPB 4,3 ; SOJG 2,LOOP ;
00700 END "UNDER" ; CHAR ← 0 MAX APPD(SS[1 TO LENGTH(S)]) ;
00800 ELSEC CHAR ← 0 MAX APPD(S); ENDC RKJ: 1-7-74;
00900 END ;
01000 END "TEXT SEG" ;
01100
01200 comment 1 ... RUBOUT -- Font Change ;
01300 IF (F←S[2 FOR 1])="↑" THEN
01400 IFC SAILVER THENC IF DEVICE=MIC THEN CTRL(DOUDOTS(CCSIZE MIN 63)) ELSE ENDC
01500 IFC PARCVER THENC
01600 IF MICRO THEN PARCSUPER ELSE
01700 IF XCRIBL THEN
01800 IF (SCRLVL←SCRLVL+SCRIPT) LEQ 0 THEN CTRL("R"-'100) ELSE
01900 BEGIN LABEL L1;
02000 CTRL("U"-'100);
02100 L1:
02200 IF G<SG THEN
02300 BEGIN
02400 SS←SEG[G+1];
02500 IF NULSTR(SS) THEN BEGIN G←G+1; GO L1 END; comment try again ;
02600 IF EQU(SS[1 FOR 2],RUBOUT&"F") THEN
02700 BEGIN
02800 G←G+1;
02900 CTRL(SS[3 FOR 1]);
03000 END ELSE CTRL(THISFONT+"0");
03100 END ELSE CTRL(THISFONT+"0")
03200 END
03300 ELSE ENDC
03400 IFC SAILXGP THENC
03500 IF XCRIBL THEN
03600 CTRL(ESCAPE1&'43&(SCRLVL←SCRLVL+SCRIPT))
03700 ELSE ENDC LINE←LINE-1 MAX 1
03800 ELSE IF F = "↓" THEN
03900 IFC SAILVER THENC IF DEVICE=MIC THEN CTRL(DOUDOTS(-(CCSIZE MIN 63))) ELSE ENDC
04000 IFC PARCVER THENC
04100 IF MICRO THEN PARCSUB ELSE
04200 IF XCRIBL THEN
04300 IF (SCRLVL←SCRLVL-SCRIPT) GEQ 0 THEN CTRL("R"-'100) ELSE
04400 BEGIN LABEL L2;
04500 CTRL("S"-'100);
04600 L2:
04700 IF G<SG THEN
04800 BEGIN
04900 SS←SEG[G+1];
05000 IF NULSTR(SS) THEN BEGIN G←G+1; GO L2 END; comment ↑↑↑ ;
05100 IF EQU(SS[1 FOR 2],RUBOUT&"F") THEN
05200 BEGIN
05300 G←G+1;
05400 CTRL(SS[3 FOR 1]);
05500 END ELSE CTRL(THISFONT+"0");
05600 END ELSE CTRL(THISFONT+"0")
05700 END
05800 ELSE ENDC
05900 IFC SAILXGP THENC
06000 IF XCRIBL THEN
06100 CTRL(ESCAPE1&'43&(SCRLVL←SCRLVL-SCRIPT)) ELSE ENDC LINE←LINE+1 MIN IML
06200 ELSE IF F = "_" THEN
06300 BEGIN
06400 UNDERLINE ← CHAR;
06500 IFC SAILVER THENC
06600 IF XCRIBL THEN CTRL(ESCAPE1&'46);
06700 ENDC
06800 IFC ITSVER PJ 8/23/74 ; THENC
06900 IF XCRIBL THEN BEGIN CTRL(ESCAPE1&'46); CTRL(ESCAPE1&'46) END;
07000 ENDC
07100 END
07200 ELSE IF F = "≡" THEN
07300 BEGIN "END UNDERLINED TEXT"
07400 IFC SAILVER THENC
07500 IF DEVICE = MIC AND BAR TES 10/22/73; THEN UNDERSCORE(CHAR) ;
07600 ENDC
07700 UNDERLINE ← -1 ;
07800 IFC SAILVER THENC
07900 IF XCRIBL AND BAR TES 10/22/73; THEN
08000 CTRL(ESCAPE1&'51&2&3); TES AND REG 11/19/73 ; BH 12/3/74;
08100 ENDC
08200 IFC ITSVER THENC PJ 8/23/74 ;
08300 IF XCRIBL AND BAR THEN BEGIN CTRL(ESCAPE1&'47&3); CTRL(ESCAPE1&'47&4) END;
08400 ENDC
08500 END "END UNDERLINED TEXT"
08600 ELSE IF F="-" THEN
08700 BEGIN
08800 F ← CVD(S[3 TO ∞]) ;
08900 IF DEVICE=MIC THEN
09000 IFC SAILVER THENC
09100 CTRL(DOLSPCS(F))
09200 ENDC
09300 IFC PARCVER THENC
09400 PARCLEFT
09500 ENDC
09600 ELSE CHAR←CHAR-F MAX 0
09700 END
09800 ELSE IF F="*" THEN CHAR ← 0 MAX LASC[LINE] comment not always correct! ;
09900 ELSE IF F="+" THEN
10000 BEGIN F ← CVD(S[3 TO ∞]) ;
10100 IFC SAILVER THENC
10200 IF DEVICE=MIC THEN CTRL(DORSPCS(F)) ELSE
10300 ENDC
10400 IFC PARCVER THENC
10500 PARCRIGHT
10600 ENDC
10700 IF XCRIBL THEN CTRL(VARBLANK(F))
10800 ELSE CHAR←CHAR+F MIN IMC
10900 END
11000 ELSE IF F="=" THEN
11100 BEGIN "TAB"
11200 F ← CVD(S[3 TO ∞]) ;
11300 IF NOT RASTER THEN F ← (F MAX 0) + LEFTCH - 1 MIN IMC ; TES 8/17/74 FIX BUG ;
11400 IF XCRIBL THEN XGPTAB(F)
11500 ELSE IF DEVICE NEQ MIC THEN CHAR ← F
11600 IFC SAILVER THENC
11700 ELSE IF F < CHAR THEN DOLSPCS(CHAR - F)
11800 ELSE IF F > CHAR THEN DORSPCS(F - CHAR) ;
11900 ENDC
12000 IFC PARCVER THENC PARCTAB ENDC
12100 END "TAB"
12200 ELSE IF F = "π" THEN
12300 BEGIN TES 11/29/73 REWROTE ; TES 11/4/74 ADDED SPECIAL ;
12400 BOOLEAN SPECIAL ;
12500 IFC CMUXGP THENC
12600 IF UNDERLINE GEQ 0 AND BAR THEN CTRL(RUBOUT&'35) ;
12700 ENDC TES 12/13/73 ;
12800 SPECIAL ← S[3 FOR 1] = 63 ;
12900 SS ← UNMASH(S[(IF SPECIAL THEN 4 ELSE 3) TO ∞]) ;
13000 IFC PARCVER THENC
13100 IF XCRIBL THEN
13150 IF SS="." THEN F←LOP(SS) tes 12/10/74 ;
13175 ELSE SS ← CTLQ & SS ;
13187
13200 IF MICRO THEN PARCPICHAR
13300 ELSE
13400 ENDC
13500 BEGIN
13600 F ← LENGTH(SS)-1 ; CHAR ← 0 MAX APPD(SS)-F ;
13700 LASC[L] ← CHAR ; FAKE[L] ← FAKE[L] + F ;
13800 IF UNDERLINE GEQ 0 AND BAR AND DEVICE NEQ MIC
13900 IFC SAILXGP THENC AND NOT XCRIBL ENDC
14000 THEN CTRL(IFC PARCVER THENC '10& ENDC BAR) ; TES 12/13/73;
14100 END ;
14200 END
14300 ELSE IF F = "←" THEN BEGIN END
00100 ELSE IF F="F" THEN FONTSELECT(S[3 FOR 1])
00200 ELSE IF F='35 THEN COMMENT OVERSTRIKE NEXT CHAR OVER LAST ;
00300 BEGIN "OVERSTRIKE"
00400 IFC CMUXGP THENC
00500 INTEGER Q;
00600 Q←IMG[L][(LASC[L]+FAKE[L]) FOR 1];
00700 LASC[L]←LASC[L]-1; CHAR ← 0 MAX CHAR-1;
00800 CTRL(RUBOUT&'35); CHAR ← 0 MAX APPD(Q);
00900 ENDC
01000 IFC SAILXGP THENC WARN("Overstrike unimplemented") ENDC
01100 IFC PARCVER THENC
01200 PARCOVLY
01300 ENDC
01400 END
01500 ELSE IF F=RUBOUT THEN IF NOT XCRIBL THEN CHAR←APPD(SP) ELSE
01600 BEGIN
01700 CHAR ← 0 MAX APPD(RUBOUT&RUBOUT)-1; LASC[L]←CHAR; FAKE[L]←FAKE[L]+1;
01800 END
01900 ELSE IMPOSSIBLE("0"&CVOS(F)&" Control Character") ;
02000
02100 comment 2 ... ALTMODE -- word break ;
02200 IF SHORTM AND G > FSTBRK THEN
02300 IFC SAILVER THENC IF DEVICE = MIC THEN CHANGESPACING ELSE ENDC
02400 BEGIN "SPREAD"
02500 TERMX ← RATIO*(BRKS←BRKS+1) + .0001 ;
02600 IF RASTER THEN
02700 BEGIN "DOVSB"
02800 F ← ((TERMX-TERM) MIN SHORTM) ;
02900 IFC PARCVER THENC IF MICRO THEN PARCJUST ELSE ENDC
03000 CTRL(VARBLANK(F)) ;
03100 SHORTM← SHORTM-F
03200 END "DOVSB"
03300 ELSE CHAR ← 0 MAX CHAR + TERMX - TERM MIN IMC ;
03400 TERM ← TERMX ;
03500 END "SPREAD"
03600 ELSE IF RASTER THEN
03700 BEGIN
03800 CHAR ← 0 MAX APPD(SP);
03900 END;
04000
04100 comment 3-5 ; IMPOSSIBLE("VT in SEG[]") ; IMPOSSIBLE("CR in SEG[]") ; IMPOSSIBLE("LF in SEG[]") ;
04200 END ; COMMENT three cases ;
04300 IFC SAILVER THENC IF CHORIZ NEQ NHORIZ THEN CTRL(SETHORIZ(NHORIZ)) ; ENDC
04400 IFC SAILXGP THENC
04500 IF XCRIBL AND UNDERLINE GEQ 0 THEN
04600 CTRL(ESCAPE1&'47&BASELINE);
04700 ENDC
04800 BRKS ← CHRS ← FSTCHRS ← SLIDETOP ← 0 ; SG ← FSTBRK ← -1 ; SHORTM ← SH ;
04900 IFC PARCVER THENC PARCLOSE ENDC
05000 END "JUSTIFY" ;
00100 comment 5 ... LF ; BEGIN END ;
00200 END ; comment, by BRC ;
00300 END "PIECE"
00400 UNTIL PAGEBRC = LF ;
00500 END "LINE" ;
00600 END "COLUMN" ;
00700 END "AREA" ;
00800
00900 IFC PARCVER THENC PARCPAGE ENDC
01000
01100 BEGIN "FINPAGE"
01200 FOR LASL ← PAGEHIGH DOWN 1 DO IF LASC[LASL] THEN DONE ;
01300
01400 F ← 120 - (IMC MAX 78) ;
01500
01600 FOR N ← 1 THRU LASL DO
01700 BEGIN "LIST LINE"
01800
01900 L ← N ;
02000 IF DEBUG AND LENGTH(S←SRCREF[L])>F AND DEVICE=LPT THEN
02100 S←S[1 TO F] ;
02200 NEEDCR ← FALSE ;
02300
02400 DO BEGIN "PART LINE"
02500 IF CHAR ← LASC[L] THEN
02600 BEGIN "NONBLANK"
02700 IF NEEDCR THEN OUT(LISTCHAN, RESTARTLINE)
02800 ELSE NEEDCR ← TRUE ; TES 11/1/73;
02900 OUT(LISTCHAN, FIXUP(IMG[L][1 TO CHAR+FAKE[L]])) ;
03000 IFC CMUVER THENC RKJ: 26-SEP-74 - KLUDGE;
03100 IF XCRIBL AND FIRST!OUTPUT THEN
03200 BEGIN
03300 FIRST!OUTPUT←FALSE;
03400 DUMMY←CHNCDB(LISTCHAN);
03500 START!CODE
03600 MOVE 1,DUMMY; HLRZ 1,2(1); MOVE 2,1(1);
03700 MOVEI 3,1; MOVEM 3,1(2);
03800 END;
03900 END;
04000 ENDC
04100 IF DEBUG AND L=N AND FULSTR(S) THEN OUT(LISTCHAN,
04200 (IF XCRIBL THEN XTABSTR(LFTMAR+IMC*CHARW+1)
04300 ELSE SPS((IMC MAX 80)-CHAR)) RKJ: 1-4-74;
04400 & S);
04500 END "NONBLANK" ;
04600 CHAR ← 0 MAX L ; L ← LINK[CHAR] ;
04700 LINK[CHAR] ← LASC[CHAR] ← FAKE[CHAR] ← 0 ;
04800 END "PART LINE" UNTIL L=0 ;
04900 OUT(LISTCHAN, CR) ; COMMENT ALWAYS CR BEFORE LF ;
05000
05100 IF NEEDVERTI AND
05150 ((L ← LEADING[N+1]+RASTVERTI) IFC SAILXGP THENC NEQ ELSEC > ENDC INTRA) THEN
05200 IFC PARCVER THENC
05300 BEGIN
05400 OUT(LISTCHAN, ENDLINE) ;
05500 OUT(LISTCHAN, CTLK&CVS(L-INTRA)&".") ;
05600 END
05650 ENDC
05700 IFC CMUXGP THENC OUT(LISTCHAN, ENDLINE) ENDC COMMENT *** ;
05800 IFC SAILXGP THENC OUT(LISTCHAN, ESCAPE1&'42&L) ENDC COMMENT *** ;
05900 ELSE
06000 OUT(LISTCHAN, ENDLINE) ;
06100
06200 LEADING[N] ← 0 ; TES 11/4/74 ;
06300
06400 IF DEBUG THEN SRCREF[N] ← NULL ;
06500 END "LIST LINE" ;
06600
06700 FOR N ← LASL+1 THRU PAGEHIGH DO FAKE[N]←LINK[N]←0 ; TES 4/4/74 ;
06800
06900 IFC ITSVER THENC OUT(LISTCHAN, ENDPAGE) ; ENDC
07000
07100 IFC PARCVER THENC
07200 OUT(LISTCHAN, ENDPAGE) ;
07300 ENDC
07400
07500 END "FINPAGE" ;
07600
07700 END "PAGE" ;
07800
07900 IF NOT (PAGEEOF OR PAGEHIGH LEQ 0) THEN DONE ; comment expand IMG ;
08000 RELEASE(ICHAN) ; RELEASE(SCHAN) ;
08100 END "FILE" ;
08200
08300 END "SIZE" UNTIL SEQEOF ;
00100 IFC PARCVER THENC PARCDOC ENDC
00200
00300 IFC SAILVER THENC OUT(LISTCHAN, ENDPAGE) ; ENDC
00400
00500 RELEASE(LISTCHAN) ; RELEASE(SEQCHAN) ;
00600 END "INNER BLOCK" ;
00100 BEGIN EXTERNAL SIMPLE PROCEDURE K!OUT ; K!OUT END ; COMMENT ** ** ** ** ** ;
00200
00300 OUTSTR("." & CRLF) ; comment signal terminal that pass two is done ;
00400 IF DELINT="A" OR DELINT="a" THEN
00500 BEGIN
00600 OUTSTR(CRLF & "DELETE INTERMEDIATE FILES?(Y OR N,CR)") ;
00700 DELINT ← INCHWL ;
00800 END ;
00900 IF DELINT="Y" OR DELINT="y" THEN
01000 BEGIN "DELETE INTERMEDIATE FILES"
01100 IFC TENEX THENC
01200 SIMPLE PROCEDURE DELVER(STRING FINAME) ;
01300 BEGIN INTEGER CHN ;
01400 CHN ← OPENFILE(FINAME&";*", "RO*") ;
01500 DO DELF(CHN) UNTIL NOT INDEXFILE(CHN) ;
01600 RELEASE(CHN) ;
01700 END ;
01800 DELVER(JOBNO & ".PASS2") ;
01900 ENDC
02000 SEQCHAN ← READIN(
02100 IFC TENEX THENC IFILENAME&".FILES" ELSEC "PUPSEQ"&PUIEXT ENDC,
02200 FALSE, SEQBRC, SEQEOF) ;
02300 DO INPUT(SEQCHAN, TO!LF!APPD) UNTIL SEQBRC=LF;
02400 IFC TENEX THENC DELVER(IFILENAME & ".LABELS") ; ELSEC
02500 LABCHAN ← READIN("PULABL"&PUIEXT, FALSE, LABBRC, LABEOF) ;
02600 RENAME(LABCHAN, NULL, 0, I) ;
02700 RELEASE(LABCHAN);
02800 ENDC
02900 AWHILE DO
03000 BEGIN
03100 PAGEFILE ← SPARAM ;
03200 IF SEQEOF THEN DONE ;
03300 IFC TENEX THENC
03400 DELVER(IFILENAME & OCTEXT & PAGEFILE) ;
03500 DELVER(IFILENAME & TXTEXT & PAGEFILE) ;
03600 ELSEC
03700 IFILE ← PAGEFILE & PUIEXT ; SFILE ← PAGEFILE & "S"&PUIEXT ;
03800 ICHAN ← READIN(IFILE, TRUE, PAGEBRC, PAGEEOF) ;
03900 SCHAN ← READIN(SFILE, FALSE, PAGEBRC, PAGEEOF) ;
04000 RENAME(ICHAN, NULL, 0, I) ; RENAME(SCHAN, NULL, 0, I) ;
04100 RELEASE(ICHAN); RELEASE(SCHAN);
04200 ENDC
04300 END ;
04400 IFC NOT TENEX THENC RENAME(SEQCHAN, NULL, 0, I) ENDC ;
04500 RELEASE(SEQCHAN) ;
04600 IFC TENEX THENC DELVER(IFILENAME & ".FILES") ; ENDC
04700 END "DELETE INTERMEDIATE FILES"
04800 ELSE IF DELINT NEQ "N" AND DELINT NEQ "n" THEN
04900 OUTSTR(CRLF&DELINT&"? -- INTERMEDIATE FILES WERE NOT DELETED") ;
05000
05100 IFC SAILVER THENC
05200 IF DEVICE = MIC THEN
05300 BEGIN "PASS 3"
05400 INTEGER FCHAN ;
05500 INTEGER SIMPLE PROCEDURE CORELOC(INTEGER ARRAY A) ; START!CODE MOVE 1, A ; END ;
05600 INTEGER ARRAY PASSTHREE[0:4] ;
05700 FCHAN ← WRITEON("$PUB$"&RPGEXT) ;
05800 OUT(FCHAN, LISTFILE&CRLF&TMPFILE&CRLF&"F"&CRLF&FF) ;
05900 RELEASE(FCHAN) ;
06000 PASSTHREE[0] ← CVSIX("DSK") ;
06100 PASSTHREE[1] ← CVFIL("TXTF80[1,3]", PASSTHREE[2], PASSTHREE[4]) ;
06200 PASSTHREE[3] ← 1 ; COMMENT STARTING ADDRESS IS NORMAL + 1 ;
06300 OUTSTR("PRODUCING FR80 FILE" & CRLF) ;
06400 CALL(CORELOC(PASSTHREE), "SWAP") ;
06500 END "PASS 3" ;
06600 IF XCRIBL THEN LODED("XSPOOL "&LISTFILE&CRLF);
06700 ENDC
06800
06900 IFC CMUVER THENC
07000 RKJ: 26-SEP-74 ALL NEW CODE;
07100 IF XCRIBL AND DOPASS3 THEN
07200 BEGIN "PASS 3"
07300 WTMPFILE("PB3",LISTFILE&CR&LF,TRUE);
07400 RUNPROG("DSK:PUB3[A700PU00]",1);
07500 START!CODE CALLI 0,'12 END;
07600 END "PASS 3";
07700 RKJ: NOW CHECK FOR MORE COMMANDS IN THE TMP FILE;
07800 IF RTMPFILE("PUB",S,FALSE,TRUE) THEN
07900 BEGIN "RERUN"
08000 RUNPROG("PUB",1);
08100 START!CODE CALLI 0,'12 END;
08200 END "RERUN";
08300 ENDC
08400
08500 IFC ISIVER THENC
08600 TES 8-OCT-74 APPROXIMATION TO WHAT ISI NEEDS;
08700 IF XCRIBL AND DOPASS3 THEN
08800 BEGIN "PASS 3"
08900 INTEGER J, JOBNO ;
09000 JOBNO ← CVS(GJINF(J, I, J)) ;
09100 J ← OPENFILE(JOBNO & ".PASS3", "WT") ;
09200 OUT(J, LISTFILE & CRLF) ;
09300 RELEASE(J) ;
09400 RUNPRG("<SUBSYS>PUB3.SAV", 1, 0) ;
09500 CALL(0,"EXIT") ;
09600 END "PASS 3" ;
09700 ENDC
09800 IFC TENEX THENC CALL(1,"EXIT") ; CALL(0,"EXIT"); ELSEC
09900 START!CODE IFC NOT ITSVER THENC CALLI 1,'12; ENDC CALLI 0,'12; END;
10000 ENDC
10100
10200 MAKEBE(WCW, CW) ;
10300
10400 END "VARIABLE BOUND ARRAY BLOCK" ;
10500
10600 END "PUB2" ;