perm filename SORCE.SAI[PUB,TES] blob sn#151278 filedate 1975-03-14 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00012 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00003 00002	BEGOF("SORCE")
C00005 00003	PUBLIC SIMPLE PROCEDURE SORCE! $"#
C00009 00004	PUBLIC SIMPLE PROCEDURE BURPINPUT(BOOLEAN VERBOSE) $"#
C00010 00005	PUBLIC SIMPLE PROCEDURE DREQUIRE $"#
C00011 00006	PUBLIC SIMPLE PROCEDURE GROWNESTS $"#
C00012 00007	PUBLIC STRING SIMPLE PROCEDURE RD(INTEGER BRKTBL) $"#
C00019 00008	PUBLIC SIMPLE PROCEDURE SWICH(STRING NEWINPUTSTR INTEGER NEWINPUTCHAN, ARGS) $"#
C00021 00009	PUBLIC STRING SIMPLE PROCEDURE SWICHBACK $"#
C00023 00010	PUBLIC SIMPLE PROCEDURE SWICHF(STRING FILENAME) $"#
C00024 00011	PRIVATE SIMPLE PROCEDURE SWICHFILE(STRING FILENAME  INTEGER CHAN) $"#
C00026 00012	FINISHED
C00027 ENDMK
C⊗;
BEGOF("SORCE")

COMMENT

                *** Variations at Different Sites ***

SWICHFILE has to ignore the directory page on TV files at SU-AI.
SORCE! differentiates file naming at TENEX sites. SORCE! also
has an optional feature presently enabled only at PARC: if there is a
file named MYPUB.DFS in the user directory, it is automatically
REQUIREd after PUBSTD.DFS.

                                 ***


Source switching and scanning module.  The principal data structure
is INPUTSTR, the current string being scanned.  RD scans it and also
replenishes it when exhausted. The INEST and SNEST arrays remember
sources that have been pushed down due to macro calls, REQUIRE
SOURCE!FILE, etc.

;

PROCEDURES
PUBLIC SIMPLE PROCEDURE SORCE! ;$"#
BEGIN "SORCE!"

INPUTCHAN ← -1 ;
INPUTSTR ← CRLF & "99999/99" & TB & TB &
    "<<)]"&RCBRAK&"⊃>>;END""PAST EOF"";END""PASSED EOF"";" ;

S ← TEXT!BRC ← CRLF & ALTMODE & RUBOUT & VT & " -.!?" ;
WHILE FULSTR(S) DO DPB(LDB(SPCHAR(J ← LOP(S))), SPCODE(J)) ;

DEFN!BRC ← RCBRAK&"$)⊂⊃∃" & LF & LETTS ;
LDEFN!BRC ← LENGTH(DEFN!BRC) ;

