Trailing-Edge
-
PDP-10 Archives
-
BB-4172G-BM
-
language-sources/dr0n.bli
There are 18 other files named dr0n.bli in the archive. Click here to see a list.
!THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
! OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
!
!COPYRIGHT (C) 1972,1973,1974,1977,1978 DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. 01754
!FILENAME: LODRIV.BLI
!DATE: 18 OCTOBER 73 MGM/FLD
%3.2% GLOBAL BIND LODRV=12; !MODULE VERSION NUMBER
! UTILITY ROUTINES FOR BLISS
! ------------------------------------------
!
! REVISION HISTORY:
!
! 7-14-77 ROUTINE READALINE IS MODIFIED TO FIX A BUG IN
! MULTIPLE MODULES.ANY ANYTHING FOLLOWED BY
! ELUDOM IS DISCARDED.IF MODULE FOLLOWS ELUDOM
! USER WILL GET AN ERROR FOR NEXT MODULE .
! 7-15-77 ROUITNE READALINE IS MODIFIED SO THAT NO EXTRA BLANK
! IS INSERTED IN QUOTED STRING EVER MORE THAN ONE
! SOURCE LINE.
! 6-2-77 ROUTINE EOCHAR IS MODIFIED SO THAT BLISS10 STATISTICS
! GETS LISTED ON TTY IF LISTING DEVICE IS NOT A TTY.
!
! 1/26/77 ADDED NECESSARY CODE TO FORCELINE TO HANDLE
! THE BLISS-36 LISTING DEMANDS. THIS INCLUDES A NEW
! ROUTINE LINOUT.
!
! 5-9-77 ROUTINE READALINE IS MODIFIED TO HAVE MORE THAN ONE
! MODULE IN A FILE.THIS DOES NOT ADVANCE THE INPUT
! BUFFER AND POINT TO CURRENT LINE IN INPUT BUFFER.
!
! IO ROUTINES
!-------------
%3.1% GLOBAL ROUTINE OUTPUT(DEV,CHUNK)=
! OUTPUT A CHUNK (ALLWORD OR CHAR) ON 'DEV', WHERE
! DEV= 1 BINARY DEVICE(HIGH SEGMENT)
! 2 LISTING DEVICE
BEGIN MACHOP IDPB=#136;
IF (DEVBUF[.DEV,2]_.DEVBUF[.DEV,2]-1) LEQ 0 THEN FORCE(.DEV);
3<0,36>_.CHUNK; IDPB(3,DEVBUF[.DEV,1])
END;
%3.1% GLOBAL ROUTINE OCHAR(CHAR)=
! OUTPUT ONE CHARACTER ON THE LISTING DEVICE
(IF NOT .LSTFLG THEN OUTPUT(2,.CHAR);1);
%3.1% GLOBAL ROUTINE OUTREL(ALLWORD)=
! OUTPUT ONE ALLWORD ON THE HIGH-SEG BINARY FILE
( IF NOT .BINFLG THEN OUTPUT(1,.ALLWORD);1);
%2.25%GLOBAL ROUTINE OUTPSTRING(PTR)=
%2.25% !OUTPUT THE ASCIZ STRING STARTING AT ADDRESS .PTR
%2.25% !TO THE LISTING DEVICE
%2.25%
%2.25% IF NOT .LSTFLG THEN
%2.25% BEGIN
%2.25% REGISTER BP, !BYTE POINTER TO OUTPUT STRING
%2.25% CHAR; !HOLDS CHAR TO BE OUTPUT
%2.25%
%2.25% BP_((.PTR)-1)<0,7>; !INIT BYTE POINTER
%2.25%
%2.25% !OUTPUT ASCIZ STRING UNTIL NULL CHAR
%2.25%
%2.25% UNTIL (CHAR_SCANI(BP)) EQL 0
%2.25% DO OUTPUT(2,.CHAR);
%2.25%
%2.25% END;
%3.1% GLOBAL ROUTINE OUTSTR(STR,N)=
IF NOT .LSTFLG THEN
BEGIN LOCAL P; MACHOP ILDB=#134;
! OUTPUT A (SHORT) STRING, N CHARS L.J., ON LISTING DEVICE
P_STR<7*.N,7>;
INCR I FROM 1 TO .N DO OUTPUT(2,ILDB(3,P));
.N
END;
%3.1% GLOBAL ROUTINE OUTSTN(I)=
IF NOT .LSTFLG THEN
BEGIN LOCAL P,N,C; MACHOP ILDB=#134;
! OUTPUT A NAME FROM THE ST, INDEX OF ENTRY IS 'I'.
P_ST[.I,1]<1,7>; N_0;
WHILE (C_ILDB(3,P)) NEQ #177 AND .N LSS 10 DO (OUTPUT(2,.C);N_.N+1);
.N
END;
%3.1% GLOBAL ROUTINE OUTBLANK(N)=
IF NOT .LSTFLG THEN
BEGIN ! OUTPUT 'N' BLANKS ON THE LISTING DEVICE
INCR I FROM 1 TO .N DO OUTPUT(2," ")
END;
%3.1% GLOBAL ROUTINE OUTMOC(ALLWORD)=
IF NOT .LSTFLG THEN
BEGIN LOCAL T; T_0;
! OUTPUT MINIMAL LENGTH OCTAL CONSTANT
DECR I FROM 11 TO 1 DO
IF .ALLWORD<3*.I,3> NEQ 0 THEN BREAK(T_.I);
DECR I FROM .T TO 0 DO OUTPUT(2,"0"+.ALLWORD<3*.I,3>);
.T+1
END;
%3.1% GLOBAL ROUTINE OUTCONOC(A)=
!OUTPUT-CONCISE-OCTAL. CALLED FOR 18BIT CONSTANTS. PUTS THEM IN
%3.19% !NEGATIVE FORMAT IF .A<15,3>=7.
%3.19% IF (.A<15,3> EQL 7) THEN (OCHAR("-"); OUTMOC(-(.A OR LEFTM)) + 1)
ELSE OUTMOC(.A);
%3.1% GLOBAL ROUTINE NEWLINE=
IF NOT .LSTFLG THEN
BEGIN
! WRITE NEW LINE SYMBOL, HANDLE REQ'D PAGINATION.
OCHAR(#15); OCHAR(#12); ! IF .TTYLST THEN (OCHAR(#15); OCHAR(#15));
IF (NLINES_.NLINES+1) GTR 56 THEN (PAGE(); NLINES_0);
IF .TTYLST THEN FORCE(2);
END;
! ERROR IO ROUTINES
!-------------------
%3.1% GLOBAL ROUTINE EOCHAR(CHAR)=
BEGIN
! ERROR OUTPUT (ONE CHARACTER). OUTPUT GOES TO THE LISTING
! DEVICE, IF THERE IS ONE, AND TO THE TTY -- IF: 1) TTY IS
! NOT THE LISTING DEVICE ALREADY, 2) ERROR MESSAGES TO TTY
! HAVE NOT BEEN SPECIFICALLY SUPRESSED.
IF NOT .LSTFLG THEN OUTPUT(2,.CHAR);
! OUTPUT BLISS-10 STATISTICS FOR BLISS-36C ALSO 6-1-77
IF NOT (.ERRBIT OR .TTYLST OR (.CCLCTL<2,1> AND NOT .B20FLG)) THEN TTYLIST(.CHAR);
1
END;
%2.25%GLOBAL ROUTINE EOUTPSTRING(PTR)=
%2.25% !OUTPUT THE ASCIZ STRING STARTING AT ADDRESS .PTR
%2.25%
%2.25% BEGIN
%2.25% REGISTER BP, !BYTE POINTER TO OUTPUT STRING
%2.25% CHAR; !HOLDS CHAR TO BE OUTPUT
%2.25%
%2.25% BP_((.PTR)-1)<0,7>; !INIT BYTE POINTER
%2.25%
%2.25% !OUTPUT ASCIZ STRING UNTIL NULL CHAR
%2.25%
%2.25% UNTIL (CHAR_SCANI(BP)) EQL 0
%2.25% DO EOCHAR(.CHAR);
%2.25%
%2.25% END;
%3.1% GLOBAL ROUTINE EOUTSTR(STR,N)=
BEGIN LOCAL P; MACHOP ILDB=#134;
! OUTPUT (SHORT) STRING ON ERROR DEVICE(S)
P_STR<7*.N,7>;
INCR I FROM 1 TO .N DO EOCHAR(ILDB(3,P));
END;
%3.1% GLOBAL ROUTINE EOSTN(I)=
BEGIN LOCAL P,N,C; MACHOP ILDB=#134;
!OUTPUT A NAME FROM THE ST. INDEX OF ENTRY 'I' ON ERROR DEVICES
P_ST[.I,1]<1,7>; N_0;
WHILE (C_ILDB(3,P)) NEQ #177 AND .N LSS 10 DO (EOCHAR(2,.C);N_.N+1);
.N
END;
ROUTINE EOUTBLANK(N)=
BEGIN
! OUTPUT SPECIFIED NO. BLANKS ON ERROR DEVICE(S)
DECR I FROM (.N - 1) TO 0 DO EOCHAR(" ");
END;
%3.20% GLOBAL ROUTINE OUTNUM(NUM, BASE, REQD, TOG)=
%3.20% BEGIN OWN N, B, RQ, T, OUTCHAR, ANUM;
%3.20%
%3.20% ROUTINE OUTXNUM=
%3.20% BEGIN LOCAL R;
%3.20%
%3.20% IF .N EQL 0 THEN
%3.20% (IF .RQ NEQ 0 THEN
%3.20% (DECR I FROM (.RQ - .T - .ANUM) TO 0 DO
%3.20% (.OUTCHAR)(IF .B EQL 10 THEN " " ELSE "0"));
%3.20% RETURN 0);
%3.20%
%3.20% R_ .N MOD .B; N_ .N / .B; T_ .T + 1;
%3.20% OUTXNUM(); (.OUTCHAR)("0" + .R);
%3.20% END;
%3.20%
%3.20%
%3.20% OUTCHAR_ IF .TOG THEN EOCHAR<0,0> ELSE OCHAR<0,0>;
%3.20%
%3.20% IF .NUM LSS 0 THEN (.OUTCHAR)("-");
%3.20%
%3.20% ANUM_ 1 + ((.NUM EQL 0) AND (.BASE EQL 10));
%3.20%
%3.20% B_ .BASE; RQ_ .REQD; T_ 0; N_ ABS(.NUM); OUTXNUM();
%3.20%
%3.20% IF (.NUM OR ((.REQD NEQ 0) AND (.BASE NEQ 10))) EQL 0 THEN (.OUTCHAR)("0");
%3.20%
%3.20% END;
%3.1% GLOBAL ROUTINE ENEWLINE=
BEGIN
! OUTPUT NEWLINE ON THE ERROR DEVICE(S). CHECK PAGINATION
EOCHAR(#15); EOCHAR(#12);
IF NOT .LSTFLG THEN
IF (NLINES_.NLINES+1) GTR 56 THEN (PAGE(); NLINES_0);
END;
%3.1% GLOBAL ROUTINE EMESSAGE(N)=
BEGIN
! WRITE OUT A LIST OF N ONE-FULLWORD STRINGS ON THE ERROR
! DEVICE(S). THE STRINGS ARE ASSUMED BELOW N ON THE
! STACK, AND HENCE THE CALL LOOKS LIKE:
!
! EMESSAGE( -STR-,-STR-, ... ,-STR-, N )
! <------ N OF 'EM ------>
!
!
DECR I FROM .N TO 1 DO EOUTSTR(@(N-.I),5);
END;
%3.1% GLOBAL ROUTINE FORCELINE(TOG)=
BEGIN REGISTER P,C; MACHOP ILDB=#134; EXTERNAL BXA;
%5.200.37% EXTERNAL BGNLINETAG;
EXTERNAL DLCNT; ! NUMBER OF DEL CHARS IN INPUT LINE.
! THIS ROUTINE FORCES OUT THE CURRENT INPUT BUFFER LINE
! IF IT IS VALID (IE, IT HASN'T BEEN PRINTED ALREADY.
! THE VALUE OF TOG SPECIFIES WHETHER THE LINE IS WRITTEN
! TO BOTH THE LISTING AND ERROR DEVICES. TOG=1 => ALSO
! TO THE ERROR DEVICE.
ROUTINE LINOUT(BUFPNT,TOG)=
! OUTPUT A STRING OF CHARACTERS STARTING WITH THE FIRST CHARACTER
! IN THE WORD POINTED TO BY BUFPNT AND ENDING WITH CHARACTER
! #177. IF TOG IS TRUE THIS IS AN ERROR OUTPUT.
BEGIN
LOCAL C,P;
P_(.BUFPNT-1)<1,7>;
WHILE (C _ SCANI(P)) NEQ #177 DO
IF .C GEQ " " OR .C EQL #11
THEN
IF .TOG
THEN
EOCHAR(.C)
ELSE
OCHAR(.C);
.VREG
END;
LOCAL PFXP,PFXCNT,PFXBUF[2];
IF .VALIDBUF THEN
BEGIN
VALIDBUF _ 0;
IF .B20FLG<0,1> AND .B20FLG<2,1> THEN
BEGIN
P _ BUFF<22,7>; ! 2ND CHAR. 1ST IS ALWAYS SPACE
C _ SCANN(P);
IF .C NEQ "!" THEN RETURN .VREG;
REPLACEN(P,1);
C _ SCANI(P);
IF .DLCNT GEQ 2 THEN RETURN .VREG;
PFXP=PFXBUF<29,7>;
REPLACEN(PFXP,#177);
PFXCNT=0;
IF .DLCNT EQL 0 THEN
IF .C EQL #11
THEN
WHILE .C NEQ #177 DO
BEGIN
REPLACEN(P,1);
IF (C _ SCANI(P)) EQL #11
THEN
EXITLOOP;
END
ELSE
BEGIN
WHILE .C NEQ #177 DO
BEGIN
REPLACEN(P,1);
IF "A" LEQ .C AND .C LEQ "Z" THEN
IF .PFXCNT LSS 7 THEN
BEGIN
REPLACEN(PFXP,.C);
REPLACEI(PFXP,#177);
PFXCNT _ .PFXCNT+1;
END;
IF (C_SCANI(P)) EQL #11
THEN
EXITLOOP;
END;
END;
END;
IF .RPAGE THEN (PAGER(); NLINES_ 0);
P_@@(BXA+#16)^(-1);
%2.25% OCHAR(";"); !MAKE IT A COMMENT FOR MACRO-10
IF .B20FLG<0,1> AND .B20FLG<2,1>
THEN
LINOUT(PFXBUF,.TOG)
ELSE
IF .TOG
THEN
(EOUTSTR(.P,5); EOCHAR(.BGNLINETAG); EOCHAR(#11); OUTNUM(.LINCNT^(-4),10,4,1); EOUTBLANK(3)) !5.200.37 3.20
ELSE
(OUTSTR(.P,5); OCHAR(.BGNLINETAG); OCHAR(#11); OUTNUM(.LINCNT^(-4),10,4,0); OUTBLANK(3)); !5.200.37 3.20
LINOUT(BUFF,.TOG);
IF .TOG THEN ENEWLINE() ELSE NEWLINE();
END;
END;
%3.12% GLOBAL ROUTINE SAVEMACSRC=IF NOT (.LSTFLG OR .TTYLST) THEN OUTPUT(2,";");
! THIS ENTIRE PAGE WAS GENERATED FOR CCO 3.18, UNLESS SPECIFICALLY
! OTHERWISE STATED, THAT IS THE CCO LEVEL FOR EACH LINE.
FORWARD GIVEDIAG;
GLOBAL ROUTINE IDERROR(NUM,STE)=
BEGIN
FORCELINE(1); ENEWLINE(); !PRINT LINE AND BLANK
GIVEDIAG(.NUM, 0); !GIVE DIAGNOSTIC WITH NO <CRLF>
EMESSAGE("; ID",": ",2); !TELL WHAT WE'RE GIVING
EOSTN(.STE); ENEWLINE(); ENEWLINE(); !GIVE BAD ID
WARNINGFOUND_ .WARNINGFOUND + 1;
END;
GLOBAL ROUTINE ERROUT(NUM, POSN)=
BEGIN
! 5.200.36 ... PROVIDE LIST OF ERROR LINES
GLOBAL HDERRLINE,ERRLINLNG;
MACRO EFIRSTB=HDERRLINE<18,18>$,
ELASTB=HDERRLINE<0,18>$,
EBLKN=CT[.ELASTB,0]<18,18>$,
EBLK1=CT[.ELASTB,0]<0,18>$,
EBLK2=CT[.ELASTB,1]<18,18>$,
EBLK3=CT[.ELASTB,1]<0,18>$;
GLOBAL ROUTINE PRNTERLNS=
BEGIN
ROUTINE PRNTERLNV(L16)=
BEGIN
BIND LNSIZE=130;
IF .ERRLINLNG EQL 0 THEN
(EOUTBLANK(10);ERRLINLNG_10);
IF .ERRLINLNG GTR LNSIZE-6 THEN
(ENEWLINE();ERRLINLNG_0;PRNTERLNV(.L16);RETURN);
EOUTBLANK(2);OUTNUM(.L16<4,14>,10,4,1);
ERRLINLNG_.ERRLINLNG+6;
RETURN
END;
LOCAL L1;
IF .EFIRSTB EQL 0 THEN RETURN;
L1_.EFIRSTB;
EFIRSTB_.ELASTB;
ELASTB_.L1;
ENEWLINE();ENEWLINE(); ERRLINLNG_0;
EMESSAGE("ERROR","S AND","/OR W","ARNIN","GS ON",
" LINE","S: ",7);
ENEWLINE();
WHILE (.EFIRSTB NEQ .ELASTB) DO
(PRNTERLNV(.EBLK1);
PRNTERLNV(.EBLK2);
PRNTERLNV(.EBLK3);
ELASTB_.EBLKN);
PRNTERLNV(.EBLK1); IF .EBLKN EQL 1 THEN RETURN (HDERRLINE_0);
PRNTERLNV(.EBLK2); IF .EBLKN EQL 2 THEN RETURN (HDERRLINE_0);
PRNTERLNV(.EBLK3); RETURN (HDERRLINE_0)
END;
IF .ELASTB EQL 0 THEN
(ELASTB_EFIRSTB_GETSPACE(1);
EBLKN_1;
EBLK1_.POSN<LEFTHALF>)
ELSE IF .EBLKN EQL 3 THEN
(EBLKN_GETSPACE(1);
ELASTB_.EBLKN; !WE NOW POINT TO THE NEW BLOCK
EBLKN_1;
EBLK1_.POSN<LEFTHALF>)
ELSE
(EBLKN_.EBLKN+1;
(IF .EBLKN EQL 2 THEN EBLK2 ELSE EBLK3)_.POSN<LEFTHALF>);
! ... 5.200.36
FORCELINE(1); SAVEMACSRC(); !PRINT BAD LINE
IF .POSN<LEFTHALF> EQL .LINCNT
THEN EOUTBLANK(9)
ELSE (EOUTSTR("LINE:",5);
%3.20% OUTNUM(.POSN<22,14>,10,4,1)); !INFORM THE USER OF WHICH LINE WE MEAN
EOUTBLANK(6); !POSITION
%5.200.23% DECR I FROM (.POSN<0,7>-2) TO 0 DO EOCHAR(".");
EOCHAR("^"); ENEWLINE(); !POINT TO ERROR
GIVEDIAG(.NUM, 1); ENEWLINE(); !GIVE DIAGNOSTIC
END;
GLOBAL ROUTINE ERROR(POS, NUM)=
BEGIN
IF NOT .ERRLEVEL THEN
(ERROUT(.NUM, .POS);
CODETOG_ LABIND_ 0;
ERRORFOUND_ .ERRORFOUND + 1);
0
END;
GLOBAL ROUTINE WARNEM(POS, NUM)= (ERROUT(.NUM, .POS); WARNINGFOUND_ .WARNINGFOUND + 1; 0);
! THIS ENTIRE PAGE WAS GENERATED FOR CCO 3.18. UNLESS SPECIFICALLY
! OTHERWISE STATED, THAT IS THE CCO LEVEL FOR EVERY LINE.
MACRO SKIP(OP)=(REGISTER Q; Q_ 1; (OP); Q_ 0; .Q)$;
FORWARD ERRRELEASE;
ROUTINE GETERRFILE(DEVICE,PPN)=
BEGIN LOCAL OPENBLOCK[3], SJBFF;
REGISTER REG;
EXTERNAL ?.JBFF;
MACHOP OPEN=#050, INBUF=#064, LOOKUP=#076;
IF .ERROPEN THEN RETURN 1; !RETURN IF ALREADY OPEN
ERRDAT_ GETSPACE(#205);
OPENBLOCK_ 0;
OPENBLOCK[1]_ .DEVICE;
ERRDAT<LEFTHALF>_ OPENBLOCK[2]_ ST[.ERRDAT<RIGHTHALF>,0]<0,0>;
IF NOT SKIP(OPEN(4,OPENBLOCK<0,0>)) THEN
RETURN (ERRRELEASE(); 0);
SJBFF_ .?.JBFF; ?.JBFF_ .ERRDAT<LEFTHALF>+3;
INBUF(4,1); ?.JBFF_ .SJBFF;
ERRFILE[3]_ .PPN;
IF NOT SKIP(LOOKUP(4,ERRFILE<0,0>)) THEN
RETURN (ERRRELEASE(); 0);
ERROPEN_ 1
END;
ROUTINE ERRRELEASE=(RELEASESPACE(.ERRDAT<RIGHTHALF>,#205); ERROPEN_ 0);
ROUTINE INERRCHAR=
BEGIN MACHOP IN=#056, STATZ=#063;
IF ((.ERRDAT<LEFTHALF>)[2]_ .(.ERRDAT<LEFTHALF>)[2] - 1) LEQ 0 THEN
IF SKIP(IN(4)) THEN
IF SKIP(STATZ(4,#740000)) THEN RETURN 0;
SCANI((.ERRDAT<LEFTHALF>)[1])
END;
! THIS ENTIRE PAGE WAS GENERATED FOR CCO 3.18. SEE COMMENTS ON
! THE PRECEEDING PAGES.
GLOBAL ROUTINE GIVERRDIAG(DISP, HEAD)=
BEGIN LOCAL TEMP, VALUE, NOTDONE;
REGISTER PTR;
MACHOP USETI=#074;
LABEL DIAGLOP;
USETI(4, .ERRTABLE[.DISP]<0,12>);
NOTDONE_ 1;
WHILE .NOTDONE DO
(PTR_ HEAD<36,7>;
(VALUE_ DIAGLOP: DECR I FROM 3 TO 0 DO
(IF (IF (TEMP_ INERRCHAR()) EQL 0
THEN RETURN 0
ELSE .TEMP) NEQ SCANI(PTR)
THEN LEAVE DIAGLOP WITH 0);
NOTDONE_ .VALUE + 1));
DECR I FROM 7 TO 0 DO INERRCHAR(); !SCAN PAST PARAMETERS
UNTIL (TEMP_ INERRCHAR()) EQL #15 DO EOCHAR(.TEMP); !GIVE DIAGNOSTIC
1
END;
! THE COMMENTS ON THE PRECEEDING PAGES CONCERNING CCO 3.18 REFER TO
! THIS PAGE TOO.
GLOBAL ROUTINE GIVEDIAG(NUM, CRLFFLAG)=
BEGIN LOCAL TYPE;
SAVEMACSRC(); ! MAKE A COMMENT OF THE MESSAGE
EOCHAR(IF (TYPE_ IF (TYPE_ .ERRTABLE[.NUM]<12,2>) EQL 0
THEN "%"
ELSE IF .TYPE EQL 1 THEN "??" ELSE "@") EQL "@" THEN "??" ELSE .TYPE); !MESSAGE TYPE
EOUTSTR("BLS",3); ! COMPILER ID
EOUTSTR(.ERRTABLE[.NUM]<15,21>, 3); ! MNEMONIC
IF .NOENGLISH THEN
RETURN (IF .CRLFFLAG THEN ENEWLINE()); ! DONE IF ONLY MNEMONIC
EOCHAR(#11); ! TAB
%3.31% IF .COREGONE THEN
%3.24% RETURN (EMESSAGE("The c","ompil","er is"," unab","le to",
%3.24% " acqu","ire a","dditi","onal ","core",10);
%3.24% ENEWLINE());
IF NOT GETERRFILE(.ERRDEV,.ERRPPN) THEN ! CAN'T LOCATE CORRECT .ERR FILE
IF NOT GETERRFILE(SIXBIT'SYS',0) THEN ! CHECK SYS
RETURN (ENEWLINE(); SAVEMACSRC();
EMESSAGE("%BLSN","ER Ca","nnot ","acces","s .ER",
"R fil","e", 7); ENEWLINE()); ! HACK MESSAGE
IF NOT GIVERRDIAG(.NUM, .TYPE^29 + (.ERRTABLE[.NUM]<15,21>^8))
THEN (ENEWLINE(); SAVEMACSRC();
EMESSAGE("%BLSN","MS Ca","nnot ","find ","appro",
"priat","e mes","sage",8); ENEWLINE());
IF .CRLFFLAG THEN ENEWLINE();
END;
! LOGICAL (?) IO ROUTINES
!-------------------------
%3.1% GLOBAL ROUTINE READALINE=
BEGIN LOCAL L1;
%5.200.37% GLOBAL EOLCONTEXT,BGNLINETAG;
% THE FOLLOWING LINE HAS THIS PURPOSE.IF TRUE, IT
JUST FINISHED PROCESSING ONE MODULE FROM A FILE.IT IS READY
TO PROCESS NEXT MODULE.IF FALSE IGNORE IT.DRIVER ROUTINE
SETS IT AND REINIT ROUTINE USES IT.
THERE MAY BE MORE THAN ONE MODULE IN A FILE.
THERE IS ALREADY AN INPUT LINE IN THE BUFFER AND DONOT READ NEXT LINE.
%
%3-24-77% EXTERNAL NOMOREINPUT; !TRUE MEANS JUST FINISHED ONE MODULE
!5.200.37 EOLCONTEXT IS TOP_OF_STACK OF CHAR DESCRIBING LEXICAL (OR OTHER ) STATE:
!5.200.37 "%" FOR INSIDE %-COMMENT
!5.200.37 "M" FOR INSIDE MACRO DEFINITION
!5.200.37 "S" FOR INSIDE STRING ("..", '...')
!5.200.37 "*" FOR INSIDE CODE NOT COMPILED DUE TO LITERAL TEST IN IF*THEN*ELSE
!5.200.37 (THESE ARE NOT ALL IMPLEMENTED: MARCH 1, 1976)
! READ THE NEXT INPUT LINE INTO 'BUFF', PRINTING THE PREVIOUS
! LINE IF THIS HAS NOT ALREADY BEEN DONE (EG., BY AN ERROR
! MESSAGE. A LINE NUMBER IS ASSIGNED TO THE INPUT LINE AND
! A RECORD OF THIS IS PLACED IN THE CODE STRING.
FORCELINE(0); VALIDBUF_1; LINCNT_.LINCNT+16;
%5.200.37% BGNLINETAG_.EOLCONTEXT; !EOLCONTEXT WILL BE RESET, IF NECESSARY, ELSEWHERE.
%5.200.37% IF .BGNLINETAG EQL 0 THEN IF NOT .CODETOG THEN
%5.200.37% BGNLINETAG_"*"; !INSIDE NON-COMPILING CODE
IF .CT[.CT[.CODEPTR,1]<PREVF>,1]<LEFTHALF> NEQ 0
THEN BEGIN
CT[L1_GETSPACE(1),1]_.LINCNT;
PUSHBOT(.CODEPTR,.L1);
END;
IF .NOMOREINPUT THEN NOMOREINPUT_0 %RESET IT AND GO %
ELSE
IF READTEXT() THEN RECOVER (.LINCNT^18,ERILTL); !IF 1 INPUT LINE IS LONGER THAN 135 CHARS
IF .FINFLG THEN ( BUFF_'END);'; BUFF+1_'$;%"'''; BUFF+2_#067777777777 );
IF .BUFF
THEN (PBUFF_IF .EOLCONTEXT EQL "S" THEN (BUFF+1)<29,7> ELSE BUFF<1,7>; NCBUFF_5+.LINCNT^18)
ELSE (PBUFF_IF .EOLCONTEXT EQL "S" THEN BUFF<29,7> ELSE (BUFF-1)<1,7>; NCBUFF_0+.LINCNT^18);
END;
!END OF LODRIV.BLI