SETBREAK(TO!VT!SKIP,	VT,		NULL,		"IS") ;
SETBREAK(TO!COMMA!RPAR,	",)" & LF,	CR,		"IR") ;
SETBREAK(TO!TERQ!CR,	RCBRAK&";),]⊂"&CRLF,	NULL,	"IR") ;
SETBREAK(TO!SEMI!SKIP,	";"&RCBRAK&""&LF,	NULL,	"IS") ;
SETBREAK(NO!CHARS,	NULL,		NULL,		"XRL");
SETBREAK(ONE!CHAR,	NULL,		NULL,		"XA") ;
SETBREAK(TO!TB!FF!SKIP,	TB&FF,		LF,		"IS") ;
SETBREAK(TO!LF!TB!VT!SKIP, LF&TB&VT,	FF,		"ISL");
SETBREAK(TO!VISIBLE,	SP&CR,		NULL,		"XR") ;
SETBREAK(ALPHA,		LETTS&DIGS,	NULL,		"XR") ;
SETBREAK(DIGITA,	DIGS,		NULL,		"XR") ;
SETBREAK(TO!QUOTE!APPD,	""""&LF,	NULL,		"IA") ;
SETBREAK(TO!NON!SP,	SP,		NULL,		"XR") ;
SETBREAK(TEXT!TBL,	TEXT!BRC&SIG!BRC,NULL,		"IS") ;
SETBREAK(TO!VBAR!SKIP,	"|"&LF,		CR,		"IS") ;
SETBREAK(DEFN!TABLE,	DEFN!BRC,	NULL,		"IS") ;
SETBREAK(TO!CR!SKIP,	CRLF,		NULL,		"IS") ;

SWICH(CRLF & "9999/98" & TB & TB &
    "CLOSE TEXT;AFTER TEXT⊂⊃;NEXT PAGE;END ""!MANUSCRIPT"" ",
	-1, 0) ;
SWICHFILE(INFILE, INCHAN) ; comment main input file ;

IFC PARCVER OR ISIVER THENC		RT01 10/25/74;
BEGIN TES 1/22/74 OPTIONAL MYPUB.DFS ON USER DIRECTORY ;
INTEGER CHAN ; EOF ← 0 ; CHAN ← GETCHAN ;
OPEN(CHAN, "DSK", 0, 2, 0, 150, BRC, EOF) ;
LOOKUP(CHAN, "MYPUB"&DFSEXT, FLAG) ;
IF FLAG THEN RELEASE(CHAN)
ELSE SWICHFILE("MYPUB"&DFSEXT,CHAN) ;
END ;
ENDC TES 1/22/74 ;

SWICH("BEGIN ""!MANUSCRIPT"" ", -1, 0) ;

PUBSTD ← TRUE ; COMMENT SUPPRESS PAGE NUMBER MONITORING ;
IFC TENEX THENC
SWICHF(LIBPPN & "PUBSTD"&DFSEXT) ;
ELSEC
SWICHF((JOBNAM&"STD")[1 TO 6]&DFSEXT&LIBPPN) ; comment standard modes and macros ;
BH 3/14/75 IF PASS1 IS NPUB.DMP, USE NPUBST.DFS;
ENDC

END "SORCE!" ;
PUBLIC SIMPLE PROCEDURE BURPINPUT(BOOLEAN VERBOSE) ;$"#
BEGIN
INTEGER L; STRING SL ;
OUTSTR("LINE/PAGE "&ERRLINE&"/"&SRCPAGE&TB&
	SOMEINPUT[1 TO (IF VERBOSE THEN 300 ELSE 60)] ) ;
OUTSTR(CRLF&" - - - - - - - - - - - - - - - - - - - -"&CRLF) ;
FOR L ← LAST STEP -2 UNTIL (IF VERBOSE THEN 6 ELSE 6 MAX LAST-6) DO
	BEGIN
	SL ← LINESCAN(L) ;
	IF CHANSCAN(L) GEQ 0 THEN  OUTSTR(SCAN(SL,TO!VT!SKIP,DUMMY)) ;
	OUTSTR(SP & SL & "/" & CVS(LH(DUMMY←ABS(PAGESCAN(L)))) & TB) ;
	OUTSTR(STRSCAN(L)[1 TO (IF VERBOSE THEN 300 ELSE 60)]) ;
	OUTSTR(CRLF&" - - - - - - - - - - - - - - - - - - - -"&CRLF) ;
	END ;
END "BURPINPUT" ;
PUBLIC SIMPLE PROCEDURE DREQUIRE ;$"#
BEGIN
STRING F ;
PASS ; F ← E(NULL, "SOURCE!FILE") ;
IF NOT EQU(THISWD[1 TO 6],"SOURCE") THEN
	WARN("=","REQUIRE -- SOURCE!FILE only!") ;
IF NEXTS(FILE) THEN PASS ; TES 10/22/74 DWIM ;
IF FULSTR(F) AND ON THEN SWICHF(F) ; PASS ;
END "DREQUIRE" ;
PUBLIC SIMPLE PROCEDURE GROWNESTS ;$"#
BEGIN "GROWNESTS"
GROW(INEST, INESTIDA, SIZE, 200, NULL) ; MAKEBE(INESTIDA, INEST) ;
DUMMY ← 0 ; COMMENT OTHERWISE SPURIOUS MESSAGE FROM SGROW 2/28/73 TES ;
SGROW(SNEST, SNESTIDA, DUMMY, 200, NULL) ; SMAKEBE(SNESTIDA, SNEST) ;
ZEROSTRINGS(200, SNEST[SIZE-199]) ;
END "GROWNESTS" ;
PUBLIC STRING SIMPLE PROCEDURE RD(INTEGER BRKTBL) ;$"#
BEGIN
COMMENT INPUTSTR = [ [chars] LF line-no TB ]... [chars]
	All break tables should break on LF.
	RD's value is as if  LF line-no TB  were null. ;
INTEGER PTR, BYTEWD ; STRING SPTR, RESULT, PART ;
RESULT ← NULL ;
DO BEGIN "PARTIAL"
PART ← SCAN(INPUTSTR, BRKTBL, BRC) ;
IF BRC = LF THEN
	BEGIN "MACRO LINE NUMBER"
	MACLINE ← SCAN(INPUTSTR, TO!TB!FF!SKIP, DUMMY) ;
	IF PART[∞ FOR 1] = LF THEN comment he Appended the break character ;
		PART ← IF DEFINING THEN PART & MACLINE & TB ELSE PART[1 TO ∞-1]
	ELSE IF DEFINING THEN PART ← PART & LF & MACLINE & TB ;
	END "MACRO LINE NUMBER"
ELSE IF BRC = 0 THEN comment, ran out of input ;
	IF INPUTCHAN < 0 THEN INPUTSTR ← SWICHBACK comment, done scanning macro body ;
	ELSE	BEGIN "FROM FILE"
		DO	BEGIN comment, may be page marks or eof or more lines ;
			IF TECOFILE THEN
				BEGIN COMMENT CHECK FOR FF AND SUPERFLUOUS LFs ;
				SRCLINE ← CVS(CVD(SRCLINE)+1) ;
				INPUT(INPUTCHAN, NO!CHARS) ;
				WHILE BRC = LF DO
					BEGIN
					INPUT(INPUTCHAN,ONE!CHAR) ;
					INPUT(INPUTCHAN,NO!CHARS) ;
					END ;
				END
			ELSE SRCLINE ← INPUT(INPUTCHAN, TO!TB!FF!SKIP) ;
			IF BRC = FF THEN
			   BEGIN "PGMARK"
			   PAGEMARKS ← PAGEMARKS + 1 ;
			   IF TECOFILE THEN
				   BEGIN
				   INPUT(INPUTCHAN, ONE!CHAR) ;
				   SRCLINE ← "0" ;
				   END ;
			   WHILE INPGS AND LAST=4 AND BRC=FF AND PAGEMARKS>RH(INPG[INPGX]) DO
			      IF (INPGX←INPGX+1)>INPGS THEN BEGIN BRC←0 ; EOF←1 END
			      ELSE IF PAGEMARKS<(K←LH(INPG[INPGX])) THEN
				 DO	 BEGIN "SKIP PAGES"
					 DO INPUT(INPUTCHAN,TO!LF!TB!VT!SKIP)
						UNTIL BRC NEQ TB;
					 IF BRC = LF THEN
					 DO	BEGIN
						 SRCLINE←INPUT(INPUTCHAN,TO!TB!FF!SKIP);
						 IF BRC=FF THEN PAGEMARKS←PAGEMARKS+1 ;
						 END UNTIL BRC NEQ FF ;
					 END "SKIP PAGES"
				 UNTIL BRC NEQ TB OR PAGEMARKS GEQ K ;
			   IF  NOT EOF THEN
				BEGIN COMMENT COMPUTE AND DISPLAY PAGE NUMBER ;
				SRCPAGE ← CVS(PAGEMARKS) ;
				IF NOT PUBSTD THEN OUTSTR((
					IF SWDBACK THEN SPS(LAST-3)
					ELSE SP
						   )&SRCPAGE) ;
				SWDBACK ← 0 ;
				END ;
			   END "PGMARK" ;
			END
		UNTIL BRC NEQ FF ;
		MACLINE ← NULL ;
		IF EOF THEN INPUTSTR ← SWICHBACK comment, done scanning a SOURCE!FILE or gen-file;
		ELSE	BEGIN "FILE LINE"
			DO	BEGIN "EXPAND TABS"
				INPUTSTR ← INPUTSTR & INPUT(INPUTCHAN,TO!LF!TB!VT!SKIP) ;
				IF BRC=TB THEN INPUTSTR←INPUTSTR&
				   (IF PAGESCAN(LAST) GEQ 0 THEN
					IF TABTAB=0 THEN
					   SPS(8-LENGTH(INPUTSTR) MOD 8)
					ELSE TABTAB
				    ELSE TB)
				ELSE IF BRC=VT THEN
				 IF INPUTSTR[∞ FOR 1]=RCBRAK THEN INPUTSTR←INPUTSTR&VT
				 ELSE
				  BEGIN "GENVT" COMMENT MAYBE {PAGE!} IN GEN-FILE ;
				  SPTR ← INPUT(INPUTCHAN, TO!VT!SKIP) ;
				  IF (PTR ← CVD(SPTR)) GEQ TWO(14)
					AND LDB(PLIGHTWD(BYTEWD←ITBL[PTR-TWO(14)]))=2
					    THEN
						BEGIN
						BREAKSET(LOCAL!TABLE,ALTMODE,"IS");
						BREAKSET(LOCAL!TABLE,NULL,"O");
						S ← STBL[LDB(IXWD(BYTEWD))] ;
						INPUTSTR ← INPUTSTR[1 TO ∞-6] &
						SCAN(S,LOCAL!TABLE,DUMMY);
						END
				  ELSE INPUTSTR ← INPUTSTR & VT & SPTR & VT ;
				  END "GENVT"
				END "EXPAND TABS"
			UNTIL BRC = LF OR BRC < 0 OR EOF ;
			IF BRC LEQ 0 THEN
			   BEGIN BRC ← LF ;
			   IF  NOT EOF THEN
				WARN("=","Garbaged manuscript "&ERRLINE&"/"&SRCPAGE)
			   END ;
			IF DEFINING THEN PART ← PART & LF & SRCLINE & "/" & SRCPAGE & TB ;
			END "FILE LINE" ;
		END "FROM FILE" ;
IF BRC = LF THEN
	IF DEFINING THEN BEGIN BRC←0 ; IF INPUTSTR=!COMMAND!CHARACTER! THEN
		BEGIN PART ← PART & TB ; LOPP(INPUTSTR) ; END END
	ELSE IF INPUTSTR = !COMMAND!CHARACTER!  OR  INPUTSTR = TB  THEN
		BEGIN
		LOPP(INPUTSTR) ;
		BRC ← 0 ; comment, keep scanning ;
		END
	ELSE INPUTSTR ← (BRC ← RCBRAK) & VT & INPUTSTR ;
IF BRC THEN RETURN(IF LENGTH(RESULT)=0 THEN PART
		   ELSE IF LENGTH(PART)=0 THEN RESULT
		   ELSE RESULT & PART)
ELSE IF LENGTH(RESULT)=0 THEN RESULT ← PART
ELSE RESULT ← RESULT & PART ;
END "PARTIAL"
UNTIL FALSE ;
END "RD" ;
PUBLIC SIMPLE PROCEDURE SWICH(STRING NEWINPUTSTR; INTEGER NEWINPUTCHAN, ARGS) ;$"#
BEGIN "SWICH" comment switch to new input stream ;
IF ARGS THEN
	BEGIN "SUBSTITUTE"
	INTEGER BRC ; STRING NEWER ; NEWER ← NULL ; LAST ← LAST - ARGS ;
	DO	BEGIN "VTABS"
		NEWER ← NEWER & SCAN(NEWINPUTSTR, TO!VT!SKIP, BRC) ;
		IF BRC THEN NEWER ← NEWER & SNEST[LAST + LOP(NEWINPUTSTR)] ;
		END "VTABS"
	UNTIL BRC = 0 ;
	NEWINPUTSTR ← NEWER ;
	END "SUBSTITUTE" ;
IF (LAST ← LAST+2) > SIZE THEN GROWNESTS ; 
STRSCAN(LAST) ← IF THATISFULL THEN LIT!ENTITY & LIT!TRAIL & INPUTSTR ELSE INPUTSTR ;
CHANSCAN(LAST) ← INPUTCHAN + (IF TECOFILE THEN 100 ELSE 0) ;
LINESCAN(LAST) ← IF INPUTCHAN < 0 THEN MACLINE ELSE THISFILE & VT & SRCLINE ;
PAGESCAN(LAST) ← LHRH(PAGEMARKS, PAGEWAS) ;
EMPTYTHIS ; EMPTYTHAT ;
INPUTSTR ← NEWINPUTSTR ; INPUTCHAN ← NEWINPUTCHAN ; TECOFILE ← 0 ;
END "SWICH" ;
PUBLIC STRING SIMPLE PROCEDURE SWICHBACK ;$"#
BEGIN "SWICHBACK"
EOF ← 0 ; IF INPUTCHAN GEQ 0 THEN 
BEGIN 
IF PUBSTD THEN PUBSTD ← FALSE
ELSE IF SWFLG AND NOT SWDBACK THEN BEGIN OUTSTR("."&CRLF) ; SWDBACK←TRUE END ;
RELEASE(INPUTCHAN) ;
END
ELSE IF CHANSCAN(LAST) LEQ -2 THEN RETURN(INPUTSTR←STRSCAN(LAST)) ;
PAGEMARKS ← LH(DUMMY ← ABS(PAGESCAN(LAST))) ; PAGEWAS ← RH(DUMMY) ;
SRCPAGE ← CVS(PAGEMARKS) ;
IF (INPUTCHAN ← CHANSCAN(LAST))< 0 THEN MACLINE←LINESCAN(LAST)
ELSE BEGIN SRCLINE←LINESCAN(LAST); 
         THISFILE←SCAN(SRCLINE,TO!VT!SKIP,DUMMY) END ;
IF TECOFILE ← INPUTCHAN > 50 THEN INPUTCHAN ← INPUTCHAN - 100 ;
INPUTSTR ← STRSCAN(LAST) ; LAST←LAST-2;  RETURN(INPUTSTR) ;
END "SWICHBACK" ;
PUBLIC SIMPLE PROCEDURE SWICHF(STRING FILENAME) ;$"#
BEGIN "SWICHF"
TES 8/24/74 PROCEDURIZED AND ALLOWED DEFAULTS ;
INTEGER CHAN ;
CHAN ← OPENTOREAD(0, IF AGENFILE THEN "Generated File " ELSE "Source!file ", FILENAME, REQEXT, REQPPN) ;
SWICHFILE(FILENAME, CHAN) ;
END "SWICHF" ;
PRIVATE SIMPLE PROCEDURE SWICHFILE(STRING FILENAME ; INTEGER CHAN) ;$"#
BEGIN COMMENT FILE ALREADY OPEN ON CHAN ;
TES 1/22/74 SUBROUTINIZED ; TES 3/23/74 SIMPLIFIED ;
SWICH(NULL, CHAN, 0) ;
IF AGENFILE THEN BEGIN TECOFILE←0 ; AGENFILE←FALSE END
ELSE BEGIN INPUT(INPUTCHAN, NO!CHARS) ; TECOFILE ← BRC GEQ 0 END ;
PAGEMARKS ← PAGEWAS ← 1 ; SRCPAGE ← "1" ; SRCLINE ← IF TECOFILE THEN "0" ELSE "00000" ;
IFC SAILVER THENC
IF TECOFILE THEN
	BEGIN COMMENT IF TVEDIT FILE, SKIP PAGE 1 ;
	IF EQU("COMMENT ⊗", INPUT(INPUTCHAN,TO!TERQ!CR)[1 TO 9]) THEN
		BEGIN
		DO INPUT(INPUTCHAN, TO!TB!FF!SKIP) UNTIL BRC=FF ;
		SRCPAGE ← "2" ; PAGEMARKS ← PAGEWAS ← 2 ;
		END
	ELSE BEGIN CLOSIN(INPUTCHAN) ; COMMENT NOT TVEDIT -- RESTART INPUT ;
			LOOKUP(CHAN,FILENAME,FLAG);
	END  END ;
ENDC
THISFILE ← FILENAME ;
IF NOT PUBSTD THEN
BEGIN
IF LAST =4 AND SWFLG=0 THEN   TES ADDED SWFLG 12/5/73 ;
	BEGIN MAINFILE←THISFILE ; SWFLG ← 1 END
ELSE BEGIN IF NOT SWDBACK THEN OUTSTR(CRLF) ; OUTSTR(SPS(LAST-4)) ; END ;
OUTSTR(THISFILE&SP&SRCPAGE) ; SWDBACK ← FALSE ;
END ;
END "SWICHFILE" ;
FINISHED

ENDOF("SORCE")